Merge "Added benchmark mode. Added some image processing operations."
diff --git a/Android.mk b/Android.mk
index 5eb5dda..5fa7fe7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -117,7 +117,8 @@
core/java/android/hardware/ISensorService.aidl \
core/java/android/net/IConnectivityManager.aidl \
core/java/android/net/INetworkManagementEventObserver.aidl \
- core/java/android/net/IThrottleManager.aidl \
+ core/java/android/net/IThrottleManager.aidl \
+ core/java/android/os/IHardwareService.aidl \
core/java/android/os/IMessenger.aidl \
core/java/android/os/storage/IMountService.aidl \
core/java/android/os/storage/IMountServiceListener.aidl \
@@ -347,6 +348,10 @@
$(call find-other-java-files, $(dirs_to_document)) \
$(call find-other-html-files, $(html_dirs))
+# This is used by ide.mk as the list of source files that are
+# always included.
+INTERNAL_SDK_SOURCE_DIRS := $(addprefix $(LOCAL_PATH)/,$(dirs_to_document))
+
framework_docs_LOCAL_DROIDDOC_SOURCE_PATH := \
$(FRAMEWORKS_BASE_JAVA_SRC_DIRS)
@@ -442,8 +447,8 @@
## Latest ADT version identifiers, for reference from published docs
framework_docs_ADT_VERSION:=0.9.7
framework_docs_ADT_DOWNLOAD:=ADT-0.9.7.zip
-framework_docs_ADT_BYTES:=na
-framework_docs_ADT_CHECKSUM:=na
+framework_docs_ADT_BYTES:=8033750
+framework_docs_ADT_CHECKSUM:=de2431c8d4786d127ae5bfc95b4605df
framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-hdf sdk.version $(framework_docs_SDK_VERSION) \
diff --git a/api/9.xml b/api/9.xml
index cfa75a75..1408351 100644
--- a/api/9.xml
+++ b/api/9.xml
@@ -147782,17 +147782,6 @@
visibility="public"
>
</constructor>
-<method name="abortUpdates"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="close"
return="void"
abstract="false"
@@ -147804,30 +147793,6 @@
visibility="public"
>
</method>
-<method name="commitUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="commitUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="values" type="java.util.Map<? extends java.lang.Long, ? extends java.util.Map<java.lang.String, java.lang.Object>>">
-</parameter>
-</method>
<method name="copyStringToBuffer"
return="void"
abstract="false"
@@ -147854,17 +147819,6 @@
visibility="public"
>
</method>
-<method name="deleteRow"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="getBlob"
return="byte[]"
abstract="false"
@@ -148061,17 +148015,6 @@
visibility="public"
>
</method>
-<method name="hasUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="isAfterLast"
return="boolean"
abstract="false"
@@ -148275,17 +148218,6 @@
<parameter name="uri" type="android.net.Uri">
</parameter>
</method>
-<method name="supportsUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="unregisterContentObserver"
return="void"
abstract="false"
@@ -148312,124 +148244,6 @@
<parameter name="observer" type="android.database.DataSetObserver">
</parameter>
</method>
-<method name="updateBlob"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="byte[]">
-</parameter>
-</method>
-<method name="updateDouble"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="double">
-</parameter>
-</method>
-<method name="updateFloat"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="float">
-</parameter>
-</method>
-<method name="updateInt"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="int">
-</parameter>
-</method>
-<method name="updateLong"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="long">
-</parameter>
-</method>
-<method name="updateShort"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="short">
-</parameter>
-</method>
-<method name="updateString"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="java.lang.String">
-</parameter>
-</method>
-<method name="updateToNull"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-</method>
</class>
<class name="MockDialogInterface"
extends="java.lang.Object"
diff --git a/api/current.xml b/api/current.xml
index 26de53c..d37c342 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -19421,6 +19421,21 @@
<parameter name="options" type="int">
</parameter>
</method>
+<method name="setDisplayOptions"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="options" type="int">
+</parameter>
+<parameter name="mask" type="int">
+</parameter>
+</method>
<method name="setDividerDrawable"
return="void"
abstract="true"
@@ -21504,6 +21519,23 @@
<parameter name="requestCode" type="int">
</parameter>
</method>
+<method name="startActivityFromFragment"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="fragment" type="android.app.Fragment">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+<parameter name="requestCode" type="int">
+</parameter>
+</method>
<method name="startActivityIfNeeded"
return="boolean"
abstract="false"
@@ -25506,6 +25538,23 @@
visibility="public"
>
</method>
+<method name="onActivityResult"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="requestCode" type="int">
+</parameter>
+<parameter name="resultCode" type="int">
+</parameter>
+<parameter name="data" type="android.content.Intent">
+</parameter>
+</method>
<method name="onAttach"
return="void"
abstract="false"
@@ -25613,6 +25662,8 @@
</parameter>
<parameter name="attrs" type="android.util.AttributeSet">
</parameter>
+<parameter name="savedInstanceState" type="android.os.Bundle">
+</parameter>
</method>
<method name="onLowMemory"
return="void"
@@ -25708,6 +25759,34 @@
<parameter name="retain" type="boolean">
</parameter>
</method>
+<method name="startActivity"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="startActivityForResult"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+<parameter name="requestCode" type="int">
+</parameter>
+</method>
</class>
<interface name="FragmentTransaction"
abstract="true"
@@ -27483,6 +27562,109 @@
</parameter>
</method>
</class>
+<class name="LoaderManagingFragment"
+ extends="android.app.Fragment"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.content.Loader.OnLoadCompleteListener">
+</implements>
+<constructor name="LoaderManagingFragment"
+ type="android.app.LoaderManagingFragment"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="getLoader"
+ return="android.content.Loader<D>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="id" type="int">
+</parameter>
+</method>
+<method name="onCreateLoader"
+ return="android.content.Loader<D>"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="id" type="int">
+</parameter>
+<parameter name="args" type="android.os.Bundle">
+</parameter>
+</method>
+<method name="onInitializeLoaders"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</method>
+<method name="onLoadComplete"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="loader" type="android.content.Loader<D>">
+</parameter>
+<parameter name="data" type="D">
+</parameter>
+</method>
+<method name="onLoadFinished"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="loader" type="android.content.Loader<D>">
+</parameter>
+<parameter name="data" type="D">
+</parameter>
+</method>
+<method name="startLoading"
+ return="android.content.Loader<D>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="id" type="int">
+</parameter>
+<parameter name="args" type="android.os.Bundle">
+</parameter>
+</method>
+</class>
<class name="LocalActivityManager"
extends="java.lang.Object"
abstract="false"
@@ -27660,6 +27842,8 @@
deprecated="not deprecated"
visibility="public"
>
+<implements name="android.view.SurfaceHolder.Callback">
+</implements>
<constructor name="NativeActivity"
type="android.app.NativeActivity"
static="false"
@@ -27668,6 +27852,51 @@
visibility="public"
>
</constructor>
+<method name="surfaceChanged"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="holder" type="android.view.SurfaceHolder">
+</parameter>
+<parameter name="format" type="int">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+</method>
+<method name="surfaceCreated"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="holder" type="android.view.SurfaceHolder">
+</parameter>
+</method>
+<method name="surfaceDestroyed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="holder" type="android.view.SurfaceHolder">
+</parameter>
+</method>
<field name="META_DATA_LIB_NAME"
type="java.lang.String"
transient="false"
@@ -35213,6 +35442,58 @@
</parameter>
</constructor>
</class>
+<class name="AsyncTaskLoader"
+ extends="android.content.Loader"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="AsyncTaskLoader"
+ type="android.content.AsyncTaskLoader"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</constructor>
+<method name="cancelLoad"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="forceLoad"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="loadInBackground"
+ return="D"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+</class>
<class name="BroadcastReceiver"
extends="java.lang.Object"
abstract="true"
@@ -40609,6 +40890,212 @@
</parameter>
</method>
</class>
+<class name="CursorLoader"
+ extends="android.content.AsyncTaskLoader"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="CursorLoader"
+ type="android.content.CursorLoader"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="uri" type="android.net.Uri">
+</parameter>
+<parameter name="projection" type="java.lang.String[]">
+</parameter>
+<parameter name="selection" type="java.lang.String">
+</parameter>
+<parameter name="selectionArgs" type="java.lang.String[]">
+</parameter>
+<parameter name="sortOrder" type="java.lang.String">
+</parameter>
+</constructor>
+<method name="deliverResult"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="cursor" type="android.database.Cursor">
+</parameter>
+</method>
+<method name="destroy"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getProjection"
+ return="java.lang.String[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSelection"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSelectionArgs"
+ return="java.lang.String[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSortOrder"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getUri"
+ return="android.net.Uri"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="loadInBackground"
+ return="android.database.Cursor"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="setProjection"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="projection" type="java.lang.String[]">
+</parameter>
+</method>
+<method name="setSelection"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="selection" type="java.lang.String">
+</parameter>
+</method>
+<method name="setSelectionArgs"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="selectionArgs" type="java.lang.String[]">
+</parameter>
+</method>
+<method name="setSortOrder"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="sortOrder" type="java.lang.String">
+</parameter>
+</method>
+<method name="setUri"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="uri" type="android.net.Uri">
+</parameter>
+</method>
+<method name="startLoading"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="stopLoading"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+</class>
<interface name="DialogInterface"
abstract="true"
static="false"
@@ -45575,6 +46062,172 @@
</parameter>
</constructor>
</class>
+<class name="Loader"
+ extends="java.lang.Object"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="Loader"
+ type="android.content.Loader"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</constructor>
+<method name="deliverResult"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="data" type="D">
+</parameter>
+</method>
+<method name="destroy"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="forceLoad"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getContext"
+ return="android.content.Context"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getId"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="registerListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="id" type="int">
+</parameter>
+<parameter name="listener" type="android.content.Loader.OnLoadCompleteListener<D>">
+</parameter>
+</method>
+<method name="startLoading"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="stopLoading"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="unregisterListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.content.Loader.OnLoadCompleteListener<D>">
+</parameter>
+</method>
+</class>
+<class name="Loader.ForceLoadContentObserver"
+ extends="android.database.ContentObserver"
+ abstract="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="Loader.ForceLoadContentObserver"
+ type="android.content.Loader.ForceLoadContentObserver"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+</class>
+<interface name="Loader.OnLoadCompleteListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onLoadComplete"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="loader" type="android.content.Loader<D>">
+</parameter>
+<parameter name="data" type="D">
+</parameter>
+</method>
+</interface>
<class name="MutableContextWrapper"
extends="android.content.ContextWrapper"
abstract="false"
@@ -77163,6 +77816,19 @@
visibility="public"
>
</method>
+<method name="getFocusDistances"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="output" type="float[]">
+</parameter>
+</method>
<method name="getFocusMode"
return="java.lang.String"
abstract="false"
@@ -78085,6 +78751,39 @@
visibility="public"
>
</field>
+<field name="FOCUS_DISTANCE_FAR_INDEX"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FOCUS_DISTANCE_NEAR_INDEX"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FOCUS_DISTANCE_OPTIMAL_INDEX"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="FOCUS_MODE_AUTO"
type="java.lang.String"
transient="false"
@@ -137291,6 +137990,17 @@
visibility="public"
>
</field>
+<field name="MEDIA_IGNORE_FILENAME"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="".nomedia""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="MEDIA_SCANNER_VOLUME"
type="java.lang.String"
transient="false"
@@ -153479,17 +154189,6 @@
visibility="public"
>
</constructor>
-<method name="abortUpdates"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="close"
return="void"
abstract="false"
@@ -153501,30 +154200,6 @@
visibility="public"
>
</method>
-<method name="commitUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="commitUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="values" type="java.util.Map<? extends java.lang.Long, ? extends java.util.Map<java.lang.String, java.lang.Object>>">
-</parameter>
-</method>
<method name="copyStringToBuffer"
return="void"
abstract="false"
@@ -153551,17 +154226,6 @@
visibility="public"
>
</method>
-<method name="deleteRow"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="getBlob"
return="byte[]"
abstract="false"
@@ -153758,17 +154422,6 @@
visibility="public"
>
</method>
-<method name="hasUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="isAfterLast"
return="boolean"
abstract="false"
@@ -153972,17 +154625,6 @@
<parameter name="uri" type="android.net.Uri">
</parameter>
</method>
-<method name="supportsUpdates"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
<method name="unregisterContentObserver"
return="void"
abstract="false"
@@ -154009,124 +154651,6 @@
<parameter name="observer" type="android.database.DataSetObserver">
</parameter>
</method>
-<method name="updateBlob"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="byte[]">
-</parameter>
-</method>
-<method name="updateDouble"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="double">
-</parameter>
-</method>
-<method name="updateFloat"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="float">
-</parameter>
-</method>
-<method name="updateInt"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="int">
-</parameter>
-</method>
-<method name="updateLong"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="long">
-</parameter>
-</method>
-<method name="updateShort"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="short">
-</parameter>
-</method>
-<method name="updateString"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-<parameter name="value" type="java.lang.String">
-</parameter>
-</method>
-<method name="updateToNull"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="columnIndex" type="int">
-</parameter>
-</method>
</class>
<class name="MockDialogInterface"
extends="java.lang.Object"
@@ -188052,6 +188576,19 @@
<parameter name="get" type="boolean">
</parameter>
</method>
+<method name="takeSurface"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="callback" type="android.view.SurfaceHolder.Callback">
+</parameter>
+</method>
<method name="togglePanel"
return="void"
abstract="true"
@@ -208207,6 +208744,17 @@
visibility="public"
>
</method>
+<method name="getNumColumns"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getStretchMode"
return="int"
abstract="false"
diff --git a/camera/tests/CameraServiceTest/CameraServiceTest.cpp b/camera/tests/CameraServiceTest/CameraServiceTest.cpp
index cb69534..3c8d553 100644
--- a/camera/tests/CameraServiceTest/CameraServiceTest.cpp
+++ b/camera/tests/CameraServiceTest/CameraServiceTest.cpp
@@ -226,7 +226,7 @@
}
void MCameraClient::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) {
- INFO(__func__);
+ INFO("%s", __func__);
Mutex::Autolock _l(mLock);
ssize_t i = mNotifyCount.indexOfKey(msgType);
if (i < 0) {
@@ -238,7 +238,7 @@
}
void MCameraClient::dataCallback(int32_t msgType, const sp<IMemory>& data) {
- INFO(__func__);
+ INFO("%s", __func__);
int dataSize = data->size();
INFO("data type = %d, size = %d", msgType, dataSize);
Mutex::Autolock _l(mLock);
@@ -314,7 +314,7 @@
};
status_t MSurface::registerBuffers(const BufferHeap& buffers) {
- INFO(__func__);
+ INFO("%s", __func__);
Mutex::Autolock _l(mLock);
++registerBuffersCount;
mCond.signal();
@@ -322,26 +322,26 @@
}
void MSurface::postBuffer(ssize_t offset) {
- // INFO(__func__);
+ // INFO("%s", __func__);
Mutex::Autolock _l(mLock);
++postBufferCount;
mCond.signal();
}
void MSurface::unregisterBuffers() {
- INFO(__func__);
+ INFO("%s", __func__);
Mutex::Autolock _l(mLock);
++unregisterBuffersCount;
mCond.signal();
}
sp<GraphicBuffer> MSurface::requestBuffer(int bufferIdx, int usage) {
- INFO(__func__);
+ INFO("%s", __func__);
return NULL;
}
status_t MSurface::setBufferCount(int bufferCount) {
- INFO(__func__);
+ INFO("%s", __func__);
return NULL;
}
@@ -386,17 +386,17 @@
}
void putTempObject(sp<IBinder> obj) {
- INFO(__func__);
+ INFO("%s", __func__);
getHolder()->put(obj);
}
sp<IBinder> getTempObject() {
- INFO(__func__);
+ INFO("%s", __func__);
return getHolder()->get();
}
void clearTempObject() {
- INFO(__func__);
+ INFO("%s", __func__);
getHolder()->clear();
}
@@ -422,7 +422,7 @@
// Various Connect Tests
//
void testConnect(int cameraId) {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICameraService> cs = getCameraService();
sp<MCameraClient> cc = new MCameraClient();
sp<ICamera> c = cs->connect(cc, cameraId);
@@ -431,7 +431,7 @@
}
void testAllowConnectOnceOnly(int cameraId) {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICameraService> cs = getCameraService();
// Connect the first client.
sp<MCameraClient> cc = new MCameraClient();
@@ -446,14 +446,14 @@
}
void testReconnectFailed() {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICamera> c = interface_cast<ICamera>(getTempObject());
sp<MCameraClient> cc = new MCameraClient();
ASSERT(c->connect(cc) != NO_ERROR);
}
void testReconnectSuccess() {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICamera> c = interface_cast<ICamera>(getTempObject());
sp<MCameraClient> cc = new MCameraClient();
ASSERT(c->connect(cc) == NO_ERROR);
@@ -461,20 +461,20 @@
}
void testLockFailed() {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICamera> c = interface_cast<ICamera>(getTempObject());
ASSERT(c->lock() != NO_ERROR);
}
void testLockUnlockSuccess() {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICamera> c = interface_cast<ICamera>(getTempObject());
ASSERT(c->lock() == NO_ERROR);
ASSERT(c->unlock() == NO_ERROR);
}
void testLockSuccess() {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICamera> c = interface_cast<ICamera>(getTempObject());
ASSERT(c->lock() == NO_ERROR);
c->disconnect();
@@ -525,7 +525,7 @@
}
void testReconnect(int cameraId) {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICameraService> cs = getCameraService();
sp<MCameraClient> cc = new MCameraClient();
sp<ICamera> c = cs->connect(cc, cameraId);
@@ -559,7 +559,7 @@
}
void testReconnectFromAnotherProcess(int cameraId) {
- INFO(__func__);
+ INFO("%s", __func__);
sp<ICameraService> cs = getCameraService();
sp<MCameraClient> cc = new MCameraClient();
@@ -729,7 +729,7 @@
public:
void run() {
String8 param_str = c->getParameters();
- INFO(param_str);
+ INFO("%s", static_cast<const char*>(param_str));
}
};
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 736ac08..301883f 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -205,7 +205,7 @@
String uri = nextArg();
if (uri != null) {
Intent oldIntent = intent;
- intent = Intent.getIntent(uri);
+ intent = Intent.parseUri(uri, 0);
if (oldIntent.getAction() != null) {
intent.setAction(oldIntent.getAction());
}
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index e28d3d3..77633c6 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -17,7 +17,6 @@
package android.app;
import android.graphics.drawable.Drawable;
-import android.view.ActionBarView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -29,12 +28,12 @@
* methods of navigating around an application.
*/
public abstract class ActionBar {
- /**
- * Normal/standard navigation mode. Consists of either a logo or icon
- * and title text with an optional subtitle. Clicking any of these elements
- * will dispatch onActionItemSelected to the registered Callback with
- * a MenuItem with item ID android.R.id.home.
- */
+ /**
+ * Normal/standard navigation mode. Consists of either a logo or icon
+ * and title text with an optional subtitle. Clicking any of these elements
+ * will dispatch onActionItemSelected to the registered Callback with
+ * a MenuItem with item ID android.R.id.home.
+ */
public static final int NAVIGATION_MODE_NORMAL = 0;
/**
@@ -119,7 +118,8 @@
public abstract void setNavigationMode(int mode);
/**
- * Set display options.
+ * Set display options. This changes all display option bits at once. To change
+ * a limited subset of display options, see {@link #setDisplayOptions(int, int)}.
*
* @param options A combination of the bits defined by the DISPLAY_ constants
* defined in ActionBar.
@@ -127,6 +127,21 @@
public abstract void setDisplayOptions(int options);
/**
+ * Set selected display options. Only the options specified by mask will be changed.
+ * To change all display option bits at once, see {@link #setDisplayOptions(int)}.
+ *
+ * <p>Example: setDisplayOptions(0, DISPLAY_HIDE_HOME) will disable the
+ * {@link #DISPLAY_HIDE_HOME} option.
+ * setDisplayOptions(DISPLAY_HIDE_HOME, DISPLAY_HIDE_HOME | DISPLAY_USE_LOGO)
+ * will enable {@link #DISPLAY_HIDE_HOME} and disable {@link #DISPLAY_USE_LOGO}.
+ *
+ * @param options A combination of the bits defined by the DISPLAY_ constants
+ * defined in ActionBar.
+ * @param mask A bit mask declaring which display options should be changed.
+ */
+ public abstract void setDisplayOptions(int options, int mask);
+
+ /**
* Set the ActionBar's background.
*
* @param d Background drawable
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 16f3265..174c15b 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -16,7 +16,6 @@
package android.app;
-import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
@@ -1580,40 +1579,6 @@
}
/**
- * Wrapper around {@link Cursor#commitUpdates()} that takes care of noting
- * that the Cursor needs to be requeried. You can call this method in
- * {@link #onPause} or {@link #onStop} to have the system call
- * {@link Cursor#requery} for you if the activity is later resumed. This
- * allows you to avoid determing when to do the requery yourself (which is
- * required for the Cursor to see any data changes that were committed with
- * it).
- *
- * @param c The Cursor whose changes are to be committed.
- *
- * @see #managedQuery(android.net.Uri , String[], String, String[], String)
- * @see #startManagingCursor
- * @see Cursor#commitUpdates()
- * @see Cursor#requery
- * @hide
- */
- @Deprecated
- public void managedCommitUpdates(Cursor c) {
- synchronized (mManagedCursors) {
- final int N = mManagedCursors.size();
- for (int i=0; i<N; i++) {
- ManagedCursor mc = mManagedCursors.get(i);
- if (mc.mCursor == c) {
- c.commitUpdates();
- mc.mUpdated = true;
- return;
- }
- }
- throw new RuntimeException(
- "Cursor " + c + " is not currently managed");
- }
- }
-
- /**
* This method allows the activity to take care of managing the given
* {@link Cursor}'s lifecycle for you based on the activity's lifecycle.
* That is, when the activity is stopped it will automatically call
@@ -3196,6 +3161,36 @@
}
/**
+ * This is called when a Fragment in this activity calls its
+ * {@link Fragment#startActivity} or {@link Fragment#startActivityForResult}
+ * method.
+ *
+ * <p>This method throws {@link android.content.ActivityNotFoundException}
+ * if there was no Activity found to run the given Intent.
+ *
+ * @param fragment The fragment making the call.
+ * @param intent The intent to start.
+ * @param requestCode Reply request code. < 0 if reply is not requested.
+ *
+ * @throws android.content.ActivityNotFoundException
+ *
+ * @see Fragment#startActivity
+ * @see Fragment#startActivityForResult
+ */
+ public void startActivityFromFragment(Fragment fragment, Intent intent,
+ int requestCode) {
+ Instrumentation.ActivityResult ar =
+ mInstrumentation.execStartActivity(
+ this, mMainThread.getApplicationThread(), mToken, fragment,
+ intent, requestCode);
+ if (ar != null) {
+ mMainThread.sendActivityResult(
+ mToken, fragment.mWho, requestCode,
+ ar.getResultCode(), ar.getResultData());
+ }
+ }
+
+ /**
* Like {@link #startActivityFromChild(Activity, Intent, int)}, but
* taking a IntentSender; see
* {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
@@ -3467,8 +3462,7 @@
* @see #createPendingResult
* @see #setResult(int)
*/
- protected void onActivityResult(int requestCode, int resultCode,
- Intent data) {
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
/**
@@ -3888,9 +3882,14 @@
fragment.mFromLayout = true;
fragment.mFragmentId = id;
fragment.mTag = tag;
- fragment.onInflate(this, attrs);
mFragments.addFragment(fragment, true);
}
+ // If this fragment is newly instantiated (either right now, or
+ // from last saved state), then give it the attributes to
+ // initialize itself.
+ if (!fragment.mRetaining) {
+ fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
+ }
if (fragment.mView == null) {
throw new IllegalStateException("Fragment " + fname
+ " did not create a view.");
@@ -4093,6 +4092,11 @@
+ ", resCode=" + resultCode + ", data=" + data);
if (who == null) {
onActivityResult(requestCode, resultCode, data);
+ } else {
+ Fragment frag = mFragments.findFragmentByWho(who);
+ if (frag != null) {
+ frag.onActivityResult(requestCode, resultCode, data);
+ }
}
}
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 2f6d9f2..5217f5e 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -620,7 +620,8 @@
+ " Is this really what you want?");
}
mMainThread.getInstrumentation().execStartActivity(
- getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);
+ getOuterContext(), mMainThread.getApplicationThread(), null,
+ (Activity)null, intent, -1);
}
@Override
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 1b877b2..c64b3e8 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -17,6 +17,7 @@
package android.app;
import android.content.ComponentCallbacks;
+import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Parcel;
@@ -36,8 +37,8 @@
static final String VIEW_STATE_TAG = "android:view_state";
final String mClassName;
+ final int mIndex;
final boolean mFromLayout;
- final int mSavedStateId;
final int mFragmentId;
final int mContainerId;
final String mTag;
@@ -49,8 +50,8 @@
public FragmentState(Fragment frag) {
mClassName = frag.getClass().getName();
+ mIndex = frag.mIndex;
mFromLayout = frag.mFromLayout;
- mSavedStateId = frag.mSavedStateId;
mFragmentId = frag.mFragmentId;
mContainerId = frag.mContainerId;
mTag = frag.mTag;
@@ -59,8 +60,8 @@
public FragmentState(Parcel in) {
mClassName = in.readString();
+ mIndex = in.readInt();
mFromLayout = in.readInt() != 0;
- mSavedStateId = in.readInt();
mFragmentId = in.readInt();
mContainerId = in.readInt();
mTag = in.readString();
@@ -69,10 +70,6 @@
}
public Fragment instantiate(Activity activity) {
- if (mFromLayout) {
- return null;
- }
-
if (mInstance != null) {
return mInstance;
}
@@ -89,7 +86,8 @@
mInstance.mSavedViewState
= mSavedFragmentState.getSparseParcelableArray(VIEW_STATE_TAG);
}
- mInstance.mSavedStateId = mSavedStateId;
+ mInstance.setIndex(mIndex);
+ mInstance.mFromLayout = mFromLayout;
mInstance.mFragmentId = mFragmentId;
mInstance.mContainerId = mContainerId;
mInstance.mTag = mTag;
@@ -104,8 +102,8 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mClassName);
+ dest.writeInt(mIndex);
dest.writeInt(mFromLayout ? 1 : 0);
- dest.writeInt(mSavedStateId);
dest.writeInt(mFragmentId);
dest.writeInt(mContainerId);
dest.writeString(mTag);
@@ -149,6 +147,15 @@
Bundle mSavedFragmentState;
SparseArray<Parcelable> mSavedViewState;
+ // Index into active fragment array.
+ int mIndex = -1;
+
+ // Internal unique name for this fragment;
+ String mWho;
+
+ // True if the fragment is in the list of added fragments.
+ boolean mAdded;
+
// Set to true if this fragment was instantiated from a layout file.
boolean mFromLayout;
@@ -187,10 +194,6 @@
// The View generated for this fragment.
View mView;
- // Used for performing save state of fragments.
- int mSavedStateSeq = 0;
- int mSavedStateId;
-
public Fragment() {
}
@@ -217,6 +220,16 @@
}
}
+ void setIndex(int index) {
+ mIndex = index;
+ mWho = "android:fragment:" + mIndex;
+ }
+
+ void clearIndex() {
+ mIndex = -1;
+ mWho = null;
+ }
+
/**
* Subclasses can not override equals().
*/
@@ -277,14 +290,56 @@
}
/**
+ * Call {@link Activity#startActivity(Intent)} on the fragment's
+ * containing Activity.
+ */
+ public void startActivity(Intent intent) {
+ mActivity.startActivityFromFragment(this, intent, -1);
+ }
+
+ /**
+ * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's
+ * containing Activity.
+ */
+ public void startActivityForResult(Intent intent, int requestCode) {
+ mActivity.startActivityFromFragment(this, intent, requestCode);
+ }
+
+ /**
+ * Receive the result from a previous call to
+ * {@link #startActivityForResult(Intent, int)}. This follows the
+ * related Activity API as described there in
+ * {@link Activity#onActivityResult(int, int, Intent)}.
+ *
+ * @param requestCode The integer request code originally supplied to
+ * startActivityForResult(), allowing you to identify who this
+ * result came from.
+ * @param resultCode The integer result code returned by the child activity
+ * through its setResult().
+ * @param data An Intent, which can return result data to the caller
+ * (various data can be attached to Intent "extras").
+ */
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ }
+
+ /**
* Called when a fragment is being created as part of a view layout
- * inflation, typically from setting the content view of an activity.
+ * inflation, typically from setting the content view of an activity. This
+ * will be called both the first time the fragment is created, as well
+ * later when it is being re-created from its saved state (which is also
+ * given here).
+ *
+ * XXX This is kind-of yucky... maybe we could just supply the
+ * AttributeSet to onCreate()?
*
* @param activity The Activity that is inflating the fragment.
* @param attrs The attributes at the tag where the fragment is
* being created.
+ * @param savedInstanceState If the fragment is being re-created from
+ * a previous saved state, this is the state.
*/
- public void onInflate(Activity activity, AttributeSet attrs) {
+ public void onInflate(Activity activity, AttributeSet attrs,
+ Bundle savedInstanceState) {
mCalled = true;
}
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 0bc1b832..7556718 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -27,7 +27,6 @@
import android.view.animation.AnimationUtils;
import java.util.ArrayList;
-import java.util.HashMap;
final class BackStackEntry implements FragmentTransaction, Runnable {
final FragmentManager mManager;
@@ -68,9 +67,9 @@
if (containerViewId == 0) {
throw new IllegalArgumentException("Must use non-zero containerViewId");
}
- if (mManager.mFragments != null) {
- for (int i=0; i<mManager.mFragments.size(); i++) {
- Fragment old = mManager.mFragments.get(i);
+ if (mManager.mAdded != null) {
+ for (int i=0; i<mManager.mAdded.size(); i++) {
+ Fragment old = mManager.mAdded.get(i);
if (old.mContainerId == containerViewId) {
remove(old);
}
@@ -118,17 +117,20 @@
public void run() {
if (mRemoved != null) {
for (int i=mRemoved.size()-1; i>=0; i--) {
- mManager.removeFragment(mRemoved.get(i), mTransition,
- mTransitionStyle);
+ Fragment f = mRemoved.get(i);
+ if (mAddToBackStack) {
+ f.mBackStackNesting++;
+ }
+ mManager.removeFragment(f, mTransition, mTransitionStyle);
}
}
if (mAdded != null) {
for (int i=mAdded.size()-1; i>=0; i--) {
Fragment f = mAdded.get(i);
- mManager.addFragment(f, false);
if (mAddToBackStack) {
f.mBackStackNesting++;
}
+ mManager.addFragment(f, false);
}
}
mManager.moveToState(mManager.mCurState, mTransition,
@@ -152,7 +154,11 @@
}
if (mRemoved != null) {
for (int i=mRemoved.size()-1; i>=0; i--) {
- mManager.addFragment(mRemoved.get(i), false);
+ Fragment f = mRemoved.get(i);
+ if (mAddToBackStack) {
+ f.mBackStackNesting--;
+ }
+ mManager.addFragment(f, false);
}
}
}
@@ -208,8 +214,7 @@
final int N = frags.size();
int[] ids = new int[N];
for (int i=0; i<N; i++) {
- FragmentState fs = fm.saveFragment(frags.get(i));
- ids[i] = fs.mSavedStateId;
+ ids[i] = frags.get(i).mIndex;
}
return ids;
}
@@ -219,7 +224,9 @@
final int N = states.length;
ArrayList<Fragment> frags = new ArrayList<Fragment>(N);
for (int i=0; i<N; i++) {
- frags.add(fm.mRestoredFragments.get(states[i]).instantiate(fm.mActivity));
+ Fragment f = fm.mActive.get(states[i]);
+ f.mBackStackNesting++;
+ frags.add(f);
}
return frags;
}
@@ -249,7 +256,7 @@
}
final class FragmentManagerState implements Parcelable {
- FragmentState[] mFragments;
+ FragmentState[] mActive;
int[] mAdded;
BackStackState[] mBackStack;
@@ -257,7 +264,7 @@
}
public FragmentManagerState(Parcel in) {
- mFragments = in.createTypedArray(FragmentState.CREATOR);
+ mActive = in.createTypedArray(FragmentState.CREATOR);
mAdded = in.createIntArray();
mBackStack = in.createTypedArray(BackStackState.CREATOR);
}
@@ -267,7 +274,7 @@
}
public void writeToParcel(Parcel dest, int flags) {
- dest.writeTypedArray(mFragments, flags);
+ dest.writeTypedArray(mActive, flags);
dest.writeIntArray(mAdded);
dest.writeTypedArray(mBackStack, flags);
}
@@ -289,18 +296,15 @@
* Container for fragments associated with an activity.
*/
public class FragmentManager {
- ArrayList<Fragment> mFragments;
+ ArrayList<Fragment> mActive;
+ ArrayList<Fragment> mAdded;
+ ArrayList<Integer> mAvailIndices;
ArrayList<BackStackEntry> mBackStack;
int mCurState = Fragment.INITIALIZING;
Activity mActivity;
- int mSaveStateSeq = 0;
-
// Temporary vars for state save and restore.
- int mCurSaveId = 0;
- HashMap<Fragment, FragmentState> mSavedFragments;
- SparseArray<FragmentState> mRestoredFragments;
Bundle mStateBundle = null;
SparseArray<Parcelable> mStateArray = null;
@@ -340,6 +344,11 @@
}
void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
+ // Fragments that are not currently added will sit in the onCreate() state.
+ if (!f.mAdded && newState > Fragment.CREATED) {
+ newState = Fragment.CREATED;
+ }
+
if (f.mState < newState) {
switch (f.mState) {
case Fragment.INITIALIZING:
@@ -366,9 +375,13 @@
// and the inflater will take care of adding it.
f.mView = f.onCreateView(mActivity.getLayoutInflater(),
null, f.mSavedFragmentState);
+ if (f.mView != null) {
+ f.mView.setSaveFromParentEnabled(false);
+ f.restoreViewState();
+ }
}
- case Fragment.CONTENT:
- if (newState > Fragment.CONTENT) {
+ case Fragment.CREATED:
+ if (newState > Fragment.CREATED) {
if (!f.mFromLayout) {
ViewGroup container = null;
if (f.mContainerId != 0) {
@@ -404,8 +417,8 @@
}
f.mSavedFragmentState = null;
}
- case Fragment.CREATED:
- if (newState > Fragment.CREATED) {
+ case Fragment.CONTENT:
+ if (newState > Fragment.CONTENT) {
f.mCalled = false;
f.onStart();
if (!f.mCalled) {
@@ -448,7 +461,7 @@
if (f.mView != null) {
// Need to save the current view state if not
// done already.
- if (!mActivity.isFinishing()) {
+ if (!mActivity.isFinishing() && f.mSavedFragmentState == null) {
saveFragmentViewState(f);
}
if (f.mContainer != null) {
@@ -504,34 +517,75 @@
}
mCurState = newState;
- if (mFragments != null) {
- for (int i=0; i<mFragments.size(); i++) {
- Fragment f = mFragments.get(i);
- moveToState(f, newState, transit, transitStyle);
+ if (mActive != null) {
+ for (int i=0; i<mActive.size(); i++) {
+ Fragment f = mActive.get(i);
+ if (f != null) {
+ moveToState(f, newState, transit, transitStyle);
+ }
}
}
}
- public void addFragment(Fragment fragment, boolean moveToStateNow) {
- if (mFragments == null) {
- mFragments = new ArrayList<Fragment>();
+ void makeActive(Fragment f) {
+ if (f.mIndex >= 0) {
+ return;
}
- mFragments.add(fragment);
+
+ if (mAvailIndices == null || mAvailIndices.size() <= 0) {
+ if (mActive == null) {
+ mActive = new ArrayList<Fragment>();
+ }
+ f.setIndex(mActive.size());
+ mActive.add(f);
+
+ } else {
+ f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1));
+ mActive.set(f.mIndex, f);
+ }
+ }
+
+ void makeInactive(Fragment f) {
+ if (f.mIndex < 0) {
+ return;
+ }
+
+ mActive.set(f.mIndex, null);
+ if (mAvailIndices == null) {
+ mAvailIndices = new ArrayList<Integer>();
+ }
+ mAvailIndices.add(f.mIndex);
+ f.clearIndex();
+ }
+
+ public void addFragment(Fragment fragment, boolean moveToStateNow) {
+ if (mAdded == null) {
+ mAdded = new ArrayList<Fragment>();
+ }
+ mAdded.add(fragment);
+ makeActive(fragment);
+ fragment.mAdded = true;
if (moveToStateNow) {
moveToState(fragment, mCurState, 0, 0);
}
}
public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
- mFragments.remove(fragment);
- moveToState(fragment, Fragment.INITIALIZING, transition, transitionStyle);
+ mAdded.remove(fragment);
+ final boolean inactive = fragment.mBackStackNesting <= 0;
+ if (inactive) {
+ makeInactive(fragment);
+ }
+ fragment.mAdded = false;
+ moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
+ transition, transitionStyle);
}
public Fragment findFragmentById(int id) {
- if (mFragments != null) {
- for (int i=mFragments.size()-1; i>=0; i--) {
- Fragment f = mFragments.get(i);
- if (f.mFragmentId == id) {
+ if (mActive != null) {
+ for (int i=mActive.size()-1; i>=0; i--) {
+ Fragment f = mActive.get(i);
+ if (f != null && f.mFragmentId == id) {
return f;
}
}
@@ -540,10 +594,22 @@
}
public Fragment findFragmentByTag(String tag) {
- if (mFragments != null && tag != null) {
- for (int i=mFragments.size()-1; i>=0; i--) {
- Fragment f = mFragments.get(i);
- if (tag.equals(f.mTag)) {
+ if (mActive != null && tag != null) {
+ for (int i=mActive.size()-1; i>=0; i--) {
+ Fragment f = mActive.get(i);
+ if (f != null && tag.equals(f.mTag)) {
+ return f;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Fragment findFragmentByWho(String who) {
+ if (mActive != null && who != null) {
+ for (int i=mActive.size()-1; i>=0; i--) {
+ Fragment f = mActive.get(i);
+ if (f != null && who.equals(f.mWho)) {
return f;
}
}
@@ -605,10 +671,10 @@
ArrayList<Fragment> retainNonConfig() {
ArrayList<Fragment> fragments = null;
- if (mFragments != null) {
- for (int i=0; i<mFragments.size(); i++) {
- Fragment f = mFragments.get(i);
- if (f.mBackStackNesting <= 0 && f.mRetainInstance && f.mTag != null) {
+ if (mActive != null) {
+ for (int i=0; i<mActive.size(); i++) {
+ Fragment f = mActive.get(i);
+ if (f != null && f.mRetainInstance) {
if (fragments == null) {
fragments = new ArrayList<Fragment>();
}
@@ -621,7 +687,7 @@
}
void saveFragmentViewState(Fragment f) {
- if (f.mSavedViewState != null) {
+ if (f.mView == null) {
return;
}
if (mStateArray == null) {
@@ -634,62 +700,59 @@
}
}
- FragmentState saveFragment(Fragment f) {
- if (mSavedFragments != null) {
- FragmentState fs = mSavedFragments.get(f);
- if (fs != null) {
- return fs;
- }
- } else {
- mSavedFragments = new HashMap<Fragment, FragmentState>();
- }
-
- f.mSavedStateSeq = mSaveStateSeq;
- f.mSavedStateId = ++mCurSaveId;
-
- FragmentState fs = new FragmentState(f);
- mSavedFragments.put(f, fs);
-
- if (mStateBundle == null) {
- mStateBundle = new Bundle();
- }
- f.onSaveInstanceState(mStateBundle);
- if (!mStateBundle.isEmpty()) {
- fs.mSavedFragmentState = mStateBundle;
- mStateBundle = null;
- }
-
- if (f.mView != null) {
- saveFragmentViewState(f);
- if (f.mSavedViewState != null) {
- if (fs.mSavedFragmentState == null) {
- fs.mSavedFragmentState = new Bundle();
- }
- fs.mSavedFragmentState.putSparseParcelableArray(
- FragmentState.VIEW_STATE_TAG, f.mSavedViewState);
- }
- }
-
- return fs;
- }
-
Parcelable saveAllState() {
- mSavedFragments = null;
- mSaveStateSeq++;
+ if (mActive == null || mActive.size() <= 0) {
+ return null;
+ }
- if (mFragments == null) {
+ // First collect all active fragments.
+ int N = mActive.size();
+ FragmentState[] active = new FragmentState[N];
+ boolean haveFragments = false;
+ for (int i=0; i<N; i++) {
+ Fragment f = mActive.get(i);
+ if (f != null) {
+ haveFragments = true;
+
+ FragmentState fs = new FragmentState(f);
+ active[i] = fs;
+
+ if (mStateBundle == null) {
+ mStateBundle = new Bundle();
+ }
+ f.onSaveInstanceState(mStateBundle);
+ if (!mStateBundle.isEmpty()) {
+ fs.mSavedFragmentState = mStateBundle;
+ mStateBundle = null;
+ }
+
+ if (f.mView != null) {
+ saveFragmentViewState(f);
+ if (f.mSavedViewState != null) {
+ if (fs.mSavedFragmentState == null) {
+ fs.mSavedFragmentState = new Bundle();
+ }
+ fs.mSavedFragmentState.putSparseParcelableArray(
+ FragmentState.VIEW_STATE_TAG, f.mSavedViewState);
+ }
+ }
+
+ }
+ }
+
+ if (!haveFragments) {
return null;
}
int[] added = null;
BackStackState[] backStack = null;
- // First collect all active fragments.
- int N = mFragments.size();
+ // Build list of currently added fragments.
+ N = mAdded.size();
if (N > 0) {
added = new int[N];
for (int i=0; i<N; i++) {
- added[i] = saveFragment(mFragments.get(i)).mSavedStateId;
+ added[i] = mAdded.get(i).mIndex;
}
}
@@ -704,21 +767,8 @@
}
}
- if (mSavedFragments == null) {
- return null;
- }
- N = mSavedFragments.size();
- if (N <= 0) {
- return null;
- }
-
FragmentManagerState fms = new FragmentManagerState();
- fms.mFragments = new FragmentState[N];
- int i = 0;
- for (FragmentState fs : mSavedFragments.values()) {
- fms.mFragments[i] = fs;
- i++;
- }
+ fms.mActive = active;
fms.mAdded = added;
fms.mBackStack = backStack;
return fms;
@@ -729,54 +779,69 @@
// any nonConfig fragments either, so that is that.
if (state == null) return;
FragmentManagerState fms = (FragmentManagerState)state;
- if (fms.mFragments == null) return;
+ if (fms.mActive == null) return;
- // First build our lookup table of all known Fragment objects.
- mRestoredFragments = new SparseArray<FragmentState>();
- for (int i=0; i<fms.mFragments.length; i++) {
- FragmentState fs = fms.mFragments[i];
- mRestoredFragments.put(fs.mSavedStateId, fs);
- }
-
- // Stick any non-config instances we are retaining directly
- // into the lookup table, so we don't try to instantiate them again.
+ // First re-attach any non-config instances we are retaining back
+ // to their saved state, so we don't try to instantiate them again.
if (nonConfig != null) {
for (int i=0; i<nonConfig.size(); i++) {
Fragment f = nonConfig.get(i);
- FragmentState fs = mRestoredFragments.get(f.mSavedStateId);
+ FragmentState fs = fms.mActive[f.mIndex];
fs.mInstance = f;
f.mSavedViewState = null;
+ f.mBackStackNesting = 0;
+ f.mAdded = false;
if (fs.mSavedFragmentState != null) {
f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
FragmentState.VIEW_STATE_TAG);
}
- addFragment(f, false);
}
}
- // Now build our data structures from the saved state, instantiating
- // the fragment objects as needed.
- if (fms.mAdded != null) {
- if (mFragments == null) {
- mFragments = new ArrayList<Fragment>(fms.mAdded.length);
- }
- for (int i=0; i<fms.mAdded.length; i++) {
- FragmentState fs = mRestoredFragments.get(fms.mAdded[i]);
- Fragment f = fs.instantiate(mActivity);
- // This will return null if this is a layout fragment,
- // since the instance for such a fragment will be created
- // later during layout inflation.
- if (f != null) {
- mFragments.add(f);
+ // Build the full list of active fragments, instantiating them from
+ // their saved state.
+ mActive = new ArrayList<Fragment>(fms.mActive.length);
+ if (mAvailIndices != null) {
+ mAvailIndices.clear();
+ }
+ for (int i=0; i<fms.mActive.length; i++) {
+ FragmentState fs = fms.mActive[i];
+ if (fs != null) {
+ mActive.add(fs.instantiate(mActivity));
+ } else {
+ mActive.add(null);
+ if (mAvailIndices == null) {
+ mAvailIndices = new ArrayList<Integer>();
}
+ mAvailIndices.add(i);
}
}
+
+ // Build the list of currently added fragments.
+ if (fms.mAdded != null) {
+ mAdded = new ArrayList<Fragment>(fms.mAdded.length);
+ for (int i=0; i<fms.mAdded.length; i++) {
+ Fragment f = mActive.get(fms.mAdded[i]);
+ if (f == null) {
+ throw new IllegalStateException(
+ "No instantiated fragment for index #" + fms.mAdded[i]);
+ }
+ f.mAdded = true;
+ mAdded.add(f);
+ }
+ } else {
+ mAdded = null;
+ }
+
+ // Build the back stack.
if (fms.mBackStack != null) {
mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length);
for (int i=0; i<fms.mBackStack.length; i++) {
BackStackEntry bse = fms.mBackStack[i].instantiate(this);
mBackStack.add(bse);
}
+ } else {
+ mBackStack = null;
}
}
@@ -802,7 +867,7 @@
}
public void dispatchStop() {
- moveToState(Fragment.CREATED, false);
+ moveToState(Fragment.CONTENT, false);
}
public void dispatchDestroy() {
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index cbb1c1a..4d5f36a 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1335,7 +1335,7 @@
* is being started.
* @param token Internal token identifying to the system who is starting
* the activity; may be null.
- * @param target Which activity is perform the start (and thus receiving
+ * @param target Which activity is performing the start (and thus receiving
* any result); may be null if this call is not being made
* from an activity.
* @param intent The actual Intent to start.
@@ -1385,6 +1385,64 @@
return null;
}
+ /**
+ * Like {@link #execStartActivity(Context, IBinder, IBinder, Activity, Intent, int)},
+ * but for calls from a {#link Fragment}.
+ *
+ * @param who The Context from which the activity is being started.
+ * @param contextThread The main thread of the Context from which the activity
+ * is being started.
+ * @param token Internal token identifying to the system who is starting
+ * the activity; may be null.
+ * @param target Which fragment is performing the start (and thus receiving
+ * any result).
+ * @param intent The actual Intent to start.
+ * @param requestCode Identifier for this request's result; less than zero
+ * if the caller is not expecting a result.
+ *
+ * @return To force the return of a particular result, return an
+ * ActivityResult object containing the desired data; otherwise
+ * return null. The default implementation always returns null.
+ *
+ * @throws android.content.ActivityNotFoundException
+ *
+ * @see Activity#startActivity(Intent)
+ * @see Activity#startActivityForResult(Intent, int)
+ * @see Activity#startActivityFromChild
+ *
+ * {@hide}
+ */
+ public ActivityResult execStartActivity(
+ Context who, IBinder contextThread, IBinder token, Fragment target,
+ Intent intent, int requestCode) {
+ IApplicationThread whoThread = (IApplicationThread) contextThread;
+ if (mActivityMonitors != null) {
+ synchronized (mSync) {
+ final int N = mActivityMonitors.size();
+ for (int i=0; i<N; i++) {
+ final ActivityMonitor am = mActivityMonitors.get(i);
+ if (am.match(who, null, intent)) {
+ am.mHits++;
+ if (am.isBlocking()) {
+ return requestCode >= 0 ? am.getResult() : null;
+ }
+ break;
+ }
+ }
+ }
+ }
+ try {
+ int result = ActivityManagerNative.getDefault()
+ .startActivity(whoThread, intent,
+ intent.resolveTypeIfNeeded(who.getContentResolver()),
+ null, 0, token, target != null ? target.mWho : null,
+ requestCode, false, false);
+ checkStartActivityResult(result, intent);
+ } catch (RemoteException e) {
+ }
+ return null;
+ }
+
/*package*/ final void init(ActivityThread thread,
Context instrContext, Context appContext, ComponentName component,
IInstrumentationWatcher watcher) {
diff --git a/core/java/android/app/LoaderManagingFragment.java b/core/java/android/app/LoaderManagingFragment.java
new file mode 100644
index 0000000..1659adf
--- /dev/null
+++ b/core/java/android/app/LoaderManagingFragment.java
@@ -0,0 +1,188 @@
+/*
+ * 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.app;
+
+import android.content.Loader;
+import android.os.Bundle;
+
+import java.util.HashMap;
+
+/**
+ * A Fragment that has utility methods for managing {@link Loader}s.
+ *
+ * @param <D> The type of data returned by the Loader. If you're using multiple Loaders with
+ * different return types use Object and case the results.
+ */
+public abstract class LoaderManagingFragment<D> extends Fragment
+ implements Loader.OnLoadCompleteListener<D> {
+ private boolean mStarted = false;
+
+ static final class LoaderInfo<D> {
+ public Bundle args;
+ public Loader<D> loader;
+ }
+ private HashMap<Integer, LoaderInfo<D>> mLoaders;
+ private HashMap<Integer, LoaderInfo<D>> mInactiveLoaders;
+
+ /**
+ * Registers a loader with this activity, registers the callbacks on it, and starts it loading.
+ * If a loader with the same id has previously been started it will automatically be destroyed
+ * when the new loader completes it's work. The callback will be delivered before the old loader
+ * is destroyed.
+ */
+ protected Loader<D> startLoading(int id, Bundle args) {
+ LoaderInfo<D> info = mLoaders.get(id);
+ if (info != null) {
+ // Keep track of the previous instance of this loader so we can destroy
+ // it when the new one completes.
+ mInactiveLoaders.put(id, info);
+ }
+ info = new LoaderInfo<D>();
+ info.args = args;
+ mLoaders.put(id, info);
+ Loader<D> loader = onCreateLoader(id, args);
+ info.loader = loader;
+ if (mStarted) {
+ // The activity will start all existing loaders in it's onStart(), so only start them
+ // here if we're past that point of the activitiy's life cycle
+ loader.registerListener(id, this);
+ loader.startLoading();
+ }
+ return loader;
+ }
+
+ protected abstract Loader<D> onCreateLoader(int id, Bundle args);
+ protected abstract void onInitializeLoaders();
+ protected abstract void onLoadFinished(Loader<D> loader, D data);
+
+ public final void onLoadComplete(Loader<D> loader, D data) {
+ // Notify of the new data so the app can switch out the old data before
+ // we try to destroy it.
+ onLoadFinished(loader, data);
+
+ // Look for an inactive loader and destroy it if found
+ int id = loader.getId();
+ LoaderInfo<D> info = mInactiveLoaders.get(id);
+ if (info != null) {
+ Loader<D> oldLoader = info.loader;
+ if (oldLoader != null) {
+ oldLoader.destroy();
+ }
+ mInactiveLoaders.remove(id);
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+
+ if (mLoaders == null) {
+ // Look for a passed along loader and create a new one if it's not there
+// TODO: uncomment once getLastNonConfigurationInstance method is available
+// mLoaders = (HashMap<Integer, LoaderInfo>) getLastNonConfigurationInstance();
+ if (mLoaders == null) {
+ mLoaders = new HashMap<Integer, LoaderInfo<D>>();
+ onInitializeLoaders();
+ }
+ }
+ if (mInactiveLoaders == null) {
+ mInactiveLoaders = new HashMap<Integer, LoaderInfo<D>>();
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ // Call out to sub classes so they can start their loaders
+ // Let the existing loaders know that we want to be notified when a load is complete
+ for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
+ LoaderInfo<D> info = entry.getValue();
+ Loader<D> loader = info.loader;
+ int id = entry.getKey();
+ if (loader == null) {
+ loader = onCreateLoader(id, info.args);
+ info.loader = loader;
+ }
+ loader.registerListener(id, this);
+ loader.startLoading();
+ }
+
+ mStarted = true;
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+
+ for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
+ LoaderInfo<D> info = entry.getValue();
+ Loader<D> loader = info.loader;
+ if (loader == null) {
+ continue;
+ }
+
+ // Let the loader know we're done with it
+ loader.unregisterListener(this);
+
+ // The loader isn't getting passed along to the next instance so ask it to stop loading
+ if (!getActivity().isChangingConfigurations()) {
+ loader.stopLoading();
+ }
+ }
+
+ mStarted = false;
+ }
+
+ /** TO DO: This needs to be turned into a retained fragment.
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ // Pass the loader along to the next guy
+ Object result = mLoaders;
+ mLoaders = null;
+ return result;
+ }
+ **/
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ if (mLoaders != null) {
+ for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
+ LoaderInfo<D> info = entry.getValue();
+ Loader<D> loader = info.loader;
+ if (loader == null) {
+ continue;
+ }
+ loader.destroy();
+ }
+ }
+ }
+
+ /**
+ * @return the Loader with the given id or null if no matching Loader
+ * is found.
+ */
+ public Loader<D> getLoader(int id) {
+ LoaderInfo<D> loaderInfo = mLoaders.get(id);
+ if (loaderInfo != null) {
+ return mLoaders.get(id).loader;
+ }
+ return null;
+ }
+}
diff --git a/core/java/android/app/NativeActivity.java b/core/java/android/app/NativeActivity.java
index 6318378..fd20b71 100644
--- a/core/java/android/app/NativeActivity.java
+++ b/core/java/android/app/NativeActivity.java
@@ -6,6 +6,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.view.SurfaceHolder;
import java.io.File;
@@ -13,7 +14,7 @@
* Convenience for implementing an activity that will be implemented
* purely in native code. That is, a game (or game-like thing).
*/
-public class NativeActivity extends Activity {
+public class NativeActivity extends Activity implements SurfaceHolder.Callback {
public static final String META_DATA_LIB_NAME = "android.app.lib_name";
private int mNativeHandle;
@@ -28,12 +29,18 @@
private native void onStopNative(int handle);
private native void onLowMemoryNative(int handle);
private native void onWindowFocusChangedNative(int handle, boolean focused);
+ private native void onSurfaceCreatedNative(int handle, SurfaceHolder holder);
+ private native void onSurfaceChangedNative(int handle, SurfaceHolder holder,
+ int format, int width, int height);
+ private native void onSurfaceDestroyedNative(int handle, SurfaceHolder holder);
@Override
protected void onCreate(Bundle savedInstanceState) {
String libname = "main";
ActivityInfo ai;
+ getWindow().takeSurface(this);
+
try {
ai = getPackageManager().getActivityInfo(
getIntent().getComponent(), PackageManager.GET_META_DATA);
@@ -79,12 +86,6 @@
}
@Override
- public void onLowMemory() {
- super.onLowMemory();
- onLowMemoryNative(mNativeHandle);
- }
-
- @Override
protected void onPause() {
super.onPause();
onPauseNative(mNativeHandle);
@@ -115,8 +116,26 @@
}
@Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ onLowMemoryNative(mNativeHandle);
+ }
+
+ @Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
onWindowFocusChangedNative(mNativeHandle, hasFocus);
}
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ onSurfaceCreatedNative(mNativeHandle, holder);
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ onSurfaceChangedNative(mNativeHandle, holder, format, width, height);
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ onSurfaceDestroyedNative(mNativeHandle, holder);
+ }
}
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 5245da5..cb4e0e78 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -162,9 +162,10 @@
* file descriptor pointing to a full snapshot of the
* application's data. The application should consume every
* entity represented in this data stream.
- * @param appVersionCode The
- * {@link android.R.styleable#AndroidManifest_versionCode android:versionCode}
- * value of the application that backed up this particular data set. This
+ * @param appVersionCode The value of the <a
+ * href="{@docRoot}guide/topics/manifest/manifest-element.html#vcode">{@code
+ * android:versionCode}</a> manifest attribute,
+ * from the application that backed up this particular data set. This
* makes it possible for an application's agent to distinguish among any
* possible older data versions when asked to perform the restore
* operation.
diff --git a/core/java/android/app/backup/package.html b/core/java/android/app/backup/package.html
index e2518ec..ae29994 100644
--- a/core/java/android/app/backup/package.html
+++ b/core/java/android/app/backup/package.html
@@ -2,23 +2,28 @@
<BODY>
<p>Contains the backup and restore functionality available to
applications. If a user wipes the data on their device or upgrades to a new Android-powered
-device, all applications that have enabled backup will restore the user's previous data and/or
-preferences. {@more} All backup management is controlled through
-{@link android.app.backup.BackupManager}. Individual backup functionality is
-implemented through a subclass {@link android.app.backup.BackupAgent} and a
-simple and easy-to-use implementation is provided in
-{@link android.app.backup.BackupAgentHelper}.</p>
+device, all applications that have enabled backup will restore the user's previous data.</p>
+{@more}
-<p>STOPSHIP: add more documentation and remove Dev Guide link if not written!</p>
+<p>All backup and restore operations are controlled by the {@link
+android.app.backup.BackupManager}. Each application that would
+like to enable backup and preserve its data on remote strage must implement a
+backup agent. A backup agent can be built by extending either {@link android.app.backup.BackupAgent}
+or {@link android.app.backup.BackupAgentHelper}. The {@link
+android.app.backup.BackupAgentHelper} class provides a wrapper around {@link
+android.app.backup.BackupAgent} that simplifies the procedures to implement a backup agent by
+employing backup helpers such as {@link android.app.backup.SharedPreferencesBackupHelper} and
+{@link android.app.backup.FileBackupHelper}.</p>
<p>The backup APIs let applications:</p>
<ul>
- <li>Perform backup of arbitrary data</li>
- <li>Easily perform backup of Preferences and files</li>
- <li>Handle restore of data</li>
+ <li>Perform backup of arbitrary data to remote storage</li>
+ <li>Easily perform backup of {@link android.content.SharedPreferences} and files</li>
+ <li>Restore the data saved to remote storage</li>
</ul>
<p>For a detailed guide to using the backup APIs, see the <a
-href="{@docRoot}guide/topics/backup.html">Backup Dev Guide topic</a>.</p>
+href="{@docRoot}guide/topics/data/backup.html">Data Backup</a> developer guide.</p>
+
</BODY>
</HTML>
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 42d87f4..8eda844 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -63,7 +63,7 @@
*/
public final class BluetoothAdapter {
private static final String TAG = "BluetoothAdapter";
- private static final boolean DBG = true; //STOPSHIP: Remove excess logging
+ private static final boolean DBG = false;
/**
* Sentinel error value for this class. Guaranteed to not equal any other
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
new file mode 100644
index 0000000..f43921fa
--- /dev/null
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -0,0 +1,88 @@
+/*
+ * 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.content;
+
+import android.os.AsyncTask;
+
+/**
+ * Abstract Loader that provides an {@link AsyncTask} to do the work.
+ *
+ * @param <D> the data type to be loaded.
+ */
+public abstract class AsyncTaskLoader<D> extends Loader<D> {
+ final class LoadTask extends AsyncTask<Void, Void, D> {
+ /* Runs on a worker thread */
+ @Override
+ protected D doInBackground(Void... params) {
+ return AsyncTaskLoader.this.loadInBackground();
+ }
+
+ /* Runs on the UI thread */
+ @Override
+ protected void onPostExecute(D data) {
+ AsyncTaskLoader.this.dispatchOnLoadComplete(data);
+ }
+ }
+
+ LoadTask mTask;
+
+ public AsyncTaskLoader(Context context) {
+ super(context);
+ }
+
+ /**
+ * Force an asynchronous load. Unlike {@link #startLoading()} this will ignore a previously
+ * loaded data set and load a new one.
+ */
+ @Override
+ public void forceLoad() {
+ mTask = new LoadTask();
+ mTask.execute((Void[]) null);
+ }
+
+ /**
+ * Attempt to cancel the current load task. See {@link AsyncTask#cancel(boolean)}
+ * for more info.
+ *
+ * @return <tt>false</tt> if the task could not be canceled,
+ * typically because it has already completed normally, or
+ * because {@link #startLoading()} hasn't been called, and
+ * <tt>true</tt> otherwise
+ */
+ public boolean cancelLoad() {
+ if (mTask != null) {
+ return mTask.cancel(false);
+ }
+ return false;
+ }
+
+ void dispatchOnLoadComplete(D data) {
+ mTask = null;
+ deliverResult(data);
+ }
+
+ /**
+ * Called on a worker thread to perform the actual load. Implementations should not deliver the
+ * results directly, but should return them from this method, which will eventually end up
+ * calling deliverResult on the UI thread. If implementations need to process
+ * the results on the UI thread they may override deliverResult and do so
+ * there.
+ *
+ * @return the result of the load
+ */
+ public abstract D loadInBackground();
+}
diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java
index 377e383..fc2dfc0 100644
--- a/core/java/android/content/ContentService.java
+++ b/core/java/android/content/ContentService.java
@@ -537,6 +537,9 @@
// Look to see if the proper child already exists
String segment = getUriSegment(uri, index);
+ if (segment == null) {
+ throw new IllegalArgumentException("Invalid Uri (" + uri + ") used for observer");
+ }
int N = mChildren.size();
for (int i = 0; i < N; i++) {
ObserverNode node = mChildren.get(i);
diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java
new file mode 100644
index 0000000..e1f9dca
--- /dev/null
+++ b/core/java/android/content/CursorLoader.java
@@ -0,0 +1,151 @@
+/*
+ * 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.content;
+
+import android.database.Cursor;
+import android.net.Uri;
+
+/**
+ * A loader that queries the {@link ContentResolver} and returns a {@link Cursor}.
+ */
+public class CursorLoader extends AsyncTaskLoader<Cursor> {
+ Cursor mCursor;
+ ForceLoadContentObserver mObserver;
+ boolean mStopped;
+ Uri mUri;
+ String[] mProjection;
+ String mSelection;
+ String[] mSelectionArgs;
+ String mSortOrder;
+
+ /* Runs on a worker thread */
+ @Override
+ public Cursor loadInBackground() {
+ Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection,
+ mSelectionArgs, mSortOrder);
+ // Ensure the cursor window is filled
+ if (cursor != null) {
+ cursor.getCount();
+ cursor.registerContentObserver(mObserver);
+ }
+ return cursor;
+ }
+
+ /* Runs on the UI thread */
+ @Override
+ public void deliverResult(Cursor cursor) {
+ if (mStopped) {
+ // An async query came in while the loader is stopped
+ cursor.close();
+ return;
+ }
+ mCursor = cursor;
+ super.deliverResult(cursor);
+ }
+
+ public CursorLoader(Context context, Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ super(context);
+ mObserver = new ForceLoadContentObserver();
+ mUri = uri;
+ mProjection = projection;
+ mSelection = selection;
+ mSelectionArgs = selectionArgs;
+ mSortOrder = sortOrder;
+ }
+
+ /**
+ * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
+ * will be called on the UI thread. If a previous load has been completed and is still valid
+ * the result may be passed to the callbacks immediately.
+ *
+ * Must be called from the UI thread
+ */
+ @Override
+ public void startLoading() {
+ mStopped = false;
+
+ if (mCursor != null) {
+ deliverResult(mCursor);
+ } else {
+ forceLoad();
+ }
+ }
+
+ /**
+ * Must be called from the UI thread
+ */
+ @Override
+ public void stopLoading() {
+ if (mCursor != null && !mCursor.isClosed()) {
+ mCursor.close();
+ mCursor = null;
+ }
+
+ // Attempt to cancel the current load task if possible.
+ cancelLoad();
+
+ // Make sure that any outstanding loads clean themselves up properly
+ mStopped = true;
+ }
+
+ @Override
+ public void destroy() {
+ // Ensure the loader is stopped
+ stopLoading();
+ }
+
+ public Uri getUri() {
+ return mUri;
+ }
+
+ public void setUri(Uri uri) {
+ mUri = uri;
+ }
+
+ public String[] getProjection() {
+ return mProjection;
+ }
+
+ public void setProjection(String[] projection) {
+ mProjection = projection;
+ }
+
+ public String getSelection() {
+ return mSelection;
+ }
+
+ public void setSelection(String selection) {
+ mSelection = selection;
+ }
+
+ public String[] getSelectionArgs() {
+ return mSelectionArgs;
+ }
+
+ public void setSelectionArgs(String[] selectionArgs) {
+ mSelectionArgs = selectionArgs;
+ }
+
+ public String getSortOrder() {
+ return mSortOrder;
+ }
+
+ public void setSortOrder(String sortOrder) {
+ mSortOrder = sortOrder;
+ }
+}
diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java
new file mode 100644
index 0000000..db40e48
--- /dev/null
+++ b/core/java/android/content/Loader.java
@@ -0,0 +1,154 @@
+/*
+ * 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.content;
+
+import android.database.ContentObserver;
+import android.os.Handler;
+
+/**
+ * An abstract class that performs asynchronous loading of data. While Loaders are active
+ * they should monitor the source of their data and deliver new results when the contents
+ * change.
+ *
+ * @param <D> The result returned when the load is complete
+ */
+public abstract class Loader<D> {
+ int mId;
+ OnLoadCompleteListener<D> mListener;
+ Context mContext;
+
+ public final class ForceLoadContentObserver extends ContentObserver {
+ public ForceLoadContentObserver() {
+ super(new Handler());
+ }
+
+ @Override
+ public boolean deliverSelfNotifications() {
+ return true;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ forceLoad();
+ }
+ }
+
+ public interface OnLoadCompleteListener<D> {
+ /**
+ * Called on the thread that created the Loader when the load is complete.
+ *
+ * @param loader the loader that completed the load
+ * @param data the result of the load
+ */
+ public void onLoadComplete(Loader<D> loader, D data);
+ }
+
+ /**
+ * Stores away the application context associated with context. Since Loaders can be used
+ * across multiple activities it's dangerous to store the context directly.
+ *
+ * @param context used to retrieve the application context.
+ */
+ public Loader(Context context) {
+ mContext = context.getApplicationContext();
+ }
+
+ /**
+ * Sends the result of the load to the registered listener. Should only be called by subclasses.
+ *
+ * Must be called from the UI thread.
+ *
+ * @param data the result of the load
+ */
+ public void deliverResult(D data) {
+ if (mListener != null) {
+ mListener.onLoadComplete(this, data);
+ }
+ }
+
+ /**
+ * @return an application context retrieved from the Context passed to the constructor.
+ */
+ public Context getContext() {
+ return mContext;
+ }
+
+ /**
+ * @return the ID of this loader
+ */
+ public int getId() {
+ return mId;
+ }
+
+ /**
+ * Registers a class that will receive callbacks when a load is complete. The callbacks will
+ * be called on the UI thread so it's safe to pass the results to widgets.
+ *
+ * Must be called from the UI thread
+ */
+ public void registerListener(int id, OnLoadCompleteListener<D> listener) {
+ if (mListener != null) {
+ throw new IllegalStateException("There is already a listener registered");
+ }
+ mListener = listener;
+ mId = id;
+ }
+
+ /**
+ * Must be called from the UI thread
+ */
+ public void unregisterListener(OnLoadCompleteListener<D> listener) {
+ if (mListener == null) {
+ throw new IllegalStateException("No listener register");
+ }
+ if (mListener != listener) {
+ throw new IllegalArgumentException("Attempting to unregister the wrong listener");
+ }
+ mListener = null;
+ }
+
+ /**
+ * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
+ * will be called on the UI thread. If a previous load has been completed and is still valid
+ * the result may be passed to the callbacks immediately. The loader will monitor the source of
+ * the data set and may deliver future callbacks if the source changes. Calling
+ * {@link #stopLoading} will stop the delivery of callbacks.
+ *
+ * Must be called from the UI thread
+ */
+ public abstract void startLoading();
+
+ /**
+ * Force an asynchronous load. Unlike {@link #startLoading()} this will ignore a previously
+ * loaded data set and load a new one.
+ */
+ public abstract void forceLoad();
+
+ /**
+ * Stops delivery of updates until the next time {@link #startLoading()} is called
+ *
+ * Must be called from the UI thread
+ */
+ public abstract void stopLoading();
+
+ /**
+ * Destroys the loader and frees its resources, making it unusable.
+ *
+ * Must be called from the UI thread
+ */
+ public abstract void destroy();
+}
\ No newline at end of file
diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java
index 541f91a2..6170bae 100644
--- a/core/java/android/database/AbstractCursor.java
+++ b/core/java/android/database/AbstractCursor.java
@@ -104,22 +104,6 @@
}
/**
- * @hide
- * @deprecated
- */
- public boolean commitUpdates(Map<? extends Long,? extends Map<String,Object>> values) {
- return false;
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean deleteRow() {
- return false;
- }
-
- /**
* This function is called every time the cursor is successfully scrolled
* to a new position, giving the subclass a chance to update any state it
* may have. If it returns false the move function will also do so and the
@@ -315,137 +299,6 @@
return getColumnNames()[columnIndex];
}
- /**
- * @hide
- * @deprecated
- */
- public boolean updateBlob(int columnIndex, byte[] value) {
- return update(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateString(int columnIndex, String value) {
- return update(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateShort(int columnIndex, short value) {
- return update(columnIndex, Short.valueOf(value));
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateInt(int columnIndex, int value) {
- return update(columnIndex, Integer.valueOf(value));
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateLong(int columnIndex, long value) {
- return update(columnIndex, Long.valueOf(value));
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateFloat(int columnIndex, float value) {
- return update(columnIndex, Float.valueOf(value));
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateDouble(int columnIndex, double value) {
- return update(columnIndex, Double.valueOf(value));
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateToNull(int columnIndex) {
- return update(columnIndex, null);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean update(int columnIndex, Object obj) {
- if (!supportsUpdates()) {
- return false;
- }
-
- // Long.valueOf() returns null sometimes!
-// Long rowid = Long.valueOf(getLong(mRowIdColumnIndex));
- Long rowid = new Long(getLong(mRowIdColumnIndex));
- if (rowid == null) {
- throw new IllegalStateException("null rowid. mRowIdColumnIndex = " + mRowIdColumnIndex);
- }
-
- synchronized(mUpdatedRows) {
- Map<String, Object> row = mUpdatedRows.get(rowid);
- if (row == null) {
- row = new HashMap<String, Object>();
- mUpdatedRows.put(rowid, row);
- }
- row.put(getColumnNames()[columnIndex], obj);
- }
-
- return true;
- }
-
- /**
- * Returns <code>true</code> if there are pending updates that have not yet been committed.
- *
- * @return <code>true</code> if there are pending updates that have not yet been committed.
- * @hide
- * @deprecated
- */
- public boolean hasUpdates() {
- synchronized(mUpdatedRows) {
- return mUpdatedRows.size() > 0;
- }
- }
-
- /**
- * @hide
- * @deprecated
- */
- public void abortUpdates() {
- synchronized(mUpdatedRows) {
- mUpdatedRows.clear();
- }
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean commitUpdates() {
- return commitUpdates(null);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean supportsUpdates() {
- return mRowIdColumnIndex != -1;
- }
-
public void registerContentObserver(ContentObserver observer) {
mContentObservable.registerObserver(observer);
}
diff --git a/core/java/android/database/BulkCursorNative.java b/core/java/android/database/BulkCursorNative.java
index baa94d8..fa62d69 100644
--- a/core/java/android/database/BulkCursorNative.java
+++ b/core/java/android/database/BulkCursorNative.java
@@ -17,13 +17,10 @@
package android.database;
import android.os.Binder;
-import android.os.RemoteException;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
-import android.os.Bundle;
-
-import java.util.HashMap;
-import java.util.Map;
+import android.os.RemoteException;
/**
* Native implementation of the bulk cursor. This is only for use in implementing
@@ -120,26 +117,6 @@
return true;
}
- case UPDATE_ROWS_TRANSACTION: {
- data.enforceInterface(IBulkCursor.descriptor);
- // TODO - what ClassLoader should be passed to readHashMap?
- // TODO - switch to Bundle
- HashMap<Long, Map<String, Object>> values = data.readHashMap(null);
- boolean result = updateRows(values);
- reply.writeNoException();
- reply.writeInt((result == true ? 1 : 0));
- return true;
- }
-
- case DELETE_ROW_TRANSACTION: {
- data.enforceInterface(IBulkCursor.descriptor);
- int position = data.readInt();
- boolean result = deleteRow(position);
- reply.writeNoException();
- reply.writeInt((result == true ? 1 : 0));
- return true;
- }
-
case ON_MOVE_TRANSACTION: {
data.enforceInterface(IBulkCursor.descriptor);
int position = data.readInt();
@@ -343,48 +320,6 @@
return count;
}
- public boolean updateRows(Map values) throws RemoteException
- {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
-
- data.writeInterfaceToken(IBulkCursor.descriptor);
-
- data.writeMap(values);
-
- mRemote.transact(UPDATE_ROWS_TRANSACTION, data, reply, 0);
-
- DatabaseUtils.readExceptionFromParcel(reply);
-
- boolean result = (reply.readInt() == 1 ? true : false);
-
- data.recycle();
- reply.recycle();
-
- return result;
- }
-
- public boolean deleteRow(int position) throws RemoteException
- {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
-
- data.writeInterfaceToken(IBulkCursor.descriptor);
-
- data.writeInt(position);
-
- mRemote.transact(DELETE_ROW_TRANSACTION, data, reply, 0);
-
- DatabaseUtils.readExceptionFromParcel(reply);
-
- boolean result = (reply.readInt() == 1 ? true : false);
-
- data.recycle();
- reply.recycle();
-
- return result;
- }
-
public boolean getWantsAllOnMoveCalls() throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
diff --git a/core/java/android/database/BulkCursorToCursorAdaptor.java b/core/java/android/database/BulkCursorToCursorAdaptor.java
index 1469ea2..2cb2aec 100644
--- a/core/java/android/database/BulkCursorToCursorAdaptor.java
+++ b/core/java/android/database/BulkCursorToCursorAdaptor.java
@@ -16,12 +16,10 @@
package android.database;
-import android.os.RemoteException;
import android.os.Bundle;
+import android.os.RemoteException;
import android.util.Log;
-import java.util.Map;
-
/**
* Adapts an {@link IBulkCursor} to a {@link Cursor} for use in the local
* process.
@@ -174,38 +172,6 @@
}
}
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean deleteRow() {
- try {
- boolean result = mBulkCursor.deleteRow(mPos);
- if (result != false) {
- // The window contains the old value, discard it
- mWindow = null;
-
- // Fix up the position
- mCount = mBulkCursor.count();
- if (mPos < mCount) {
- int oldPos = mPos;
- mPos = -1;
- moveToPosition(oldPos);
- } else {
- mPos = mCount;
- }
-
- // Send the change notification
- onChange(true);
- }
- return result;
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to delete row because the remote process is dead");
- return false;
- }
- }
-
@Override
public String[] getColumnNames() {
if (mColumns == null) {
@@ -219,44 +185,6 @@
return mColumns;
}
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean commitUpdates(Map<? extends Long,
- ? extends Map<String,Object>> additionalValues) {
- if (!supportsUpdates()) {
- Log.e(TAG, "commitUpdates not supported on this cursor, did you include the _id column?");
- return false;
- }
-
- synchronized(mUpdatedRows) {
- if (additionalValues != null) {
- mUpdatedRows.putAll(additionalValues);
- }
-
- if (mUpdatedRows.size() <= 0) {
- return false;
- }
-
- try {
- boolean result = mBulkCursor.updateRows(mUpdatedRows);
-
- if (result == true) {
- mUpdatedRows.clear();
-
- // Send the change notification
- onChange(true);
- }
- return result;
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to commit updates because the remote process is dead");
- return false;
- }
- }
- }
-
@Override
public Bundle getExtras() {
try {
diff --git a/core/java/android/database/Cursor.java b/core/java/android/database/Cursor.java
index 7a2546d..fee658a 100644
--- a/core/java/android/database/Cursor.java
+++ b/core/java/android/database/Cursor.java
@@ -146,22 +146,6 @@
boolean isAfterLast();
/**
- * Removes the row at the current cursor position from the underlying data
- * store. After this method returns the cursor will be pointing to the row
- * after the row that is deleted. This has the side effect of decrementing
- * the result of count() by one.
- * <p>
- * The query must have the row ID column in its selection, otherwise this
- * call will fail.
- *
- * @hide
- * @return whether the record was successfully deleted.
- * @deprecated use {@link ContentResolver#delete(Uri, String, String[])}
- */
- @Deprecated
- boolean deleteRow();
-
- /**
* Returns the zero-based index for the given column name, or -1 if the column doesn't exist.
* If you expect the column to exist use {@link #getColumnIndexOrThrow(String)} instead, which
* will make the error more clear.
@@ -303,188 +287,6 @@
boolean isNull(int columnIndex);
/**
- * Returns <code>true</code> if the cursor supports updates.
- *
- * @return whether the cursor supports updates.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean supportsUpdates();
-
- /**
- * Returns <code>true</code> if there are pending updates that have not yet been committed.
- *
- * @return <code>true</code> if there are pending updates that have not yet been committed.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean hasUpdates();
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateBlob(int columnIndex, byte[] value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateString(int columnIndex, String value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateShort(int columnIndex, short value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateInt(int columnIndex, int value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateLong(int columnIndex, long value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateFloat(int columnIndex, float value);
-
- /**
- * Updates the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @param value the new value.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateDouble(int columnIndex, double value);
-
- /**
- * Removes the value for the given column in the row the cursor is
- * currently pointing at. Updates are not committed to the backing store
- * until {@link #commitUpdates()} is called.
- *
- * @param columnIndex the zero-based index of the target column.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean updateToNull(int columnIndex);
-
- /**
- * Atomically commits all updates to the backing store. After completion,
- * this method leaves the data in an inconsistent state and you should call
- * {@link #requery} before reading data from the cursor again.
- *
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean commitUpdates();
-
- /**
- * Atomically commits all updates to the backing store, as well as the
- * updates included in values. After completion,
- * this method leaves the data in an inconsistent state and you should call
- * {@link #requery} before reading data from the cursor again.
- *
- * @param values A map from row IDs to Maps associating column names with
- * updated values. A null value indicates the field should be
- removed.
- * @return whether the operation succeeded.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- boolean commitUpdates(Map<? extends Long,
- ? extends Map<String,Object>> values);
-
- /**
- * Reverts all updates made to the cursor since the last call to
- * commitUpdates.
- * @hide
- * @deprecated use the {@link ContentResolver} update methods instead of the Cursor
- * update methods
- */
- @Deprecated
- void abortUpdates();
-
- /**
* Deactivates the Cursor, making all calls on it fail until {@link #requery} is called.
* Inactive Cursors use fewer resources than active Cursors.
* Calling {@link #requery} will make the cursor active again.
diff --git a/core/java/android/database/CursorToBulkCursorAdaptor.java b/core/java/android/database/CursorToBulkCursorAdaptor.java
index 748eb99..8bc7de2 100644
--- a/core/java/android/database/CursorToBulkCursorAdaptor.java
+++ b/core/java/android/database/CursorToBulkCursorAdaptor.java
@@ -16,16 +16,12 @@
package android.database;
-import android.database.sqlite.SQLiteMisuseException;
-import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Config;
import android.util.Log;
-import java.util.Map;
-
/**
* Wraps a BulkCursor around an existing Cursor making it remotable.
@@ -38,7 +34,6 @@
private final CrossProcessCursor mCursor;
private CursorWindow mWindow;
private final String mProviderName;
- private final boolean mReadOnly;
private ContentObserverProxy mObserver;
private static final class ContentObserverProxy extends ContentObserver
@@ -98,7 +93,6 @@
"Only CrossProcessCursor cursors are supported across process for now", e);
}
mProviderName = providerName;
- mReadOnly = !allowWrite;
createAndRegisterObserverProxy(observer);
}
@@ -197,31 +191,6 @@
}
}
- public boolean updateRows(Map<? extends Long, ? extends Map<String, Object>> values) {
- if (mReadOnly) {
- Log.w("ContentProvider", "Permission Denial: modifying "
- + mProviderName
- + " from pid=" + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid());
- return false;
- }
- return mCursor.commitUpdates(values);
- }
-
- public boolean deleteRow(int position) {
- if (mReadOnly) {
- Log.w("ContentProvider", "Permission Denial: modifying "
- + mProviderName
- + " from pid=" + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid());
- return false;
- }
- if (mCursor.moveToPosition(position) == false) {
- return false;
- }
- return mCursor.deleteRow();
- }
-
public Bundle getExtras() {
return mCursor.getExtras();
}
diff --git a/core/java/android/database/CursorWrapper.java b/core/java/android/database/CursorWrapper.java
index f0aa7d7..633b2b3 100644
--- a/core/java/android/database/CursorWrapper.java
+++ b/core/java/android/database/CursorWrapper.java
@@ -32,14 +32,6 @@
public CursorWrapper(Cursor cursor) {
mCursor = cursor;
}
-
- /**
- * @hide
- * @deprecated
- */
- public void abortUpdates() {
- mCursor.abortUpdates();
- }
public void close() {
mCursor.close();
@@ -49,23 +41,6 @@
return mCursor.isClosed();
}
- /**
- * @hide
- * @deprecated
- */
- public boolean commitUpdates() {
- return mCursor.commitUpdates();
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean commitUpdates(
- Map<? extends Long, ? extends Map<String, Object>> values) {
- return mCursor.commitUpdates(values);
- }
-
public int getCount() {
return mCursor.getCount();
}
@@ -74,14 +49,6 @@
mCursor.deactivate();
}
- /**
- * @hide
- * @deprecated
- */
- public boolean deleteRow() {
- return mCursor.deleteRow();
- }
-
public boolean moveToFirst() {
return mCursor.moveToFirst();
}
@@ -147,14 +114,6 @@
return mCursor.getWantsAllOnMoveCalls();
}
- /**
- * @hide
- * @deprecated
- */
- public boolean hasUpdates() {
- return mCursor.hasUpdates();
- }
-
public boolean isAfterLast() {
return mCursor.isAfterLast();
}
@@ -219,14 +178,6 @@
mCursor.setNotificationUri(cr, uri);
}
- /**
- * @hide
- * @deprecated
- */
- public boolean supportsUpdates() {
- return mCursor.supportsUpdates();
- }
-
public void unregisterContentObserver(ContentObserver observer) {
mCursor.unregisterContentObserver(observer);
}
@@ -235,71 +186,6 @@
mCursor.unregisterDataSetObserver(observer);
}
- /**
- * @hide
- * @deprecated
- */
- public boolean updateDouble(int columnIndex, double value) {
- return mCursor.updateDouble(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateFloat(int columnIndex, float value) {
- return mCursor.updateFloat(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateInt(int columnIndex, int value) {
- return mCursor.updateInt(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateLong(int columnIndex, long value) {
- return mCursor.updateLong(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateShort(int columnIndex, short value) {
- return mCursor.updateShort(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateString(int columnIndex, String value) {
- return mCursor.updateString(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateBlob(int columnIndex, byte[] value) {
- return mCursor.updateBlob(columnIndex, value);
- }
-
- /**
- * @hide
- * @deprecated
- */
- public boolean updateToNull(int columnIndex) {
- return mCursor.updateToNull(columnIndex);
- }
-
- private Cursor mCursor;
-
+ private Cursor mCursor;
}
diff --git a/core/java/android/database/DefaultDatabaseErrorHandler.java b/core/java/android/database/DefaultDatabaseErrorHandler.java
index 98aa54a..0bad37a 100644
--- a/core/java/android/database/DefaultDatabaseErrorHandler.java
+++ b/core/java/android/database/DefaultDatabaseErrorHandler.java
@@ -16,6 +16,7 @@
package android.database;
import java.io.File;
+import java.util.ArrayList;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@@ -46,7 +47,7 @@
// make the application crash on database open operation. To avoid this problem,
// the application should provide its own {@link DatabaseErrorHandler} impl class
// to delete ALL files of the database (including the attached databases).
- if (!dbObj.getPath().equalsIgnoreCase(":memory")) {
+ if (!dbObj.getPath().equalsIgnoreCase(":memory:")) {
// not memory database.
try {
new File(dbObj.getPath()).delete();
@@ -57,8 +58,11 @@
return;
}
+ ArrayList<Pair<String, String>> attachedDbs = null;
try {
// Close the database, which will cause subsequent operations to fail.
+ // before that, get the attached database list first.
+ attachedDbs = dbObj.getAttachedDbs();
try {
dbObj.close();
} catch (SQLiteException e) {
@@ -66,10 +70,13 @@
}
} finally {
// Delete all files of this corrupt database and/or attached databases
- for (Pair<String, String> p : dbObj.getAttachedDbs()) {
- Log.e(TAG, "deleting the database file: " + p.second);
- if (!p.second.equalsIgnoreCase(":memory:")) {
+ if (attachedDbs != null) {
+ for (Pair<String, String> p : attachedDbs) {
// delete file if it is a non-memory database file
+ if (p.second.equalsIgnoreCase(":memory:") || p.second.trim().length() == 0) {
+ continue;
+ }
+ Log.e(TAG, "deleting the database file: " + p.second);
try {
new File(p.second).delete();
} catch (Exception e) {
diff --git a/core/java/android/database/IBulkCursor.java b/core/java/android/database/IBulkCursor.java
index 46790a3..244c88f 100644
--- a/core/java/android/database/IBulkCursor.java
+++ b/core/java/android/database/IBulkCursor.java
@@ -16,16 +16,14 @@
package android.database;
-import android.os.RemoteException;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.IInterface;
-import android.os.Bundle;
-
-import java.util.Map;
+import android.os.RemoteException;
/**
* This interface provides a low-level way to pass bulk cursor data across
- * both process and language boundries. Application code should use the Cursor
+ * both process and language boundaries. Application code should use the Cursor
* interface directly.
*
* {@hide}
@@ -54,10 +52,6 @@
*/
public String[] getColumnNames() throws RemoteException;
- public boolean updateRows(Map<? extends Long, ? extends Map<String, Object>> values) throws RemoteException;
-
- public boolean deleteRow(int position) throws RemoteException;
-
public void deactivate() throws RemoteException;
public void close() throws RemoteException;
@@ -76,8 +70,6 @@
static final int GET_CURSOR_WINDOW_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
static final int COUNT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 1;
static final int GET_COLUMN_NAMES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 2;
- static final int UPDATE_ROWS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 3;
- static final int DELETE_ROW_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 4;
static final int DEACTIVATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 5;
static final int REQUERY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 6;
static final int ON_MOVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 7;
diff --git a/core/java/android/database/MergeCursor.java b/core/java/android/database/MergeCursor.java
index 722d707..cb6d7ac 100644
--- a/core/java/android/database/MergeCursor.java
+++ b/core/java/android/database/MergeCursor.java
@@ -92,32 +92,6 @@
return false;
}
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean deleteRow()
- {
- return mCursor.deleteRow();
- }
-
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean commitUpdates() {
- int length = mCursors.length;
- for (int i = 0 ; i < length ; i++) {
- if (mCursors[i] != null) {
- mCursors[i].commitUpdates();
- }
- }
- onChange(true);
- return true;
- }
-
@Override
public String getString(int column)
{
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index f3382dc..eecd01e 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -21,17 +21,14 @@
import android.database.CursorWindow;
import android.database.DataSetObserver;
import android.database.RequeryOnUiThreadException;
-import android.database.SQLException;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
-import android.text.TextUtils;
import android.util.Config;
import android.util.Log;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
@@ -328,166 +325,11 @@
}
}
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean deleteRow() {
- checkPosition();
-
- // Only allow deletes if there is an ID column, and the ID has been read from it
- if (mRowIdColumnIndex == -1 || mCurrentRowID == null) {
- Log.e(TAG,
- "Could not delete row because either the row ID column is not available or it" +
- "has not been read.");
- return false;
- }
-
- boolean success;
-
- /*
- * Ensure we don't change the state of the database when another
- * thread is holding the database lock. requery() and moveTo() are also
- * synchronized here to make sure they get the state of the database
- * immediately following the DELETE.
- */
- mDatabase.lock();
- try {
- try {
- mDatabase.delete(mEditTable, mColumns[mRowIdColumnIndex] + "=?",
- new String[] {mCurrentRowID.toString()});
- success = true;
- } catch (SQLException e) {
- success = false;
- }
-
- int pos = mPos;
- requery();
-
- /*
- * Ensure proper cursor state. Note that mCurrentRowID changes
- * in this call.
- */
- moveToPosition(pos);
- } finally {
- mDatabase.unlock();
- }
-
- if (success) {
- onChange(true);
- return true;
- } else {
- return false;
- }
- }
-
@Override
public String[] getColumnNames() {
return mColumns;
}
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean supportsUpdates() {
- return super.supportsUpdates() && !TextUtils.isEmpty(mEditTable);
- }
-
- /**
- * @hide
- * @deprecated
- */
- @Override
- public boolean commitUpdates(Map<? extends Long,
- ? extends Map<String, Object>> additionalValues) {
- if (!supportsUpdates()) {
- Log.e(TAG, "commitUpdates not supported on this cursor, did you "
- + "include the _id column?");
- return false;
- }
-
- /*
- * Prevent other threads from changing the updated rows while they're
- * being processed here.
- */
- synchronized (mUpdatedRows) {
- if (additionalValues != null) {
- mUpdatedRows.putAll(additionalValues);
- }
-
- if (mUpdatedRows.size() == 0) {
- return true;
- }
-
- /*
- * Prevent other threads from changing the database state while
- * we process the updated rows, and prevents us from changing the
- * database behind the back of another thread.
- */
- mDatabase.beginTransaction();
- try {
- StringBuilder sql = new StringBuilder(128);
-
- // For each row that has been updated
- for (Map.Entry<Long, Map<String, Object>> rowEntry :
- mUpdatedRows.entrySet()) {
- Map<String, Object> values = rowEntry.getValue();
- Long rowIdObj = rowEntry.getKey();
-
- if (rowIdObj == null || values == null) {
- throw new IllegalStateException("null rowId or values found! rowId = "
- + rowIdObj + ", values = " + values);
- }
-
- if (values.size() == 0) {
- continue;
- }
-
- long rowId = rowIdObj.longValue();
-
- Iterator<Map.Entry<String, Object>> valuesIter =
- values.entrySet().iterator();
-
- sql.setLength(0);
- sql.append("UPDATE " + mEditTable + " SET ");
-
- // For each column value that has been updated
- Object[] bindings = new Object[values.size()];
- int i = 0;
- while (valuesIter.hasNext()) {
- Map.Entry<String, Object> entry = valuesIter.next();
- sql.append(entry.getKey());
- sql.append("=?");
- bindings[i] = entry.getValue();
- if (valuesIter.hasNext()) {
- sql.append(", ");
- }
- i++;
- }
-
- sql.append(" WHERE " + mColumns[mRowIdColumnIndex]
- + '=' + rowId);
- sql.append(';');
- mDatabase.execSQL(sql.toString(), bindings);
- mDatabase.rowUpdated(mEditTable, rowId);
- }
- mDatabase.setTransactionSuccessful();
- } finally {
- mDatabase.endTransaction();
- }
-
- mUpdatedRows.clear();
- }
-
- // Let any change observers know about the update
- onChange(true);
-
- return true;
- }
-
private void deactivateCommon() {
if (Config.LOGV) Log.v(TAG, "<<< Releasing cursor " + this);
mCursorState = 0;
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 6dc1a86..46c6cb8 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -762,6 +762,8 @@
private static final String KEY_ZOOM_RATIOS = "zoom-ratios";
private static final String KEY_ZOOM_SUPPORTED = "zoom-supported";
private static final String KEY_SMOOTH_ZOOM_SUPPORTED = "smooth-zoom-supported";
+ private static final String KEY_FOCUS_DISTANCES = "focus-distances";
+
// Parameter key suffix for supported values.
private static final String SUPPORTED_VALUES_SUFFIX = "-values";
@@ -874,10 +876,30 @@
*/
public static final String FOCUS_MODE_EDOF = "edof";
+ // Indices for focus distance array.
+ /**
+ * The array index of near focus distance for use with
+ * {@link #getFocusDistances(float[])}.
+ */
+ public static final int FOCUS_DISTANCE_NEAR_INDEX = 0;
+
+ /**
+ * The array index of optimal focus distance for use with
+ * {@link #getFocusDistances(float[])}.
+ */
+ public static final int FOCUS_DISTANCE_OPTIMAL_INDEX = 1;
+
+ /**
+ * The array index of far focus distance for use with
+ * {@link #getFocusDistances(float[])}.
+ */
+ public static final int FOCUS_DISTANCE_FAR_INDEX = 2;
+
/**
* Continuous focus mode. The camera continuously tries to focus. This
* is ideal for shooting video or shooting photo of moving object.
* Continuous focus starts when {@link #autoFocus(AutoFocusCallback)} is
+ * called. Continuous focus stops when {@link #cancelAutoFocus()} is
* called. AutoFocusCallback will be only called once as soon as the
* picture is in focus.
*/
@@ -1814,6 +1836,42 @@
return TRUE.equals(str);
}
+ /**
+ * Gets the distances from the camera to where an object appears to be
+ * in focus. The object is sharpest at the optimal focus distance. The
+ * depth of field is the far focus distance minus near focus distance.
+ *
+ * Focus distances may change after calling {@link
+ * #autoFocus(AutoFocusCallback)}, {@link #cancelAutoFocus}, or {@link
+ * #startPreview()}. Applications can call {@link #getParameters()}
+ * and this method anytime to get the latest focus distances. If the
+ * focus mode is FOCUS_MODE_EDOF, the values may be all 0, which means
+ * focus distance is not applicable. If the focus mode is
+ * FOCUS_MODE_CONTINUOUS and autofocus has started, focus distances may
+ * change from time to time.
+ *
+ * Far focus distance > optimal focus distance > near focus distance. If
+ * the far focus distance is infinity, the value will be
+ * Float.POSITIVE_INFINITY.
+ *
+ * @param output focus distances in meters. output must be a float
+ * array with three elements. Near focus distance, optimal focus
+ * distance, and far focus distance will be filled in the array.
+ * @see #NEAR_FOCUS_DISTANCE_INDEX
+ * @see #OPTIMAL_FOCUS_DISTANCE_INDEX
+ * @see #FAR_FOCUS_DISTANCE_INDEX
+ */
+ public void getFocusDistances(float[] output) {
+ if (output == null || output.length != 3) {
+ throw new IllegalArgumentException(
+ "output must be an float array with three elements.");
+ }
+ List<Float> distances = splitFloat(get(KEY_FOCUS_DISTANCES));
+ output[0] = distances.get(0);
+ output[1] = distances.get(1);
+ output[2] = distances.get(2);
+ }
+
// Splits a comma delimited string to an ArrayList of String.
// Return null if the passing string is null or the size is 0.
private ArrayList<String> split(String str) {
@@ -1843,6 +1901,21 @@
return substrings;
}
+ // Splits a comma delimited string to an ArrayList of Float.
+ // Return null if the passing string is null or the size is 0.
+ private ArrayList<Float> splitFloat(String str) {
+ if (str == null) return null;
+
+ StringTokenizer tokenizer = new StringTokenizer(str, ",");
+ ArrayList<Float> substrings = new ArrayList<Float>();
+ while (tokenizer.hasMoreElements()) {
+ String token = tokenizer.nextToken();
+ substrings.add(Float.parseFloat(token));
+ }
+ if (substrings.size() == 0) return null;
+ return substrings;
+ }
+
// Returns the value of a float parameter.
private float getFloat(String key, float defaultValue) {
try {
diff --git a/media/libdrm/mobile2/include/util/domcore/Vector.h b/core/java/android/os/IHardwareService.aidl
old mode 100644
new mode 100755
similarity index 63%
rename from media/libdrm/mobile2/include/util/domcore/Vector.h
rename to core/java/android/os/IHardwareService.aidl
index 8ceae3b..38abfc00
--- a/media/libdrm/mobile2/include/util/domcore/Vector.h
+++ b/core/java/android/os/IHardwareService.aidl
@@ -1,11 +1,11 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
+/**
+ * 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
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,9 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#ifndef __VECTOR_H__
-#define __VECTOR_H__
-#include <uvector.h>
-using namespace ustl;
-#endif /*__VECTOR_H__*/
-
+
+package android.os;
+
+/** {@hide} */
+interface IHardwareService
+{
+ // obsolete flashlight support
+ boolean getFlashlightEnabled();
+ void setFlashlightEnabled(boolean on);
+}
+
diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java
index cc48aeb..bbad2b6 100644
--- a/core/java/android/preference/DialogPreference.java
+++ b/core/java/android/preference/DialogPreference.java
@@ -33,7 +33,6 @@
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
/**
@@ -275,7 +274,7 @@
protected void showDialog(Bundle state) {
Context context = getContext();
- mWhichButtonClicked = DialogInterface.BUTTON2;
+ mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
mBuilder = new AlertDialog.Builder(context)
.setTitle(mDialogTitle)
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index c9d125b..40ed980 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -1819,4 +1819,12 @@
* Name of current volume being scanned by the media scanner.
*/
public static final String MEDIA_SCANNER_VOLUME = "volume";
+
+ /**
+ * Name of the file signaling the media scanner to ignore media in the containing directory
+ * and its subdirectories. Developers should use this to avoid application graphics showing
+ * up in the Gallery and likewise prevent application sounds and music from showing up in
+ * the Music app.
+ */
+ public static final String MEDIA_IGNORE_FILENAME = ".nomedia";
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e8c09b0..460e9b4 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3532,20 +3532,8 @@
// If a shortcut is supplied, and it is already defined for
// another bookmark, then remove the old definition.
if (shortcut != 0) {
- Cursor c = cr.query(CONTENT_URI,
- sShortcutProjection, sShortcutSelection,
- new String[] { String.valueOf((int) shortcut) }, null);
- try {
- if (c.moveToFirst()) {
- while (c.getCount() > 0) {
- if (!c.deleteRow()) {
- Log.w(TAG, "Could not delete existing shortcut row");
- }
- }
- }
- } finally {
- if (c != null) c.close();
- }
+ cr.delete(CONTENT_URI, sShortcutSelection,
+ new String[] { String.valueOf((int) shortcut) });
}
ContentValues values = new ContentValues();
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 3d1d7d6..2ade44e 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -522,20 +522,14 @@
}
try {
- SurfaceHolder.Callback callbacks[] = null;
- synchronized (mSurfaceHolder.mCallbacks) {
- final int N = mSurfaceHolder.mCallbacks.size();
- if (N > 0) {
- callbacks = new SurfaceHolder.Callback[N];
- mSurfaceHolder.mCallbacks.toArray(callbacks);
- }
- }
+ mSurfaceHolder.ungetCallbacks();
if (surfaceCreating) {
mIsCreating = true;
if (DEBUG) Log.v(TAG, "onSurfaceCreated("
+ mSurfaceHolder + "): " + this);
onSurfaceCreated(mSurfaceHolder);
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
if (callbacks != null) {
for (SurfaceHolder.Callback c : callbacks) {
c.surfaceCreated(mSurfaceHolder);
@@ -557,6 +551,7 @@
+ "): " + this);
onSurfaceChanged(mSurfaceHolder, mFormat,
mCurWidth, mCurHeight);
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
if (callbacks != null) {
for (SurfaceHolder.Callback c : callbacks) {
c.surfaceChanged(mSurfaceHolder, mFormat,
@@ -698,14 +693,12 @@
void reportSurfaceDestroyed() {
if (mSurfaceCreated) {
mSurfaceCreated = false;
- SurfaceHolder.Callback callbacks[];
- synchronized (mSurfaceHolder.mCallbacks) {
- callbacks = new SurfaceHolder.Callback[
- mSurfaceHolder.mCallbacks.size()];
- mSurfaceHolder.mCallbacks.toArray(callbacks);
- }
- for (SurfaceHolder.Callback c : callbacks) {
- c.surfaceDestroyed(mSurfaceHolder);
+ mSurfaceHolder.ungetCallbacks();
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
+ if (callbacks != null) {
+ for (SurfaceHolder.Callback c : callbacks) {
+ c.surfaceDestroyed(mSurfaceHolder);
+ }
}
if (DEBUG) Log.v(TAG, "onSurfaceDestroyed("
+ mSurfaceHolder + "): " + this);
diff --git a/core/java/android/view/ActionBarView.java b/core/java/android/view/ActionBarView.java
index 941ef21..311274c 100644
--- a/core/java/android/view/ActionBarView.java
+++ b/core/java/android/view/ActionBarView.java
@@ -58,7 +58,9 @@
/**
* Display options that require re-layout as opposed to a simple invalidate
*/
- private static final int DISPLAY_RELAYOUT_MASK = ActionBar.DISPLAY_USE_LOGO;
+ private static final int DISPLAY_RELAYOUT_MASK =
+ ActionBar.DISPLAY_HIDE_HOME |
+ ActionBar.DISPLAY_USE_LOGO;
private final int mContentHeight;
@@ -203,7 +205,6 @@
if (view != null) {
setNavigationMode(ActionBar.NAVIGATION_MODE_CUSTOM);
}
- requestLayout();
}
public void setDividerDrawable(Drawable d) {
@@ -236,9 +237,17 @@
}
public void setDisplayOptions(int options) {
- final int flagsChanged = options & mDisplayOptions;
+ final int flagsChanged = options ^ mDisplayOptions;
mDisplayOptions = options;
if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) {
+ final int vis = (options & ActionBar.DISPLAY_HIDE_HOME) != 0 ? GONE : VISIBLE;
+ if (mLogoView != null) {
+ mLogoView.setVisibility(vis);
+ }
+ if (mIconView != null) {
+ mIconView.setVisibility(vis);
+ }
+
requestLayout();
} else {
invalidate();
@@ -246,7 +255,30 @@
}
public void setNavigationMode(int mode) {
- if (mode != mNavigationMode) {
+ final int oldMode = mNavigationMode;
+ if (mode != oldMode) {
+ switch (oldMode) {
+ case ActionBar.NAVIGATION_MODE_NORMAL:
+ if (mTitleView != null) {
+ removeView(mTitleView);
+ mTitleView = null;
+ }
+ break;
+ case ActionBar.NAVIGATION_MODE_CUSTOM:
+ if (mNavigationView != null) {
+ removeView(mNavigationView);
+ mNavigationView = null;
+ }
+ }
+
+ switch (mode) {
+ case ActionBar.NAVIGATION_MODE_NORMAL:
+ initTitle();
+ break;
+ case ActionBar.NAVIGATION_MODE_CUSTOM:
+ addView(mNavigationView);
+ break;
+ }
mNavigationMode = mode;
requestLayout();
}
@@ -347,6 +379,7 @@
actionView.actionLabel = item.getTitle();
actionView.setAdjustViewBounds(true);
actionView.setImageDrawable(item.getIcon());
+ actionView.setFocusable(true);
actionView.setOnClickListener(mActionClickHandler);
LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
@@ -401,6 +434,7 @@
LayoutParams.MATCH_PARENT, LayoutParams.ITEM_TYPE_ICON));
mLogoView.setImageDrawable(mLogo);
mLogoView.setClickable(true);
+ mLogoView.setFocusable(true);
mLogoView.setOnClickListener(mHomeClickListener);
addView(mLogoView);
} else if (mIcon != null) {
@@ -410,6 +444,7 @@
LayoutParams.MATCH_PARENT, LayoutParams.ITEM_TYPE_ICON));
mIconView.setImageDrawable(mIcon);
mIconView.setClickable(true);
+ mIconView.setFocusable(true);
mIconView.setOnClickListener(mHomeClickListener);
addView(mIconView);
}
@@ -418,16 +453,7 @@
switch (mNavigationMode) {
case ActionBar.NAVIGATION_MODE_NORMAL:
if (mLogoView == null) {
- LayoutInflater inflater = LayoutInflater.from(getContext());
- mTitleView = (TextView) inflater.inflate(R.layout.action_bar_title_item, null);
- mTitleView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT, LayoutParams.ITEM_TYPE_TITLE));
- if (mTitle != null) {
- mTitleView.setText(mTitle);
- }
- mTitleView.setClickable(true);
- mTitleView.setOnClickListener(mHomeClickListener);
- addView(mTitleView);
+ initTitle();
}
break;
@@ -441,13 +467,22 @@
case ActionBar.NAVIGATION_MODE_CUSTOM:
if (mNavigationView != null) {
- mNavigationView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT, LayoutParams.ITEM_TYPE_CUSTOM_NAV));
addView(mNavigationView);
}
break;
}
}
+
+ private void initTitle() {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ mTitleView = (TextView) inflater.inflate(R.layout.action_bar_title_item, null);
+ mTitleView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT, LayoutParams.ITEM_TYPE_TITLE));
+ if (mTitle != null) {
+ mTitleView.setText(mTitle);
+ }
+ addView(mTitleView);
+ }
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
@@ -466,13 +501,13 @@
int contentWidth = MeasureSpec.getSize(widthMeasureSpec);
int availableWidth = contentWidth - getPaddingLeft() - getPaddingRight();
- int childSpecHeight = MeasureSpec.makeMeasureSpec(mContentHeight - getPaddingTop() -
- getPaddingBottom(), MeasureSpec.AT_MOST);
+ final int height = mContentHeight - getPaddingTop() - getPaddingBottom();
+ final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
- if (mLogoView != null) {
+ if (mLogoView != null && mLogoView.getVisibility() != GONE) {
availableWidth = measureChildView(mLogoView, availableWidth, childSpecHeight, mSpacing);
}
- if (mIconView != null) {
+ if (mIconView != null && mIconView.getVisibility() != GONE) {
availableWidth = measureChildView(mIconView, availableWidth, childSpecHeight, mSpacing);
}
@@ -487,14 +522,14 @@
switch (mNavigationMode) {
case ActionBar.NAVIGATION_MODE_NORMAL:
if (mTitleView != null) {
- availableWidth = measureChildView(mTitleView, availableWidth,
- childSpecHeight, mSpacing);
+ measureChildView(mTitleView, availableWidth, childSpecHeight, mSpacing);
}
break;
case ActionBar.NAVIGATION_MODE_CUSTOM:
if (mNavigationView != null) {
- availableWidth = measureChildView(mNavigationView, availableWidth,
- childSpecHeight, mSpacing);
+ mNavigationView.measure(
+ MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}
break;
}
@@ -503,8 +538,7 @@
}
private int measureChildView(View child, int availableWidth, int childSpecHeight, int spacing) {
- measureChild(child,
- MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
+ child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
childSpecHeight);
availableWidth -= child.getMeasuredWidth();
@@ -519,10 +553,10 @@
final int y = getPaddingTop();
final int contentHeight = b - t - getPaddingTop() - getPaddingBottom();
- if (mLogoView != null) {
+ if (mLogoView != null && mLogoView.getVisibility() != GONE) {
x += positionChild(mLogoView, x, y, contentHeight) + mSpacing;
}
- if (mIconView != null) {
+ if (mIconView != null && mIconView.getVisibility() != GONE) {
x += positionChild(mIconView, x, y, contentHeight) + mSpacing;
}
diff --git a/core/java/android/view/SurfaceHolder.java b/core/java/android/view/SurfaceHolder.java
index 64a10d1..34e4638 100644
--- a/core/java/android/view/SurfaceHolder.java
+++ b/core/java/android/view/SurfaceHolder.java
@@ -182,7 +182,6 @@
/**
* Enable or disable option to keep the screen turned on while this
* surface is displayed. The default is false, allowing it to turn off.
- * Enabling the option effectivelty.
* This is safe to call from any thread.
*
* @param screenOn Supply to true to force the screen to stay on, false
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index aab76c4..e69b807 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -206,7 +206,7 @@
final long oldestTime = pastTime[oldestTouch];
float accumX = 0;
float accumY = 0;
- float N = (lastTouch - oldestTouch + NUM_PAST) % NUM_PAST + 1;
+ int N = (lastTouch - oldestTouch + NUM_PAST) % NUM_PAST + 1;
// Skip the last received event, since it is probably pretty noisy.
if (N > 3) N--;
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index a9dd844..aa124e6 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -16,8 +16,10 @@
package android.view;
+import com.android.internal.view.BaseSurfaceHolder;
import com.android.internal.view.IInputMethodCallback;
import com.android.internal.view.IInputMethodSession;
+import com.android.internal.view.RootViewSurfaceTaker;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
@@ -135,6 +137,11 @@
int mViewVisibility;
boolean mAppVisible = true;
+ SurfaceHolder.Callback mSurfaceHolderCallback;
+ BaseSurfaceHolder mSurfaceHolder;
+ boolean mIsCreating;
+ boolean mDrawingAllowed;
+
final Region mTransparentRegion;
final Region mPreviousTransparentRegion;
@@ -440,6 +447,13 @@
mView = view;
mWindowAttributes.copyFrom(attrs);
attrs = mWindowAttributes;
+ if (view instanceof RootViewSurfaceTaker) {
+ mSurfaceHolderCallback =
+ ((RootViewSurfaceTaker)view).willYouTakeTheSurface();
+ if (mSurfaceHolderCallback != null) {
+ mSurfaceHolder = new TakenSurfaceHolder();
+ }
+ }
Resources resources = mView.getContext().getResources();
CompatibilityInfo compatibilityInfo = resources.getCompatibilityInfo();
mTranslator = compatibilityInfo.getTranslator();
@@ -695,6 +709,7 @@
boolean windowResizesToFitContent = false;
boolean fullRedrawNeeded = mFullRedrawNeeded;
boolean newSurface = false;
+ boolean surfaceChanged = false;
WindowManager.LayoutParams lp = mWindowAttributes;
int desiredWindowWidth;
@@ -713,6 +728,7 @@
WindowManager.LayoutParams params = null;
if (mWindowAttributesChanged) {
mWindowAttributesChanged = false;
+ surfaceChanged = true;
params = lp;
}
Rect frame = mWinFrame;
@@ -899,11 +915,18 @@
}
}
+ if (mSurfaceHolder != null) {
+ mSurfaceHolder.mSurfaceLock.lock();
+ mDrawingAllowed = true;
+ lp.format = mSurfaceHolder.getRequestedFormat();
+ lp.type = mSurfaceHolder.getRequestedType();
+ }
+
boolean initialized = false;
boolean contentInsetsChanged = false;
boolean visibleInsetsChanged;
+ boolean hadSurface = mSurface.isValid();
try {
- boolean hadSurface = mSurface.isValid();
int fl = 0;
if (params != null) {
fl = params.flags;
@@ -978,6 +1001,7 @@
}
} catch (RemoteException e) {
}
+
if (DEBUG_ORIENTATION) Log.v(
"ViewRoot", "Relayout returned: frame=" + frame + ", surface=" + mSurface);
@@ -990,6 +1014,57 @@
mWidth = frame.width();
mHeight = frame.height();
+ if (mSurfaceHolder != null) {
+ // The app owns the surface; tell it about what is going on.
+ if (mSurface.isValid()) {
+ // XXX .copyFrom() doesn't work!
+ //mSurfaceHolder.mSurface.copyFrom(mSurface);
+ mSurfaceHolder.mSurface = mSurface;
+ }
+ mSurfaceHolder.mSurfaceLock.unlock();
+ if (mSurface.isValid()) {
+ if (!hadSurface) {
+ mSurfaceHolder.ungetCallbacks();
+
+ mIsCreating = true;
+ mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
+ if (callbacks != null) {
+ for (SurfaceHolder.Callback c : callbacks) {
+ c.surfaceCreated(mSurfaceHolder);
+ }
+ }
+ surfaceChanged = true;
+ }
+ if (surfaceChanged) {
+ mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
+ lp.format, mWidth, mHeight);
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
+ if (callbacks != null) {
+ for (SurfaceHolder.Callback c : callbacks) {
+ c.surfaceChanged(mSurfaceHolder, lp.format,
+ mWidth, mHeight);
+ }
+ }
+ }
+ mIsCreating = false;
+ } else if (hadSurface) {
+ mSurfaceHolder.ungetCallbacks();
+ SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
+ mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
+ if (callbacks != null) {
+ for (SurfaceHolder.Callback c : callbacks) {
+ c.surfaceDestroyed(mSurfaceHolder);
+ }
+ }
+ mSurfaceHolder.mSurfaceLock.lock();
+ // Make surface invalid.
+ //mSurfaceHolder.mSurface.copyFrom(mSurface);
+ mSurfaceHolder.mSurface = new Surface();
+ mSurfaceHolder.mSurfaceLock.unlock();
+ }
+ }
+
if (initialized) {
mGlCanvas.setViewport((int) (mWidth * appScale + 0.5f),
(int) (mHeight * appScale + 0.5f));
@@ -1281,6 +1356,12 @@
boolean scalingRequired = mAttachInfo.mScalingRequired;
Rect dirty = mDirty;
+ if (mSurfaceHolder != null) {
+ // The app owns the surface, we won't draw.
+ dirty.setEmpty();
+ return;
+ }
+
if (mUseGL) {
if (!dirty.isEmpty()) {
Canvas canvas = mGlCanvas;
@@ -2828,6 +2909,46 @@
return scrollToRectOrFocus(rectangle, immediate);
}
+ class TakenSurfaceHolder extends BaseSurfaceHolder {
+ @Override
+ public boolean onAllowLockCanvas() {
+ return mDrawingAllowed;
+ }
+
+ @Override
+ public void onRelayoutContainer() {
+ // Not currently interesting -- from changing between fixed and layout size.
+ }
+
+ public void setFormat(int format) {
+ ((RootViewSurfaceTaker)mView).setSurfaceFormat(format);
+ }
+
+ public void setType(int type) {
+ ((RootViewSurfaceTaker)mView).setSurfaceType(type);
+ }
+
+ @Override
+ public void onUpdateSurface() {
+ // We take care of format and type changes on our own.
+ throw new IllegalStateException("Shouldn't be here");
+ }
+
+ public boolean isCreating() {
+ return mIsCreating;
+ }
+
+ @Override
+ public void setFixedSize(int width, int height) {
+ throw new UnsupportedOperationException(
+ "Currently only support sizing from layout");
+ }
+
+ public void setKeepScreenOn(boolean screenOn) {
+ ((RootViewSurfaceTaker)mView).setSurfaceKeepScreenOn(screenOn);
+ }
+ }
+
static class InputMethodCallback extends IInputMethodCallback.Stub {
private WeakReference<ViewRoot> mViewRoot;
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index e1ff4e8..bbd9f04 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -480,6 +480,14 @@
}
/**
+ * Take ownership of this window's surface. The window's view hierarchy
+ * will no longer draw into the surface, though it will otherwise continue
+ * to operate (such as for receiving input events). The given SurfaceHolder
+ * callback will be used to tell you about state changes to the surface.
+ */
+ public abstract void takeSurface(SurfaceHolder.Callback callback);
+
+ /**
* Return whether this window is being displayed with a floating style
* (based on the {@link android.R.attr#windowIsFloating} attribute in
* the style/theme).
diff --git a/core/java/android/webkit/AccessibilityInjector.java b/core/java/android/webkit/AccessibilityInjector.java
new file mode 100644
index 0000000..49ddc19
--- /dev/null
+++ b/core/java/android/webkit/AccessibilityInjector.java
@@ -0,0 +1,99 @@
+/*
+ * 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.webkit;
+
+import android.view.KeyEvent;
+import android.view.accessibility.AccessibilityEvent;
+import android.webkit.WebViewCore.EventHub;
+
+/**
+ * This class injects accessibility into WebViews with disabled JavaScript or
+ * WebViews with enabled JavaScript but for which we have no accessibility
+ * script to inject.
+ */
+class AccessibilityInjector {
+
+ // Handle to the WebView this injector is associated with.
+ private final WebView mWebView;
+
+ /**
+ * Creates a new injector associated with a given VwebView.
+ *
+ * @param webView The associated WebView.
+ */
+ public AccessibilityInjector(WebView webView) {
+ mWebView = webView;
+ }
+
+ /**
+ * Processes a key down <code>event</code>.
+ *
+ * @return True if the event was processed.
+ */
+ public boolean onKeyEvent(KeyEvent event) {
+
+ // as a proof of concept let us do the simplest example
+
+ if (event.getAction() != KeyEvent.ACTION_UP) {
+ return false;
+ }
+
+ int keyCode = event.getKeyCode();
+
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_N:
+ modifySelection("extend", "forward", "sentence");
+ break;
+ case KeyEvent.KEYCODE_P:
+ modifySelection("extend", "backward", "sentence");
+ break;
+ }
+
+ return false;
+ }
+
+ /**
+ * Called when the <code>selectionString</code> has changed.
+ */
+ public void onSelectionStringChange(String selectionString) {
+ // put the selection string in an AccessibilityEvent and send it
+ AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED);
+ event.getText().add(selectionString);
+ mWebView.sendAccessibilityEventUnchecked(event);
+ }
+
+ /**
+ * Modifies the current selection.
+ *
+ * @param alter Specifies how to alter the selection.
+ * @param direction The direction in which to alter the selection.
+ * @param granularity The granularity of the selection modification.
+ */
+ private void modifySelection(String alter, String direction, String granularity) {
+ WebViewCore webViewCore = mWebView.getWebViewCore();
+
+ if (webViewCore == null) {
+ return;
+ }
+
+ WebViewCore.ModifySelectionData data = new WebViewCore.ModifySelectionData();
+ data.mAlter = alter;
+ data.mDirection = direction;
+ data.mGranularity = granularity;
+ webViewCore.sendMessage(EventHub.MODIFY_SELECTION, data);
+ }
+}
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 0e0e032..9521b49 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -1087,10 +1087,15 @@
public void onProgressChanged(int newProgress) {
// Synchronize so that mLatestProgress is up-to-date.
synchronized (this) {
- if (mWebChromeClient == null || mLatestProgress == newProgress) {
+ // update mLatestProgress even mWebChromeClient is null as
+ // WebView.getProgress() needs it
+ if (mLatestProgress == newProgress) {
return;
}
mLatestProgress = newProgress;
+ if (mWebChromeClient == null) {
+ return;
+ }
if (!mProgressUpdatePending) {
sendEmptyMessage(PROGRESS);
mProgressUpdatePending = true;
diff --git a/core/java/android/webkit/GeolocationService.java b/core/java/android/webkit/GeolocationService.java
index 24306f4..183b3c0 100755
--- a/core/java/android/webkit/GeolocationService.java
+++ b/core/java/android/webkit/GeolocationService.java
@@ -62,9 +62,10 @@
/**
* Start listening for location updates.
*/
- public void start() {
+ public boolean start() {
registerForLocationUpdates();
mIsRunning = true;
+ return mIsNetworkProviderAvailable || mIsGpsProviderAvailable;
}
/**
@@ -87,6 +88,8 @@
// only unregister from all, then reregister with all but the GPS.
unregisterFromLocationUpdates();
registerForLocationUpdates();
+ // Check that the providers are still available after we re-register.
+ maybeReportError("The last location provider is no longer available");
}
}
}
@@ -156,11 +159,16 @@
*/
private void registerForLocationUpdates() {
try {
- mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
- mIsNetworkProviderAvailable = true;
+ // Registration may fail if providers are not present on the device.
+ try {
+ mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
+ mIsNetworkProviderAvailable = true;
+ } catch(IllegalArgumentException e) { }
if (mIsGpsEnabled) {
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
- mIsGpsProviderAvailable = true;
+ try {
+ mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
+ mIsGpsProviderAvailable = true;
+ } catch(IllegalArgumentException e) { }
}
} catch(SecurityException e) {
Log.e(TAG, "Caught security exception registering for location updates from system. " +
@@ -173,6 +181,8 @@
*/
private void unregisterFromLocationUpdates() {
mLocationManager.removeUpdates(this);
+ mIsNetworkProviderAvailable = false;
+ mIsGpsProviderAvailable = false;
}
/**
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index e7517205..ebcf5c5 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -25,19 +25,13 @@
import android.content.pm.PackageManager;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Interpolator;
-import android.graphics.Matrix;
-import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
-import android.graphics.Region;
-import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.http.SslCertificate;
@@ -46,9 +40,11 @@
import android.os.Message;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.speech.tts.TextToSpeech;
import android.text.IClipboard;
import android.text.Selection;
import android.text.Spannable;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Log;
@@ -64,6 +60,7 @@
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import android.view.accessibility.AccessibilityManager;
import android.view.animation.AlphaAnimation;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
@@ -76,20 +73,17 @@
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
-import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Scroller;
import android.widget.Toast;
import android.widget.ZoomButtonsController;
-import android.widget.ZoomControls;
import android.widget.AdapterView.OnItemClickListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
@@ -109,36 +103,51 @@
* {@link #getSettings() WebSettings}.{@link WebSettings#setBuiltInZoomControls(boolean)}
* (introduced in API version 3).
* <p>Note that, in order for your Activity to access the Internet and load web pages
- * in a WebView, you must add the <var>INTERNET</var> permissions to your
+ * in a WebView, you must add the {@code INTERNET} permissions to your
* Android Manifest file:</p>
* <pre><uses-permission android:name="android.permission.INTERNET" /></pre>
*
- * <p>This must be a child of the <code><manifest></code> element.</p>
+ * <p>This must be a child of the <a
+ * href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code <manifest>}</a>
+ * element.</p>
*
* <h3>Basic usage</h3>
*
* <p>By default, a WebView provides no browser-like widgets, does not
- * enable JavaScript and errors will be ignored. If your goal is only
+ * enable JavaScript and web page errors are ignored. If your goal is only
* to display some HTML as a part of your UI, this is probably fine;
* the user won't need to interact with the web page beyond reading
* it, and the web page won't need to interact with the user. If you
- * actually want a fully blown web browser, then you probably want to
- * invoke the Browser application with your URL rather than show it
- * with a WebView. See {@link android.content.Intent} for more information.</p>
+ * actually want a full-blown web browser, then you probably want to
+ * invoke the Browser application with a URL Intent rather than show it
+ * with a WebView. For example:
+ * <pre>
+ * Uri uri = Uri.parse("http://www.example.com");
+ * Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ * startActivity(intent);
+ * </pre>
+ * <p>See {@link android.content.Intent} for more information.</p>
*
+ * <p>To provide a WebView in your own Activity, include a {@code <WebView>} in your layout,
+ * or set the entire Activity window as a WebView during {@link
+ * android.app.Activity#onCreate(Bundle) onCreate()}:</p>
* <pre class="prettyprint">
* WebView webview = new WebView(this);
* setContentView(webview);
+ * </pre>
*
+ * <p>Then load the desired web page:</p>
+ * <pre>
* // Simplest usage: note that an exception will NOT be thrown
* // if there is an error loading this page (see below).
* webview.loadUrl("http://slashdot.org/");
*
- * // Of course you can also load from any string:
- * String summary = "<html><body>You scored <b>192</b> points.</body></html>";
+ * // OR, you can also load from an HTML string:
+ * String summary = "<html><body>You scored <b>192</b> points.</body></html>";
* webview.loadData(summary, "text/html", "utf-8");
* // ... although note that there are restrictions on what this HTML can do.
- * // See the JavaDocs for loadData and loadDataWithBaseUrl for more info.
+ * // See the JavaDocs for {@link #loadData(String,String,String) loadData()} and {@link
+ * #loadDataWithBaseURL(String,String,String,String,String) loadDataWithBaseURL()} for more info.
* </pre>
*
* <p>A WebView has several customization points where you can add your
@@ -148,15 +157,20 @@
* <li>Creating and setting a {@link android.webkit.WebChromeClient} subclass.
* This class is called when something that might impact a
* browser UI happens, for instance, progress updates and
- * JavaScript alerts are sent here.
+ * JavaScript alerts are sent here (see <a
+ * href="{@docRoot}guide/developing/debug-tasks.html#DebuggingWebPages">Debugging Tasks</a>).
* </li>
* <li>Creating and setting a {@link android.webkit.WebViewClient} subclass.
* It will be called when things happen that impact the
* rendering of the content, eg, errors or form submissions. You
- * can also intercept URL loading here.</li>
- * <li>Via the {@link android.webkit.WebSettings} class, which contains
- * miscellaneous configuration. </li>
- * <li>With the {@link android.webkit.WebView#addJavascriptInterface} method.
+ * can also intercept URL loading here (via {@link
+ * android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String)
+ * shouldOverrideUrlLoading()}).</li>
+ * <li>Modifying the {@link android.webkit.WebSettings}, such as
+ * enabling JavaScript with {@link android.webkit.WebSettings#setJavaScriptEnabled(boolean)
+ * setJavaScriptEnabled()}. </li>
+ * <li>Adding JavaScript-to-Java interfaces with the {@link
+ * android.webkit.WebView#addJavascriptInterface} method.
* This lets you bind Java objects into the WebView so they can be
* controlled from the web pages JavaScript.</li>
* </ul>
@@ -191,8 +205,8 @@
* <h3>Cookie and window management</h3>
*
* <p>For obvious security reasons, your application has its own
- * cache, cookie store etc - it does not share the Browser
- * applications data. Cookies are managed on a separate thread, so
+ * cache, cookie store etc.—it does not share the Browser
+ * application's data. Cookies are managed on a separate thread, so
* operations like index building don't block the UI
* thread. Follow the instructions in {@link android.webkit.CookieSyncManager}
* if you want to use cookies in your application.
@@ -201,15 +215,79 @@
* <p>By default, requests by the HTML to open new windows are
* ignored. This is true whether they be opened by JavaScript or by
* the target attribute on a link. You can customize your
- * WebChromeClient to provide your own behaviour for opening multiple windows,
+ * {@link WebChromeClient} to provide your own behaviour for opening multiple windows,
* and render them in whatever manner you want.</p>
*
- * <p>Standard behavior for an Activity is to be destroyed and
- * recreated when the devices orientation is changed. This will cause
+ * <p>The standard behavior for an Activity is to be destroyed and
+ * recreated when the device orientation or any other configuration changes. This will cause
* the WebView to reload the current page. If you don't want that, you
- * can set your Activity to handle the orientation and keyboardHidden
+ * can set your Activity to handle the {@code orientation} and {@code keyboardHidden}
* changes, and then just leave the WebView alone. It'll automatically
- * re-orient itself as appropriate.</p>
+ * re-orient itself as appropriate. Read <a
+ * href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime Changes</a> for
+ * more information about how to handle configuration changes during runtime.</p>
+ *
+ *
+ * <h3>Building web pages to support different screen densities</h3>
+ *
+ * <p>The screen density of a device is based on the screen resolution. A screen with low density
+ * has fewer available pixels per inch, where a screen with high density
+ * has more — sometimes significantly more — pixels per inch. The density of a
+ * screen is important because, other things being equal, a UI element (such as a button) whose
+ * height and width are defined in terms of screen pixels will appear larger on the lower density
+ * screen and smaller on the higher density screen.
+ * For simplicity, Android collapses all actual screen densities into three generalized densities:
+ * high, medium, and low.</p>
+ * <p>By default, WebView scales a web page so that it is drawn at a size that matches the default
+ * appearance on a medium density screen. So, it applies 1.5x scaling on a high density screen
+ * (because its pixels are smaller) and 0.75x scaling on a low density screen (because its pixels
+ * are bigger).
+ * Starting with API Level 5 (Android 2.0), WebView supports DOM, CSS, and meta tag features to help
+ * you (as a web developer) target screens with different screen densities.</p>
+ * <p>Here's a summary of the features you can use to handle different screen densities:</p>
+ * <ul>
+ * <li>The {@code window.devicePixelRatio} DOM property. The value of this property specifies the
+ * default scaling factor used for the current device. For example, if the value of {@code
+ * window.devicePixelRatio} is "1.0", then the device is considered a medium density (mdpi) device
+ * and default scaling is not applied to the web page; if the value is "1.5", then the device is
+ * considered a high density device (hdpi) and the page content is scaled 1.5x; if the
+ * value is "0.75", then the device is considered a low density device (ldpi) and the content is
+ * scaled 0.75x. However, if you specify the {@code "target-densitydpi"} meta property
+ * (discussed below), then you can stop this default scaling behavior.</li>
+ * <li>The {@code -webkit-device-pixel-ratio} CSS media query. Use this to specify the screen
+ * densities for which this style sheet is to be used. The corresponding value should be either
+ * "0.75", "1", or "1.5", to indicate that the styles are for devices with low density, medium
+ * density, or high density screens, respectively. For example:
+ * <pre>
+ * <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" /></pre>
+ * <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ration of 1.5,
+ * which is the high density pixel ratio.</p>
+ * </li>
+ * <li>The {@code target-densitydpi} property for the {@code viewport} meta tag. You can use
+ * this to specify the target density for which the web page is designed, using the following
+ * values:
+ * <ul>
+ * <li>{@code device-dpi} - Use the device's native dpi as the target dpi. Default scaling never
+ * occurs.</li>
+ * <li>{@code high-dpi} - Use hdpi as the target dpi. Medium and low density screens scale down
+ * as appropriate.</li>
+ * <li>{@code medium-dpi} - Use mdpi as the target dpi. High density screens scale up and
+ * low density screens scale down. This is also the default behavior.</li>
+ * <li>{@code low-dpi} - Use ldpi as the target dpi. Medium and high density screens scale up
+ * as appropriate.</li>
+ * <li><em>{@code <value>}</em> - Specify a dpi value to use as the target dpi (accepted
+ * values are 70-400).</li>
+ * </ul>
+ * <p>Here's an example meta tag to specify the target density:</p>
+ * <pre><meta name="viewport" content="target-densitydpi=device-dpi" /></pre></li>
+ * </ul>
+ * <p>If you want to modify your web page for different densities, by using the {@code
+ * -webkit-device-pixel-ratio} CSS media query and/or the {@code
+ * window.devicePixelRatio} DOM property, then you should set the {@code target-densitydpi} meta
+ * property to {@code device-dpi}. This stops Android from performing scaling in your web page and
+ * allows you to make the necessary adjustments for each density via CSS and JavaScript.</p>
+ *
+ *
*/
@Widget
public class WebView extends AbsoluteLayout
@@ -226,49 +304,7 @@
static final String LOGTAG = "webview";
- private static class ExtendedZoomControls extends FrameLayout {
- public ExtendedZoomControls(Context context, AttributeSet attrs) {
- super(context, attrs);
- LayoutInflater inflater = (LayoutInflater)
- context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(com.android.internal.R.layout.zoom_magnify, this, true);
- mPlusMinusZoomControls = (ZoomControls) findViewById(
- com.android.internal.R.id.zoomControls);
- findViewById(com.android.internal.R.id.zoomMagnify).setVisibility(
- View.GONE);
- }
-
- public void show(boolean showZoom, boolean canZoomOut) {
- mPlusMinusZoomControls.setVisibility(
- showZoom ? View.VISIBLE : View.GONE);
- fade(View.VISIBLE, 0.0f, 1.0f);
- }
-
- public void hide() {
- fade(View.GONE, 1.0f, 0.0f);
- }
-
- private void fade(int visibility, float startAlpha, float endAlpha) {
- AlphaAnimation anim = new AlphaAnimation(startAlpha, endAlpha);
- anim.setDuration(500);
- startAnimation(anim);
- setVisibility(visibility);
- }
-
- public boolean hasFocus() {
- return mPlusMinusZoomControls.hasFocus();
- }
-
- public void setOnZoomInClickListener(OnClickListener listener) {
- mPlusMinusZoomControls.setOnZoomInClickListener(listener);
- }
-
- public void setOnZoomOutClickListener(OnClickListener listener) {
- mPlusMinusZoomControls.setOnZoomOutClickListener(listener);
- }
-
- ZoomControls mPlusMinusZoomControls;
- }
+ private ZoomManager mZoomManager;
/**
* Transportation object for returning WebView across thread boundaries.
@@ -363,6 +399,10 @@
private float mLastVelX;
private float mLastVelY;
+ // only trigger accelerated fling if the new velocity is at least
+ // MINIMUM_VELOCITY_RATIO_FOR_ACCELERATION times of the previous velocity
+ private static final float MINIMUM_VELOCITY_RATIO_FOR_ACCELERATION = 0.2f;
+
/**
* Touch mode
*/
@@ -439,9 +479,6 @@
private static final int MIN_FLING_TIME = 250;
// draw unfiltered after drag is held without movement
private static final int MOTIONLESS_TIME = 100;
- // The time that the Zoom Controls are visible before fading away
- private static final long ZOOM_CONTROLS_TIMEOUT =
- ViewConfiguration.getZoomControlsTimeout();
// The amount of content to overlap between two screens when going through
// pages with the space bar, in pixels.
private static final int PAGE_SCROLL_OVERLAP = 24;
@@ -487,6 +524,10 @@
// use the framework's ScaleGestureDetector to handle multi-touch
private ScaleGestureDetector mScaleDetector;
+ // An instance for injecting accessibility in WebViews with disabled
+ // JavaScript or ones for which no accessibility script exists
+ private AccessibilityInjector mAccessibilityInjector;
+
// the anchor point in the document space where VIEW_SIZE_CHANGED should
// apply to
private int mAnchorX;
@@ -545,6 +586,7 @@
static final int CENTER_FIT_RECT = 127;
static final int REQUEST_KEYBOARD_WITH_SELECTION_MSG_ID = 128;
static final int SET_SCROLLBAR_MODES = 129;
+ static final int SELECTION_STRING_CHANGED = 130;
private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID;
private static final int LAST_PACKAGE_MSG_ID = SET_SCROLLBAR_MODES;
@@ -604,23 +646,9 @@
// the minimum preferred width is huge, an upper limit is needed.
static int sMaxViewportWidth = DEFAULT_VIEWPORT_WIDTH;
- // default scale limit. Depending on the display density
- private static float DEFAULT_MAX_ZOOM_SCALE;
- private static float DEFAULT_MIN_ZOOM_SCALE;
- // scale limit, which can be set through viewport meta tag in the web page
- private float mMaxZoomScale;
- private float mMinZoomScale;
- private boolean mMinZoomScaleFixed = true;
-
// initial scale in percent. 0 means using default.
private int mInitialScaleInPercent = 0;
- // while in the zoom overview mode, the page's width is fully fit to the
- // current window. The page is alive, in another words, you can click to
- // follow the links. Double tap will toggle between zoom overview mode and
- // the last zoom scale.
- boolean mInZoomOverview = false;
-
// ideally mZoomOverviewWidth should be mContentWidth. But sites like espn,
// engadget always have wider mContentWidth no matter what viewport size is.
int mZoomOverviewWidth = DEFAULT_VIEWPORT_WIDTH;
@@ -670,6 +698,19 @@
private int mHorizontalScrollBarMode = SCROLLBAR_AUTO;
private int mVerticalScrollBarMode = SCROLLBAR_AUTO;
+ // the alias via which accessibility JavaScript interface is exposed
+ private static final String ALIAS_ACCESSIBILITY_JS_INTERFACE = "accessibility";
+
+ // JavaScript to inject the script chooser which will
+ // pick the right script for the current URL
+ private static final String ACCESSIBILITY_SCRIPT_CHOOSER_JAVASCRIPT =
+ "javascript:(function() {" +
+ " var chooser = document.createElement('script');" +
+ " chooser.type = 'text/javascript';" +
+ " chooser.src = 'https://ssl.gstatic.com/accessibility/javascript/android/AndroidScriptChooser.user.js';" +
+ " document.getElementsByTagName('head')[0].appendChild(chooser);" +
+ " })();";
+
// Used to match key downs and key ups
private boolean mGotKeyDown;
@@ -774,43 +815,11 @@
}
}
- // The View containing the zoom controls
- private ExtendedZoomControls mZoomControls;
- private Runnable mZoomControlRunnable;
-
- // mZoomButtonsController will be lazy initialized in
- // getZoomButtonsController() to get better performance.
- private ZoomButtonsController mZoomButtonsController;
-
// These keep track of the center point of the zoom. They are used to
// determine the point around which we should zoom.
private float mZoomCenterX;
private float mZoomCenterY;
- private ZoomButtonsController.OnZoomListener mZoomListener =
- new ZoomButtonsController.OnZoomListener() {
-
- public void onVisibilityChanged(boolean visible) {
- if (visible) {
- switchOutDrawHistory();
- // Bring back the hidden zoom controls.
- mZoomButtonsController.getZoomControls().setVisibility(
- View.VISIBLE);
- updateZoomButtonsEnabled();
- }
- }
-
- public void onZoom(boolean zoomIn) {
- if (zoomIn) {
- zoomIn();
- } else {
- zoomOut();
- }
-
- updateZoomButtonsEnabled();
- }
- };
-
/**
* Construct a new WebView with a Context object.
* @param context A Context object used to access application assets.
@@ -846,21 +855,32 @@
* @param context A Context object used to access application assets.
* @param attrs An AttributeSet passed to our parent.
* @param defStyle The default style resource ID.
- * @param javascriptInterfaces is a Map of intareface names, as keys, and
+ * @param javascriptInterfaces is a Map of interface names, as keys, and
* object implementing those interfaces, as values.
* @hide pending API council approval.
*/
protected WebView(Context context, AttributeSet attrs, int defStyle,
Map<String, Object> javascriptInterfaces) {
super(context, attrs, defStyle);
- init();
+
+ if (AccessibilityManager.getInstance(context).isEnabled()) {
+ if (javascriptInterfaces == null) {
+ javascriptInterfaces = new HashMap<String, Object>();
+ }
+ exposeAccessibilityJavaScriptApi(javascriptInterfaces);
+ }
mCallbackProxy = new CallbackProxy(context, this);
mViewManager = new ViewManager(this);
mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javascriptInterfaces);
mDatabase = WebViewDatabase.getInstance(context);
mScroller = new Scroller(context);
+ mZoomManager = new ZoomManager(this);
+ /* The init method must follow the creation of certain member variables,
+ * such as the mZoomManager.
+ */
+ init();
updateMultiTouchSupport(context);
}
@@ -877,22 +897,6 @@
}
}
- private void updateZoomButtonsEnabled() {
- if (mZoomButtonsController == null) return;
- boolean canZoomIn = mActualScale < mMaxZoomScale;
- boolean canZoomOut = mActualScale > mMinZoomScale && !mInZoomOverview;
- if (!canZoomIn && !canZoomOut) {
- // Hide the zoom in and out buttons, as well as the fit to page
- // button, if the page cannot zoom
- mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
- } else {
- // Set each one individually, as a page may be able to zoom in
- // or out.
- mZoomButtonsController.setZoomInEnabled(canZoomIn);
- mZoomButtonsController.setZoomOutEnabled(canZoomOut);
- }
- }
-
private void init() {
setWillNotDraw(false);
setFocusable(true);
@@ -916,13 +920,30 @@
mActualScale = density;
mInvActualScale = 1 / density;
mTextWrapScale = density;
- DEFAULT_MAX_ZOOM_SCALE = 4.0f * density;
- DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
- mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
- mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
+ mZoomManager.init(density);
mMaximumFling = configuration.getScaledMaximumFlingVelocity();
}
+ /**
+ * Exposes accessibility APIs to JavaScript by appending them to the JavaScript
+ * interfaces map provided by the WebView client. In case of conflicting
+ * alias with the one of the accessibility API the user specified one wins.
+ *
+ * @param javascriptInterfaces A map with interfaces to be exposed to JavaScript.
+ */
+ private void exposeAccessibilityJavaScriptApi(Map<String, Object> javascriptInterfaces) {
+ if (javascriptInterfaces.containsKey(ALIAS_ACCESSIBILITY_JS_INTERFACE)) {
+ Log.w(LOGTAG, "JavaScript interface mapped to \"" + ALIAS_ACCESSIBILITY_JS_INTERFACE
+ + "\" overrides the accessibility API JavaScript interface. No accessibility"
+ + "API will be exposed to JavaScript!");
+ return;
+ }
+
+ // expose the TTS for now ...
+ javascriptInterfaces.put(ALIAS_ACCESSIBILITY_JS_INTERFACE,
+ new TextToSpeech(getContext(), null));
+ }
+
/* package */void updateDefaultZoomDensity(int zoomDensity) {
final float density = getContext().getResources().getDisplayMetrics().density
* 100 / zoomDensity;
@@ -931,11 +952,11 @@
// adjust the limits
mNavSlop = (int) (16 * density);
DEFAULT_SCALE_PERCENT = (int) (100 * density);
- DEFAULT_MAX_ZOOM_SCALE = 4.0f * density;
- DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
+ mZoomManager.DEFAULT_MAX_ZOOM_SCALE = 4.0f * density;
+ mZoomManager.DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
mDefaultScale = density;
- mMaxZoomScale *= scaleFactor;
- mMinZoomScale *= scaleFactor;
+ mZoomManager.mMaxZoomScale *= scaleFactor;
+ mZoomManager.mMinZoomScale *= scaleFactor;
setNewZoomScale(mActualScale * scaleFactor, true, false);
}
}
@@ -1317,7 +1338,7 @@
b.putInt("scrollY", mScrollY);
b.putFloat("scale", mActualScale);
b.putFloat("textwrapScale", mTextWrapScale);
- b.putBoolean("overview", mInZoomOverview);
+ b.putBoolean("overview", mZoomManager.mInZoomOverview);
return true;
}
@@ -1337,7 +1358,7 @@
mActualScale = scale;
mInvActualScale = 1 / scale;
mTextWrapScale = b.getFloat("textwrapScale", scale);
- mInZoomOverview = b.getBoolean("overview");
+ mZoomManager.mInZoomOverview = b.getBoolean("overview");
invalidate();
}
@@ -1783,13 +1804,7 @@
return;
}
clearTextEntry(false);
- if (getSettings().getBuiltInZoomControls()) {
- getZoomButtonsController().setVisible(true);
- } else {
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- mPrivateHandler.postDelayed(mZoomControlRunnable,
- ZOOM_CONTROLS_TIMEOUT);
- }
+ mZoomManager.invokeZoomPicker();
}
/**
@@ -2131,12 +2146,14 @@
private void setNewZoomScale(float scale, boolean updateTextWrapScale,
boolean force) {
- if (scale < mMinZoomScale) {
- scale = mMinZoomScale;
+ if (scale < mZoomManager.mMinZoomScale) {
+ scale = mZoomManager.mMinZoomScale;
// set mInZoomOverview for non mobile sites
- if (scale < mDefaultScale) mInZoomOverview = true;
- } else if (scale > mMaxZoomScale) {
- scale = mMaxZoomScale;
+ if (scale < mDefaultScale) {
+ mZoomManager.mInZoomOverview = true;
+ }
+ } else if (scale > mZoomManager.mMaxZoomScale) {
+ scale = mZoomManager.mMaxZoomScale;
}
if (updateTextWrapScale) {
mTextWrapScale = scale;
@@ -2323,7 +2340,7 @@
if (mDrawHistory) {
return mHistoryWidth;
} else if (mHorizontalScrollBarMode == SCROLLBAR_ALWAYSOFF
- && (mActualScale - mMinZoomScale <= MINIMUM_SCALE_INCREMENT)) {
+ && (mActualScale - mZoomManager.mMinZoomScale <= MINIMUM_SCALE_INCREMENT)) {
// only honor the scrollbar mode when it is at minimum zoom level
return computeHorizontalScrollExtent();
} else {
@@ -2337,7 +2354,7 @@
if (mDrawHistory) {
return mHistoryHeight;
} else if (mVerticalScrollBarMode == SCROLLBAR_ALWAYSOFF
- && (mActualScale - mMinZoomScale <= MINIMUM_SCALE_INCREMENT)) {
+ && (mActualScale - mZoomManager.mMinZoomScale <= MINIMUM_SCALE_INCREMENT)) {
// only honor the scrollbar mode when it is at minimum zoom level
return computeVerticalScrollExtent();
} else {
@@ -2711,6 +2728,11 @@
postInvalidate(); // So we draw again
if (oldX != mScrollX || oldY != mScrollY) {
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
+ } else {
+ abortAnimation();
+ mPrivateHandler.removeMessages(RESUME_WEBCORE_PRIORITY);
+ WebViewCore.resumePriority();
+ WebViewCore.resumeUpdatePicture(mWebViewCore);
}
} else {
super.computeScroll();
@@ -2799,6 +2821,29 @@
}
mPageThatNeedsToSlideTitleBarOffScreen = null;
}
+
+ injectAccessibilityForUrl(url);
+ }
+
+ /**
+ * This method injects accessibility in the loaded document if accessibility
+ * is enabled. If JavaScript is enabled we try to inject a URL specific script.
+ * If no URL specific script is found or JavaScript is disabled we fallback to
+ * the default {@link AccessibilityInjector} implementation.
+ *
+ * @param url The URL loaded by this {@link WebView}.
+ */
+ private void injectAccessibilityForUrl(String url) {
+ if (AccessibilityManager.getInstance(mContext).isEnabled()) {
+ if (getSettings().getJavaScriptEnabled()) {
+ loadUrl(ACCESSIBILITY_SCRIPT_CHOOSER_JAVASCRIPT);
+ } else if (mAccessibilityInjector == null) {
+ mAccessibilityInjector = new AccessibilityInjector(this);
+ }
+ } else {
+ // it is possible that accessibility was turned off between reloads
+ mAccessibilityInjector = null;
+ }
}
/**
@@ -3045,7 +3090,7 @@
* settings.
*/
public WebSettings getSettings() {
- return mWebViewCore.getSettings();
+ return (mWebViewCore != null) ? mWebViewCore.getSettings() : null;
}
/**
@@ -3492,7 +3537,7 @@
// bring it back to the default scale so that user can enter text
boolean zoom = mActualScale < mDefaultScale;
if (zoom) {
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
mZoomCenterX = mLastTouchX;
mZoomCenterY = mLastTouchY;
// do not change text wrap scale so that there is no reflow
@@ -3722,8 +3767,10 @@
// Bubble up the key event if
// 1. it is a system key; or
// 2. the host application wants to handle it;
+ // 3. the accessibility injector is present and wants to handle it;
if (event.isSystem()
- || mCallbackProxy.uiOverrideKeyEvent(event)) {
+ || mCallbackProxy.uiOverrideKeyEvent(event)
+ || (mAccessibilityInjector != null && mAccessibilityInjector.onKeyEvent(event))) {
return false;
}
@@ -3867,7 +3914,10 @@
// Bubble up the key event if
// 1. it is a system key; or
// 2. the host application wants to handle it;
- if (event.isSystem() || mCallbackProxy.uiOverrideKeyEvent(event)) {
+ // 3. the accessibility injector is present and wants to handle it;
+ if (event.isSystem()
+ || mCallbackProxy.uiOverrideKeyEvent(event)
+ || (mAccessibilityInjector != null && mAccessibilityInjector.onKeyEvent(event))) {
return false;
}
@@ -4010,7 +4060,7 @@
@Override
protected void onDetachedFromWindow() {
clearTextEntry(false);
- dismissZoomControl();
+ mZoomManager.dismissZoomPicker();
if (hasWindowFocus()) setActive(false);
super.onDetachedFromWindow();
}
@@ -4019,7 +4069,7 @@
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility != View.VISIBLE) {
- dismissZoomControl();
+ mZoomManager.dismissZoomPicker();
}
}
@@ -4067,17 +4117,14 @@
// false for the first parameter
}
} else {
- if (mWebViewCore != null && getSettings().getBuiltInZoomControls()
- && (mZoomButtonsController == null ||
- !mZoomButtonsController.isVisible())) {
+ if (!mZoomManager.isZoomPickerVisible()) {
/*
- * The zoom controls come in their own window, so our window
- * loses focus. Our policy is to not draw the cursor ring if
- * our window is not focused, but this is an exception since
+ * The external zoom controls come in their own window, so our
+ * window loses focus. Our policy is to not draw the cursor ring
+ * if our window is not focused, but this is an exception since
* the user can still navigate the web page with the zoom
* controls showing.
*/
- // If our window has lost focus, stop drawing the cursor ring
mDrawCursorRing = false;
}
mGotKeyDown = false;
@@ -4187,9 +4234,7 @@
mWebView.setNewZoomScale(mWebView.mActualScale,
mUpdateTextWrap, true);
// update the zoom buttons as the scale can be changed
- if (mWebView.getSettings().getBuiltInZoomControls()) {
- mWebView.updateZoomButtonsEnabled();
- }
+ mWebView.mZoomManager.updateZoomPicker();
}
}
}
@@ -4209,30 +4254,30 @@
// adjust the max viewport width depending on the view dimensions. This
// is to ensure the scaling is not going insane. So do not shrink it if
// the view size is temporarily smaller, e.g. when soft keyboard is up.
- int newMaxViewportWidth = (int) (Math.max(w, h) / DEFAULT_MIN_ZOOM_SCALE);
+ int newMaxViewportWidth = (int) (Math.max(w, h) / mZoomManager.DEFAULT_MIN_ZOOM_SCALE);
if (newMaxViewportWidth > sMaxViewportWidth) {
sMaxViewportWidth = newMaxViewportWidth;
}
// update mMinZoomScale if the minimum zoom scale is not fixed
- if (!mMinZoomScaleFixed) {
+ if (!mZoomManager.mMinZoomScaleFixed) {
// when change from narrow screen to wide screen, the new viewWidth
// can be wider than the old content width. We limit the minimum
// scale to 1.0f. The proper minimum scale will be calculated when
// the new picture shows up.
- mMinZoomScale = Math.min(1.0f, (float) getViewWidth()
+ mZoomManager.mMinZoomScale = Math.min(1.0f, (float) getViewWidth()
/ (mDrawHistory ? mHistoryPicture.getWidth()
: mZoomOverviewWidth));
if (mInitialScaleInPercent > 0) {
// limit the minZoomScale to the initialScale if it is set
float initialScale = mInitialScaleInPercent / 100.0f;
- if (mMinZoomScale > initialScale) {
- mMinZoomScale = initialScale;
+ if (mZoomManager.mMinZoomScale > initialScale) {
+ mZoomManager.mMinZoomScale = initialScale;
}
}
}
- dismissZoomControl();
+ mZoomManager.dismissZoomPicker();
// onSizeChanged() is called during WebView layout. And any
// requestLayout() is blocked during layout. As setNewZoomScale() will
@@ -4503,9 +4548,9 @@
public boolean onScaleBegin(ScaleGestureDetector detector) {
// cancel the single touch handling
cancelTouch();
- dismissZoomControl();
+ mZoomManager.dismissZoomPicker();
// reset the zoom overview mode so that the page won't auto grow
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
// If it is in password mode, turn it off so it does not draw
// misplaced.
if (inEditingMode() && nativeFocusCandidateIsPassword()) {
@@ -4524,7 +4569,7 @@
mAnchorY = viewToContentY((int) mZoomCenterY + mScrollY);
// don't reflow when zoom in; when zoom out, do reflow if the
// new scale is almost minimum scale;
- boolean reflowNow = (mActualScale - mMinZoomScale
+ boolean reflowNow = (mActualScale - mZoomManager.mMinZoomScale
<= MINIMUM_SCALE_INCREMENT)
|| ((mActualScale <= 0.8 * mTextWrapScale));
// force zoom after mPreviewZoomOnly is set to false so that the
@@ -4611,7 +4656,7 @@
// FIXME: we may consider to give WebKit an option to handle multi-touch
// events later.
if (mSupportMultiTouch && ev.getPointerCount() > 1) {
- if (mMinZoomScale < mMaxZoomScale) {
+ if (mZoomManager.mMinZoomScale < mZoomManager.mMaxZoomScale) {
mScaleDetector.onTouchEvent(ev);
if (mScaleDetector.isInProgress()) {
mLastTouchTime = eventTime;
@@ -5097,21 +5142,10 @@
if (!mDragFromTextInput) {
nativeHideCursor();
}
- WebSettings settings = getSettings();
- if (settings.supportZoom()
- && settings.getBuiltInZoomControls()
- && !getZoomButtonsController().isVisible()
- && mMinZoomScale < mMaxZoomScale
- && (mHorizontalScrollBarMode != SCROLLBAR_ALWAYSOFF
- || mVerticalScrollBarMode != SCROLLBAR_ALWAYSOFF)) {
- mZoomButtonsController.setVisible(true);
- int count = settings.getDoubleTapToastCount();
- if (mInZoomOverview && count > 0) {
- settings.setDoubleTapToastCount(--count);
- Toast.makeText(mContext,
- com.android.internal.R.string.double_tap_toast,
- Toast.LENGTH_LONG).show();
- }
+
+ if (mHorizontalScrollBarMode != SCROLLBAR_ALWAYSOFF
+ || mVerticalScrollBarMode != SCROLLBAR_ALWAYSOFF) {
+ mZoomManager.invokeZoomPicker();
}
}
@@ -5119,18 +5153,7 @@
if ((deltaX | deltaY) != 0) {
scrollBy(deltaX, deltaY);
}
- if (!getSettings().getBuiltInZoomControls()) {
- boolean showPlusMinus = mMinZoomScale < mMaxZoomScale;
- if (mZoomControls != null && showPlusMinus) {
- if (mZoomControls.getVisibility() == View.VISIBLE) {
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- } else {
- mZoomControls.show(showPlusMinus, false);
- }
- mPrivateHandler.postDelayed(mZoomControlRunnable,
- ZOOM_CONTROLS_TIMEOUT);
- }
- }
+ mZoomManager.keepZoomPickerVisible();
}
private void stopTouch() {
@@ -5499,13 +5522,16 @@
return;
}
float currentVelocity = mScroller.getCurrVelocity();
- if (mLastVelocity > 0 && currentVelocity > 0) {
+ float velocity = (float) Math.hypot(vx, vy);
+ if (mLastVelocity > 0 && currentVelocity > 0 && velocity
+ > mLastVelocity * MINIMUM_VELOCITY_RATIO_FOR_ACCELERATION) {
float deltaR = (float) (Math.abs(Math.atan2(mLastVelY, mLastVelX)
- Math.atan2(vy, vx)));
final float circle = (float) (Math.PI) * 2.0f;
if (deltaR > circle * 0.9f || deltaR < circle * 0.1f) {
vx += currentVelocity * mLastVelX / mLastVelocity;
vy += currentVelocity * mLastVelY / mLastVelocity;
+ velocity = (float) Math.hypot(vx, vy);
if (DebugFlags.WEB_VIEW) {
Log.v(LOGTAG, "doFling vx= " + vx + " vy=" + vy);
}
@@ -5521,7 +5547,7 @@
}
mLastVelX = vx;
mLastVelY = vy;
- mLastVelocity = (float) Math.hypot(vx, vy);
+ mLastVelocity = velocity;
mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY);
// TODO: duration is calculated based on velocity, if the range is
@@ -5579,81 +5605,11 @@
Log.w(LOGTAG, "This WebView doesn't support zoom.");
return null;
}
- if (mZoomControls == null) {
- mZoomControls = createZoomControls();
-
- /*
- * need to be set to VISIBLE first so that getMeasuredHeight() in
- * {@link #onSizeChanged()} can return the measured value for proper
- * layout.
- */
- mZoomControls.setVisibility(View.VISIBLE);
- mZoomControlRunnable = new Runnable() {
- public void run() {
-
- /* Don't dismiss the controls if the user has
- * focus on them. Wait and check again later.
- */
- if (!mZoomControls.hasFocus()) {
- mZoomControls.hide();
- } else {
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- mPrivateHandler.postDelayed(mZoomControlRunnable,
- ZOOM_CONTROLS_TIMEOUT);
- }
- }
- };
- }
- return mZoomControls;
+ return mZoomManager.getExternalZoomPicker();
}
- private ExtendedZoomControls createZoomControls() {
- ExtendedZoomControls zoomControls = new ExtendedZoomControls(mContext
- , null);
- zoomControls.setOnZoomInClickListener(new OnClickListener() {
- public void onClick(View v) {
- // reset time out
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- mPrivateHandler.postDelayed(mZoomControlRunnable,
- ZOOM_CONTROLS_TIMEOUT);
- zoomIn();
- }
- });
- zoomControls.setOnZoomOutClickListener(new OnClickListener() {
- public void onClick(View v) {
- // reset time out
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- mPrivateHandler.postDelayed(mZoomControlRunnable,
- ZOOM_CONTROLS_TIMEOUT);
- zoomOut();
- }
- });
- return zoomControls;
- }
-
- /**
- * Gets the {@link ZoomButtonsController} which can be used to add
- * additional buttons to the zoom controls window.
- *
- * @return The instance of {@link ZoomButtonsController} used by this class,
- * or null if it is unavailable.
- * @hide
- */
- public ZoomButtonsController getZoomButtonsController() {
- if (mZoomButtonsController == null) {
- mZoomButtonsController = new ZoomButtonsController(this);
- mZoomButtonsController.setOnZoomListener(mZoomListener);
- // ZoomButtonsController positions the buttons at the bottom, but in
- // the middle. Change their layout parameters so they appear on the
- // right.
- View controls = mZoomButtonsController.getZoomControls();
- ViewGroup.LayoutParams params = controls.getLayoutParams();
- if (params instanceof FrameLayout.LayoutParams) {
- FrameLayout.LayoutParams frameParams = (FrameLayout.LayoutParams) params;
- frameParams.gravity = Gravity.RIGHT;
- }
- }
- return mZoomButtonsController;
+ void dismissZoomControl() {
+ mZoomManager.dismissZoomPicker();
}
/**
@@ -5663,7 +5619,7 @@
public boolean zoomIn() {
// TODO: alternatively we can disallow this during draw history mode
switchOutDrawHistory();
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
// Center zooming to the center of the screen.
mZoomCenterX = getViewWidth() * .5f;
mZoomCenterY = getViewHeight() * .5f;
@@ -5818,10 +5774,10 @@
int viewHeight = getViewHeightWithTitle();
float scale = Math.min((float) viewWidth / view.width,
(float) viewHeight / view.height);
- if (scale < mMinZoomScale) {
- scale = mMinZoomScale;
- } else if (scale > mMaxZoomScale) {
- scale = mMaxZoomScale;
+ if (scale < mZoomManager.mMinZoomScale) {
+ scale = mZoomManager.mMinZoomScale;
+ } else if (scale > mZoomManager.mMaxZoomScale) {
+ scale = mZoomManager.mMaxZoomScale;
}
if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) {
if (contentToViewX(view.x) >= mScrollX
@@ -5847,10 +5803,10 @@
int viewHeight = getViewHeightWithTitle();
float scale = Math.min((float) viewWidth / docWidth, (float) viewHeight
/ docHeight);
- if (scale < mMinZoomScale) {
- scale = mMinZoomScale;
- } else if (scale > mMaxZoomScale) {
- scale = mMaxZoomScale;
+ if (scale < mZoomManager.mMinZoomScale) {
+ scale = mZoomManager.mMinZoomScale;
+ } else if (scale > mZoomManager.mMaxZoomScale) {
+ scale = mZoomManager.mMaxZoomScale;
}
if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) {
pinScrollTo(contentToViewX(docX + docWidth / 2) - viewWidth / 2,
@@ -5888,33 +5844,6 @@
}
}
- void dismissZoomControl() {
- if (mWebViewCore == null) {
- // maybe called after WebView's destroy(). As we can't get settings,
- // just hide zoom control for both styles.
- if (mZoomButtonsController != null) {
- mZoomButtonsController.setVisible(false);
- }
- if (mZoomControls != null) {
- mZoomControls.hide();
- }
- return;
- }
- WebSettings settings = getSettings();
- if (settings.getBuiltInZoomControls()) {
- if (mZoomButtonsController != null) {
- mZoomButtonsController.setVisible(false);
- }
- } else {
- if (mZoomControlRunnable != null) {
- mPrivateHandler.removeCallbacks(mZoomControlRunnable);
- }
- if (mZoomControls != null) {
- mZoomControls.hide();
- }
- }
- }
-
// Rule for double tap:
// 1. if the current scale is not same as the text wrap scale and layout
// algorithm is NARROW_COLUMNS, fit to column;
@@ -5931,17 +5860,17 @@
WebSettings settings = getSettings();
settings.setDoubleTapToastCount(0);
// remove the zoom control after double tap
- dismissZoomControl();
+ mZoomManager.dismissZoomPicker();
ViewManager.ChildView plugin = mViewManager.hitTest(mAnchorX, mAnchorY);
if (plugin != null) {
if (isPluginFitOnScreen(plugin)) {
- mInZoomOverview = true;
+ mZoomManager.mInZoomOverview = true;
// Force the titlebar fully reveal in overview mode
if (mScrollY < getTitleHeight()) mScrollY = 0;
zoomWithPreview((float) getViewWidth() / mZoomOverviewWidth,
true);
} else {
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
centerFitRect(plugin.x, plugin.y, plugin.width, plugin.height);
}
return;
@@ -5952,12 +5881,12 @@
setNewZoomScale(mActualScale, true, true);
float overviewScale = (float) getViewWidth() / mZoomOverviewWidth;
if (Math.abs(mActualScale - overviewScale) < MINIMUM_SCALE_INCREMENT) {
- mInZoomOverview = true;
+ mZoomManager.mInZoomOverview = true;
}
- } else if (!mInZoomOverview) {
+ } else if (!mZoomManager.mInZoomOverview) {
float newScale = (float) getViewWidth() / mZoomOverviewWidth;
if (Math.abs(mActualScale - newScale) >= MINIMUM_SCALE_INCREMENT) {
- mInZoomOverview = true;
+ mZoomManager.mInZoomOverview = true;
// Force the titlebar fully reveal in overview mode
if (mScrollY < getTitleHeight()) mScrollY = 0;
zoomWithPreview(newScale, true);
@@ -5968,7 +5897,7 @@
zoomToDefault = true;
}
if (zoomToDefault) {
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
int left = nativeGetBlockLeftEdge(mAnchorX, mAnchorY, mActualScale);
if (left != NO_LEFTEDGE) {
// add a 5pt padding to the left edge.
@@ -6316,7 +6245,7 @@
updateZoomRange(restoreState, viewSize.x,
draw.mMinPrefWidth, true);
if (!mDrawHistory) {
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
if (mInitialScaleInPercent > 0) {
setNewZoomScale(mInitialScaleInPercent / 100.0f,
@@ -6327,10 +6256,10 @@
setNewZoomScale(restoreState.mViewScale, false,
false);
} else {
- mInZoomOverview = useWideViewport
+ mZoomManager.mInZoomOverview = useWideViewport
&& settings.getLoadWithOverviewMode();
float scale;
- if (mInZoomOverview) {
+ if (mZoomManager.mInZoomOverview) {
scale = (float) viewWidth
/ DEFAULT_VIEWPORT_WIDTH;
} else {
@@ -6348,9 +6277,7 @@
// the WebTextView was visible.
clearTextEntry(false);
// update the zoom buttons as the scale can be changed
- if (getSettings().getBuiltInZoomControls()) {
- updateZoomButtonsEnabled();
- }
+ mZoomManager.updateZoomPicker();
}
}
// We update the layout (i.e. request a layout from the
@@ -6380,10 +6307,10 @@
.max(draw.mMinPrefWidth,
draw.mViewPoint.x)));
}
- if (!mMinZoomScaleFixed) {
- mMinZoomScale = (float) viewWidth / mZoomOverviewWidth;
+ if (!mZoomManager.mMinZoomScaleFixed) {
+ mZoomManager.mMinZoomScale = (float) viewWidth / mZoomOverviewWidth;
}
- if (!mDrawHistory && mInZoomOverview) {
+ if (!mDrawHistory && mZoomManager.mInZoomOverview) {
// fit the content width to the current view. Ignore
// the rounding error case.
if (Math.abs((viewWidth * mInvActualScale)
@@ -6712,7 +6639,7 @@
case CENTER_FIT_RECT:
Rect r = (Rect)msg.obj;
- mInZoomOverview = false;
+ mZoomManager.mInZoomOverview = false;
centerFitRect(r.left, r.top, r.width(), r.height());
break;
@@ -6721,6 +6648,13 @@
mVerticalScrollBarMode = msg.arg2;
break;
+ case SELECTION_STRING_CHANGED:
+ if (mAccessibilityInjector != null) {
+ String selectionString = (String) msg.obj;
+ mAccessibilityInjector.onSelectionStringChange(selectionString);
+ }
+ break;
+
default:
super.handleMessage(msg);
break;
@@ -7033,29 +6967,29 @@
if (restoreState.mMinScale == 0) {
if (restoreState.mMobileSite) {
if (minPrefWidth > Math.max(0, viewWidth)) {
- mMinZoomScale = (float) viewWidth / minPrefWidth;
- mMinZoomScaleFixed = false;
+ mZoomManager.mMinZoomScale = (float) viewWidth / minPrefWidth;
+ mZoomManager.mMinZoomScaleFixed = false;
if (updateZoomOverview) {
WebSettings settings = getSettings();
- mInZoomOverview = settings.getUseWideViewPort() &&
+ mZoomManager.mInZoomOverview = settings.getUseWideViewPort() &&
settings.getLoadWithOverviewMode();
}
} else {
- mMinZoomScale = restoreState.mDefaultScale;
- mMinZoomScaleFixed = true;
+ mZoomManager.mMinZoomScale = restoreState.mDefaultScale;
+ mZoomManager.mMinZoomScaleFixed = true;
}
} else {
- mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
- mMinZoomScaleFixed = false;
+ mZoomManager.mMinZoomScale = mZoomManager.DEFAULT_MIN_ZOOM_SCALE;
+ mZoomManager.mMinZoomScaleFixed = false;
}
} else {
- mMinZoomScale = restoreState.mMinScale;
- mMinZoomScaleFixed = true;
+ mZoomManager.mMinZoomScale = restoreState.mMinScale;
+ mZoomManager.mMinZoomScaleFixed = true;
}
if (restoreState.mMaxScale == 0) {
- mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
+ mZoomManager.mMaxZoomScale = mZoomManager.DEFAULT_MAX_ZOOM_SCALE;
} else {
- mMaxZoomScale = restoreState.mMaxScale;
+ mZoomManager.mMaxZoomScale = restoreState.mMaxScale;
}
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index b4ab4df..f67819e 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -17,7 +17,6 @@
package android.webkit;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.graphics.Canvas;
@@ -33,12 +32,10 @@
import android.os.Looper;
import android.os.Message;
import android.os.Process;
-import android.provider.Browser;
import android.provider.OpenableColumns;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.KeyEvent;
-import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
@@ -576,7 +573,18 @@
/**
* Provide WebCore with the previously visted links from the history database
*/
- private native void nativeProvideVisitedHistory(String[] history);
+ private native void nativeProvideVisitedHistory(String[] history);
+
+ /**
+ * Modifies the current selection.
+ *
+ * @param alter Specifies how to alter the selection.
+ * @param direction The direction in which to alter the selection.
+ * @param granularity The granularity of the selection modification.
+ *
+ * @return The selection string.
+ */
+ private native String nativeModifySelection(String alter, String direction, String granularity);
// EventHub for processing messages
private final EventHub mEventHub;
@@ -716,7 +724,11 @@
boolean mRemember;
}
-
+ static class ModifySelectionData {
+ String mAlter;
+ String mDirection;
+ String mGranularity;
+ }
static final String[] HandlerDebugString = {
"REQUEST_LABEL", // 97
@@ -863,6 +875,9 @@
static final int ADD_PACKAGE_NAME = 185;
static final int REMOVE_PACKAGE_NAME = 186;
+ // accessibility support
+ static final int MODIFY_SELECTION = 190;
+
// private message ids
private static final int DESTROY = 200;
@@ -1236,6 +1251,19 @@
nativeSetSelection(msg.arg1, msg.arg2);
break;
+ case MODIFY_SELECTION:
+ ModifySelectionData modifySelectionData =
+ (ModifySelectionData) msg.obj;
+ String selectionString = nativeModifySelection(
+ modifySelectionData.mAlter,
+ modifySelectionData.mDirection,
+ modifySelectionData.mGranularity);
+
+ mWebView.mPrivateHandler.obtainMessage(
+ WebView.SELECTION_STRING_CHANGED, selectionString)
+ .sendToTarget();
+ break;
+
case LISTBOX_CHOICES:
SparseBooleanArray choices = (SparseBooleanArray)
msg.obj;
diff --git a/core/java/android/webkit/ZoomControlBase.java b/core/java/android/webkit/ZoomControlBase.java
new file mode 100644
index 0000000..be9e8f3
--- /dev/null
+++ b/core/java/android/webkit/ZoomControlBase.java
@@ -0,0 +1,41 @@
+/*
+ * 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.webkit;
+
+interface ZoomControlBase {
+
+ /**
+ * Causes the on-screen zoom control to be made visible
+ */
+ public void show();
+
+ /**
+ * Causes the on-screen zoom control to disappear
+ */
+ public void hide();
+
+ /**
+ * Enables the control to update its state if necessary in response to a
+ * change in the pages zoom level. For example, if the max zoom level is
+ * reached then the control can disable the button for zooming in.
+ */
+ public void update();
+
+ /**
+ * Checks to see if the control is currently visible to the user.
+ */
+ public boolean isVisible();
+}
diff --git a/core/java/android/webkit/ZoomControlEmbedded.java b/core/java/android/webkit/ZoomControlEmbedded.java
new file mode 100644
index 0000000..cd02c00
--- /dev/null
+++ b/core/java/android/webkit/ZoomControlEmbedded.java
@@ -0,0 +1,119 @@
+/*
+ * 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.webkit;
+
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+import android.widget.ZoomButtonsController;
+
+class ZoomControlEmbedded implements ZoomControlBase {
+
+ private final ZoomManager mZoomManager;
+ private final WebView mWebView;
+
+ // The controller is lazily initialized in getControls() for performance.
+ private ZoomButtonsController mZoomButtonsController;
+
+ public ZoomControlEmbedded(ZoomManager zoomManager, WebView webView) {
+ mZoomManager = zoomManager;
+ mWebView = webView;
+ }
+
+ public void show() {
+ if (!getControls().isVisible()
+ && mZoomManager.mMinZoomScale < mZoomManager.mMaxZoomScale) {
+
+ mZoomButtonsController.setVisible(true);
+
+ WebSettings settings = mWebView.getSettings();
+ int count = settings.getDoubleTapToastCount();
+ if (mZoomManager.mInZoomOverview && count > 0) {
+ settings.setDoubleTapToastCount(--count);
+ Toast.makeText(mWebView.getContext(),
+ com.android.internal.R.string.double_tap_toast,
+ Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ public void hide() {
+ if (mZoomButtonsController != null) {
+ mZoomButtonsController.setVisible(false);
+ }
+ }
+
+ public boolean isVisible() {
+ return mZoomButtonsController != null && mZoomButtonsController.isVisible();
+ }
+
+ public void update() {
+ if (mZoomButtonsController == null) {
+ return;
+ }
+
+ boolean canZoomIn = mWebView.getScale() < mZoomManager.mMaxZoomScale;
+ boolean canZoomOut = mWebView.getScale() > mZoomManager.mMinZoomScale &&
+ !mZoomManager.mInZoomOverview;
+ if (!canZoomIn && !canZoomOut) {
+ // Hide the zoom in and out buttons if the page cannot zoom
+ mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
+ } else {
+ // Set each one individually, as a page may be able to zoom in or out
+ mZoomButtonsController.setZoomInEnabled(canZoomIn);
+ mZoomButtonsController.setZoomOutEnabled(canZoomOut);
+ }
+ }
+
+ private ZoomButtonsController getControls() {
+ if (mZoomButtonsController == null) {
+ mZoomButtonsController = new ZoomButtonsController(mWebView);
+ mZoomButtonsController.setOnZoomListener(new ZoomListener());
+ // ZoomButtonsController positions the buttons at the bottom, but in
+ // the middle. Change their layout parameters so they appear on the
+ // right.
+ View controls = mZoomButtonsController.getZoomControls();
+ ViewGroup.LayoutParams params = controls.getLayoutParams();
+ if (params instanceof FrameLayout.LayoutParams) {
+ ((FrameLayout.LayoutParams) params).gravity = Gravity.RIGHT;
+ }
+ }
+ return mZoomButtonsController;
+ }
+
+ private class ZoomListener implements ZoomButtonsController.OnZoomListener {
+
+ public void onVisibilityChanged(boolean visible) {
+ if (visible) {
+ mWebView.switchOutDrawHistory();
+ // Bring back the hidden zoom controls.
+ mZoomButtonsController.getZoomControls().setVisibility(View.VISIBLE);
+ update();
+ }
+ }
+
+ public void onZoom(boolean zoomIn) {
+ if (zoomIn) {
+ mWebView.zoomIn();
+ } else {
+ mWebView.zoomOut();
+ }
+ update();
+ }
+ }
+}
diff --git a/core/java/android/webkit/ZoomControlExternal.java b/core/java/android/webkit/ZoomControlExternal.java
new file mode 100644
index 0000000..d75313e
--- /dev/null
+++ b/core/java/android/webkit/ZoomControlExternal.java
@@ -0,0 +1,159 @@
+/*
+ * 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.webkit;
+
+import android.content.Context;
+import android.os.Handler;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.View.OnClickListener;
+import android.view.animation.AlphaAnimation;
+import android.widget.FrameLayout;
+
+@Deprecated
+class ZoomControlExternal implements ZoomControlBase {
+
+ // The time that the external controls are visible before fading away
+ private static final long ZOOM_CONTROLS_TIMEOUT =
+ ViewConfiguration.getZoomControlsTimeout();
+ // The view containing the external zoom controls
+ private ExtendedZoomControls mZoomControls;
+ private Runnable mZoomControlRunnable;
+ private final Handler mPrivateHandler = new Handler();
+
+ private final WebView mWebView;
+
+ public ZoomControlExternal(WebView webView) {
+ mWebView = webView;
+ }
+
+ public void show() {
+ if(mZoomControlRunnable != null) {
+ mPrivateHandler.removeCallbacks(mZoomControlRunnable);
+ }
+ getControls().show(true);
+ mPrivateHandler.postDelayed(mZoomControlRunnable, ZOOM_CONTROLS_TIMEOUT);
+ }
+
+ public void hide() {
+ if (mZoomControlRunnable != null) {
+ mPrivateHandler.removeCallbacks(mZoomControlRunnable);
+ }
+ if (mZoomControls != null) {
+ mZoomControls.hide();
+ }
+ }
+
+ public boolean isVisible() {
+ return mZoomControls != null && mZoomControls.isShown();
+ }
+
+ public void update() { }
+
+ public ExtendedZoomControls getControls() {
+ if (mZoomControls == null) {
+ mZoomControls = createZoomControls();
+
+ /*
+ * need to be set to VISIBLE first so that getMeasuredHeight() in
+ * {@link #onSizeChanged()} can return the measured value for proper
+ * layout.
+ */
+ mZoomControls.setVisibility(View.VISIBLE);
+ mZoomControlRunnable = new Runnable() {
+ public void run() {
+ /* Don't dismiss the controls if the user has
+ * focus on them. Wait and check again later.
+ */
+ if (!mZoomControls.hasFocus()) {
+ mZoomControls.hide();
+ } else {
+ mPrivateHandler.removeCallbacks(mZoomControlRunnable);
+ mPrivateHandler.postDelayed(mZoomControlRunnable,
+ ZOOM_CONTROLS_TIMEOUT);
+ }
+ }
+ };
+ }
+ return mZoomControls;
+ }
+
+ private ExtendedZoomControls createZoomControls() {
+ ExtendedZoomControls zoomControls = new ExtendedZoomControls(mWebView.getContext());
+ zoomControls.setOnZoomInClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ // reset time out
+ mPrivateHandler.removeCallbacks(mZoomControlRunnable);
+ mPrivateHandler.postDelayed(mZoomControlRunnable, ZOOM_CONTROLS_TIMEOUT);
+ mWebView.zoomIn();
+ }
+ });
+ zoomControls.setOnZoomOutClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ // reset time out
+ mPrivateHandler.removeCallbacks(mZoomControlRunnable);
+ mPrivateHandler.postDelayed(mZoomControlRunnable, ZOOM_CONTROLS_TIMEOUT);
+ mWebView.zoomOut();
+ }
+ });
+ return zoomControls;
+ }
+
+ private static class ExtendedZoomControls extends FrameLayout {
+
+ private android.widget.ZoomControls mPlusMinusZoomControls;
+
+ public ExtendedZoomControls(Context context) {
+ super(context, null);
+ LayoutInflater inflater = (LayoutInflater)
+ context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(com.android.internal.R.layout.zoom_magnify, this, true);
+ mPlusMinusZoomControls = (android.widget.ZoomControls) findViewById(
+ com.android.internal.R.id.zoomControls);
+ findViewById(com.android.internal.R.id.zoomMagnify).setVisibility(
+ View.GONE);
+ }
+
+ public void show(boolean showZoom) {
+ mPlusMinusZoomControls.setVisibility(showZoom ? View.VISIBLE : View.GONE);
+ fade(View.VISIBLE, 0.0f, 1.0f);
+ }
+
+ public void hide() {
+ fade(View.GONE, 1.0f, 0.0f);
+ }
+
+ private void fade(int visibility, float startAlpha, float endAlpha) {
+ AlphaAnimation anim = new AlphaAnimation(startAlpha, endAlpha);
+ anim.setDuration(500);
+ startAnimation(anim);
+ setVisibility(visibility);
+ }
+
+ public boolean hasFocus() {
+ return mPlusMinusZoomControls.hasFocus();
+ }
+
+ public void setOnZoomInClickListener(OnClickListener listener) {
+ mPlusMinusZoomControls.setOnZoomInClickListener(listener);
+ }
+
+ public void setOnZoomOutClickListener(OnClickListener listener) {
+ mPlusMinusZoomControls.setOnZoomOutClickListener(listener);
+ }
+ }
+}
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
new file mode 100644
index 0000000..8ec771f
--- /dev/null
+++ b/core/java/android/webkit/ZoomManager.java
@@ -0,0 +1,128 @@
+/*
+ * 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.webkit;
+
+import android.view.View;
+
+class ZoomManager {
+
+ static final String LOGTAG = "webviewZoom";
+
+ private final WebView mWebView;
+
+ // manages the on-screen zoom functions of the WebView
+ private ZoomControlEmbedded mEmbeddedZoomControl;
+
+ private ZoomControlExternal mExternalZoomControl;
+
+ /*
+ * TODO: clean up the visibility of the class variables when the zoom
+ * refactoring is complete
+ */
+
+ // default scale limits, which are dependent on the display density
+ static float DEFAULT_MAX_ZOOM_SCALE;
+ static float DEFAULT_MIN_ZOOM_SCALE;
+
+ // actual scale limits, which can be set through a webpage viewport meta tag
+ float mMaxZoomScale;
+ float mMinZoomScale;
+
+ // locks the minimum ZoomScale to the value currently set in mMinZoomScale
+ boolean mMinZoomScaleFixed = true;
+
+ // while in the zoom overview mode, the page's width is fully fit to the
+ // current window. The page is alive, in another words, you can click to
+ // follow the links. Double tap will toggle between zoom overview mode and
+ // the last zoom scale.
+ boolean mInZoomOverview = false;
+
+ public ZoomManager(WebView webView) {
+ mWebView = webView;
+ }
+
+ public void init(float density) {
+ DEFAULT_MAX_ZOOM_SCALE = 4.0f * density;
+ DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
+ mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
+ mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
+ }
+
+ private ZoomControlBase getCurrentZoomControl() {
+ if (mWebView.getSettings() != null && mWebView.getSettings().supportZoom()) {
+ if (mWebView.getSettings().getBuiltInZoomControls()) {
+ if (mEmbeddedZoomControl == null) {
+ mEmbeddedZoomControl = new ZoomControlEmbedded(this, mWebView);
+ }
+ return mEmbeddedZoomControl;
+ } else {
+ if (mExternalZoomControl == null) {
+ mExternalZoomControl = new ZoomControlExternal(mWebView);
+ }
+ return mExternalZoomControl;
+ }
+ }
+ return null;
+ }
+
+ public void invokeZoomPicker() {
+ ZoomControlBase control = getCurrentZoomControl();
+ if (control != null) {
+ control.show();
+ }
+ }
+
+ public void dismissZoomPicker() {
+ ZoomControlBase control = getCurrentZoomControl();
+ if (control != null) {
+ control.hide();
+ }
+ }
+
+ public boolean isZoomPickerVisible() {
+ ZoomControlBase control = getCurrentZoomControl();
+ return (control != null) ? control.isVisible() : false;
+ }
+
+ public void updateZoomPicker() {
+ ZoomControlBase control = getCurrentZoomControl();
+ if (control != null) {
+ control.update();
+ }
+ }
+
+ /**
+ * The embedded zoom control intercepts touch events and automatically stays
+ * visible. The external control needs to constantly refresh its internal
+ * timer to stay visible.
+ */
+ public void keepZoomPickerVisible() {
+ ZoomControlBase control = getCurrentZoomControl();
+ if (control != null && control == mExternalZoomControl) {
+ control.show();
+ }
+ }
+
+ public View getExternalZoomPicker() {
+ ZoomControlBase control = getCurrentZoomControl();
+ if (control != null && control == mExternalZoomControl) {
+ return mExternalZoomControl.getControls();
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/core/java/android/widget/Gallery.java b/core/java/android/widget/Gallery.java
index 6775a94..c47292f 100644
--- a/core/java/android/widget/Gallery.java
+++ b/core/java/android/widget/Gallery.java
@@ -1087,7 +1087,7 @@
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// Gallery steals all key events
- return event.dispatch(this);
+ return event.dispatch(this, null, null);
}
/**
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index d2829db..363e0a2 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -23,6 +23,7 @@
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
+import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.SoundEffectConstants;
import android.view.animation.GridLayoutAnimationController;
@@ -1774,6 +1775,19 @@
requestLayoutIfNecessary();
}
}
+
+ /**
+ * Get the number of columns in the grid.
+ * Returns {@link #AUTO_FIT} if the Grid has never been laid out.
+ *
+ * @attr ref android.R.styleable#GridView_numColumns
+ *
+ * @see #setNumColumns(int)
+ */
+ @ViewDebug.ExportedProperty
+ public int getNumColumns() {
+ return mNumColumns;
+ }
/**
* Make sure views are touching the top or bottom edge, as appropriate for
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 202e658..8e9eb05 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -947,4 +947,20 @@
setProgress(ss.progress);
setSecondaryProgress(ss.secondaryProgress);
}
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ if (mIndeterminate) {
+ startAnimation();
+ }
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (mIndeterminate) {
+ stopAnimation();
+ }
+ }
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 968636b..3466c17 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -4552,6 +4552,10 @@
outText.text = TextUtils.substring(content, partialStartOffset,
partialEndOffset);
}
+ } else {
+ outText.partialStartOffset = 0;
+ outText.partialEndOffset = 0;
+ outText.text = "";
}
outText.flags = 0;
if (MetaKeyKeyListener.getMetaState(mText, MetaKeyKeyListener.META_SELECTING) != 0) {
diff --git a/core/java/com/android/internal/app/ExternalMediaFormatActivity.java b/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
index 7e9bbd1..98dcb8b 100644
--- a/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
+++ b/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
@@ -23,13 +23,10 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
-import android.os.Handler;
import android.os.storage.IMountService;
-import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.Environment;
-import android.widget.Toast;
import android.util.Log;
/**
@@ -38,7 +35,7 @@
*/
public class ExternalMediaFormatActivity extends AlertActivity implements DialogInterface.OnClickListener {
- private static final int POSITIVE_BUTTON = AlertDialog.BUTTON1;
+ private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE;
/** Used to detect when the media state changes, in case we need to call finish() */
private BroadcastReceiver mStorageReceiver = new BroadcastReceiver() {
diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java
index 03b0957..36f45b2 100755
--- a/core/java/com/android/internal/app/NetInitiatedActivity.java
+++ b/core/java/com/android/internal/app/NetInitiatedActivity.java
@@ -23,10 +23,6 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.widget.Toast;
import android.util.Log;
import android.location.LocationManager;
@@ -43,8 +39,8 @@
private static final boolean DEBUG = true;
private static final boolean VERBOSE = false;
- private static final int POSITIVE_BUTTON = AlertDialog.BUTTON1;
- private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON2;
+ private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE;
+ private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE;
// Dialog button text
public static final String BUTTON_TEXT_ACCEPT = "Accept";
diff --git a/core/java/com/android/internal/app/RingtonePickerActivity.java b/core/java/com/android/internal/app/RingtonePickerActivity.java
index ddddabe..5569ffe 100644
--- a/core/java/com/android/internal/app/RingtonePickerActivity.java
+++ b/core/java/com/android/internal/app/RingtonePickerActivity.java
@@ -223,7 +223,7 @@
* On click of Ok/Cancel buttons
*/
public void onClick(DialogInterface dialog, int which) {
- boolean positiveResult = which == BUTTON1;
+ boolean positiveResult = which == DialogInterface.BUTTON_POSITIVE;
// Stop playing the previous ringtone
mRingtoneManager.stopPreviousRingtone();
diff --git a/core/java/com/android/internal/app/SplitActionBar.java b/core/java/com/android/internal/app/SplitActionBar.java
index 4e19e04..9204c00 100644
--- a/core/java/com/android/internal/app/SplitActionBar.java
+++ b/core/java/com/android/internal/app/SplitActionBar.java
@@ -61,6 +61,11 @@
public void setDisplayOptions(int options) {
mActionView.setDisplayOptions(options);
}
+
+ public void setDisplayOptions(int options, int mask) {
+ final int current = mActionView.getDisplayOptions();
+ mActionView.setDisplayOptions((options & mask) | (current & ~mask));
+ }
public void setBackgroundDrawable(Drawable d) {
mActionView.setBackgroundDrawable(d);
diff --git a/core/java/com/android/internal/database/SortCursor.java b/core/java/com/android/internal/database/SortCursor.java
index 99410bc..12248a2 100644
--- a/core/java/com/android/internal/database/SortCursor.java
+++ b/core/java/com/android/internal/database/SortCursor.java
@@ -182,24 +182,6 @@
}
@Override
- public boolean deleteRow()
- {
- return mCursor.deleteRow();
- }
-
- @Override
- public boolean commitUpdates() {
- int length = mCursors.length;
- for (int i = 0 ; i < length ; i++) {
- if (mCursors[i] != null) {
- mCursors[i].commitUpdates();
- }
- }
- onChange(true);
- return true;
- }
-
- @Override
public String getString(int column)
{
return mCursor.getString(column);
diff --git a/core/java/com/android/internal/util/HierarchicalStateMachine.java b/core/java/com/android/internal/util/HierarchicalStateMachine.java
index 9911f48..c599d68 100644
--- a/core/java/com/android/internal/util/HierarchicalStateMachine.java
+++ b/core/java/com/android/internal/util/HierarchicalStateMachine.java
@@ -51,7 +51,7 @@
mS2 mS1 ----> initial state
</code>
* After the state machine is created and started, messages are sent to a state
- * machine using <code>sendMessage</code and the messages are created using
+ * machine using <code>sendMessage</code> and the messages are created using
* <code>obtainMessage</code>. When the state machine receives a message the
* current state's <code>processMessage</code> is invoked. In the above example
* mS1.processMessage will be invoked first. The state may use <code>transitionTo</code>
@@ -59,9 +59,9 @@
*
* Each state in the state machine may have a zero or one parent states and if
* a child state is unable to handle a message it may have the message processed
- * by its parent by returning false. If a message is never processed <code>unhandledMessage</code>
- * will be invoked to give one last chance for the state machine to process
- * the message.
+ * by its parent by returning false or NOT_HANDLED. If a message is never processed
+ * <code>unhandledMessage</code> will be invoked to give one last chance for the state machine
+ * to process the message.
*
* When all processing is completed a state machine may choose to call
* <code>transitionToHaltingState</code>. When the current <code>processingMessage</code>
@@ -95,7 +95,7 @@
* any other messages that are on the queue or might be added later. Both of
* these are protected and may only be invoked from within a state machine.
*
- * To illustrate some of these properties we'll use state machine with 8
+ * To illustrate some of these properties we'll use state machine with an 8
* state hierarchy:
<code>
mP0
@@ -109,44 +109,19 @@
*
* After starting mS5 the list of active states is mP0, mP1, mS1 and mS5.
* So the order of calling processMessage when a message is received is mS5,
- * mS1, mP1, mP0 assuming each processMessage indicates it can't handle this
- * message by returning false.
+ * mS1, mP1, mP0 assuming each processMessage indicates it can't handle this
+ * message by returning false or NOT_HANDLED.
*
* Now assume mS5.processMessage receives a message it can handle, and during
- * the handling determines the machine should changes states. It would call
- * transitionTo(mS4) and return true. Immediately after returning from
+ * the handling determines the machine should change states. It could call
+ * transitionTo(mS4) and return true or HANDLED. Immediately after returning from
* processMessage the state machine runtime will find the common parent,
* which is mP1. It will then call mS5.exit, mS1.exit, mS2.enter and then
* mS4.enter. The new list of active states is mP0, mP1, mS2 and mS4. So
* when the next message is received mS4.processMessage will be invoked.
*
- * To assist in describing an HSM a simple grammar has been created which
- * is informally defined here and a formal EBNF description is at the end
- * of the class comment.
- *
- * An HSM starts with the name and includes a set of hierarchical states.
- * A state is preceeded by one or more plus signs (+), to indicate its
- * depth and a hash (#) if its the initial state. Child states follow their
- * parents and have one more plus sign then their parent. Inside a state
- * are a series of messages, the actions they perform and if the processing
- * is complete ends with a period (.). If processing isn't complete and
- * the parent should process the message it ends with a caret (^). The
- * actions include send a message ($MESSAGE), defer a message (%MESSAGE),
- * transition to a new state (>MESSAGE) and an if statement
- * (if ( expression ) { list of actions }.)
- *
- * The Hsm HelloWorld could documented as:
- *
- * HelloWorld {
- * + # mState1.
- * }
- *
- * and interpreted as HSM HelloWorld:
- *
- * mState1 a root state (single +) and initial state (#) which
- * processes all messages completely, the period (.).
- *
- * The implementation is:
+ * Now for some concrete examples, here is the canonical HelloWorld as an HSM.
+ * It responds with "Hello World" being printed to the log for every message.
<code>
class HelloWorld extends HierarchicalStateMachine {
Hsm1(String name) {
@@ -164,7 +139,7 @@
class State1 extends HierarchicalState {
@Override public boolean processMessage(Message message) {
Log.d(TAG, "Hello World");
- return true;
+ return HANDLED;
}
}
State1 mState1 = new State1();
@@ -176,7 +151,7 @@
}
</code>
*
- * A more interesting state machine is one of four states
+ * A more interesting state machine is one with four states
* with two independent parent states.
<code>
mP1 mP2
@@ -184,45 +159,68 @@
mS2 mS1
</code>
*
- * documented as:
+ * Here is a description of this state machine using pseudo code.
*
- * Hsm1 {
- * + mP1 {
- * CMD_2 {
- * $CMD_3
- * %CMD_2
- * >mS2
- * }.
- * }
- * ++ # mS1 { CMD_1{ >mS1 }^ }
- * ++ mS2 {
- * CMD_2{$CMD_4}.
- * CMD_3{%CMD_3 ; >mP2}.
- * }
*
- * + mP2 e($CMD_5) {
- * CMD_3, CMD_4.
- * CMD_5{>HALT}.
- * }
+ * state mP1 {
+ * enter { log("mP1.enter"); }
+ * exit { log("mP1.exit"); }
+ * on msg {
+ * CMD_2 {
+ * send(CMD_3);
+ * defer(msg);
+ * transitonTo(mS2);
+ * return HANDLED;
+ * }
+ * return NOT_HANDLED;
+ * }
* }
*
- * and interpreted as HierarchicalStateMachine Hsm1:
+ * INITIAL
+ * state mS1 parent mP1 {
+ * enter { log("mS1.enter"); }
+ * exit { log("mS1.exit"); }
+ * on msg {
+ * CMD_1 {
+ * transitionTo(mS1);
+ * return HANDLED;
+ * }
+ * return NOT_HANDLED;
+ * }
+ * }
*
- * mP1 a root state.
- * processes message CMD_2 which sends CMD_3, defers CMD_2, and transitions to mS2
+ * state mS2 parent mP1 {
+ * enter { log("mS2.enter"); }
+ * exit { log("mS2.exit"); }
+ * on msg {
+ * CMD_2 {
+ * send(CMD_4);
+ * return HANDLED;
+ * }
+ * CMD_3 {
+ * defer(msg);
+ * transitionTo(mP2);
+ * return HANDLED;
+ * }
+ * return NOT_HANDLED;
+ * }
+ * }
*
- * mS1 a child of mP1 is the initial state:
- * processes message CMD_1 which transitions to itself and returns false to let mP1 handle it.
- *
- * mS2 a child of mP1:
- * processes message CMD_2 which send CMD_4
- * processes message CMD_3 which defers CMD_3 and transitions to mP2
- *
- * mP2 a root state.
- * on enter it sends CMD_5
- * processes message CMD_3
- * processes message CMD_4
- * processes message CMD_5 which transitions to halt state
+ * state mP2 {
+ * enter {
+ * log("mP2.enter");
+ * send(CMD_5);
+ * }
+ * exit { log("mP2.exit"); }
+ * on msg {
+ * CMD_3, CMD_4 { return HANDLED; }
+ * CMD_5 {
+ * transitionTo(HaltingState);
+ * return HANDLED;
+ * }
+ * return NOT_HANDLED;
+ * }
+ * }
*
* The implementation is below and also in HierarchicalStateMachineTest:
<code>
@@ -271,11 +269,11 @@
sendMessage(obtainMessage(CMD_3));
deferMessage(message);
transitionTo(mS2);
- retVal = true;
+ retVal = HANDLED;
break;
default:
// Any message we don't understand in this state invokes unhandledMessage
- retVal = false;
+ retVal = NOT_HANDLED;
break;
}
return retVal;
@@ -294,10 +292,10 @@
if (message.what == CMD_1) {
// Transition to ourself to show that enter/exit is called
transitionTo(mS1);
- return true;
+ return HANDLED;
} else {
// Let parent process all other messages
- return false;
+ return NOT_HANDLED;
}
}
@Override public void exit() {
@@ -315,15 +313,15 @@
switch(message.what) {
case(CMD_2):
sendMessage(obtainMessage(CMD_4));
- retVal = true;
+ retVal = HANDLED;
break;
case(CMD_3):
deferMessage(message);
transitionTo(mP2);
- retVal = true;
+ retVal = HANDLED;
break;
default:
- retVal = false;
+ retVal = NOT_HANDLED;
break;
}
return retVal;
@@ -349,7 +347,7 @@
transitionToHaltingState();
break;
}
- return true;
+ return HANDLED;
}
@Override public void exit() {
Log.d(TAG, "mP2.exit");
@@ -357,7 +355,7 @@
}
@Override
- protected void halting() {
+ void halting() {
Log.d(TAG, "halting");
synchronized (this) {
this.notifyAll();
@@ -413,53 +411,32 @@
* D/hsm1 ( 1999): mP2.exit
* D/hsm1 ( 1999): halting
*
- * Here is the HSM a BNF grammar, this is a first stab at creating an
- * HSM description language, suggestions corrections or alternatives
- * would be much appreciated.
- *
- * Legend:
- * {} ::= zero or more
- * {}+ ::= one or more
- * [] ::= zero or one
- * () ::= define a group with "or" semantics.
- *
- * HSM EBNF:
- * HSM = HSM_NAME "{" { STATE }+ "}" ;
- * HSM_NAME = alpha_numeric_name ;
- * STATE = INTRODUCE_STATE [ ENTER | [ ENTER EXIT ] "{" [ MESSAGES ] "}" [ EXIT ] ;
- * INTRODUCE_STATE = { STATE_DEPTH }+ [ INITIAL_STATE_INDICATOR ] STATE_NAME ;
- * STATE_DEPTH = "+" ;
- * INITIAL_STATE_INDICATOR = "#"
- * ENTER = "e(" SEND_ACTION | TRANSITION_ACTION | HALT_ACTION ")" ;
- * MESSAGES = { MSG_LIST MESSAGE_ACTIONS } ;
- * MSG_LIST = { MSG_NAME { "," MSG_NAME } };
- * EXIT = "x(" SEND_ACTION | TRANSITION_ACTION | HALT_ACTION ")" ;
- * PROCESS_COMPLETION = PROCESS_IN_PARENT_OR_COMPLETE | PROCESS_COMPLETE ;
- * SEND_ACTION = "$" MSG_NAME ;
- * DEFER_ACTION = "%" MSG_NAME ;
- * TRANSITION_ACTION = ">" STATE_NAME ;
- * HALT_ACTION = ">" HALT ;
- * MESSAGE_ACTIONS = { "{" ACTION_LIST "}" } [ PROCESS_COMPLETION ] ;
- * ACTION_LIST = ACTION { (";" | "\n") ACTION } ;
- * ACTION = IF_ACTION | SEND_ACTION | DEFER_ACTION | TRANSITION_ACTION | HALT_ACTION ;
- * IF_ACTION = "if(" boolean_expression ")" "{" ACTION_LIST "}"
- * PROCESS_IN_PARENT_OR_COMPLETE = "^" ;
- * PROCESS_COMPLETE = "." ;
- * STATE_NAME = alpha_numeric_name ;
- * MSG_NAME = alpha_numeric_name | ALL_OTHER_MESSAGES ;
- * ALL_OTHER_MESSAGES = "*" ;
- * EXP = boolean_expression ;
- *
- * Idioms:
- * * { %* }. ::= All other messages will be deferred.
*/
public class HierarchicalStateMachine {
private static final String TAG = "HierarchicalStateMachine";
private String mName;
+ /** Message.what value when quitting */
public static final int HSM_QUIT_CMD = -1;
+ /** Message.what value when initializing */
+ public static final int HSM_INIT_CMD = -1;
+
+ /**
+ * Convenience constant that maybe returned by processMessage
+ * to indicate the the message was processed and is not to be
+ * processed by parent states
+ */
+ public static final boolean HANDLED = true;
+
+ /**
+ * Convenience constant that maybe returned by processMessage
+ * to indicate the the message was NOT processed and is to be
+ * processed by parent states
+ */
+ public static final boolean NOT_HANDLED = false;
+
private static class HsmHandler extends Handler {
/** The debug flag */
@@ -468,6 +445,12 @@
/** The quit object */
private static final Object mQuitObj = new Object();
+ /** The initialization message */
+ private static final Message mInitMsg = null;
+
+ /** The current message */
+ private Message mMsg;
+
/** A list of messages that this state machine has processed */
private ProcessedMessages mProcessedMessages = new ProcessedMessages();
@@ -550,8 +533,7 @@
private class QuittingState extends HierarchicalState {
@Override
public boolean processMessage(Message msg) {
- // Ignore
- return false;
+ return NOT_HANDLED;
}
}
@@ -565,6 +547,9 @@
public final void handleMessage(Message msg) {
if (mDbg) Log.d(TAG, "handleMessage: E msg.what=" + msg.what);
+ /** Save the current message */
+ mMsg = msg;
+
/**
* Check that construction was completed
*/
@@ -679,6 +664,7 @@
* starting at the first entry.
*/
mIsConstructionCompleted = true;
+ mMsg = obtainMessage(HSM_INIT_CMD);
invokeEnterMethods(0);
/**
@@ -855,6 +841,13 @@
}
/**
+ * @return current message
+ */
+ private final Message getCurrentMessage() {
+ return mMsg;
+ }
+
+ /**
* @return current state
*/
private final HierarchicalState getCurrentState() {
@@ -1025,6 +1018,14 @@
protected final void addState(HierarchicalState state, HierarchicalState parent) {
mHsmHandler.addState(state, parent);
}
+
+ /**
+ * @return current message
+ */
+ protected final Message getCurrentMessage() {
+ return mHsmHandler.getCurrentMessage();
+ }
+
/**
* @return current state
*/
@@ -1032,7 +1033,6 @@
return mHsmHandler.getCurrentState();
}
-
/**
* Add a new state to the state machine, parent will be null
* @param state to add
diff --git a/core/java/com/android/internal/view/BaseSurfaceHolder.java b/core/java/com/android/internal/view/BaseSurfaceHolder.java
index e0d3a5f..3a04993 100644
--- a/core/java/com/android/internal/view/BaseSurfaceHolder.java
+++ b/core/java/com/android/internal/view/BaseSurfaceHolder.java
@@ -33,9 +33,11 @@
public final ArrayList<SurfaceHolder.Callback> mCallbacks
= new ArrayList<SurfaceHolder.Callback>();
-
+ SurfaceHolder.Callback[] mGottenCallbacks;
+ boolean mHaveGottenCallbacks;
+
public final ReentrantLock mSurfaceLock = new ReentrantLock();
- public final Surface mSurface = new Surface();
+ public Surface mSurface = new Surface();
int mRequestedWidth = -1;
int mRequestedHeight = -1;
@@ -83,6 +85,31 @@
}
}
+ public SurfaceHolder.Callback[] getCallbacks() {
+ if (mHaveGottenCallbacks) {
+ return mGottenCallbacks;
+ }
+
+ synchronized (mCallbacks) {
+ final int N = mCallbacks.size();
+ if (N > 0) {
+ if (mGottenCallbacks == null || mGottenCallbacks.length != N) {
+ mGottenCallbacks = new SurfaceHolder.Callback[N];
+ }
+ mCallbacks.toArray(mGottenCallbacks);
+ } else {
+ mGottenCallbacks = null;
+ }
+ mHaveGottenCallbacks = true;
+ }
+
+ return mGottenCallbacks;
+ }
+
+ public void ungetCallbacks() {
+ mHaveGottenCallbacks = false;
+ }
+
public void setFixedSize(int width, int height) {
if (mRequestedWidth != width || mRequestedHeight != height) {
mRequestedWidth = width;
diff --git a/core/java/com/android/internal/view/RootViewSurfaceTaker.java b/core/java/com/android/internal/view/RootViewSurfaceTaker.java
new file mode 100644
index 0000000..fcb1645
--- /dev/null
+++ b/core/java/com/android/internal/view/RootViewSurfaceTaker.java
@@ -0,0 +1,11 @@
+package com.android.internal.view;
+
+import android.view.SurfaceHolder;
+
+/** hahahah */
+public interface RootViewSurfaceTaker {
+ SurfaceHolder.Callback willYouTakeTheSurface();
+ void setSurfaceType(int type);
+ void setSurfaceFormat(int format);
+ void setSurfaceKeepScreenOn(boolean keepOn);
+}
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index 1810fd5..f2ab134 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -27,13 +27,41 @@
{
struct NativeCode {
+ NativeCode(void* _dlhandle, android_activity_create_t* _createFunc) {
+ memset(&activity, sizeof(activity), 0);
+ memset(&callbacks, sizeof(callbacks), 0);
+ dlhandle = _dlhandle;
+ createActivityFunc = _createFunc;
+ surface = NULL;
+ }
+
+ ~NativeCode() {
+ if (callbacks.onDestroy != NULL) {
+ callbacks.onDestroy(&activity);
+ }
+ if (dlhandle != NULL) {
+ dlclose(dlhandle);
+ }
+ }
+
+ void setSurface(jobject _surface) {
+ if (surface != NULL) {
+ activity.env->DeleteGlobalRef(surface);
+ }
+ if (_surface != NULL) {
+ surface = activity.env->NewGlobalRef(_surface);
+ } else {
+ surface = NULL;
+ }
+ }
+
android_activity_t activity;
android_activity_callbacks_t callbacks;
void* dlhandle;
-
android_activity_create_t* createActivityFunc;
- void* clientContext;
+
+ jobject surface;
};
static jint
@@ -47,18 +75,13 @@
env->ReleaseStringUTFChars(path, pathStr);
if (handle != NULL) {
- code = new NativeCode();
- code->dlhandle = handle;
- code->createActivityFunc = (android_activity_create_t*)
- dlsym(handle, "android_onCreateActivity");
+ code = new NativeCode(handle, (android_activity_create_t*)
+ dlsym(handle, "android_onCreateActivity"));
if (code->createActivityFunc == NULL) {
LOGW("android_onCreateActivity not found");
delete code;
- dlclose(handle);
return 0;
}
- memset(&code->activity, sizeof(code->activity), 0);
- memset(&code->callbacks, sizeof(code->callbacks), 0);
code->activity.callbacks = &code->callbacks;
code->activity.env = env;
code->activity.clazz = clazz;
@@ -73,10 +96,6 @@
{
if (handle != 0) {
NativeCode* code = (NativeCode*)handle;
- if (code->callbacks.onDestroy != NULL) {
- code->callbacks.onDestroy(&code->activity);
- }
- dlclose(code->dlhandle);
delete code;
}
}
@@ -159,6 +178,45 @@
}
}
+static void
+onSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
+{
+ if (handle != 0) {
+ NativeCode* code = (NativeCode*)handle;
+ code->setSurface(surface);
+ if (code->callbacks.onSurfaceCreated != NULL) {
+ code->callbacks.onSurfaceCreated(&code->activity,
+ (android_surface_t*)code->surface);
+ }
+ }
+}
+
+static void
+onSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface,
+ jint format, jint width, jint height)
+{
+ if (handle != 0) {
+ NativeCode* code = (NativeCode*)handle;
+ if (code->surface != NULL && code->callbacks.onSurfaceChanged != NULL) {
+ code->callbacks.onSurfaceChanged(&code->activity,
+ (android_surface_t*)code->surface, format, width, height);
+ }
+ }
+}
+
+static void
+onSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
+{
+ if (handle != 0) {
+ NativeCode* code = (NativeCode*)handle;
+ if (code->surface != NULL && code->callbacks.onSurfaceDestroyed != NULL) {
+ code->callbacks.onSurfaceDestroyed(&code->activity,
+ (android_surface_t*)code->surface);
+ }
+ code->setSurface(NULL);
+ }
+}
+
static const JNINativeMethod g_methods[] = {
{ "loadNativeCode", "(Ljava/lang/String;)I", (void*)loadNativeCode_native },
{ "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native },
@@ -169,6 +227,9 @@
{ "onStopNative", "(I)V", (void*)onStop_native },
{ "onLowMemoryNative", "(I)V", (void*)onLowMemory_native },
{ "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native },
+ { "onSurfaceCreatedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceCreated_native },
+ { "onSurfaceChangedNative", "(ILandroid/view/SurfaceHolder;III)V", (void*)onSurfaceChanged_native },
+ { "onSurfaceDestroyedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceDestroyed_native },
};
static const char* const kNativeActivityPathName = "android/app/NativeActivity";
diff --git a/core/jni/android_bluetooth_HeadsetBase.cpp b/core/jni/android_bluetooth_HeadsetBase.cpp
index b0b0cb8..5593a26 100644
--- a/core/jni/android_bluetooth_HeadsetBase.cpp
+++ b/core/jni/android_bluetooth_HeadsetBase.cpp
@@ -169,7 +169,7 @@
// never receive non-ASCII UTF-8).
// This was added because of the BMW 2005 E46 which sends binary junk.
if (is_ascii(buf)) {
- LOG(LOG_INFO, "Bluetooth AT recv", buf);
+ LOG(LOG_INFO, "Bluetooth AT recv", "%s", buf);
} else {
LOGW("Ignoring invalid AT command: %s", buf);
buf[0] = NULL;
@@ -494,7 +494,7 @@
}
}
}
- LOG(LOG_INFO, "Bluetooth AT sent", buf);
+ LOG(LOG_INFO, "Bluetooth AT sent", "%s", buf);
free(buf);
}
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index a033e32..5e7b693 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"oblíbené"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Aktivován režim V autě"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Vyberte, chcete-li ukončit režim Na cestě."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Sdílení je aktivní"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Je aktivní tethering nebo hotspot"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Dotykem zahájíte konfiguraci"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Vysoké využití mobilních dat"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotykem zobrazíte další informace o využití mobilních dat"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index ab4a7c7..0d4b9c3 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favorit"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Biltilstand er aktiveret"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Vælg for at afslutte biltilstand."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Tethering aktiveret"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering eller hotspot er aktivt"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Tryk for at konfigurere"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Højt mobildataforbrug"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Tryk for oplysninger om brug af mobildata"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 8539d51..218054d 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -130,14 +130,14 @@
<string name="silent_mode" msgid="7167703389802618663">"Lautlos-Modus"</string>
<string name="turn_on_radio" msgid="3912793092339962371">"Funk einschalten"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"Funk ausschalten"</string>
- <string name="screen_lock" msgid="799094655496098153">"Bildschirmsperre"</string>
+ <string name="screen_lock" msgid="799094655496098153">"Display-Sperre"</string>
<string name="power_off" msgid="4266614107412865048">"Ausschalten"</string>
- <string name="shutdown_progress" msgid="2281079257329981203">"Herunterfahren..."</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"Fährt herunter..."</string>
<string name="shutdown_confirm" msgid="649792175242821353">"Ihr Telefon wird heruntergefahren."</string>
- <string name="recent_tasks_title" msgid="3691764623638127888">"Neueste"</string>
- <string name="no_recent_tasks" msgid="279702952298056674">"Keine neuen Anwendungen."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string>
+ <string name="no_recent_tasks" msgid="279702952298056674">"Keine zuletzt verwendeten Anwendungen"</string>
<string name="global_actions" msgid="2406416831541615258">"Telefonoptionen"</string>
- <string name="global_action_lock" msgid="2844945191792119712">"Bildschirmsperre"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Display-Sperre"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lautlos"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ton ist AUS"</string>
@@ -751,7 +751,7 @@
<string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"Lautlos-Modus ausgewählt"</string>
<string name="volume_call" msgid="3941680041282788711">"Hörerlautstärke"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"Lautstärke bei eingehendem Bluetooth-Anruf"</string>
- <string name="volume_alarm" msgid="1985191616042689100">"Lautstärke für Alarm"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Lautstärke für Wecker"</string>
<string name="volume_notification" msgid="2422265656744276715">"Benachrichtigungslautstärke"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Lautstärke"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Standard-Klingelton"</string>
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"Favorit"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automodus aktiviert"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Zum Beenden des Automodus auswählen"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Tethering aktiv"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oder Hotspot aktiv"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Zum Konfigurieren berühren"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Hohe Mobildatennutzung"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Weitere Informationen über die Mobildatennutzung durch Berühren aufrufen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 8838eb2..d6b1e09 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"αγαπημένο"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Η λειτουργία αυτοκινήτου είναι ενεργοποιημένη"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Επιλέξτε για έξοδο από τη λειτουργία αυτοκινήτου."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Η σύνδεση μέσω κινητής συσκευής είναι ενεργή"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Σύνδεση μέσω κινητής συσκευής ή σημείου πρόσβασης ενεργή"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Αγγίξτε για να γίνει διαμόρφωση"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Υψηλή χρήση δεδομένων κινητής τηλεφωνίας"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Αγγίξτε για να μάθετε περισσότερα σχετικά με τη χρήση δεδομένων κινητής τηλεφωνίας"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index cdd686d..0953202 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favorito"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo auto habilitado"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Seleccionar para salir del modo auto"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Conexión de anclaje a red activa"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Tocar para configurar"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Amplia utilización de datos móviles"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Toca para obtener más información acerca de la utilización de datos móviles."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index df651f2..3cb068e 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -855,10 +855,10 @@
<string name="description_star" msgid="2654319874908576133">"favoritos"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche."</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Selecciona esta opción para salir del modo coche."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Anclaje a red activo"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red activo o zona Wi-Fi"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Toca para iniciar la configuración."</string>
- <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Uso elevado datos móv"</string>
- <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Toca para más inform sobre uso de datos móv"</string>
- <string name="throttled_notification_title" msgid="6269541897729781332">"Límite datos móv superado"</string>
- <string name="throttled_notification_message" msgid="4712369856601275146">"Toca para más inform sobre uso de datos móv"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Uso elevado datos móviles"</string>
+ <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Más información sobre uso de datos"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Límite datos superado"</string>
+ <string name="throttled_notification_message" msgid="4712369856601275146">"Más información sobre uso de datos"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index d672b1e..5efcf32 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -484,7 +484,7 @@
<string name="phoneTypeOther" msgid="1544425847868765990">"Autre"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Rappel"</string>
<string name="phoneTypeCar" msgid="8738360689616716982">"Voiture"</string>
- <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Société (principal)"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Entreprise (principal)"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"RNIS"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Principal"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Autre télécopie"</string>
@@ -503,15 +503,15 @@
<string name="emailTypeWork" msgid="3548058059601149973">"Bureau"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Autre"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Mobile"</string>
- <string name="postalTypeCustom" msgid="8903206903060479902">"Personnalisée"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"Personnalisé"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Domicile"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Bureau"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Autre"</string>
- <string name="imTypeCustom" msgid="2074028755527826046">"Personnalisée"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"Personnalisé"</string>
<string name="imTypeHome" msgid="6241181032954263892">"Domicile"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Bureau"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Autre"</string>
- <string name="imProtocolCustom" msgid="6919453836618749992">"Personnalisée"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"Personnalisé"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
<string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
<string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
@@ -523,7 +523,7 @@
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
<string name="orgTypeWork" msgid="29268870505363872">"Bureau"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Autre"</string>
- <string name="orgTypeCustom" msgid="225523415372088322">"Personnalisée"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"Personnalisé"</string>
<string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Saisissez le code PIN"</string>
@@ -855,10 +855,10 @@
<string name="description_star" msgid="2654319874908576133">"favori"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode Voiture activé"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Sélectionnez cette option pour quitter le mode Voiture."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Partage de connexion activé"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Toucher pour configurer"</string>
- <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilisation importante des données mobiles"</string>
- <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Touchez pour en savoir plus sur l\'utilisation des données mobiles."</string>
- <string name="throttled_notification_title" msgid="6269541897729781332">"Plafond d\'utilisation des données mobiles dépassé"</string>
- <string name="throttled_notification_message" msgid="4712369856601275146">"Touchez pour en savoir plus sur l\'utilisation des données mobiles."</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilisation élevée des données mobiles"</string>
+ <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Touchez pour en savoir plus sur l\'utilisation des données mobiles"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Quota d\'utilisation des données mobiles dépassé"</string>
+ <string name="throttled_notification_message" msgid="4712369856601275146">"Touchez pour en savoir plus sur l\'utilisation des données mobiles"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index dd081ecd..33cb9fb 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"preferiti"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modalità automobile attivata"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Seleziona per uscire dalla modalità automobile."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Tethering attivo"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oppure hotspot attivo"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Tocca per configurare"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilizzo dati cell. elevato"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Tocca per informazioni sull\'utilizzo dati cell."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7fcef92..5816ef7 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"お気に入り"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"運転モードを有効にする"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"運転モードを終了するには選択してください。"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"テザリングが有効です"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"テザリングまたはアクセスポイントが有効です"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"タップして設定する"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"モバイルデータの使用量が増えています"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"タップしてモバイルデータ利用の詳細を表示します"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1f742bf..fa30eb2 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"즐겨찾기"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"차량 모드 사용"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"차량 모드를 종료하려면 선택하세요."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"테더링 사용중"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"테더링 또는 핫스팟 사용"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"구성하려면 터치하세요."</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"높은 모바일 데이터 사용량"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"모바일 데이터 사용에 대해 자세히 알아보려면 터치하세요."</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 318fc15..f92435c 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favoritt"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Bilmodus er aktivert"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Velg for å avslutte bilmodus"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Tilknytning er aktiv"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tilknytning eller trådløs sone er aktiv"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Trykk for å konfigurere"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Høy mobildatabruk"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Berør for å lese mer om bruk av mobildata"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 736855f..a9586e1 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favoriet"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automodus ingeschakeld"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Selecteer dit om de automodus af te sluiten."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Tethering actief"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering of hotspot actief"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Aanraken om te configureren"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Hoog mobiel gegevensgebruik"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Raak aan voor meer informatie over mobiel gegevensgebruik"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 597bd69..c1f4033 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -855,10 +855,10 @@
<string name="description_star" msgid="2654319874908576133">"ulubione"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Tryb samochodowy włączony"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Wybierz, aby zakończyć tryb samochodowy."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Powiązanie aktywne"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Jest aktywne powiązanie lub punkt dostępu"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Dotknij, aby skonfigurować"</string>
- <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Wysoki poziom użycia danych komórkowych"</string>
- <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotknij, aby uzyskać więcej informacji na temat używania danych komórkowych"</string>
- <string name="throttled_notification_title" msgid="6269541897729781332">"Przekroczono limit danych komórkowych"</string>
- <string name="throttled_notification_message" msgid="4712369856601275146">"Dotknij, aby uzyskać więcej informacji na temat używania danych komórkowych"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Wysoki poziom użycia danych"</string>
+ <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotknij, aby zobaczyć statystyki przesyłu danych"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Przekroczono limit danych"</string>
+ <string name="throttled_notification_message" msgid="4712369856601275146">"Dotknij, aby zobaczyć statystyki przesyłu danych"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 8302dd2..750d257 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favorito"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo automóvel activado"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Seleccionar para sair do modo automóvel."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Associação activa"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Ligação ponto a ponto ou hotspot activos"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Tocar para configurar"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilização elevada de dados móveis"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Toque para saber mais sobre a utilização de dados móveis"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 92bf56c..12f77bc 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favorito"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo de carro ativado"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Selecione para sair do modo de carro."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Vínculo ativo"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Toque para configurar"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Alto uso de dados do celular"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Toque para saber mais sobre uso de dados do celular"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index abc726c..61123b1 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"избранное"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Режим громкой связи включен"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Выберите для выхода из режима громкой связи."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Подключение активно"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"USB-модем или точка доступа Wi-Fi активны"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Нажмите для настройки"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Активная передача данных"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Нажмите, чтобы узнать больше о мобильной передаче данных"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 2fefa21..b7cbc52 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favorit"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Billäge aktiverat"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Välj om du vill avsluta billäge."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Aktiv sammanlänkning"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfpunkt aktiverad"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Tryck om du vill konfigurera"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Hög mobildataanvändning"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Tryck om du vill veta mer om mobildataanvändning"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 7066cb0..cb1e399 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"favori"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Araba modu etkin"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Araba modundan çıkmak için seçin."</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"Bağlantı etkin"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Doğrudan bağlantı veya ortak erişim noktası etkin"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Yapılandırmak için dokunun"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Yüksek düzeyde mobil veri kullanımı"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Mobil veri kullanımı hakkında daha fazla bilgi edinmek için dokunun"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 455429c..b7c5bbc 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -725,7 +725,7 @@
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="yes" msgid="5362982303337969312">"确定"</string>
<string name="no" msgid="5141531044935541497">"取消"</string>
- <string name="dialog_alert_title" msgid="2049658708609043103">"注意事项"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"注意"</string>
<string name="capital_on" msgid="1544682755514494298">"打开"</string>
<string name="capital_off" msgid="6815870386972805832">"关闭"</string>
<string name="whichApplication" msgid="4533185947064773386">"使用以下方式发送"</string>
@@ -734,8 +734,8 @@
<string name="chooseActivity" msgid="1009246475582238425">"选择一项操作"</string>
<string name="noApplications" msgid="1691104391758345586">"没有应用程序可执行此操作。"</string>
<string name="aerr_title" msgid="653922989522758100">"很抱歉!"</string>
- <string name="aerr_application" msgid="4683614104336409186">"“<xliff:g id="APPLICATION">%1$s</xliff:g>”应用程序(在“<xliff:g id="PROCESS">%2$s</xliff:g>”进程中)意外停止,请重试。"</string>
- <string name="aerr_process" msgid="1551785535966089511">"“<xliff:g id="PROCESS">%1$s</xliff:g>”进程意外停止,请重试。"</string>
+ <string name="aerr_application" msgid="4683614104336409186">"应用程序 <xliff:g id="APPLICATION">%1$s</xliff:g>(进程:<xliff:g id="PROCESS">%2$s</xliff:g>)意外停止,请重试。"</string>
+ <string name="aerr_process" msgid="1551785535966089511">"<xliff:g id="PROCESS">%1$s</xliff:g> 进程意外停止,请重试。"</string>
<string name="anr_title" msgid="3100070910664756057">"很抱歉!"</string>
<string name="anr_activity_application" msgid="3538242413112507636">"“<xliff:g id="ACTIVITY">%1$s</xliff:g>”活动(在“<xliff:g id="APPLICATION">%2$s</xliff:g>”应用程序中)无响应。"</string>
<string name="anr_activity_process" msgid="5420826626009561014">"“<xliff:g id="ACTIVITY">%1$s</xliff:g>”活动(在“<xliff:g id="PROCESS">%2$s</xliff:g>”进程中)无响应。"</string>
@@ -855,10 +855,10 @@
<string name="description_star" msgid="2654319874908576133">"收藏"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已启用车载模式"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"选择退出车载模式"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"绑定生效"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"USB 绑定或热点已启用"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"触摸可进行配置"</string>
- <string name="throttle_warning_notification_title" msgid="4890894267454867276">"手机数据使用过多"</string>
- <string name="throttle_warning_notification_message" msgid="2609734763845705708">"轻触以了解有关手机数据使用的详情"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"手机流量过多"</string>
+ <string name="throttle_warning_notification_message" msgid="2609734763845705708">"轻触以了解有关手机流量详情"</string>
<string name="throttled_notification_title" msgid="6269541897729781332">"已超出手机数据上限"</string>
- <string name="throttled_notification_message" msgid="4712369856601275146">"轻触以了解有关手机数据使用的详情"</string>
+ <string name="throttled_notification_message" msgid="4712369856601275146">"轻触以了解有关手机流量详情"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1424b51..549f571 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -75,7 +75,7 @@
<string name="RestrictedOnVoiceData" msgid="8244438624660371717">"已封鎖語音/資料服務。"</string>
<string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"已封鎖語音/SMS 服務。"</string>
<string name="RestrictedOnAll" msgid="2714924667937117304">"已封鎖所有語音/資料/SMS 服務。"</string>
- <string name="serviceClassVoice" msgid="1258393812335258019">"語音"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"語音服務"</string>
<string name="serviceClassData" msgid="872456782077937893">"資料"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"傳真"</string>
<string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
@@ -598,10 +598,10 @@
<string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"允許應用程式修改儲存在電話上的瀏覽記錄或書籤。請注意:惡意應用程式可能會使用此選項來清除或修改您瀏覽器的資料。"</string>
<string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"修改瀏覽器地理資訊的權限"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"允許應用程式修改瀏覽器的地理位置權限,惡意應用程式可能會透過此方式允許將您的位置資訊任意傳送給某些網站。"</string>
- <string name="save_password_message" msgid="767344687139195790">"是否記憶此密碼?"</string>
+ <string name="save_password_message" msgid="767344687139195790">"是否記住此密碼?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"現在不要"</string>
<string name="save_password_remember" msgid="6491879678996749466">"記住"</string>
- <string name="save_password_never" msgid="8274330296785855105">"從不"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"永不"</string>
<string name="open_permission_deny" msgid="5661861460947222274">"您沒有開啟此頁的權限。"</string>
<string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
@@ -855,7 +855,7 @@
<string name="description_star" msgid="2654319874908576133">"我的最愛"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已啟用車用模式"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"選取結束車用模式。"</string>
- <string name="tethered_notification_title" msgid="8146103971290167718">"啟用數據連線"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"數據連線或無線基地台已啟用"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"輕觸以設定"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"高行動資料用量"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"輕觸即可瞭解更多有關行動資料用量的詳細資訊"</string>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index 4672c0e..a0bc5b3 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -128,11 +128,11 @@
<item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">data_connection</xliff:g></item>
<item><xliff:g id="id">cdma_eri</xliff:g></item>
+ <item><xliff:g id="id">wifi</xliff:g></item>
<item><xliff:g id="id">tty</xliff:g></item>
<item><xliff:g id="id">volume</xliff:g></item>
<item><xliff:g id="id">mute</xliff:g></item>
<item><xliff:g id="id">speakerphone</xliff:g></item>
- <item><xliff:g id="id">wifi</xliff:g></item>
<item><xliff:g id="id">tty</xliff:g></item>
<item><xliff:g id="id">bluetooth</xliff:g></item>
<item><xliff:g id="id">gps</xliff:g></item>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 870770f..0071ea2 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1513,12 +1513,27 @@
progress dialog in the meantime. this is the emssage. -->
<string name="lockscreen_sim_unlock_progress_dialog_message">Unlocking SIM card\u2026</string>
- <!-- For the unlock screen, Information message shown in dialog when user has too many failed attempts -->
+ <!-- For the unlock screen, Information message shown in dialog when user has too many failed attempts at
+ drawing the unlock pattern -->
<string name="lockscreen_too_many_failed_attempts_dialog_message">
You have incorrectly drawn your unlock pattern <xliff:g id="number">%d</xliff:g> times.
\n\nPlease try again in <xliff:g id="number">%d</xliff:g> seconds.
</string>
+ <!-- For the unlock screen, Information message shown in dialog when user has too many failed attempts at
+ entering the password -->
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message">
+ You have incorrectly entered your password <xliff:g id="number">%d</xliff:g> times.
+ \n\nPlease try again in <xliff:g id="number">%d</xliff:g> seconds.
+ </string>
+
+ <!-- For the unlock screen, Information message shown in dialog when user has too many failed attempts at
+ entering the PIN -->
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message">
+ You have incorrectly entered your PIN <xliff:g id="number">%d</xliff:g> times.
+ \n\nPlease try again in <xliff:g id="number">%d</xliff:g> seconds.
+ </string>
+
<!-- For the unlock screen, Information message shown in dialog when user is almost at the limit
where they will be locked out and may have to enter an alternate username/password to unlock the phone -->
<string name="lockscreen_failed_attempts_almost_glogin">
@@ -1628,7 +1643,7 @@
<!-- Do not translate. WebView User Agent string -->
<string name="web_user_agent" translatable="false"><xliff:g id="x">Mozilla/5.0 (Linux; U; Android %s)
- AppleWebKit/533.6 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.6</xliff:g></string>
+ AppleWebKit/533.9 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.9</xliff:g></string>
<!-- Title for a JavaScript dialog. "The page at <url of current page> says:" -->
<string name="js_dialog_title">The page at \'<xliff:g id="title">%s</xliff:g>\' says:</string>
diff --git a/core/tests/ConnectivityManagerTest/AndroidManifest.xml b/core/tests/ConnectivityManagerTest/AndroidManifest.xml
index c318577..5480993 100644
--- a/core/tests/ConnectivityManagerTest/AndroidManifest.xml
+++ b/core/tests/ConnectivityManagerTest/AndroidManifest.xml
@@ -24,17 +24,19 @@
<application>
<uses-library android:name="android.test.runner" />
<activity android:name="ConnectivityManagerTestActivity"
- android:label="CMTest">
+ android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.TEST" />
+ <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!--
This declares that this app uses the instrumentation test runner targeting
- the package of browserpowertest. To run the tests use the command:
- "adb shell am instrument -w com.android.connectivitymanagertest/.ConnectivityManagerTestRunner"
+ the package of connectivitymanagertest. To run the tests use the command:
+ "adb shell am instrument -e ssid <SSID> -w
+ com.android.connectivitymanagertest/.ConnectivityManagerTestRunner",
+ the access point <SSID> should be an open AP.
-->
<instrumentation android:name=".ConnectivityManagerTestRunner"
android:targetPackage="com.android.connectivitymanagertest"
diff --git a/core/tests/ConnectivityManagerTest/res/values/strings.xml b/core/tests/ConnectivityManagerTest/res/values/strings.xml
new file mode 100644
index 0000000..fb6e82f
--- /dev/null
+++ b/core/tests/ConnectivityManagerTest/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">ConnectivityManagerTest</string>
+</resources>
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 82834b6..1f2e97c 100755
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -1039,10 +1039,9 @@
* Install package on sdcard. Unmount and then mount the media.
* (Use PackageManagerService private api for now)
* Make sure the installed package is available.
- * STOPSHIP will uncomment when MountService api's to mount/unmount
- * are made asynchronous.
*/
- public void xxxtestMountSdNormalInternal() {
+ @MediumTest
+ public void testMountSdNormalInternal() {
assertTrue(mountFromRawResource());
}
@@ -1444,7 +1443,7 @@
int result = PackageManager.MOVE_FAILED_FORWARD_LOCKED;
sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
}
- //TODO: To be reenabled after investigation
+ @MediumTest
public void testMoveAppFailInternalToExternalDelete() {
int installFlags = 0;
int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
@@ -1461,7 +1460,8 @@
ip = installFromRawResource("install.apk", R.raw.install, installFlags, false,
false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
// Delete the package now retaining data.
- pm.deletePackage(ip.pkg.packageName, null, PackageManager.DONT_DELETE_DATA);
+ GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
+ invokeDeletePackage(ip.pkg.packageName, PackageManager.DONT_DELETE_DATA, receiver);
assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result));
} catch (Exception e) {
failStr(e);
@@ -2346,6 +2346,49 @@
}
}
+
+ /* This test installs an application on sdcard and unmounts media.
+ * The app is then re-installed on internal storage. The sdcard is mounted
+ * and verified that the re-installation on internal storage takes precedence.
+ */
+ @MediumTest
+ public void testInstallSdcardStaleContainerReinstall() {
+ boolean origMediaState = getMediaState();
+ try {
+ // Mount media first
+ mountMedia();
+ String outFileName = "install.apk";
+ int rawResId = R.raw.install;
+ PackageManager pm = mContext.getPackageManager();
+ File filesDir = mContext.getFilesDir();
+ File outFile = new File(filesDir, outFileName);
+ Uri packageURI = getInstallablePackage(rawResId, outFile);
+ PackageParser.Package pkg = parsePackage(packageURI);
+ assertNotNull(pkg);
+ // Install an app on sdcard.
+ installFromRawResource(outFileName, rawResId,
+ PackageManager.INSTALL_EXTERNAL, false,
+ false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ // Unmount sdcard
+ unmountMedia();
+ // Reinstall the app and make sure it gets installed on internal storage.
+ installFromRawResource(outFileName, rawResId,
+ PackageManager.INSTALL_REPLACE_EXISTING, false,
+ false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ mountMedia();
+ // Verify that the app installed is on internal storage.
+ assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ } catch (Exception e) {
+ failStr(e.getMessage());
+ } finally {
+ if (origMediaState) {
+ mountMedia();
+ } else {
+ unmountMedia();
+ }
+
+ }
+ }
/*
* The following series of tests are related to upgrading apps with
* different certificates.
diff --git a/core/tests/coretests/src/android/database/DatabaseCursorTest.java b/core/tests/coretests/src/android/database/DatabaseCursorTest.java
index fb5a36f..0265c87 100644
--- a/core/tests/coretests/src/android/database/DatabaseCursorTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseCursorTest.java
@@ -92,43 +92,6 @@
}
@MediumTest
- public void testCursorUpdate() {
- mDatabase.execSQL(
- "CREATE TABLE test (_id INTEGER PRIMARY KEY, d INTEGER, s INTEGER);");
- for(int i = 0; i < 20; i++) {
- mDatabase.execSQL("INSERT INTO test (d, s) VALUES (" + i +
- "," + i%2 + ");");
- }
-
- Cursor c = mDatabase.query("test", null, "s = 0", null, null, null, null);
- int dCol = c.getColumnIndexOrThrow("d");
- int sCol = c.getColumnIndexOrThrow("s");
-
- int count = 0;
- while (c.moveToNext()) {
- assertTrue(c.updateInt(dCol, 3));
- count++;
- }
- assertEquals(10, count);
-
- assertTrue(c.commitUpdates());
-
- assertTrue(c.requery());
-
- count = 0;
- while (c.moveToNext()) {
- assertEquals(3, c.getInt(dCol));
- count++;
- }
-
- assertEquals(10, count);
- assertTrue(c.moveToFirst());
- assertTrue(c.deleteRow());
- assertEquals(9, c.getCount());
- c.close();
- }
-
- @MediumTest
public void testBlob() throws Exception {
// create table
mDatabase.execSQL(
@@ -164,24 +127,7 @@
assertTrue(Arrays.equals(blob, cBlob));
assertEquals(s, c.getString(sCol));
assertEquals((double)d, c.getDouble(dCol));
- assertEquals((long)l, c.getLong(lCol));
-
- // new byte[]
- byte[] newblob = new byte[1000];
- value = 98;
- Arrays.fill(blob, value);
-
- c.updateBlob(bCol, newblob);
- cBlob = c.getBlob(bCol);
- assertTrue(Arrays.equals(newblob, cBlob));
-
- // commit
- assertTrue(c.commitUpdates());
- assertTrue(c.requery());
- c.moveToNext();
- cBlob = c.getBlob(bCol);
- assertTrue(Arrays.equals(newblob, cBlob));
- c.close();
+ assertEquals((long)l, c.getLong(lCol));
}
@MediumTest
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index 34434d2..d9a234a 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -26,9 +26,11 @@
import android.os.Parcel;
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.SmallTest;
import android.util.Log;
+import android.util.Pair;
import junit.framework.Assert;
@@ -468,45 +470,6 @@
}
@MediumTest
- public void testNotificationTest1() throws Exception {
- /*
- Cursor c = mContentResolver.query(Notes.CONTENT_URI,
- new String[] {Notes._ID, Notes.NOTE},
- null, null);
- c.registerContentObserver(new MyContentObserver(true));
- int count = c.count();
-
- MyContentObserver observer = new MyContentObserver(false);
- mContentResolver.registerContentObserver(Notes.CONTENT_URI, true, observer);
-
- Uri uri;
-
- HashMap<String, String> values = new HashMap<String, String>();
- values.put(Notes.NOTE, "test note1");
- uri = mContentResolver.insert(Notes.CONTENT_URI, values);
- assertEquals(1, mCursorNotificationCount);
- assertEquals(1, mNotificationCount);
-
- c.requery();
- assertEquals(count + 1, c.count());
- c.first();
- assertEquals("test note1", c.getString(c.getColumnIndex(Notes.NOTE)));
- c.updateString(c.getColumnIndex(Notes.NOTE), "test note2");
- c.commitUpdates();
-
- assertEquals(2, mCursorNotificationCount);
- assertEquals(2, mNotificationCount);
-
- mContentResolver.delete(uri, null);
-
- assertEquals(3, mCursorNotificationCount);
- assertEquals(3, mNotificationCount);
-
- mContentResolver.unregisterContentObserver(observer);
- */
- }
-
- @MediumTest
public void testSelectionArgs() throws Exception {
mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
ContentValues values = new ContentValues(1);
@@ -1177,4 +1140,96 @@
assertTrue(e.getMessage().contains("cannot set cacheSize to a value less than"));
}
}
+
+ @LargeTest
+ public void testDefaultDatabaseErrorHandler() {
+ DefaultDatabaseErrorHandler errorHandler = new DefaultDatabaseErrorHandler();
+
+ // close the database. and call corruption handler.
+ // it should delete the database file.
+ File dbfile = new File(mDatabase.getPath());
+ mDatabase.close();
+ assertFalse(mDatabase.isOpen());
+ assertTrue(dbfile.exists());
+ try {
+ errorHandler.onCorruption(mDatabase);
+ assertFalse(dbfile.exists());
+ } catch (Exception e) {
+ fail("unexpected");
+ }
+
+ // create an in-memory database. and corruption handler shouldn't try to delete it
+ SQLiteDatabase memoryDb = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
+ assertNotNull(memoryDb);
+ memoryDb.close();
+ assertFalse(memoryDb.isOpen());
+ try {
+ errorHandler.onCorruption(memoryDb);
+ } catch (Exception e) {
+ fail("unexpected");
+ }
+
+ // create a database, keep it open, call corruption handler. database file should be deleted
+ SQLiteDatabase dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
+ assertTrue(dbfile.exists());
+ assertNotNull(dbObj);
+ assertTrue(dbObj.isOpen());
+ try {
+ errorHandler.onCorruption(dbObj);
+ assertFalse(dbfile.exists());
+ } catch (Exception e) {
+ fail("unexpected");
+ }
+
+ // create a database, attach 2 more databases to it
+ // attached database # 1: ":memory:"
+ // attached database # 2: mDatabase.getPath() + "1";
+ // call corruption handler. database files including the one for attached database # 2
+ // should be deleted
+ String attachedDb1File = mDatabase.getPath() + "1";
+ dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
+ dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
+ dbObj.execSQL("ATTACH DATABASE '" + attachedDb1File + "' as attachedDb1");
+ assertTrue(dbfile.exists());
+ assertTrue(new File(attachedDb1File).exists());
+ assertNotNull(dbObj);
+ assertTrue(dbObj.isOpen());
+ ArrayList<Pair<String, String>> attachedDbs = dbObj.getAttachedDbs();
+ try {
+ errorHandler.onCorruption(dbObj);
+ assertFalse(dbfile.exists());
+ assertFalse(new File(attachedDb1File).exists());
+ } catch (Exception e) {
+ fail("unexpected");
+ }
+
+ // same as above, except this is a bit of stress testing. attach 5 database files
+ // and make sure they are all removed.
+ int N = 5;
+ ArrayList<String> attachedDbFiles = new ArrayList<String>(N);
+ for (int i = 0; i < N; i++) {
+ attachedDbFiles.add(mDatabase.getPath() + i);
+ }
+ dbObj = SQLiteDatabase.openOrCreateDatabase(mDatabase.getPath(), null);
+ dbObj.execSQL("ATTACH DATABASE ':memory:' as memoryDb");
+ for (int i = 0; i < N; i++) {
+ dbObj.execSQL("ATTACH DATABASE '" + attachedDbFiles.get(i) + "' as attachedDb" + i);
+ }
+ assertTrue(dbfile.exists());
+ for (int i = 0; i < N; i++) {
+ assertTrue(new File(attachedDbFiles.get(i)).exists());
+ }
+ assertNotNull(dbObj);
+ assertTrue(dbObj.isOpen());
+ attachedDbs = dbObj.getAttachedDbs();
+ try {
+ errorHandler.onCorruption(dbObj);
+ assertFalse(dbfile.exists());
+ for (int i = 0; i < N; i++) {
+ assertFalse(new File(attachedDbFiles.get(i)).exists());
+ }
+ } catch (Exception e) {
+ fail("unexpected");
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/os/HierarchicalStateMachineTest.java b/core/tests/coretests/src/android/os/HierarchicalStateMachineTest.java
index 89b3fb6..639372b2 100644
--- a/core/tests/coretests/src/android/os/HierarchicalStateMachineTest.java
+++ b/core/tests/coretests/src/android/os/HierarchicalStateMachineTest.java
@@ -74,15 +74,15 @@
if (isQuit(message)) {
mQuitCount += 1;
if (mQuitCount > 2) {
- // Returning false to actually quit
- return false;
+ // Returning NOT_HANDLED to actually quit
+ return NOT_HANDLED;
} else {
// Do NOT quit
- return true;
+ return HANDLED;
}
} else {
// All other message are handled
- return true;
+ return HANDLED;
}
}
}
@@ -172,12 +172,18 @@
class S1 extends HierarchicalState {
@Override protected void enter() {
+ // Test that message is HSM_INIT_CMD
+ assertEquals(HSM_INIT_CMD, getCurrentMessage().what);
+
// Test that a transition in enter and the initial state works
mS1EnterCount += 1;
transitionTo(mS2);
Log.d(TAG, "S1.enter");
}
@Override protected void exit() {
+ // Test that message is HSM_INIT_CMD
+ assertEquals(HSM_INIT_CMD, getCurrentMessage().what);
+
mS1ExitCount += 1;
Log.d(TAG, "S1.exit");
}
@@ -185,10 +191,16 @@
class S2 extends HierarchicalState {
@Override protected void enter() {
+ // Test that message is HSM_INIT_CMD
+ assertEquals(HSM_INIT_CMD, getCurrentMessage().what);
+
mS2EnterCount += 1;
Log.d(TAG, "S2.enter");
}
@Override protected void exit() {
+ // Test that message is TEST_CMD_1
+ assertEquals(TEST_CMD_1, getCurrentMessage().what);
+
// Test transition in exit work
mS2ExitCount += 1;
transitionTo(mS4);
@@ -196,10 +208,10 @@
}
@Override protected boolean processMessage(Message message) {
// Start a transition to S3 but it will be
- // changed to a transition to S4
+ // changed to a transition to S4 in exit
transitionTo(mS3);
Log.d(TAG, "S2.processMessage");
- return true;
+ return HANDLED;
}
}
@@ -264,7 +276,7 @@
}
synchronized (smEnterExitTranstionToTest) {
- smEnterExitTranstionToTest.sendMessage(1);
+ smEnterExitTranstionToTest.sendMessage(TEST_CMD_1);
try {
// wait for the messages to be handled
@@ -321,7 +333,7 @@
if (message.what == TEST_CMD_6) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
}
@@ -415,7 +427,7 @@
assertEquals(1, mExitCount);
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
@Override protected void exit() {
@@ -510,7 +522,7 @@
if (message.what == TEST_CMD_2) {
transitionTo(mS2);
}
- return true;
+ return HANDLED;
}
@Override protected void exit() {
@@ -523,7 +535,7 @@
if (message.what == TEST_CMD_2) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
}
@@ -612,13 +624,13 @@
if (message.what == TEST_CMD_2) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
}
class ChildState extends HierarchicalState {
@Override protected boolean processMessage(Message message) {
- return false;
+ return NOT_HANDLED;
}
}
@@ -697,20 +709,20 @@
if (message.what == TEST_CMD_2) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
}
class ChildState1 extends HierarchicalState {
@Override protected boolean processMessage(Message message) {
transitionTo(mChildState2);
- return true;
+ return HANDLED;
}
}
class ChildState2 extends HierarchicalState {
@Override protected boolean processMessage(Message message) {
- return false;
+ return NOT_HANDLED;
}
}
@@ -794,7 +806,7 @@
mParentState1EnterCount += 1;
}
@Override protected boolean processMessage(Message message) {
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mParentState1ExitCount += 1;
@@ -822,7 +834,7 @@
assertEquals(0, mChildState5ExitCount);
transitionTo(mChildState2);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mChildState1ExitCount += 1;
@@ -850,7 +862,7 @@
assertEquals(0, mChildState5ExitCount);
transitionTo(mChildState5);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mChildState2ExitCount += 1;
@@ -878,7 +890,7 @@
assertEquals(1, mChildState5ExitCount);
transitionToHaltingState();
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mParentState2ExitCount += 1;
@@ -906,7 +918,7 @@
assertEquals(1, mChildState5ExitCount);
transitionTo(mChildState4);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mChildState3ExitCount += 1;
@@ -934,7 +946,7 @@
assertEquals(1, mChildState5ExitCount);
transitionTo(mParentState2);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mChildState4ExitCount += 1;
@@ -962,7 +974,7 @@
assertEquals(0, mChildState5ExitCount);
transitionTo(mChildState3);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
mChildState5ExitCount += 1;
@@ -1108,7 +1120,7 @@
mArrivalTimeMsg2 = SystemClock.elapsedRealtime();
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
@Override protected void exit() {
@@ -1190,7 +1202,7 @@
class S1 extends HierarchicalState {
@Override protected boolean processMessage(Message message) {
transitionTo(mS2);
- return true;
+ return HANDLED;
}
@Override protected void exit() {
sendMessage(TEST_CMD_2);
@@ -1216,7 +1228,7 @@
if (mMsgCount == 2) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
@Override protected void exit() {
@@ -1300,7 +1312,7 @@
if (message.what == TEST_CMD_2) {
transitionToHaltingState();
}
- return false;
+ return NOT_HANDLED;
}
}
@@ -1369,7 +1381,7 @@
if (message.what == TEST_CMD_4) {
transitionToHaltingState();
}
- return true;
+ return HANDLED;
}
}
@@ -1563,10 +1575,10 @@
if (message.what == CMD_1) {
// Transition to ourself to show that enter/exit is called
transitionTo(mS1);
- return true;
+ return HANDLED;
} else {
// Let parent process all other messages
- return false;
+ return NOT_HANDLED;
}
}
@Override protected void exit() {
@@ -1618,7 +1630,7 @@
transitionToHaltingState();
break;
}
- return true;
+ return HANDLED;
}
@Override protected void exit() {
Log.d(TAG, "P2.exit");
diff --git a/core/tests/coretests/src/android/view/VelocityTest.java b/core/tests/coretests/src/android/view/VelocityTest.java
new file mode 100644
index 0000000..fb28e1e
--- /dev/null
+++ b/core/tests/coretests/src/android/view/VelocityTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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 com.android.frameworktest.view;
+
+import junit.framework.Assert;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+
+/**
+ * Exercises {@link android.view.VelocityTracker} to compute correct velocity.<br>
+ * To launch this test, use :<br>
+ * <code>./development/testrunner/runtest.py framework -c com.android.frameworktest.view.VelocityTest</code>
+ */
+public class VelocityTest extends InstrumentationTestCase {
+
+ @MediumTest
+ public void testInitialCondiditions() {
+ VelocityTracker vt = VelocityTracker.obtain();
+ assertNotNull(vt);
+ vt.recycle();
+ }
+
+ /**
+ * Test that {@link android.view.VelocityTracker}.clear() clears
+ * the previous values after a call to computeCurrentVelocity()
+ */
+ @MediumTest
+ public void testClear() {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 300);
+ vt.computeCurrentVelocity(1);
+ assertFalse("Velocity should not be null", vt.getXVelocity() == 0.0f);
+ assertFalse("Velocity should not be null", vt.getYVelocity() == 0.0f);
+ vt.clear();
+ vt.computeCurrentVelocity(1);
+ assertEquals(0.0f, vt.getXVelocity());
+ assertEquals(0.0f, vt.getYVelocity());
+ vt.recycle();
+ }
+
+ @MediumTest
+ public void testDragAcceleration () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 15, t, 400, new AccelerateInterpolator());
+ vt.computeCurrentVelocity(1000);
+ assertGreater(250.0f, vt.getXVelocity());
+ assertGreater(250.0f, vt.getYVelocity());
+ vt.recycle();
+ }
+
+ @MediumTest
+ public void testDragDeceleration () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 15, t, 400, new DecelerateInterpolator());
+ vt.computeCurrentVelocity(1000);
+ assertLower(250.0f, vt.getXVelocity());
+ assertLower(250.0f, vt.getYVelocity());
+ vt.recycle();
+ }
+
+ @MediumTest
+ public void testDragLinearHorizontal() {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ // 100px in 400ms => 250px/s
+ drag(vt, 100, 200, 200, 200, 15, t, 400);
+ vt.computeCurrentVelocity(1000);
+ assertEquals(0.0f, vt.getYVelocity());
+ assertEqualFuzzy(250.0f, vt.getXVelocity(), 4f);
+ vt.recycle();
+ }
+
+ @MediumTest
+ public void testDragLinearVertical() {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ // 100px in 400ms => 250px/s
+ drag(vt, 200, 200, 100, 200, 15, t, 400);
+ vt.computeCurrentVelocity(1000);
+ assertEquals(0.0f, vt.getXVelocity());
+ assertEqualFuzzy(250.0f, vt.getYVelocity(), 4f);
+ vt.recycle();
+ }
+
+ /**
+ * Test dragging with two points only
+ * (velocity must be an exact value)
+ */
+ @MediumTest
+ public void testDragWith2Points () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ // 100px, 2 steps, 100ms => 1000px/s
+ drag(vt, 100, 200, 100, 200, 2, t, 100);
+ vt.computeCurrentVelocity(1000);
+ assertEquals(1000.0f, vt.getXVelocity());
+ assertEquals(1000.0f, vt.getYVelocity());
+ vt.recycle();
+ }
+
+ /**
+ * Velocity is independent of the number of points used during
+ * the same interval
+ */
+ @MediumTest
+ public void testStabilityInNbPoints () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 400); // 10 steps over 400ms
+ vt.computeCurrentVelocity(1);
+ float firstX = vt.getXVelocity();
+ float firstY = vt.getYVelocity();
+ vt.clear();
+ drag(vt, 100, 200, 100, 200, 20, t, 400); // 20 steps over 400ms
+ vt.computeCurrentVelocity(1);
+ float secondX = vt.getXVelocity();
+ float secondY = vt.getYVelocity();
+ assertEqualFuzzy(firstX, secondX, 0.1f);
+ assertEqualFuzzy(firstY, secondY, 0.1f);
+ vt.recycle();
+ }
+
+ /**
+ * Velocity is independent of the time when the events occurs,
+ * it only depends on delays between the events.
+ */
+ @MediumTest
+ public void testStabilityInTime () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 400);
+ vt.computeCurrentVelocity(1);
+ float firstX = vt.getXVelocity();
+ float firstY = vt.getYVelocity();
+ vt.clear();
+ drag(vt, 100, 200, 100, 200, 10, t + 3600*1000, 400); // on hour later
+ vt.computeCurrentVelocity(1);
+ float secondX = vt.getXVelocity();
+ float secondY = vt.getYVelocity();
+ assertEqualFuzzy(firstX, secondX, 0.1f);
+ assertEqualFuzzy(firstY, secondY, 0.1f);
+ vt.recycle();
+ }
+
+ /**
+ * Velocity is independent of the position of the events,
+ * it only depends on their relative distance.
+ */
+ @MediumTest
+ public void testStabilityInSpace () {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 400);
+ vt.computeCurrentVelocity(1);
+ float firstX = vt.getXVelocity();
+ float firstY = vt.getYVelocity();
+ vt.clear();
+ drag(vt, 200, 300, 200, 300, 10, t, 400); // 100px further
+ vt.computeCurrentVelocity(1);
+ float secondX = vt.getXVelocity();
+ float secondY = vt.getYVelocity();
+ assertEqualFuzzy(firstX, secondX, 0.1f);
+ assertEqualFuzzy(firstY, secondY, 0.1f);
+ vt.recycle();
+ }
+
+ /**
+ * Test that calls to {@link android.view.VelocityTracker}.computeCurrentVelocity()
+ * will output same values when using the same data.
+ */
+ @MediumTest
+ public void testStabilityOfComputation() {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 300);
+ vt.computeCurrentVelocity(1);
+ float firstX = vt.getXVelocity();
+ float firstY = vt.getYVelocity();
+ vt.computeCurrentVelocity(1);
+ float secondX = vt.getXVelocity();
+ float secondY = vt.getYVelocity();
+ assertEquals(firstX, secondX);
+ assertEquals(firstY, secondY);
+ vt.recycle();
+ }
+
+ /**
+ * Test the units parameter of {@link android.view.VelocityTracker}.computeCurrentVelocity()
+ */
+ @MediumTest
+ public void testStabilityOfUnits() {
+ long t = System.currentTimeMillis();
+ VelocityTracker vt = VelocityTracker.obtain();
+ drag(vt, 100, 200, 100, 200, 10, t, 300);
+ vt.computeCurrentVelocity(1);
+ float firstX = vt.getXVelocity();
+ float firstY = vt.getYVelocity();
+ vt.computeCurrentVelocity(1000);
+ float secondX = vt.getXVelocity();
+ float secondY = vt.getYVelocity();
+ assertEqualFuzzy(firstX, secondX / 1000.0f, 0.1f);
+ assertEqualFuzzy(firstY, secondY / 1000.0f, 0.1f);
+ vt.recycle();
+ }
+
+ /**
+ * Simulate a drag by giving directly MotionEvents to
+ * the VelocityTracker using a linear interpolator
+ */
+ private void drag(VelocityTracker vt, int startX, int endX, int startY, int endY, int steps,
+ long startime, int duration) {
+ drag(vt, startX, endX, startY, endY, steps, startime, duration, new LinearInterpolator());
+ }
+
+ /**
+ * Simulate a drag by giving directly MotionEvents to
+ * the VelocityTracker using a given interpolator
+ */
+ private void drag(VelocityTracker vt, int startX, int endX, int startY, int endY, int steps,
+ long startime, int duration, Interpolator interpolator) {
+ addMotionEvent(vt, startX, startY, startime, MotionEvent.ACTION_DOWN);
+ float dt = duration / (float)steps;
+ int distX = endX - startX;
+ int distY = endY - startY;
+ for (int i=1; i<steps-1; i++) {
+ float ii = interpolator.getInterpolation(i / (float)steps);
+ int x = (int) (startX + distX * ii);
+ int y = (int) (startY + distY * ii);
+ long time = startime + (int) (i * dt);
+ addMotionEvent(vt, x, y, time, MotionEvent.ACTION_MOVE);
+ }
+ addMotionEvent(vt, endX, endY, startime + duration, MotionEvent.ACTION_UP);
+ }
+
+ private void addMotionEvent(VelocityTracker vt, int x, int y, long time, int action) {
+ MotionEvent me = MotionEvent.obtain(time, time, action, x, y, 0);
+ vt.addMovement(me);
+ me.recycle();
+ }
+
+ /**
+ * Float imprecision of the average computations and filtering
+ * (removing last MotionEvent for N > 3) implies that tests
+ * accepts some approximated values.
+ */
+ private void assertEqualFuzzy(float expected, float actual, float threshold) {
+ boolean fuzzyEqual = actual >= expected - threshold && actual <= expected + threshold;
+ Assert.assertTrue("Expected: <"+expected+"> but was: <"+actual+
+ "> while accepting a variation of: <"+threshold+">", fuzzyEqual);
+ }
+
+ private void assertGreater(float minExpected, float actual) {
+ Assert.assertTrue("Expected: minimum <"+minExpected+"> but was: <"+actual+">",
+ actual > minExpected);
+ }
+
+ private void assertLower(float maxExpected, float actual) {
+ Assert.assertTrue("Expected: maximum <"+maxExpected+"> but was: <"+actual+">",
+ actual < maxExpected);
+ }
+}
diff --git a/docs/html/guide/appendix/market-filters.jd b/docs/html/guide/appendix/market-filters.jd
index 201a142..0797892 100644
--- a/docs/html/guide/appendix/market-filters.jd
+++ b/docs/html/guide/appendix/market-filters.jd
@@ -4,25 +4,24 @@
<div id="qv-wrapper">
<div id="qv">
-<h2 align="left">Market Filters quickview</h2>
-<ul> <li>Android Market applies filters to control which apps are visible to a
-user.</li> <li>Filtering is determined by elements in an app's manifest file,
+<h2 align="left">Market filters quickview</h2>
+<ul> <li>Android Market applies filters to that let you control whether your app is shown to a
+user who is browing or searching for apps.</li>
+<li>Filtering is determined by elements in an app's manifest file,
aspects of the device being used, and other factors.</li> </ul>
<h2>In this document</h2>
<ol> <li><a href="#how-filters-work">How Filters Work in Android Market</a></li>
-<li><a href="#manifest-filters">The Manifest File</a>
- <ol>
- <li><a href="#affects-filtering">Elements that affect filtering</a></li>
- </ol>
-</li>
+<li><a href="#manifest-filters">Filtering based on Manifest File Elements</a></li>
<li><a href="#other-filters">Other Filters</a></li>
</ol>
<h2>See also</h2>
<ol>
-<li><code><a
+<li><a
+href="{@docRoot}guide/practices/compatibility.html">Compatibility</a></li>
+<li style="margin-top:2px;"><code><a
href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><supports-screens></a></code></li>
<li><code><a
href="{@docRoot}guide/topics/manifest/uses-configuration-element.html"><uses-configuration></a></code></li>
@@ -55,18 +54,29 @@
<p>Changes to the Android Market filters are independent of changes
to the Android platform itself. This document will be updated periodically to reflect
-any changes that might occur. </p>
+any changes that occur. </p>
<h2 id="how-filters-work">How Filters Work in Android Market</h2>
-<p>If any one of the filter restrictions described in the following sections applies to
-an application, then the application will not appear in search results or category
-browsing on Android Market. </p><p> You can request any combination of the available filters for your
-app — for example, you could set a <code>minSdkVersion</code> of 4 and set
-<code>smallScreens</code> to false in the app, then when uploading the app to
+<p>Android Market uses the filter restrictions described below to determine
+whether to show your application to a user who is browsing or searching for
+applications on a given device. When determining whether to display your app,
+Market checks the device's hardware and software capabilities, as well as it's
+carrier, location, and other characteristics. It then compares those against the
+restrictions and dependencies expressed by the application itself, in its
+manifest, <code>.apk</code>, and publishing details. If the application is
+compatible with the device according to the filter rules, Market displays the
+application to the user. Otherwise, Market hides your application from search
+results and category browsing. </p>
+
+<p> You can use the filters described below to control whether Market shows or
+hides your application to users. You can request any combination of the
+available filters for your app — for example, you could set a
+<code>minSdkVersion</code> requirement of <code>"4"</code> and set
+<code>smallScreens="false"</code> in the app, then when uploading the app to
Market you could target European countries (carriers) only. Android Market's
-filters would prevent the application from being visible on any device that did not
-match all three of these requirements. </p>
+filters would prevent the application from being visible on any device that did
+not match all three of these requirements. </p>
<p>A filtered app is not visible within Market, even if a user specifically requests
the app by clicking a deep link that points directly to the app's ID within Market.
@@ -74,22 +84,26 @@
change between versions. For example:</p>
<ul>
-<li>If you publish a new version of
-your app with stricter restrictions, the app will not be visible to users for whom
-it is filtered, even if those users were able see the previous version.</li> <li>If
-a user has installed your application and you publish an upgrade that makes the app
-invisible to the user, the user will not see that an upgrade is available.
-</li>
+<li>If you publish a new version of your app with stricter restrictions, the app
+will not be visible to users for whom it is filtered, even if those users were
+able see the previous version.</li>
+<li>If a user has installed your application and you publish an upgrade that
+makes the app invisible to the user, the user will not see that an upgrade is
+available. </li>
</ul>
-<h2 id="manifest-filters">The Manifest File</h2>
-<p>Most Market filters are triggered by elements within an application's manifest file, <a
-href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>,
-although not everything in the manifest file can trigger filtering. </p>
-<h3 id="affects-filtering">Elements that affect filtering</h3>
-<p>The following table lists the manifest elements that can be used to trigger
-Android Market filtering, and explains how they work.</p>
-<table border="1">
+<h2 id="manifest-filters">Filtering based on Manifest Elements</h2>
+
+<p>Most Market filters are triggered by elements within an application's
+manifest file, <a
+href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>,
+although not everything in the manifest file can trigger filtering. The
+table below lists the manifest elements that you can use to trigger Android
+Market filtering, and explains how the filtering works.</p>
+
+<p class="table-caption"><strong>Table 1.</strong> Manifest elements that
+trigger filtering on Market.</p>
+<table>
<tr>
<th>Manifest Element</th>
<th>Filter Name</th>
@@ -199,7 +213,7 @@
<p><em>A note about camera:</em> If an
application requests the CAMERA permission using the <a
href="{@docRoot}guide/topics/manifest/uses-permission-element.html"> <code><uses-permission></code></a> element, Market assumes that the
- application requires the camera and autofocus features. For applications that require the camera and are designed to run on Android 1.5 (API Level 3), declaring the CAMERA permission is an effective way of ensuring that Market filters your app properly, since <code>uses-feature</code> filtering is not available to applications compiled against the Android 1.5 platform. For more details about requiring or requesting a camera, see the <a href="{@docRoot}guide/topics/manifest/uses-library-element.html#required"> <code>required</code></a> attribute of <code><uses-feature></code>. </p></td>
+ application requires the camera and all camera features (such as autofocus). For applications that require the camera and are designed to run on Android 1.5 (API Level 3), declaring the CAMERA permission is an effective way of ensuring that Market filters your app properly, since <code>uses-feature</code> filtering is not available to applications compiled against the Android 1.5 platform. For more details about requiring or requesting a camera, see the <a href="{@docRoot}guide/topics/manifest/uses-library-element.html#required"> <code>required</code></a> attribute of <code><uses-feature></code>. </p></td>
</tr>
<tr>
<td valign="top">OpenGL-ES
@@ -269,9 +283,10 @@
</table>
<h2 id="other-filters">Other Filters</h2>
-<p>The following table describes other application characteristics that trigger Android Market filtering. </p>
+<p>Android Market uses other application characteristics to determine whether to show or hide an application for a particular user on a given device, as described in the table below. </p>
-<table border="1"> <tr>
+<p class="table-caption"><strong>Table 2.</strong> Application and publishing characteristics that affect filtering on Market.</p>
+<table> <tr>
<th>Filter Name</th> <th>How It Works</th> </tr>
<tr>
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index 549e093..cf2a457 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -15,6 +15,14 @@
</li>
<li><a href="#RunConfig">Creating a Custom Run Configuration</a></li>
<li><a href="#Signing">Setting Up Application Signing</a></li>
+ <li><a href="#libraryProject">Working with Library Projects</a>
+ <ol>
+ <li><a href="#libraryReqts">Development requirements</a></li>
+ <li><a href="#librarySetup">Setting up a library project</a></li>
+ <li><a href="#libraryReference">Referencing a library project</a></li>
+ <li><a href="#considerations">Development considerations</a></li>
+ </ol>
+ </li>
<li><a href="#Tips">Eclipse Tips</a></li>
</div>
</div>
@@ -118,12 +126,11 @@
<dd>This contains the Java files generated by ADT, such as your <code>R.java</code> file
and interfaces created from AIDL files.</dd>
<dt><code>assets/</code></dt>
- <dd>This is empty. You can use it to store raw asset files. See
- <a href="{@docRoot}guide/topics/resources/index.html">Resources and Assets</a>.</dd>
+ <dd>This is empty. You can use it to store raw asset files. </dd>
<dt><code>res/</code></dt>
<dd>A folder for your application resources, such as drawable files, layout files, string
values, etc. See
- <a href="{@docRoot}guide/topics/resources/index.html">Resources and Assets</a>.</dd>
+ <a href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</dd>
<dt><code>AndroidManifest.xml</code></dt>
<dd>The Android Manifest for your project. See
<a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml
@@ -303,8 +310,7 @@
<h3 id="AutoAndManualTargetModes">Automatic and manual target modes</h3>
<p>By default, a run configuration uses the <strong>automatic</strong> target mode in order to
-select
-an AVD. In this mode, ADT will select an AVD for the application in the following manner:</p>
+select an AVD. In this mode, ADT will select an AVD for the application in the following manner:</p>
<ol>
<li>If there's a device or emulator already running and its AVD configuration
@@ -349,6 +355,381 @@
a guide to exporting and signing your application with the ADT's Export Wizard.</p>
+<h2 id="libraryProject">Working with Library Projects</h2>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Library project example code</h2>
+
+<p>The SDK includes an example application called TicTacToeMain that shows how a
+dependent application can use code and resources from an Android Library
+project. The TicTacToeMain application uses code and resources from an example
+library project called TicTacToeLib.
+
+<p style="margin-top:1em;">To download the sample applications and run them as
+projects in your environment, use the <em>Android SDK and AVD Manager</em> to
+download the "Samples for SDK API 8" component into your SDK. </p>
+
+<p style="margin-top:1em;">For more information and to browse the code of the
+samples, see the <a
+href="{@docRoot}resources/samples/TicTacToeMain/index.html">TicTacToeMain
+application</a>.</p>
+</div>
+</div>
+
+<p>An Android <em>library project</em> is a development project that holds
+shared Android source code and resources. Other Android application projects can
+reference the library project and, at build time, include its compiled sources
+in their <code>.apk</code> files. Multiple application projects can reference
+the same library project and any single application project can reference
+multiple library projects. </p>
+
+<p>If you have source code and resources that are common to multiple application
+projects, you can move them to a library project so that it is easier to
+maintain across applications and versions. Here are some common scenarios in
+which you could make use of library projects: </p>
+
+<ul>
+<li>If you are developing multiple related applications that use some of the
+same components, you move the redundant components out of their respective
+application projects and create a single, reuseable set of the same components
+in a library project. </li>
+<li>If you are creating an application that exists in both free and paid
+versions. You move the part of the application that is common to both versions
+into a library project. The two dependent projects, with their different package
+names, will reference the library project and provide only the difference
+between the two application versions.</li>
+</ul>
+
+<p>Structurally, a library project is similar to a standard Android application
+project. For example, it includes a manifest file at the project root, as well
+as <code>src/</code>, <code>res/</code> and similar directories. The project can
+contain the same types of source code and resources as a standard
+Android project, stored in the same way. For example, source code in the library
+project can access its own resources through its <code>R</code> class. </p>
+
+<p>However, a library project differs from an standard Android application
+project in that you cannot compile it directly to its own <code>.apk</code> or
+run it on the Android platform. Similarly, you cannot export the library project
+to a self-contained JAR file, as you would do for a true library. Instead, you
+must compile the library indirectly, by referencing the library from a dependent
+application's build path, then building that application. </p>
+
+<p>When you build an application that depends on a library project, the SDK
+tools compile the library and merge its sources with those in the main project,
+then use the result to generate the <code>.apk</code>. In cases where a resource
+ID is defined in both the application and the library, the tools ensure that the
+resource declared in the application gets priority and that the resource in the
+library project is not compiled into the application <code>.apk</code>. This
+gives your application the flexibility to either use or redefine any resource
+behaviors or values that are defined in any library.</p>
+
+<p>To organize your code further, your application can add references to
+multiple library projects, then specify the relative priority of the resources
+in each library. This lets you build up the resources actually used in your
+application in a cumulative manner. When two libraries referenced from an
+application define the same resource ID, the tools select the resource from the
+library with higher priority and discard the other. </p>
+
+<p>ADT lets you add references to library projects and set their relative
+priority from the application project's Properties. As shown in Figure 2,
+below, once you've added a reference to a library project, you can use the
+<strong>Up</strong> and <strong>Down</strong> controls to change the ordering,
+with the library listed at the top getting the higher priority. At build time,
+the libraries are merged with the application one at a time, starting from the
+lowest priority to the highest. </p>
+
+<p>Note that a library project cannot itself reference another library project
+and that, at build time, library projects are <em>not</em> merged with each
+other before being merged with the application. However, note that a library can
+import an external library (JAR) in the normal way.</p>
+
+<p>The sections below describe how to use ADT to set up and manage library your
+projects. Once you've set up your library projects and moved code into them, you
+can import library classes and resources to your application in the normal way.
+</p>
+
+
+<h3 id="libraryReqts">Development requirements</h3>
+
+<p>Android library projects are a build-time construct, so you can use them to
+build a final application <code>.apk</code> that targets any API level and is
+compiled against any version of the Android library. </p>
+
+<p>However, to use library projects, you need to update your development
+environment to use the latest tools and platforms, since older releases of the
+tools and platforms do not support building with library projects. Specifically,
+you need to download and install the versions listed below:</p>
+
+<p class="table-caption"><strong>Table 1.</strong> Minimum versions of SDK tools
+and plaforms on which you can develop library projects.</p>
+
+<table>
+<tr>
+<th>Component</th>
+<th>Minimum Version</th>
+</tr>
+<tr>
+<td>SDK Tools</td>
+<td>r6 (or higher)</td>
+</tr>
+<tr><td>Android 2.2 platform</td><td>r1 (or higher)</td></tr>
+<tr><td>Android 2.1 platform</td><td>r2 (or higher)</td></tr>
+<tr><td style="color:gray">Android 2.0.1 platform</td><td style="color:gray"><em>not supported</em></td></tr>
+<tr><td style="color:gray">Android 2.0 platform</td><td style="color:gray"><em>not supported</em></td></tr>
+<tr><td>Android 1.6 platform</td><td>r3 (or higher)</td></tr>
+<tr><td>Android 1.5 platform</td><td>r4 (or higher)</td></tr>
+<tr><td>ADT Plugin</td><td>0.9.7 (or higher)</td></tr>
+</table>
+
+<p>You can download the tools and platforms using the <em>Android SDK and AVD
+Manager</em>, as described in <a href="{@docRoot}sdk/adding-components.html">Adding SDK
+Components</a>. To install or update ADT, use the Eclipse Updater as described
+in <a href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin for Eclipse</a>.</p>
+
+
+<h3 id="librarySetup">Setting up a library project</h3>
+
+<p>A library project is a standard Android project, so you can create a new one in the
+same way as you would a new application project. Specifically, you can use
+the New Project Wizard, as described in <a href="#CreatingAProject">Creating an
+Android Project</a>, above. </p>
+
+<p>When you are creating the library project, you can select any application
+name, package, and set other fields as needed, as shown in the diagram below.
+Click Finish to create the project in the workspace.</p>
+
+<p>Next, set the project's Properties to indicate that it is a library project:</p>
+
+<ol>
+<li>In the <strong>Package Explorer</strong>, right-click the library project
+and select <strong>Properties</strong>.</li>
+<li>In the <strong>Properties</strong> window, select the "Android" properties
+group at left and locate the <strong>Library</strong> properties at right. </li>
+<li>Select the "is Library" checkbox and click <strong>Apply</strong>.</li>
+<li>Click <strong>OK</strong> to close the <strong>Properties</strong> window.</li>
+</ol>
+
+<p>The new project is now marked as a library project. You can begin moving
+source code and resources into it, as described in the sections below. </p>
+
+<p>You can also convert an existing application project into a library. To do
+so, simply open the Properties for the project and select the "is Library"
+checkbox. Other application projects can now reference the existing project as a
+library project.</p>
+
+<img src="{@docRoot}images/developing/adt-props-isLib.png" style="margin:0;padding:0;" />
+<p class="img-caption" style="margin-left:3em;margin-bottom:2em;"><strong>Figure 1.</strong>
+Marking a project as an Android library project. </p>
+
+<h4>Creating the manifest file</h4>
+
+<p>A library project's manifest file must declare all of the shared components
+that it includes, just as would a standard Android application. For more
+information, see the documentation for <a
+href="{@docRoot}guide/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+<p>For example, the <a
+href="{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a>
+example library project declares the Activity <code>GameActivity</code>: </p>
+
+<pre><manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="GameActivity" />
+ ...
+ </application>
+ ...
+</manifest></pre>
+
+
+<h3 id="libraryReference">Referencing a library project from an application</h3>
+
+<p>If you are developing an application and want to include the shared code or
+resources from a library project, you can do so easily by adding a reference to
+the library project in the application project's Properties.</p>
+
+<p>To add a reference to a library project, follow these steps: </p>
+
+<ol>
+<li>In the <strong>Package Explorer</strong>, right-click the dependent project
+and select <strong>Properties</strong>.</li>
+<li>In the <strong>Properties</strong> window, select the "Android" properties group
+at left and locate the <strong>Library</strong> properties at right.</li>
+<li>Click <strong>Add</strong> to open the <strong>Project Selection</strong>
+dialog. </li>
+<li>From the list of available library projects, select a project and click
+<strong>OK</strong>.</li>
+<li>When the dialog closes, click <strong>Apply</strong> in the
+<strong>Properties</strong> window.</li>
+<li>Click <strong>OK</strong> to close the <strong>Properties</strong> window.</li>
+</ol>
+
+<p>As soon as the Properties dialog closes, Eclipse rebuilds the project,
+including the contents of the library project. </p>
+
+<p>The figure below shows the Properties dialog that lets you add library
+references and move them up and down in priority. </p>
+
+<img src="{@docRoot}images/developing/adt-props-libRef.png" style="margin:0;padding:0;" />
+<p class="img-caption" style="margin-left:3em;margin-bottom:2em;"><strong>Figure 2.</strong>
+Adding a reference to a library project in the properties of an application project. </p>
+
+<p>If you are adding references to multiple libraries, note that you can set
+their relative priority (and merge order) by selecting a library and using the
+<strong>Up</strong> and <strong>Down</strong> controls. The tools merge the
+referenced libraries with your application starting from lowest priority (bottom
+of the list) to highest (top of the list). If more than one library defines the
+same resource ID, the tools select the resource from the library with higher
+priority. The application itself has highest priority and its resources are
+always used in preference to identical resource IDs defined in libraries.</p>
+
+<h4>Declaring library components in the the manifest file</h4>
+
+<p>In the manifest file of the application project, you must add declarations
+of all components that the application will use that are imported from a library
+project. For example, you must declare any <code><activity></code>,
+<code><service></code>, <code><receiver></code>,
+<code><provider></code>, and so on, as well as
+<code><permission></code>, <code><uses-library></code>, and similar
+elements.</p>
+
+<p>Declarations should reference the library components by their fully-qualified
+package names, where appropriate. </p>
+
+<p>For example, the <a
+href="{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a>
+example application declares the library Activity <code>GameActivity</code>
+like this: </p>
+
+<pre><manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="com.example.android.tictactoe.library.GameActivity" />
+ ...
+ </application>
+ ...
+</manifest></pre>
+
+<p>For more information about the manifest file, see the documentation for <a href="{@docRoot}guide/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+
+<h3 id="considerations">Development considerations</h3>
+
+<p>As you develop your library project and dependent applications, keep the
+points listed below in mind.</p>
+
+<p><strong>Resource conflicts</strong></p>
+
+<p>Since the tools merge the resources of a library project with those of a
+dependent application project, a given resource ID might be defined in both
+projects. In this case, the tools select the resource from the application, or
+the library with highest priority, and discard the other resource. As you
+develop your applications, be aware that common resource IDs are likely to be
+defined in more than one project and will be merged, with the resource from the
+application or highest-priority library taking precedence.</p>
+
+<p><strong>Using prefixes to avoid resource conflicts</strong></p>
+
+<p>To avoid resource conflicts for common resource IDs, consider using a prefix
+or other consistent naming scheme that is unique to the project (or is unique
+across all projects). </p>
+
+<p><strong>No export of library project to JAR</strong></p>
+
+<p>A library cannot be distributed as a binary file (such as a jar file). This
+is because the library project is compiled by the main project to use the
+correct resource IDs.</p>
+
+<p><strong>One library project cannot reference another</strong></p>
+
+<p>A library cannot depend on another library.</p>
+
+<p><strong>A library project can include a JAR library</strong></p>
+
+<p>You can develop a library project that itself includes a JAR library, however
+you need to manually edit the dependent application project's build path and add
+a path to the JAR file. </p>
+
+<p><strong>A library project can depend on an external JAR library</strong></p>
+
+<p>You can develop a library project that depends on an external library (for
+example, the Maps external library). In this case, the dependent application
+must build against a target that includes the external library (for example, the
+Google APIs Add-On). Note also that both the library project and the dependent
+application must declare the external library their manifest files, in a <a
+href="{@docRoot}guide/topics/manifest/uses-library-element.html"><code><uses-library></code></a>
+element. </p>
+
+<p><strong>Library project can not include AIDL files</strong></p>
+
+<p>The tools do not support the use of <a
+href="{@docRoot}guide/developing/tools/aidl.html">AIDL</a> files in a library project.
+Any AIDL files used by an application must be stored in the application project
+itself.</p>
+
+<p><strong>Library project can not include raw assets</strong></p>
+
+<p>The tools do not support the use of raw asset files in a library project.
+Any asset resources used by an application must be stored in the
+<code>assets/</code> directory of the application project
+itself.</p>
+
+<p><strong>Targeting different Android platform versions in library project and
+application project</strong></p>
+
+<p>A library is compiled as part of the dependent application project, so the
+API used in the library project must be compatible with the version of the
+Android library used to compile the application project. In general, the library
+project should use an <a href="{@docRoot}guide/appendix/api-levels.html">API level</a>
+that is the same as — or lower than — that used by the application.
+If the library project uses an API level that is higher than that of the
+application, the application project will fail to compile. It is perfectly
+acceptable to have a library that uses the Android 1.5 API (API level 3) and
+that is used in an Android 1.6 (API level 4) or Android 2.1 (API level 7)
+project, for instance.</p>
+
+<p><strong>No restriction on library package name</strong></p>
+
+<p>There is no requirement for the package name of a library to be the same as
+that of applications that use it.</p>
+
+<p><strong>Multiple R classes in gen/ folder of application project</strong></p>
+
+<p>When you build the dependent application project, the code of any libraries
+is compiled and merged to the application project. Each library has its own
+<code>R</code> class, named according to the library's package name. The
+<code>R</code> class generated from the resources of the main project and of the
+library is created in all the packages that are needed including the main
+project’s package and the libraries’ packages.</p>
+
+<p><strong>Testing a library project</strong></p>
+
+<p>There are two recommended ways of setting up testing on code and resources in
+a library project: </p>
+
+<ul>
+<li>You can set up a <a
+href="{@docRoot}guide/developing/testing/testing_otheride.html">test project</a>
+that instruments an application project that depends on the library project. You
+can then add tests to the project for library-specific features.</li>
+<li>You can set up a set up a standard application project that depends on the
+library and put the instrumentation in that project. This lets you create a
+self-contained project that contains both the tests/instrumentations and the
+code to test.</li>
+</ul>
+
+<p><strong>Library project storage location</strong></p>
+
+<p>There are no specific requirements on where you should store a library
+project, relative to a dependent application project, as long as the application
+project can reference the library project by a relative link. You can place the
+library project What is important is that the main project can reference the
+library project through a relative link.</p>
+
+
<h2 id="Tips">Eclipse Tips </h2>
<h3 id="arbitraryexpressions">Executing arbitrary Java expressions in Eclipse</h3>
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index 76b2d9f..e8a6fb6 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -20,6 +20,15 @@
<li><a href="#RunningOnDevice">Running on a device</a></li>
</ol>
</li>
+ <li><a href="#libraryProject">Working with Library Projects</a>
+ <ol>
+ <li><a href="#libraryReqts">Development requirements</a></li>
+ <li><a href="#librarySetup">Setting up a library project</a></li>
+ <li><a href="#libraryReference">Referencing a library project</a></li>
+ <li><a href="#depAppBuild">Building a dependent application project</a></li>
+ <li><a href="#considerations">Development considerations</a></li>
+ </ol>
+ </li>
<li><a href="#AttachingADebugger">Attaching a Debugger to Your Application</a></li>
</ol>
@@ -93,7 +102,7 @@
android create project \
--target <em><target_ID></em> \
--name <em><your_project_name></em> \
---path <em>/path/to/your/project</em> \
+--path <em>path/to/your/project</em> \
--activity <em><your_activity_name></em> \
--package <em><your_package_namespace></em>
</pre>
@@ -350,7 +359,7 @@
For example:</p>
<pre>
-key.store=/path/to/my.keystore
+key.store=path/to/my.keystore
key.alias=mykeystore
</pre>
@@ -458,7 +467,7 @@
directory after you <a href="#Building">build your application</a>.</p>
<p>If there is more than one emulator running, you must specify the emulator upon which to
install the application, by its serial number, with the <code>-s</code> option. For example:</p>
- <pre>adb -s emulator-5554 install <em>/path/to/your/app</em>.apk</pre>
+ <pre>adb -s emulator-5554 install <em>path/to/your/app</em>.apk</pre>
<p>To see a list of available device serial numbers, execute {@code adb devices}.</p>
</li>
</ol>
@@ -499,12 +508,10 @@
<p>Once your device is set up and connected via USB, navigate to your
SDK's <code>tools/</code> directory and install the <code>.apk</code> on the device:
- <pre>adb -d install <em>/path/to/your/app</em>.apk</pre>
+ <pre>adb -d install <em>path/to/your/app</em>.apk</pre>
<p>The {@code -d} flag specifies that you want to use the attached device (in case you also
have an emulator running).</p>
-
-
<p>For more information on the tools used above, please see the following documents:</p>
<ul>
<li><a href="{@docRoot}guide/developing/tools/othertools.html#android">android Tool</a></li>
@@ -512,6 +519,409 @@
<li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (ADB)</li>
</ul>
+<h2 id="libraryProject">Working with Library Projects</h2>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Library project example code</h2>
+
+<p>The SDK includes an example application called TicTacToeMain that shows how a
+dependent application can use code and resources from an Android Library
+project. The TicTacToeMain application uses code and resources from an example
+library project called TicTacToeLib.
+
+<p style="margin-top:1em;">To download the sample applications and run them as
+projects in your environment, use the <em>Android SDK and AVD Manager</em> to
+download the "Samples for SDK API 8" component into your SDK. </p>
+
+<p style="margin-top:1em;">For more information and to browse the code of the
+samples, see the <a
+href="{@docRoot}resources/samples/TicTacToeMain/index.html">TicTacToeMain
+application</a>.</p>
+</div>
+</div>
+
+<p>An Android <em>library project</em> is a development project that holds
+shared Android source code and resources. Other Android application projects can
+reference the library project and, at build time, include its compiled sources
+in their <code>.apk</code> files. Multiple application projects can reference
+the same library project and any single application project can reference
+multiple library projects. </p>
+
+<p>If you have source code and resources that are common to multiple application
+projects, you can move them to a library project so that it is easier to
+maintain across applications and versions. Here are some common scenarios in
+which you could make use of library projects: </p>
+
+<ul>
+<li>If you are developing multiple related applications that use some of the
+same components, you move the redundant components out of their respective
+application projects and create a single, reuseable set of the same components
+in a library project. </li>
+<li>If you are creating an application that exists in both free and paid
+versions. You move the part of the application that is common to both versions
+into a library project. The two dependent projects, with their different package
+names, will reference the library project and provide only the difference
+between the two application versions.</li>
+</ul>
+
+<p>Structurally, a library project is similar to a standard Android application
+project. For example, it includes a manifest file at the project root, as well
+as <code>src/</code>, <code>res/</code> and similar directories. The project can
+contain the same types of source code and resources as a standard
+Android project, stored in the same way. For example, source code in the library
+project can access its own resources through its <code>R</code> class. </p>
+
+<p>However, a library project differs from an standard Android application
+project in that you cannot compile it directly to its own <code>.apk</code> or
+run it on the Android platform. Similarly, you cannot export the library project
+to a self-contained JAR file, as you would do for a true library. Instead, you
+must compile the library indirectly, by referencing the library from a dependent
+application's build path, then building that application. </p>
+
+<p>When you build an application that depends on a library project, the SDK
+tools compile the library and merge its sources with those in the main project,
+then use the result to generate the <code>.apk</code>. In cases where a resource
+ID is defined in both the application and the library, the tools ensure that the
+resource declared in the application gets priority and that the resource in the
+library project is not compiled into the application <code>.apk</code>. This
+gives your application the flexibility to either use or redefine any resource
+behaviors or values that are defined in any library.</p>
+
+<p>To organize your code further, your application can add references to
+multiple library projects, then specify the relative priority of the resources
+in each library. This lets you build up the resources actually used in your
+application in a cumulative manner. When two libraries referenced from an
+application define the same resource ID, the tools select the resource from the
+library with higher priority and discard the other.
+
+<p>Once you've have added references, the tools let you set their relative
+priority by editing the application project's build properties. At build time,
+the tools merge the libraries with the application one at a time, starting from
+the lowest priority to the highest. </p>
+
+<p>Note that a library project cannot itself reference another library project
+and that, at build time, library projects are <em>not</em> merged with each
+other before being merged with the application. However, note that a library can
+import an external library (JAR) in the normal way.</p>
+
+<p>The sections below describe how to use ADT to set up and manage library your
+projects. Once you've set up your library projects and moved code into them, you
+can import library classes and resources to your application in the normal way.
+</p>
+
+
+<h3 id="libraryReqts">Development requirements</h3>
+
+<p>Android library projects are a build-time construct, so you can use them to
+build a final application <code>.apk</code> that targets any API level and is
+compiled against any version of the Android library. </p>
+
+<p>However, to use library projects, you need to update your development
+environment to use the latest tools and platforms, since older releases of the
+tools and platforms do not support building with library projects. Specifically,
+you need to download and install the versions listed below:</p>
+
+<p class="table-caption"><strong>Table 1.</strong> Minimum versions of SDK tools
+and plaforms on which you can develop library projects.</p>
+
+<table>
+<tr>
+<th>Component</th>
+<th>Minimum Version</th>
+</tr>
+<tr>
+<td>SDK Tools</td>
+<td>r6 (or higher)</td>
+</tr>
+<tr><td>Android 2.2 platform</td><td>r1 (or higher)</td></tr>
+<tr><td>Android 2.1 platform</td><td>r2 (or higher)</td></tr>
+<tr><td style="color:gray">Android 2.0.1 platform</td><td style="color:gray"><em>not supported</em></td></tr>
+<tr><td style="color:gray">Android 2.0 platform</td><td style="color:gray"><em>not supported</em></td></tr>
+<tr><td>Android 1.6 platform</td><td>r3 (or higher)</td></tr>
+<tr><td>Android 1.5 platform</td><td>r4 (or higher)</td></tr>
+<tr><td>ADT Plugin</td><td>0.9.7 (or higher)</td></tr>
+</table>
+
+<p>You can download the tools and platforms using the <em>Android SDK and AVD
+Manager</em>, as described in <a href="{@docRoot}sdk/adding-components.html">Adding SDK
+Components</a>.</p>
+
+
+<h3 id="librarySetup">Setting up a new library project</h3>
+
+<p>A library project is a standard Android project, so you can create a new one in the
+same way as you would a new application project. Specifically, you can use
+the <code>android</code> tool to generate a new library project with all of the
+necessary files and folders. </p>
+
+<h4>Creating a library project</h4>
+
+<p>To create a new library project, navigate to the <code><sdk>/tools/</code> directory
+and use this command:</p>
+
+<pre class="no-pretty-print" style="color:black">
+android create lib-project --name <em><your_project_name></em> \
+--target <em><target_ID></em> \
+--path <em>path/to/your/project</em> \
+--package <em><your_library_package_namespace></em>
+</pre>
+
+<p>The <code>create lib-project</code> command creates a standard project
+structure that includes preset property that indicates to the build system that
+the project is a library. It does this by adding this line to the project's
+<code>default.properties</code> file: </p>
+
+<pre class="no-pretty-print" style="color:black">android.library=true</pre>
+
+<p>Once the command completes, the library project is created and you can begin moving
+source code and resources into it, as described in the sections below.</p>
+
+<p>If you want to convert an existing application project to a library project,
+so that other applications can use it, you can do so by adding a the
+<code>android.library=true</code> property to the application's
+<code>default.properties</code> file. </p>
+
+<h4>Creating the manifest file</h4>
+
+<p>A library project's manifest file must declare all of the shared components
+that it includes, just as would a standard Android application. For more
+information, see the documentation for <a
+href="{@docRoot}guide/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+<p>For example, the <a
+href="{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a>
+example library project declares the Activity <code>GameActivity</code>: </p>
+
+<pre><manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="GameActivity" />
+ ...
+ </application>
+ ...
+</manifest></pre>
+
+<h4>Updating a library project</h4>
+
+<p>If you want to update the build properties (build target, location) of the
+library project, use this command: </p>
+
+<pre>
+android update lib-project \
+--target <em><target_ID></em> \
+--path <em>path/to/your/project</em>
+</pre>
+
+
+<h3 id="libraryReference">Referencing a library project from an application</h3>
+
+<p>If you are developing an application and want to include the shared code or
+resources from a library project, you can do so easily by adding a reference to
+the library project in the application project's build properties.</p>
+
+<p>To add a reference to a library project, navigate to the <code><sdk>/tools/</code> directory
+and use this command:</p>
+
+<pre>
+android update lib-project \
+--target <em><target_ID></em> \
+--path <em>path/to/your/project</em>
+--library <em>path/to/library_projectA</em>
+</pre>
+
+<p>This command updates the application project's build properties to include a
+reference to the library project. Specifically, it adds an
+<code>android.library.reference.<em>n</em></code> property to the project's
+<code>default.properties</code> file. For example: </p>
+
+<pre class="no-pretty-print" style="color:black">
+android.library.reference.1=path/to/library_projectA
+</pre>
+
+<p>If you are adding references to multiple libraries, note that you can set
+their relative priority (and merge order) by manually editing the
+<code>default.properties</code> file and adjusting the each reference's
+<code>.<em>n</em></code> index as appropriate. For example, assume these
+references: </p>
+
+<pre class="no-pretty-print" style="color:black">
+android.library.reference.1=path/to/library_projectA
+android.library.reference.2=path/to/library_projectB
+android.library.reference.3=path/to/library_projectC
+</pre>
+
+<p>You can reorder the references to give highest priority to
+<code>library_projectC</code> in this way:</p>
+
+<pre class="no-pretty-print" style="color:black">
+android.library.reference.2=path/to/library_projectA
+android.library.reference.3=path/to/library_projectB
+android.library.reference.1=path/to/library_projectC
+</pre>
+
+<p>Note that the <code>.<em>n</em></code> index in the references
+must begin at "1" and increase uniformly without "holes". References
+appearing in the index after a hole are ignored. </p>
+
+<p>At build time, the libraries are merged with the application one at a time,
+starting from the lowest priority to the highest. Note that a library cannot
+itself reference another library and that, at build time, libraries are not
+merged with each other before being merged with the application.</p>
+
+
+<h4>Declaring library components in the the manifest file</h4>
+
+<p>In the manifest file of the application project, you must add declarations
+of all components that the application will use that are imported from a library
+project. For example, you must declare any <code><activity></code>,
+<code><service></code>, <code><receiver></code>,
+<code><provider></code>, and so on, as well as
+<code><permission></code>, <code><uses-library></code>, and similar
+elements.</p>
+
+<p>Declarations should reference the library components by their fully-qualified
+package names, where appropriate. </p>
+
+<p>For example, the
+<a href="{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a>
+example application declares the library Activity <code>GameActivity</code>
+like this: </p>
+
+<pre><manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="com.example.android.tictactoe.library.GameActivity" />
+ ...
+ </application>
+ ...
+</manifest></pre>
+
+<p>For more information about the manifest file, see the documentation for <a href="{@docRoot}guide/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+<h3 id="depAppBuild">Building a dependent application</h3>
+
+<p>To build an application project that depends on one or more library projects,
+you can use the standard Ant build commands and compile modes, as described in
+<a href=#Building">Building Your Application</a>, earlier in this document. The
+tools compile and merge all libraries referenced by the application as part
+of compiling the dependent application project. No additional commands or steps
+are necessary. </p>
+
+<h3 id="considerations">Development considerations</h3>
+
+<p>As you develop your library project and dependent applications, keep the
+points listed below in mind.</p>
+
+<p><strong>Resource conflicts</strong></p>
+
+<p>Since the tools merge the resources of a library project with those of a
+dependent application project, a given resource ID might be defined in both
+projects. In this case, the tools select the resource from the application, or
+the library with highest priority, and discard the other resource. As you
+develop your applications, be aware that common resource IDs are likely to be
+defined in more than one project and will be merged, with the resource from the
+application or highest-priority library taking precedence.</p>
+
+<p><strong>Using prefixes to avoid resource conflicts</strong></p>
+
+<p>To avoid resource conflicts for common resource IDs, consider using a prefix
+or other consistent naming scheme that is unique to the project (or is unique
+across all projects). </p>
+
+<p><strong>No export of library project to JAR</strong></p>
+
+<p>A library cannot be distributed as a binary file (such as a jar file). This
+is because the library project is compiled by the main project to use the
+correct resource IDs.</p>
+
+<p><strong>One library project cannot reference another</strong></p>
+
+<p>A library cannot depend on another library.</p>
+
+<p><strong>A library project can include a JAR library</strong></p>
+
+<p>You can develop a library project that itself includes a JAR library. When
+you build the dependent application project, the tools automatically locate and
+include the library in the application <code>.apk</code>. </p>
+
+<p><strong>A library project can depend on an external JAR library</strong></p>
+
+<p>You can develop a library project that depends on an external library (for
+example, the Maps external library). In this case, the dependent application
+must build against a target that includes the external library (for example, the
+Google APIs Add-On). Note also that both the library project and the dependent
+application must declare the external library their manifest files, in a <a
+href="{@docRoot}guide/topics/manifest/uses-library-element.html"><code><uses-library></code></a>
+element. </p>
+
+<p><strong>Library project cannot include AIDL files</strong></p>
+
+<p>The tools do not support the use of <a
+href="{@docRoot}guide/developing/tools/aidl.html">AIDL</a> files in a library project.
+Any AIDL files used by an application must be stored in the application project
+itself.</p>
+
+<p><strong>Library project cannot include raw assets</strong></p>
+
+<p>The tools do not support the use of raw asset files in a library project.
+Any asset resources used by an application must be stored in the
+<code>assets/</code> directory of the application project
+itself.</p>
+
+<p><strong>Targeting different Android platform versions in library project and
+application project</strong></p>
+
+<p>A library is compiled as part of the dependent application project, so the
+API used in the library project must be compatible with the version of the
+Android library used to compile the application project. In general, the library
+project should use an <a href="{@docRoot}guide/appendix/api-levels.html">API level</a>
+that is the same as — or lower than — that used by the application.
+If the library project uses an API level that is higher than that of the
+application, the application project will fail to compile. It is perfectly
+acceptable to have a library that uses the Android 1.5 API (API level 3) and
+that is used in an Android 1.6 (API level 4) or Android 2.1 (API level 7)
+project, for instance.</p>
+
+<p><strong>No restriction on library package name</strong></p>
+
+<p>There is no requirement for the package name of a library to be the same as
+that of applications that use it.</p>
+
+<p><strong>Multiple R classes in gen/ folder of application project</strong></p>
+
+<p>When you build the dependent application project, the code of any libraries
+is compiled and merged to the application project. Each library has its own
+<code>R</code> class, named according to the library's package name. The
+<code>R</code> class generated from the resources of the main project and of the
+library is created in all the packages that are needed including the main
+project’s package and the libraries’ packages.</p>
+
+<p><strong>Testing a library project</strong></p>
+
+<p>There are two recommended ways of setting up testing on code and resources in
+a library project: </p>
+
+<ul>
+<li>You can set up a <a
+href="{@docRoot}guide/developing/testing/testing_otheride.html">test project</a>
+that instruments an application project that depends on the library project. You
+can then add tests to the project for library-specific features.</li>
+<li>You can set up a set up a standard application project that depends on the
+library and put the instrumentation in that project. This lets you create a
+self-contained project that contains both the tests/instrumentations and the
+code to test.</li>
+</ul>
+
+<p><strong>Library project storage location</strong></p>
+
+<p>There are no specific requirements on where you should store a library
+project, relative to a dependent application project, as long as the application
+project can reference the library project by a relative link. You can place the
+library project What is important is that the main project can reference the
+library project through a relative link.</p>
<h2 id="AttachingADebugger">Attaching a Debugger to Your Application</h2>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 3d356ae..19f0f1d 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -144,9 +144,17 @@
<li><a href="<?cs var:toroot ?>guide/topics/intents/intents-filters.html">
<span class="en">Intents and Intent Filters</span>
</a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/data/data-storage.html">
+ <li class="toggle-list">
+ <div><a href="<?cs var:toroot ?>guide/topics/data/data-storage.html">
<span class="en">Data Storage</span>
- </a></li>
+ </a> <span class="new">new!</span></div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>guide/topics/data/backup.html">
+ <span class="en">Data Backup</span>
+ </a> <span class="new">new!</span>
+ </li>
+ </ul>
+ </li>
<li><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html">
<span class="en">Content Providers</span>
</a></li>
@@ -390,6 +398,9 @@
<span class="zh-TW" style="display:none">最佳實務</span>
</h2>
<ul>
+ <li><a href="<?cs var:toroot ?>guide/practices/compatibility.html">
+ <span class="en">Compatibility</span>
+ </a><span class="new">new!</span></li>
<li><a href="<?cs var:toroot ?>guide/practices/screens_support.html">
<span class="en">Supporting Multiple Screens</span>
</a></li>
diff --git a/docs/html/guide/practices/compatibility.jd b/docs/html/guide/practices/compatibility.jd
new file mode 100644
index 0000000..c91ab7f
--- /dev/null
+++ b/docs/html/guide/practices/compatibility.jd
@@ -0,0 +1,246 @@
+page.title=Android Compatibility
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>See also</h2>
+ <ol>
+<li><a
+href="{@docRoot}guide/appendix/market-filters.html">Market Filters</a></li>
+<li><a
+href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">Providing Alternative Resources</a></li>
+<li><a
+href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li>
+<li style="margin-top:3px;"><code><a
+href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><supports-screens></a></code></li>
+<li><code><a
+href="{@docRoot}guide/topics/manifest/uses-configuration-element.html"><uses-configuration></a></code></li>
+<li><code><a
+href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><uses-feature></a></code></li>
+<li><code><a
+href="{@docRoot}guide/topics/manifest/uses-library-element.html"><uses-library></a></code></li>
+<li><code><a
+href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code></li>
+<li><code><a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></code></a></li>
+</ol>
+
+
+</div> </div>
+
+<p>Android is designed to run on many different types of devices. For
+developers, the range and number of devices means a huge potential audience: the
+more devices that run Android apps, the more users who can access your app. In
+exchange, however, it also means that your apps will have to cope with that same
+variety of hardware.</p>
+
+<p>Fortunately, Android has built-in tools and support that make it easy for
+your apps to do that, while at the same time maintaining control of what types
+of devices your app is available to. If you do your work properly, users
+whose devices can’t run your app will never see it in the Android Market, and
+will not get in trouble by downloading it. This page explains how you can
+control which devices have access to your apps, and how to prepare your apps to
+make sure they reach the right audience.</p>
+
+
+<h3 id="defined">What does “Compatibility” mean?</h3>
+
+<p>A device is “Android compatible” if it can correctly run apps written for the
+<em>Android execution environment</em>. The exact details of the Android execution
+environment</em> are defined by the Android Compatibility Definition Document,
+but the single most important characteristic of a compatible device is the
+ability to install and correctly run an Android <code>.apk</code> file.</p>
+
+<p>There is exactly one Android API for each <a
+href="{@docRoot}guide/appendix/api-levels.html">API level</a>, and it’s the same
+API no matter what kind of device it’s installed on. No parts of the API are
+optional, and you never have to worry about parts of the API missing on some
+devices. Every compatible Android device your app will land on will include
+every class and every API for that API level.</p>
+
+<p>Of course, some APIs won’t work correctly if a particular device lacks the
+corresponding hardware or feature. But that’s not a problem: we also designed
+Android to prevent apps from being visible to devices which don’t have features
+the apps require. We’ve built support for this right into the SDK tools, and
+it’s part of the Android platform itself, as well as Android Market.</p>
+
+<p>As a developer, you have complete control of how and where your apps are
+available. Android provides tools as a first-class part of the platform that let
+you manage this. You control the availability of your apps, so that they reach
+only the devices capable of running them.</p>
+
+<h3 id="how">How does it work?</h3>
+
+<p>You manage your app’s availability through a simple three-step process:</p>
+
+<ol>
+<li>You state the features your app requires by declaring <a
+href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a>
+elements its manifest file.</li>
+<li>Devices are required to declare the features they include to Android
+Market.</li>
+<li>Android Market uses your app’s stated requirements to filter it from devices
+that don’t meet those requirements.</li>
+</ol>
+
+<p>This way, users never even see apps that won’t work properly on their
+devices. As long as you accurately describe your app’s requirements, you don’t
+need to worry about users blaming you for compatibility problems.</p>
+
+<p>If you’re familiar with web development, you may recognize this model as
+“capability detection”. Web developers typically prefer this approach to
+“browser detection”, because it’s very difficult to keep up as new browsers and
+new versions of current browsers are released. By checking for support for
+specific required capabilities instead of the current browser, web developers
+get better fine-grained control. That’s the same approach Android uses: since
+it’s impossible to keep up with all the Android devices being released, you
+instead use the fine-grained controls Android provides.</p>
+
+<h3>Filtering for technical reasons</h3>
+
+ <div class="sidebox-wrapper">
+ <img id="rule" src="{@docRoot}assets/images/grad-rule-qv.png">
+ <div id="qv-sub-rule">
+ <img src="{@docRoot}assets/images/icon_market.jpg" style="float:left;margin:0;padding:0;">
+ <p style="color:#669999;">Filtering on Android Market</p>
+
+ <p>Android Market filters the applications that are visible to users, so
+that users can see and download only those applications that are compatible with
+their devices.</p>
+
+ <p style="margin-top:1em;">One of the ways Market filters applications is by
+feature compatibility. To do this, Market checks the
+<code><uses-feature></code> elements in each application's manifest, to
+establish the app's feature needs. Market then shows or hides the application to
+each user, based on a comparison with the features available on the user's
+device.
+
+<p style="margin-top:1em;">For information about other filters that you can
+use to control the availability of your apps, see the
+<a href="{@docRoot}guide/appendix/market-filters.html">Market
+Filters</a> document.</p>
+ </div>
+</div>
+
+<p>Android includes support for a lot of features, some hardware and some
+software. Examples include compass and accelerometer sensors, cameras, and Live
+Wallpapers. However, not every device will support every feature. For instance,
+some devices don’t have the hardware horsepower to display Live Wallpapers
+well.</p>
+
+<p>To manage this, Android defines <em>feature IDs</em>. Every capability has a
+corresponding feature ID defined by the Android platform. For instance, the
+feature ID for compass is <code>“android.hardware.sensor.compass”</code>,
+while the feature
+ID for Live Wallpapers is <code>“android.software.live_wallpapers”</code>. Each of these IDs
+also has a corresponding Java-language constant on the
+{@link android.content.pm.PackageManager} class that you can use to query whether
+feature is supported at runtime. As Android adds support for new features in
+future versions, new feature IDs will be added as well.</p>
+
+<p>When you write your application, you specify which features your app requires
+by listing their feature IDs in <code><uses-feature></code> elements in
+the <code>AndroidManifest.xml</code> file. This is the information that Android
+Market uses to match your app to devices that can run it. For instance, if you
+state that your app requires android.software.live_wallpapers, it won’t be shown
+to devices that don’t support Live Wallpapers.</p>
+
+<p>This puts you in total control of your app — because you don’t have to
+declare these features. Consider an example involving cameras.</p>
+
+<p>If you’re building a really impressive next-generation augmented-reality app,
+your app won’t function at all without a camera. However, if you’re building a
+shopping app that only uses the camera for barcode scanning, users without
+cameras might still find it useful even if they can’t scan barcodes. While both
+apps need to acquire the permission to access the camera, only the first app
+needs to state that it requires a camera. (The shopping app can simply check at
+runtime and disable the camera-related features if there’s no camera
+present.)</p>
+
+<p>Since only you can say what the best approach is for your app, Android
+provides the tools and lets you make your own tradeoff between maximizing
+audience size and minimizing development costs.</p>
+
+
+<h3 id="filtering">Filtering for business reasons</h3>
+
+<p>It’s possible that you may need to restrict your app’s availability for
+business or legal reasons. For instance, an app that displays train schedules
+for the London Underground is unlikely to be useful to users outside the United
+Kingdom. Other apps might not be permitted in certain countries for business or
+legal reasons. For cases such as these, Android Market itself provides
+developers with filtering options that allow them control their app’s
+availability for non-technical reasons.</p>
+
+<p>The help information for Android Market provides full details, but in a
+nutshell, developers can use the Market publisher UI to:</p>
+
+<ul>
+<li>List the countries an app is available in.</li>
+<li>Select which carrier’s users are able to access the app.</li>
+</ul>
+
+<p>Filtering for technical compatibility (such as required hardware components)
+is always based on information contained within your <code>.apk</code> file. But
+filtering for non-technical reasons (such as geographic restrictions) is always
+handled in the Market user interface.</p>
+
+<h3 id="futureproofing">Future-proofing</h3>
+
+<p>There’s one additional quirk that we haven’t yet addressed: protecting apps
+from changes made to future versions of Android. If the Android platform
+introduces a new feature or changes how existing features are handled, what
+happens to existing apps that were written without any knowledge of the new
+behavior?</p>
+
+<p>Simply put, Android commits to not making existing apps available to devices
+where they won’t work properly, even when the platform changes. The best way to
+explain this is through examples, so here are two:</p>
+
+<ul>
+<li>Android 1.0 through 1.5 required a 2 megapixel camera with auto-focus.
+However, with version 1.6, Android devices were permitted to omit the auto-focus
+capability, though a (fixed-focus) camera was still required. Some apps such as
+barcode scanners do not function as well with cameras that do not auto-focus. To
+prevent users from having a bad experience with those apps, existing apps that
+obtain permission to use the Camera were assumed by default to require
+auto-focus. This allowed Android Market to filter those apps from devices that
+lack auto-focus.</li>
+
+<li>Android 2.2, meanwhile, allowed the microphone to be optional on some
+devices, such as set-top boxes. Android 2.2 included a new feature ID for the
+microphone which allows developers to filter their apps if necessary, but
+— as with camera — apps that obtain permission to record audio are
+assumed to require the microphone feature by default. If your app can use a
+microphone but doesn’t strictly need it, you can explicitly state that you don’t
+require it; but unless you do that, your app won’t be shown to devices without
+microphones.</li>
+</ul>
+
+<p>In other words, whenever Android introduces new features or changes existing
+ones, we will always take steps to protect existing applications so that they
+don’t end up being available to devices where they won’t work.</p>
+
+<p>This is implemented, in part, using the <code>aapt</code> tool in the SDK.
+To see which features your app explicitly requires or is implicitly assumed to
+require, you can use the command <code>aapt dump badging</code>.</p>
+
+<h3 id="conclusion">Conclusion</h3>
+
+<p>The goal of Android is to create a huge installed base for developers to take
+advantage of. One of the ways we will achieve this is through different kinds of
+hardware running the same software environment. But we also recognize that only
+developers know which kinds of devices their apps make sense on. We’ve built in
+tools to the SDK and set up policies and requirements to ensure that developers
+remain in control of their apps, today and in the future. With the information
+you just read, and the resources listed in the sidebar of this document, you
+can publish your app with the confidence that only users who can run it will
+see it.</p>
+
+<p>For more information about Android device compatibility, please visit:</p>
+
+<p style="margin-left:2em;"><a href="http://source.android.com/compatibility/index.html">http://source.android.com/compatibility/index.html</a></p>
+
+
+
\ No newline at end of file
diff --git a/docs/html/guide/practices/screens_support.jd b/docs/html/guide/practices/screens_support.jd
index 1e254f0..45e3e49 100644
--- a/docs/html/guide/practices/screens_support.jd
+++ b/docs/html/guide/practices/screens_support.jd
@@ -35,7 +35,7 @@
<ol>
<li><code><a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><supports-screens></a></code></li>
<li><code><a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a></code></li>
- <li><a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">Alternate Resources</a></li>
+ <li><a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">Alternative Resources</a></li>
<li><a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a></li>
</ol>
@@ -279,16 +279,16 @@
<div class="sidebox-wrapper">
<div class="sidebox">
-<h2>Using the alternate resources framework</h2>
+<h2>Using the alternative resources framework</h2>
<p>The platform's support for loading screen size- and density-specific
-resources at run time is based on the alternate resources framework.
+resources at run time is based on the alternative resources framework.
<p> If you want to use size- or density-specific layouts or drawables in your
application and you are not familiar with resource qualifiers or how the
platform uses them, please read
-<a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">
-Alternate Resources</a>.
+<a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">
+Alternative Resources</a>.
</div>
</div>
@@ -738,8 +738,8 @@
<p>For more information about how to use resource qualifiers or how the platform
selects them, please read
-<a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">
-Alternate Resources</a>.</p>
+<a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">
+Alternative Resources</a>.</p>
<h2 id="screen-independence">Best practices for Screen Independence</h2>
@@ -1023,8 +1023,8 @@
<li>Creating any size- or density-specific resources you need and placing
them in directories tagged with the <a href="#qualifiers">correct
qualifiers</a>. Qualifiers must be arranged in a proscribed order. See
-<a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">
-Alternate Resources</a> for more information. </li>
+<a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">
+Alternative Resources</a> for more information. </li>
<li>Note that if you add size- or density-specific resource directories
tagged with any of the resource qualifiers listed in this document, you should
make sure to also tag those directories with the <code>v<api-level></code>
diff --git a/docs/html/guide/topics/data/backup.jd b/docs/html/guide/topics/data/backup.jd
new file mode 100644
index 0000000..98f7a4f
--- /dev/null
+++ b/docs/html/guide/topics/data/backup.jd
@@ -0,0 +1,761 @@
+page.title=Data Backup
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+ <h2>Quickview</h2>
+ <ul>
+ <li>Back up your data to the cloud in case the user looses it</li>
+ <li>Easily back up SharedPreferences and private files with BackupAgentHelper</li>
+ <li>Requires API Level 8</li>
+ </ul>
+
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Basics">The Basics</a></li>
+ <li><a href="#BackupAgent">Extending BackupAgent</a>
+ <ol>
+ <li><a href="#RequiredMethods">Required Methods</a></li>
+ <li><a href="#PerformingBackup">Performing backup</a></li>
+ <li><a href="#PerformingRestore">Performing restore</a></li>
+ </ol>
+ </li>
+ <li><a href="#BackupAgentHelper">Extending BackupAgentHelper</a>
+ <ol>
+ <li><a href="#SharedPreferences">Backing up SharedPreferences</a></li>
+ <li><a href="#Files">Backing up Private Files</a></li>
+ </ol>
+ </li>
+ <li><a href="#RestoreVersion">Checking the Restore Data Version</a></li>
+ <li><a href="#RequestingBackup">Requesting Backup</a></li>
+ <li><a href="#RequestingRestore">Requesting Restore</a></li>
+ </ol>
+
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.app.backup.BackupManager}</li>
+ <li>{@link android.app.backup.BackupAgent}</li>
+ <li>{@link android.app.backup.BackupAgentHelper}</li>
+ </ol>
+
+</div>
+</div>
+
+<p>Android's {@link android.app.backup backup} service allows you to copy your persistent
+application data to a remote "cloud" storage, in order to provide a restore point for the
+application data and settings. If a user performs a factory reset or converts to a new
+Android-powered device, the system automatically restores your backup data when the application
+is re-installed. This way, your users are not required to reproduce their previous data or
+application settings. This process is completely transparent to the user and does not affect the
+functionality or user experience in your application.</p>
+
+<p>Android-powered devices that support the backup service provide a cloud storage area that
+saves your backup data and a backup transport that delivers your data to
+the storage area and back to the device. During a backup
+operation, Android's Backup Manager requests backup data from your application, then delivers it to
+the cloud storage using the backup transport. During a restore operation, the Backup Manager
+retrieves the backup data from the backup transport and returns it to your application
+so it can restore the data to the device. The backup service is <em>not</em> designed for data
+synchronization (you do not have access the backup data, except during a restore operation on the
+device).</p>
+
+<p>The cloud storage used for backup won't necessarily be the same on all Android-powered devices.
+The cloud storage and backup transport may differ between devices and service providers.
+Where the backup data is stored is transparent to your application, but you are assured that your
+application data cannot be read by other applications.</p>
+
+<p class="caution"><strong>Caution:</strong> Because the cloud storage and transport service can
+differ from device to device, Android makes no guarantees about the security of your data while
+using backup. You should be cautious about using backup to store sensitive data, such as usernames
+and passwords.</p>
+
+
+<h2 id="Basics">The Basics</h2>
+
+<p>To backup your application data, you need to implement a backup agent. Your backup
+agent is called by the Backup Manager to provide the data you want to back up. It is also called
+to restore your backup data when the application is re-installed. The Backup Manager handles all
+your data transactions with the cloud storage and your backup agent handles all your data
+transactions on the device.</p>
+
+<p>To implement a backup agent, you must:</p>
+
+<ol>
+ <li>Declare your backup agent in your manifest file with the <a
+href="{@docRoot}guide/topics/manifest/application-element.html#agent">{@code
+android:backupAgent}</a> attribute.</li>
+ <li>Define a backup agent by either:</p>
+ <ol type="a">
+ <li><a href="#backupAgent">Extending BackupAgent</a>
+ <p>The {@link android.app.backup.BackupAgent} class provides the central interface with
+which your application communicates with the Backup Manager. If you extend this class
+directly, you must override {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()} to handle the backup and restore operations for your data.</p>
+ <p><em>Or</em></p>
+ <li><a href="#backupAgentHelper">Extending BackupAgentHelper</a>
+ <p>The {@link android.app.backup.BackupAgentHelper} class provides a convenient
+wrapper around the {@link android.app.backup.BackupAgent} class, which minimizes the amount of code
+you need to write. In your {@link android.app.backup.BackupAgentHelper}, you must use one or more
+"helper" objects, which automatically backup and restore certain types of data, so that you do not
+need to implement {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}.</p>
+ <p>Android currently provides backup helpers that will backup and restore complete files
+from {@link android.content.SharedPreferences} and <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>.</p>
+ </li>
+ </ol>
+ </li>
+</ol>
+
+
+
+
+<h2 id="BackupManifest">Declaring the Backup Agent in Your Manifest</h2>
+
+<p>This is the easiest step, so once you've decided on the class name for your backup agent, declare
+it in your manifest with the <a
+href="{@docRoot}guide/topics/manifest/application-element.html#agent">{@code
+android:backupAgent}</a> attribute in the <a
+href="{@docRoot}guide/topics/manifest/application-element.html">{@code
+<application>}</a> tag.</p>
+
+<p>For example:</p>
+
+<pre>
+<manifest ... >
+ <application android:label="MyApplication"
+ <b>android:backupAgent="MyBackupAgent"</b>>
+ <activity ... >
+ ...
+ </activity>
+ </application>
+</manifest>
+</pre>
+
+<p>Another attribute you might want to use is <a
+href="{@docRoot}guide/topics/manifest/application-element.html#restoreany">{@code
+android:restoreAnyVersion}</a>. This attribute takes a boolean value to indicate whether you
+want to restore the application data regardless of the current application version compared to the
+version that produced the backup data. (The default value is "{@code false}".) See <a
+href="#RestoreVersion">Checking the Restore Data Version</a> for more information.</p>
+
+<p class="note"><strong>Note:</strong> The backup service and the APIs you must use are
+available only on devices running API Level 8 (Android 2.2) or greater, so you should also
+set your <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code android:minSdkVersion}</a>
+attribute to "8". However, if you implement proper <a
+href="{@docRoot}resources/articles/backward-compatibility.html">backward compatibility</a> in
+your application, you can support this feature for devices running API Level 8 or greater, while
+remaining compatible with older devices.</p>
+
+
+
+
+
+<h2 id="BackupAgent">Extending BackupAgent</h2>
+
+<p>Most applications shouldn't need to extend the {@link android.app.backup.BackupAgent} class
+directly, but should instead <a href="BackupAgentHelper">extend BackupAgentHelper</a> to take
+advantage of the built-in helper classes that automatically backup and restore your files. However,
+you might want to extend {@link android.app.backup.BackupAgent} directly if you need to:</p>
+<ul>
+ <li>Version your data format. For instance, if you anticipate the need to revise the
+format in which you write your application data, you can build a backup agent to cross-check your
+application version during a restore operation and perform any necessary compatibility work if the
+version on the device is different than that of the backup data. For more information, see <a
+href="#RestoreVersion">Checking the Restore Data Version</a>.</li>
+ <li>Instead of backing up an entire file, you can specify the portions of data the should be
+backed up and how each portion is then restored to the device. (This can also help you manage
+different versions, because you read and write your data as unique entities, rather than
+complete files.)</li>
+ <li>Back up data in a database. If you have an SQLite database that you want to restore when
+the user re-installs your application, you need to build a custom {@link
+android.app.backup.BackupAgent} that reads the appropriate data during a backup operation, then
+create your table and insert the data during a restore operation.</li>
+</ul>
+
+<p>If you don't need to perform any of the tasks above and want to back up complete files from
+{@link android.content.SharedPreferences} or <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>, you
+should skip to <a href="BackupAgentHelper">Extending BackupAgentHelper</a>.</p>
+
+
+
+<h3 id="RequiredMethods">Required Methods</h3>
+
+<p>When you create a backup agent by extending {@link android.app.backup.BackupAgent}, you
+must implement the following callback methods:</p>
+
+<dl>
+ <dt>{@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()}</dt>
+ <dd>The Backup Manager calls this method after you <a href="#RequestBackup">request a
+backup</a>. In this method, you read your application data from the device and pass the data you
+want to back up to the Backup Manager, as described below in <a href="#PerformingBackup">Performing
+backup</a>.</dd>
+
+ <dt>{@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}</dt>
+ <dd>The Backup Manager calls this method during a restore operation (you can <a
+href="#RequestRestore">request a restore</a>, but the system automatically performs restore when the
+user re-installs your application). When it calls this method, the Backup Manager delivers your
+backup data, which you then restore to the device, as described below in <a
+href="#PerformingRestore">Performing restore</a>.</dd>
+</dl>
+
+
+
+<h3 id="PerformingBackup">Performing backup</h3>
+
+
+<p>When it's time to back up your application data, the Backup Manager calls your {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method. This is where you must provide your application data to the Backup Manager so
+it can be saved to cloud storage.</p>
+
+<p>Only the Backup Manager can call your backup agent's {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method. Each time that your application data changes and you want to perform a backup,
+you must request a backup operation by calling {@link
+android.app.backup.BackupManager#dataChanged()} (see <a href="#RequestingBackup">Requesting
+Backup</a> for more information). A backup request does not result in an immediate call to your
+{@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method. Instead, the Backup Manager waits for an appropriate time, then performs
+backup for all applications that have requested a backup since the last backup was performed.</p>
+
+<p class="note"><strong>Tip:</strong> While developing your application, you can initiate an
+immediate backup operation from the Backup Manager with the <a
+href="{@docRoot}guide/developing/tools/bmgr.html">bmgr tool</a>.</p>
+
+<p>When the Backup Manager calls your {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method, it passes three parameters:</p>
+
+<dl>
+ <dt>{@code oldState}</dt>
+ <dd>An open, read-only {@link android.os.ParcelFileDescriptor} pointing to the last backup
+state provided by your application. This is not the backup data from cloud storage, but a
+local representation of the data that was backed up the last time {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} was called (as defined by {@code newState}, below, or from {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}—more about this in the next section). Because {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} does not allow you to read existing backup data in
+the cloud storage, you can use this local representation to determine whether your data has changed
+since the last backup.</dd>
+ <dt>{@code data}</dt>
+ <dd>A {@link android.app.backup.BackupDataOutput} object, which you use to deliver your backup
+data to the Backup Manager.</dd>
+ <dt>{@code newState}</dt>
+ <dd>An open, read/write {@link android.os.ParcelFileDescriptor} pointing to a file in which
+you must write a representation of the data that you delivered to {@code data} (a representation
+can be as simple as the last-modified timestamp for your file). This object is
+returned as {@code oldState} the next time the Backup Manager calls your {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method. If you do not write your backup data to {@code newState}, then {@code oldState}
+will point to an empty file next time Backup Manager calls {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()}.</dd>
+</dl>
+
+<p>Using these parameters, you should implement your {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method to do the following:</p>
+
+<ol>
+ <li>Check whether your data has changed since the last backup by comparing {@code oldState} to
+your current data. How you read data in {@code oldState} depends on how you originally wrote it to
+{@code newState} (see step 3). The easiest way to record the state of a file is with its
+last-modified timestamp. For example, here's how you can read and compare a timestamp from {@code
+oldState}:
+ <pre>
+// Get the oldState input stream
+FileInputStream instream = new FileInputStream(oldState.getFileDescriptor());
+DataInputStream in = new DataInputStream(instream);
+
+try {
+ // Get the last modified timestamp from the state file and data file
+ long stateModified = in.readLong();
+ long fileModified = mDataFile.lastModified();
+
+ if (stateModified != fileModified) {
+ // The file has been modified, so do a backup
+ // Or the time on the device changed, so be safe and do a backup
+ } else {
+ // Don't back up because the file hasn't changed
+ return;
+ }
+} catch (IOException e) {
+ // Unable to read state file... be safe and do a backup
+}
+</pre>
+ <p>If nothing has changed and you don't need to back up, skip to step 3.</p>
+ </li>
+ <li>If your data has changed, compared to {@code oldState}, write the current data to
+{@code data} to back it up to the cloud storage.
+ <p>You must write each chunk of data as an "entity" in the {@link
+android.app.backup.BackupDataOutput}. An entity is a flattened binary data
+record that is identified by a unique key string. Thus, the data set that you back up is
+conceptually a set of key-value pairs.</p>
+ <p>To add an entity to your backup data set, you must:</p>
+ <ol>
+ <li>Call {@link android.app.backup.BackupDataOutput#writeEntityHeader(String,int)
+writeEntityheader()}, passing a unique string key for the data you're about to write and the data
+size.</li>
+ <li>Call {@link android.app.backup.BackupDataOutput#writeEntityData(byte[],int)
+writeEntityData()}, passing a byte buffer that contains your data and the number of bytes to write
+from the buffer (which should match the size passed to {@link
+android.app.backup.BackupDataOutput#writeEntityHeader(String,int) writeEntityHeader()}).</li>
+ </ol>
+ <p>For example, the following code flattens some data into a byte stream and writes it into a
+single entity:</p>
+ <pre>
+// Create buffer stream and data output stream for our data
+ByteArrayOutputStream bufStream = new ByteArrayOutputStream();
+DataOutputStream outWriter = new DataOutputStream(bufStream);
+// Write structured data
+outWriter.writeString(playerName);
+outWriter.writeInt(playerScore);
+// Send the data to the Backup Manager via the BackupDataOutput
+byte[] buffer = bufStream.toByteArray();
+int len = buffer.length;
+data.writeEntityHeader(TOPSCORE_BACKUP_KEY, len);
+data.writeEntityData(buffer, len);
+</pre>
+ <p>Perform this for each piece of data that you want to back up. How you divide your data into
+entities is up to you (and you might use just one entity).</p>
+ </li>
+ <li>Whether or not you perform a backup (in step 2), write a representation of the current data to
+the {@code newState} {@link android.os.ParcelFileDescriptor}. The Backup Manager retains this object
+locally as a representation of the data that is currently backed up. It passes this back to you as
+{@code oldState} the next time it calls {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} so you can determine whether another backup is necessary (as handled in step 1). If you
+do not write the current data state to this file, then
+{@code oldState} will be empty during the next callback.
+ <p>Again, the following example saves a representation of the data using the file's
+last-modified timestamp:</p>
+ <pre>
+FileOutputStream outstream = new FileOutputStream(stateFile.getFileDescriptor());
+DataOutputStream out = new DataOutputStream(outstream);
+
+long modified = mDataFile.lastModified();
+out.writeLong(modified);
+</pre>
+ </li>
+</ol>
+
+<p class="caution"><strong>Caution:</strong> If your application data is saved to a file, make sure
+that you use synchronized statements while accessing the file so that your backup agent does not
+read the file while an Activity in your application is also writing the file.</p>
+
+
+
+
+<h3 id="PerformingRestore">Performing restore</h3>
+
+<p>When it's time to restore your application data, the Backup Manager calls your backup
+agent's {@link android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()} method. When it calls this method, the Backup Manager delivers your backup data so
+you can restore it onto the device.</p>
+
+<p>Only the Backup Manager can call {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}, which happens automatically when the system installs your application and
+finds existing backup data. However, you can request a restore operation for
+your application by calling {@link
+android.app.backup.BackupManager#requestRestore(RestoreObserver) requestRestore()} (see <a
+href="#RequestingRestore">Requesting restore</a> for more information).</p>
+
+<p class="note"><strong>Note:</strong> While developing your application, you can also request a
+restore operation with the <a href="{@docRoot}guide/developing/tools/bmgr.html">bmgr
+tool</a>.</p>
+
+<p>When the Backup Manager calls your {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()} method, it passes three parameters:</p>
+
+<dl>
+ <dt>{@code data}</dt>
+ <dd>A {@link android.app.backup.BackupDataInput}, which allows you to read your backup
+data.</dd>
+ <dt>{@code appVersionCode}</dt>
+ <dd>An integer representing the value of your application's <a
+href="{@docRoot}guide/topics/manifest/manifest-element.html#vcode">{@code android:versionCode}</a>
+manifest attribute, as it was when this data was backed up. You can use this to cross-check the
+current application version and determine if the data format is compatible. For more
+information about using this to handle different versions of restore data, see the section
+below about <a href="#RestoreVersion">Checking the Restore Data Version</a>.</dd>
+ <dt>{@code newState}</dt>
+ <dd>An open, read/write {@link android.os.ParcelFileDescriptor} pointing to a file in which
+you must write the final backup state that was provided with {@code data}. This object is
+returned as {@code oldState} the next time {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} is called. Recall that you must also write the same {@code newState} object in the
+{@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} callback—also doing it here ensures that the {@code oldState} object given to
+{@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} is valid even the first time {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} is called after the device is restored.</dd>
+</dl>
+
+<p>In your implementation of {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}, you should call {@link android.app.backup.BackupDataInput#readNextHeader()} to iterate
+through all entities in the data set. For each entity found, do the following:</p>
+
+<ol>
+ <li>Get the entity key with {@link android.app.backup.BackupDataInput#getKey()}.</li>
+ <li>Compare the entity key to a list of known key values that you should have declared as static
+final strings inside your {@link android.app.backup.BackupAgent} class. When the key matches one of
+your known key strings, enter into a statement to extract the entity data and save it to the device:
+ <ol>
+ <li>Get the entity data size with {@link
+android.app.backup.BackupDataInput#getDataSize()} and create a byte array of that size.</li>
+ <li>Call {@link android.app.backup.BackupDataInput#readEntityData(byte[],int,int)
+readEntityData()} and pass it the byte array, which is where the data will go, and specify the
+start offset and the size to read.</li>
+ <li>Your byte array is now full and you can read the data and write it to the device
+however you like.</li>
+ </ol>
+ </li>
+ <li>After you read and write your data back to the device, write the state of your data to the
+{@code newState} parameter the same as you do during {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()}.
+</ol>
+
+<div class="special">
+<p>For an example implementation of {@link android.app.backup.BackupAgent}, see the <a
+href="{@docRoot}resources/samples/BackupRestore/src/com/example/android/backuprestore/ExampleAgent.html">{@code
+ExampleAgent}</a> class in the <a
+href="{@docRoot}}resources/samples/BackupRestore/index.html">Backup and Restore</a> sample
+application.</p>
+</div>
+
+
+
+
+
+
+<h2 id="BackupAgentHelper">Extending BackupAgentHelper</h2>
+
+<p>You should build your backup agent using {@link android.app.backup.BackupAgentHelper} if you want
+to back up complete files (from either {@link android.content.SharedPreferences} or <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>).
+Building your backup agent with {@link android.app.backup.BackupAgentHelper} requires far less
+code than extending {@link android.app.backup.BackupAgent}, because you don't have to implement
+{@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}.</p>
+
+<p>Your implementation of {@link android.app.backup.BackupAgentHelper} must
+use one or more backup helpers. A backup helper is a specialized
+component that {@link android.app.backup.BackupAgentHelper} summons to perform backup and
+restore operations for a particular type of data. The Android framework currently provides two
+different helpers:</p>
+<ul>
+ <li>{@link android.app.backup.SharedPreferencesBackupHelper} to backup {@link
+android.content.SharedPreferences} files.</li>
+ <li>{@link android.app.backup.FileBackupHelper} to backup files from <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>.</li>
+</ul>
+
+<p>You can include multiple helpers in your {@link android.app.backup.BackupAgentHelper}, but only
+one helper is needed for each data type. That is, if you have multiple {@link
+android.content.SharedPreferences} files, then you need only one {@link
+android.app.backup.SharedPreferencesBackupHelper}.</p>
+
+<p>For each helper you want to add to your {@link android.app.backup.BackupAgentHelper}, you must do
+the following during your {@link android.app.backup.BackupAgent#onCreate()} method:</p>
+<ol>
+ <li>Instantiate in instance of the desired helper class. In the class constructor, you must
+specify the appropriate file(s) you want to backup.</li>
+ <li>Call {@link android.app.backup.BackupAgentHelper#addHelper(String,BackupHelper) addHelper()}
+to add the helper to your {@link android.app.backup.BackupAgentHelper}.</li>
+</ol>
+
+<p>The following sections describe how to create a backup agent using each of the available
+helpers.</p>
+
+
+
+<h3 id="SharedPreferences">Backing up SharedPreferences</h3>
+
+<p>When you instantiate a {@link android.app.backup.SharedPreferencesBackupHelper}, you must the
+name of one or more {@link android.content.SharedPreferences} files.</p>
+
+<p>For example, to back up a {@link android.content.SharedPreferences} file named
+"user_preferences", a complete backup agent using {@link android.app.backup.BackupAgentHelper} looks
+like this:</p>
+
+<pre>
+public class MyPrefsBackupAgent extends BackupAgentHelper {
+ // The name of the SharedPreferences file
+ static final String PREFS = "user_preferences";
+
+ // A key to uniquely identify the set of backup data
+ static final String PREFS_BACKUP_KEY = "prefs";
+
+ // Allocate a helper and add it to the backup agent
+ void onCreate() {
+ SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);
+ addHelper(PREFS_BACKUP_KEY, helper);
+ }
+}
+</pre>
+
+<p>That's it! That's your entire backup agent. The {@link
+android.app.backup.SharedPreferencesBackupHelper} includes all the code
+needed to backup and restore a {@link android.content.SharedPreferences} file.</p>
+
+<p>When the Backup Manager calls {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()}, {@link android.app.backup.BackupAgentHelper} calls your backup helpers to perform
+backup and restore for your specified files.</p>
+
+<p class="note"><strong>Note:</strong> {@link android.content.SharedPreferences} are threadsafe, so
+you can safely read and write the shared preferences file from your backup agent and
+other activities.</p>
+
+
+
+<h3 id="Files">Backing up other files</h3>
+
+<p>When you instantiate a {@link android.app.backup.FileBackupHelper}, you must include the name of
+one or more files that are saved to your application's <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>
+(as specified by {@link android.content.ContextWrapper#getFilesDir()}, which is the same
+location where {@link android.content.Context#openFileOutput(String,int) openFileOutput()} writes
+files).</p>
+
+<p>For example, to backup two files named "scores" and "stats," a backup agent using {@link
+android.app.backup.BackupAgentHelper} looks like this:</p>
+
+<pre>
+public class MyFileBackupAgent extends BackupAgentHelper {
+ // The name of the SharedPreferences file
+ static final String TOP_SCORES = "scores";
+ static final String PLAYER_STATS = "stats";
+
+ // A key to uniquely identify the set of backup data
+ static final String FILES_BACKUP_KEY = "myfiles";
+
+ // Allocate a helper and add it to the backup agent
+ void onCreate() {
+ FileBackupHelper helper = new FileBackupHelper(this, TOP_SCORES, PLAYER_STATS);
+ addHelper(FILES_BACKUP_KEY, helper);
+ }
+}
+</pre>
+
+<p>The {@link android.app.backup.FileBackupHelper} includes all the code necessary to backup and
+restore files that are saved to your application's <a
+href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal storage</a>..</p>
+
+<p>However, reading and writing to files on internal storage is <strong>not threadsafe</strong>. To
+ensure that your backup agent does not read or write your files at the same time as your activities,
+you must use synchronized statements each time you perform a read or write. For example,
+in any Activity where you read and write the file, you need an object to use as the intrinsic
+lock for the synchronized statements:</p>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<p><strong>Interesting Fact:</strong></p>
+<p>A zero-length array is lighter-weight than a normal Object, so it's great for an
+intrinsic lock.</p>
+</div>
+</div>
+
+<pre>
+// Object for intrinsic lock
+static final Object[] sDataLock = new Object[0];
+</pre>
+
+<p>Then create a synchronized statement with this lock each time you read or write the files. For
+example, here's a synchronized statement for writing the latest score in a game to a file:</p>
+
+<pre>
+try {
+ synchronized (MyActivity.sDataLock) {
+ File dataFile = new File({@link android.content.Context#getFilesDir()}, TOP_SCORES);
+ RandomAccessFile raFile = new RandomAccessFile(dataFile, "rw");
+ raFile.writeInt(score);
+ }
+} catch (IOException e) {
+ Log.e(TAG, "Unable to write to file");
+}
+</pre>
+
+<p>You should synchronize your read statements with the same lock.</p>
+
+<p>Then, in your {@link android.app.backup.BackupAgentHelper}, you must override {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()} to synchronize the backup and restore operations with the same
+intrinsic lock. For example, the {@code MyFileBackupAgent} example from above needs the following
+methods:</p>
+
+<pre>
+@Override
+public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) throws IOException {
+ // Hold the lock while the FileBackupHelper performs backup
+ synchronized (MyActivity.sDataLock) {
+ super.onBackup(oldState, data, newState);
+ }
+}
+
+@Override
+public void onRestore(BackupDataInput data, int appVersionCode,
+ ParcelFileDescriptor newState) throws IOException {
+ // Hold the lock while the FileBackupHelper restores the file
+ synchronized (MyActivity.sDataLock) {
+ super.onRestore(data, appVersionCode, newState);
+ }
+}
+</pre>
+
+<p>That's it. All you need to do is add your {@link android.app.backup.FileBackupHelper} in the
+{@link android.app.backup.BackupAgent#onCreate()} method and override {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} and {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
+onRestore()} to synchronize read and write operations.</p>
+
+<div class="special">
+<p>For an example implementation of {@link
+android.app.backup.BackupAgentHelper} with {@link android.app.backup.FileBackupHelper}, see the
+{@code FileHelperExampleAgent} class in the <a
+href="{@docRoot}resources/samples/BackupRestore/index.html">Backup and Restore</a> sample
+application.</p>
+</div>
+
+
+
+
+
+
+<h2 id="RestoreVersion">Checking the Restore Data Version</h2>
+
+<p>When the Backup Manager saves your data to cloud storage, it automatically includes the version
+of your application, as defined by your manifest file's <a
+href="{@docRoot}guide/topics/manifest/manifest-element.html#vcode">{@code android:versionCode}</a>
+attribute. Before the Backup Manager calls your backup agent to restore your data, it
+looks at the <a
+href="{@docRoot}guide/topics/manifest/manifest-element.html#vcode">{@code
+android:versionCode}</a> of the installed application and compares it to the value
+recorded in the restore data set. If the version recorded in the restore data set is
+<em>newer</em> than the application version on the device, then the user has downgraded their
+application. In this case, the Backup Manager will abort the restore operation for your application
+and not call your {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}
+method, because the restore set is considered meaningless to an older version.</p>
+
+<p>You can override this behavior with the <a
+href="{@docRoot}guide/topics/manifest/application-element.html#restoreany">{@code
+android:restoreAnyVersion}</a> attribute. This attribute is either "{@code true}" or "{@code
+false}" to indicate whether you want to restore the application regardless of the restore set
+version. The default value is "{@code false}". If you define this to be "{@code true}" then the
+Backup Manager will ignore the <a
+href="{@docRoot}guide/topics/manifest/manifest-element.html#vcode">{@code android:versionCode}</a>
+and call your {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}
+method in all cases. In doing so, you can manually check for the version difference in your {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}
+method and take any steps necessary to make the data compatible if the versions conflict.</p>
+
+<p>To help you handle different versions during a restore operation, the {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}
+method passes you the version code included with the restore data set as the {@code appVersionCode}
+parameter. You can then query the current application's version code with the {@link
+android.content.pm.PackageInfo#versionCode PackageInfo.versionCode} field. For example:</p>
+
+<pre>
+PackageInfo info;
+try {
+ String name = {@link android.content.ContextWrapper#getPackageName() getPackageName}();
+ info = {@link android.content.ContextWrapper#getPackageManager
+getPackageManager}().{@link android.content.pm.PackageManager#getPackageInfo(String,int)
+getPackageInfo}(name,0);
+} catch (NameNotFoundException nnfe) {
+ info = null;
+}
+
+int version;
+if (info != null) {
+ version = info.versionCode;
+}
+</pre>
+
+<p>Then simply compare the {@code version} acquired from {@link android.content.pm.PackageInfo}
+to the {@code appVersionCode} passed into {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}.
+</p>
+
+<p class="caution"><strong>Caution:</strong> Be certain you understand the consequences of setting
+<a href="{@docRoot}guide/topics/manifest/application-element.html#restoreany">{@code
+android:restoreAnyVersion}</a> to "{@code true}" for your application. If each version of your
+application that supports backup does not properly account for variations in your data format during
+{@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()},
+then the data on the device could be saved in a format incompatible with the version currently
+installed on the device.</p>
+
+
+
+<h2 id="RequestingBackup">Requesting Backup</h2>
+
+<p>You can request a backup operation at any time by calling {@link
+android.app.backup.BackupManager#dataChanged()}. This method notifies the Backup Manager that you'd
+like to backup your data using your backup agent. The Backup Manager then calls your backup
+agent's {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()} method at an opportune time in the future. Typically, you should
+request a backup each time your data changes (such as when the user changes an application
+preference that you'd like to back up). If you call {@link
+android.app.backup.BackupManager#dataChanged()} several times consecutively, before the Backup
+Manager requests a backup from your agent, your agent still receives just one call to {@link
+android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
+onBackup()}.</p>
+
+<p class="note"><strong>Note:</strong> While developing your application, you can request a
+backup and initiate an immediate backup operation with the <a
+href="{@docRoot}guide/developing/tools/bmgr.html">bmgr
+tool</a>.</p>
+
+
+<h2 id="RequestingRestore">Requesting Restore</h2>
+
+<p>During the normal life of your application, you shouldn't need to request a restore operation.
+They system automatically checks for backup data and performs a restore when your application is
+installed. However, you can manually request a restore operation by calling {@link
+android.app.backup.BackupManager#requestRestore(RestoreObserver) requestRestore()}, if necessary. In
+which case, the Backup Manager calls your {@link
+android.app.backup.BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor) onRestore()}
+implementation, passing the data from the current set of backup data.</p>
+
+<p class="note"><strong>Note:</strong> While developing your application, you can request a
+restore operation with the <a href="{@docRoot}guide/developing/tools/bmgr.html">bmgr
+tool</a>.</p>
+
diff --git a/docs/html/images/developing/adt-props-isLib.png b/docs/html/images/developing/adt-props-isLib.png
new file mode 100644
index 0000000..18bdb33
--- /dev/null
+++ b/docs/html/images/developing/adt-props-isLib.png
Binary files differ
diff --git a/docs/html/images/developing/adt-props-libRef.png b/docs/html/images/developing/adt-props-libRef.png
new file mode 100644
index 0000000..e61df51
--- /dev/null
+++ b/docs/html/images/developing/adt-props-libRef.png
Binary files differ
diff --git a/docs/html/resources/dashboard/platform-versions.jd b/docs/html/resources/dashboard/platform-versions.jd
index ec7e9da..c77e7b7 100644
--- a/docs/html/resources/dashboard/platform-versions.jd
+++ b/docs/html/resources/dashboard/platform-versions.jd
@@ -2,9 +2,10 @@
@jd:body
<style type="text/css">
+
div.dashboard-panel {
- max-width:928px;
- margin:0 0 1em 0;
+ max-width:1000px;
+ margin:0 0 2em 0;
padding:20px 20px 0 20px;
border:1px solid #d3ecf5;
border-radius:7px;
@@ -22,11 +23,14 @@
border:1px solid #ccc;
float:left;
}
-div.dashboard-panel table {
+#jd-content div.dashboard-panel table {
margin:0 0 20px 0;
float:left;
background-color:#fff;
}
+div.dashboard-panel p {
+ clear:left;
+}
div.dashboard-panel th {
white-space:nowrap;
}
@@ -36,7 +40,8 @@
running a given version of the Android platform. This can help you
understand the landscape of device distribution and decide how to prioritize
the development of your application features for the devices currently in
-the hands of users.</p>
+the hands of users. For information about how to target your application to devices based on
+platform version, see <a href="{@docRoot}guide/appendix/api-levels.html">API Levels</a>.</p>
<p class="note"><strong>Note:</strong> This data is based on the number
of Android devices that have accessed Android Market within a 14-day period
@@ -44,38 +49,23 @@
<div class="dashboard-panel">
-<img alt="" width="400" height="250"
-src="http://chart.apis.google.com/chart?cht=p&chs=400x250&chd=t:0.3,31.0,47.6,0.7,20.4&chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1&chco=c4df9b,6fad0c" />
-
-<!-- HISTORY
-12/14/09 http://chart.apis.google.com/chart?cht=p&chs=400x250&chd=t:0.3,27.7,54.2,2.9,14.8&chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1&chco=c4df9b,6fad0c
--->
+<img alt="" width="460" height="250"
+src="http://chart.apis.google.com/chart?&cht=p&chs=460x250&chd=t:0.1,35.6,28.1,0.2,0.4,35.6&chl=
+Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1|Android%202.1&chco=c4df9b,
+6fad0c" />
<table>
<tr>
<th>Android Platform</th>
<th>Percent of Devices</th>
</tr>
-<tr>
- <td>Android 1.1</td>
- <td>0.3%</td>
-</tr>
-<tr>
- <td>Android 1.5</td>
- <td>31.0%</td>
-</tr>
-<tr>
- <td>Android 1.6</td>
- <td>47.6%</td></tr>
-<tr>
- <td>Android 2.0</td>
- <td>0.7%</td>
-</tr>
-<tr>
- <td>Android 2.0.1</td>
- <td>20.4%</td>
-</tr>
+<tr><td>Android 1.1</td><td>0.1%</td></tr>
+<tr><td>Android 1.5</td><td>34.1%</td></tr>
+<tr><td>Android 1.6</td><td>28.0%</td></tr>
+<tr><td>Android 2.0</td><td>0.2%</td></tr>
+<tr><td>Android 2.0.1</td><td>0.4%</td></tr>
+<tr><td>Android 2.1</td><td>37.2%</td></tr>
</table>
+<p><em>Data collected during two weeks ending on May 17, 2010</em></p>
</div>
-<p><em>Data collected during two weeks ending on 1/4/2010</em></p>
diff --git a/docs/html/resources/dashboard/screens.jd b/docs/html/resources/dashboard/screens.jd
new file mode 100644
index 0000000..4ce7596
--- /dev/null
+++ b/docs/html/resources/dashboard/screens.jd
@@ -0,0 +1,81 @@
+page.title=Screen Sizes and Densities
+@jd:body
+
+<style type="text/css">
+
+div.dashboard-panel {
+ max-width:1000px;
+ margin:0 0 2em 0;
+ padding:20px 20px 0 20px;
+ border:1px solid #d3ecf5;
+ border-radius:7px;
+ -moz-border-radius:7px;
+ -webkit-border-radius:7px;
+ background-color: #DAF3FC;
+ box-shadow:2px 3px 1px #eee;
+ -moz-box-shadow:2px 3px 1px #eee;
+ -webkit-box-shadow:2px 3px 1px #eee;
+ overflow:hidden;
+}
+#jd-content div.dashboard-panel img {
+ margin:0 20px 20px 0;
+ padding:0;
+ border:1px solid #ccc;
+ float:left;
+}
+#jd-content div.dashboard-panel table {
+ margin:0 0 20px 0;
+ float:left;
+ background-color:#fff;
+}
+div.dashboard-panel p {
+ clear:left;
+}
+div.dashboard-panel th {
+ white-space:nowrap;
+}
+</style>
+
+<p>This page provides data about the relative number of active devices
+using a particular type of screen, including the screen size and density. For information about how
+your application can support multiple screen types, see <a
+href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a>.</p>
+
+<p class="note"><strong>Note:</strong> This data is based on the number
+of Android devices that have accessed Android Market within a 14-day period
+ending on the data collection date noted below.</p>
+
+
+<div class="dashboard-panel">
+
+<img alt="" width="460" height="250"
+src="http://chart.apis.google.com/chart?&cht=p&chs=460x250&chd=t:1.0,63.9,35.1&chl=Small%20/%20ldpi|
+Normal%20/%20mdpi|Normal%20/%20hdpi&chco=c4df9b,6fad0c" />
+
+<table>
+<tr>
+<th></th>
+<th scope="col">Low Density</th>
+<th scope="col">Medium Density</th>
+<th scope="col">High Density</th>
+</tr>
+<tr><th scope="row">Small</th>
+<td class='cent '>1.0%</td>
+<td></td>
+<td></td>
+</tr>
+<tr><th scope="row">Normal</th>
+<td></td>
+<td class='cent hi'>63.7%</td>
+<td class='cent hi'>35.3%</td>
+</tr>
+<tr><th scope="row">Large</th>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</table>
+
+<p><em>Data collected during two weeks ending on May 17, 2010</em></p>
+</div>
+
diff --git a/docs/html/resources/resources_toc.cs b/docs/html/resources/resources_toc.cs
index 0d6ecc4..107c604 100644
--- a/docs/html/resources/resources_toc.cs
+++ b/docs/html/resources/resources_toc.cs
@@ -27,6 +27,9 @@
<li><a href="<?cs var:toroot ?>resources/dashboard/platform-versions.html">
<span class="en">Platform Versions</span>
</a></li>
+ <li><a href="<?cs var:toroot ?>resources/dashboard/screens.html">
+ <span class="en">Screen Sizes & Densities</span>
+ </a> <span class="new">new!</span></li>
</ul>
</li><?cs
/if
diff --git a/docs/html/sdk/android-2.2.jd b/docs/html/sdk/android-2.2.jd
index 5844256..ab261f0 100644
--- a/docs/html/sdk/android-2.2.jd
+++ b/docs/html/sdk/android-2.2.jd
@@ -38,9 +38,8 @@
<p>
<em>API Level:</em> <strong>{@sdkPlatformApiLevel}</strong></p>
-<p>Android {@sdkPlatformVersion} is a {@sdkPlatformMajorMinor} platform release
-deployable to Android-powered handsets starting in {@sdkPlatformDeployableDate}.
-This release includes user features, developer features, API changes, and bug
+<p>Android {@sdkPlatformVersion} is a {@sdkPlatformMajorMinor} platform release including user
+features, developer features, API changes, and bug
fixes. For information on developer features and API changes, see the
<a href="#api">Framework API</a> section.</p>
@@ -125,19 +124,7 @@
<dt>Tools:</dt>
<dd>
-<ul>
-<li>Adds support for building with Android library projects, a capability that
-lets you store shared Android application code and resources in a separate
-development project. You can then reference the library project from other
-Android projects and, at build time, the tools compile the shared code and
-resources as part of the dependent applications. More information about this
-feature is available in the <a
-href="{@docRoot}guide/developing/eclipse-adt.html#libraryProject">Developing in
-Eclipse, with ADT</a> and <a
-href="{@docRoot}guide/developing/other-ide.html#libraryProject">Developing in
-Other IDEs</a> documents. </li>
-</li>
-</ul>
+<p>Adds support for building with Android library projects. See <a href="tools-notes.html">SDK Tools, r6</a> for information.</p>
</dd>
</dl>
@@ -332,26 +319,14 @@
<h4 id="backup-manager">Backup manager</h4>
-<p>The platform now provides a generalized backup manager facility that
+<p>The platform now provides a generalized backup service that
applications can use to backup and restore user data, to ensure that users can
maintain their data when switching devices or reinstalling the application. The
-backup manager handles the work of transporting the application data to and from
-the backup storage area in the cloud. The backup manager can store any type of
+Backup Manager handles the work of transporting the application data to and from
+the backup storage area in the cloud. The Backup Manager can store any type of
data, from arbitrary data to files, and manages backup and restore operations
-in an atomic manner. </p>
-
-<p>Any application can use the backup manager to save and restore data. To do
-so, the application instantiates a {@link android.app.backup.BackupManager} and
-uses its methods to trigger a new backup or restore operation. The application
-must also create a subclass of {@link android.app.backup.BackupAgent} and
-implement its methods to handle calls from the backup manager to get data for
-backup and provide data to restore
-({@link android.app.backup.BackupAgent#onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) onBackup()}
-and {@link android.app.backup.BackupAgent#onRestore(android.app.backup.BackupDataInput, int, android.os.ParcelFileDescriptor) onRestore()}).
-A simple implementation of a BackupAgent useful for backing up preferences
-and files is available by using {@link android.app.backup.BackupAgentHelper}.
-For more information, see <a
-href="{@docRoot}guide/topics/topics/data/backup.html">Data Backup</a>.</p>
+in an atomic manner. For more information, see <a
+href="{@docRoot}guide/topics/data/backup.html">Data Backup</a>.</p>
<h4>Graphics</h4>
@@ -373,10 +348,11 @@
<li>New APIs for adding files to the media database, so that they are automatically scanned. See {@link android.media.MediaScannerConnection#scanFile(Context, String[], String[], OnScanCompletedListener) MediaScannerConnection.scanFile} and {@link android.media.MediaScannerConnection.OnScanCompletedListener MediaScannerConnection.OnScanCompletedListener}.</li>
</ul>
-<h4>Third-party voice recognition engines</h4>
+<h4>Speech recognition and third-party recognition engines</h4>
<ul>
-<li>The platform now provides a {@link android.speech.RecognitionService} base class that lets third-party developers create plug-in recognition engines. </li>
+<li>The platform provides new speech-recognition APIs that allow applications to have a richer interaction with the available voice recognizer. For example, the APIs are sufficient to integrate voice recognition deeply into an IME.</li>
+<li>The platform also provides a {@link android.speech.RecognitionService} base class that lets third-party developers create plug-in recognition engines. </li>
<li>New {@link android.speech.RecognitionListener} interface to receive callbacks.</li>
<li>New {@link android.speech.RecognizerIntent} extras that let a requester app specify details as preferred language, minimum length in milliseconds, and so on.</li>
</ul>
@@ -395,7 +371,13 @@
<h4>Device policy manager</h4>
-<p>New device policy management APIs allow developers to write "device administrator" applications that can control security features of the device, such as the minimum password strength, data wipe, and so on. Users can select the administrators that are enabled on their devices. For more information, see the {@link android.app.admin android.app.admin} classees.</p>
+<p>New device policy management APIs allow developers to write "device
+administrator" applications that can control security features of the device,
+such as the minimum password strength, data wipe, and so on. Users can select
+the administrators that are enabled on their devices. For more information, see
+the {@link android.app.admin android.app.admin} classees or the example
+application code in <a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.html">DeviceAdminSample.java</a>.</p>
<h4>UI Framework</h4>
@@ -405,7 +387,7 @@
<li>Improvements in the way that multitouch events are reported in {@link android.view.MotionEvent} objects.</li>
<li>The layout attribute <code>fill_parent</code> is renamed to <code>match_parent</code>. This affects both XML and Java code (see {@link android.view.ViewGroup.LayoutParams}). Note that the platform will continue to honor uses of <code>fill_parent</code> in legacy applications. </li>
<li>New layout attributes {@link android.R.attr#tabStripEnabled}, {@link android.R.attr#tabStripRight}, and {@link android.R.attr#tabStripLeft} let developers customize the bottom strip of TabWidgets.</li>
-<li>Better support for managed dialogs in Activity.</li> application data (and applications)
+<li>Better support for managed dialogs in Activity.</li>
</ul>
<h4>Accounts and Sync</h4>
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index d383fde..5e92253 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -2,16 +2,16 @@
sdk.redirect=0
sdk.win_download=android-sdk_r06-windows.zip
-sdk.win_bytes=
-sdk.win_checksum=
+sdk.win_bytes=23293160
+sdk.win_checksum=7c7fcec3c6b5c7c3df6ae654b27effb5
sdk.mac_download=android-sdk_r06-mac_86.zip
-sdk.mac_bytes=
-sdk.mac_checksum=
+sdk.mac_bytes=19108077
+sdk.mac_checksum=c92abf66a82c7a3f2b8493ebe025dd22
sdk.linux_download=android-sdk_r06-linux_86.tgz
-sdk.linux_bytes=
-sdk.linux_checksum=
+sdk.linux_bytes=16971139
+sdk.linux_checksum=848371e4bf068dbb582b709f4e56d903
@jd:body
diff --git a/docs/html/sdk/ndk/index.jd b/docs/html/sdk/ndk/index.jd
index 93c5fb8..69cc73d 100644
--- a/docs/html/sdk/ndk/index.jd
+++ b/docs/html/sdk/ndk/index.jd
@@ -1,16 +1,16 @@
ndk=true
ndk.win_download=android-ndk-r4-windows.zip
-ndk.win_bytes=
-ndk.win_checksum=
+ndk.win_bytes=45778965
+ndk.win_checksum=1eded98a7f5cd5e71f8ac74565f73f11
ndk.mac_download=android-ndk-r4-darwin-x86.zip
-ndk.mac_bytes=
-ndk.mac_checksum=
+ndk.mac_bytes=50572163
+ndk.mac_checksum=b7d5f149fecf951c05a79b045f00419f
ndk.linux_download=android-ndk-r4-linux-x86.zip
-ndk.linux_bytes=
-ndk.linux_checksum=
+ndk.linux_bytes=49450682
+ndk.linux_checksum=0892b0637d45d145e045cc68e163dee3
page.title=Android NDK
@jd:body
@@ -27,7 +27,7 @@
//$(".toggleme", toggleable).slideDown("fast");
toggleable.removeClass("closed");
toggleable.addClass("open");
- $(".toggle-img", toggleable).attr("title", "hide").attr("src", "/assets/images/triangle-opened.png");
+ $(".toggle-img", toggleable).attr("title", "hide").attr("src", "{@docRoot}assets/images/triangle-opened.png");
} else {
//$(".toggleme", toggleable).slideUp("fast");
toggleable.removeClass("open");
@@ -72,8 +72,8 @@
<ul>
<li>Provides a simplified build system through the new <code>ndk-build</code> build
command. </li>
-<li>Adds support for easy native debugging of generated machine code through the new
-<code>ndk-gdb</code> command.</li>
+<li>Adds support for easy native debugging of generated machine code on production
+devices through the new <code>ndk-gdb</code> command.</li>
<li>Adds a new Android-specific ABI for ARM-based CPU architectures,
<code>armeabi-v7a</code>. The new ABI extends the existing <code>armeabi</code>
ABI to include these CPU instruction set extensions:
@@ -81,7 +81,8 @@
<li>Thumb-2 instructions</li>
<li>VFP hardware FPU instructions (VFPv3-D16)</li>
<li>Optional support for ARM Advanced SIMD (NEON) GCC intrinsics and VFPv3-D32.
-Supported by devices such as Verizon Droid, Google Nexus One, and others.</li>
+Supported by devices such as Verizon Droid by Motorola, Google Nexus One, and
+others.</li>
</ul>
<li>Adds a new <code>cpufeatures</code> static library (with sources) that lets
your app detect the host device's CPU features at runtime. Specifically,
@@ -207,6 +208,12 @@
optional support for NEON/VFPv3-D32 instructions)</li>
</ul>
+<p>Future releases of the NDK will also support:</p>
+
+<ul>
+<li>x86 instructions (see CPU-ARCH-ABIS.TXT for more information)</li>
+</ul>
+
<p>ARMv5TE machine code will run on all ARM-based Android devices. ARMv7-A will
run only on devices such as the Verizon Droid or Google Nexus One that have a
compatible CPU. The main difference between the two instruction sets is that
@@ -215,7 +222,7 @@
switching to ARMv7-A is as easy as adding a single line to the application's
Application.mk file, without needing to change anything else in the file. You
can also build for both architectures at the same time and have everything
-stored in the final <code>.apk</code>. Complete information is provided in the
+stored in the final <code>.apk</code>. For complete information is provided in the
CPU-ARCH-ABIS.TXT in the NDK package. </p>
<p>The NDK provides stable headers for libc (the C library), libm (the Math
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index 7b155fe..f801794 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -315,29 +315,6 @@
super.destroy();
}
- public static Element createFromClass(RenderScript rs, Class c) {
- rs.validate();
- Field[] fields = c.getFields();
- Builder b = new Builder(rs);
-
- for(Field f: fields) {
- Class fc = f.getType();
- if(fc == int.class) {
- b.add(createUser(rs, DataType.SIGNED_32), f.getName());
- } else if(fc == short.class) {
- b.add(createUser(rs, DataType.SIGNED_16), f.getName());
- } else if(fc == byte.class) {
- b.add(createUser(rs, DataType.SIGNED_8), f.getName());
- } else if(fc == float.class) {
- b.add(createUser(rs, DataType.FLOAT_32), f.getName());
- } else {
- throw new IllegalArgumentException("Unkown field type");
- }
- }
- return b.create();
- }
-
-
/////////////////////////////////////////
public static Element createUser(RenderScript rs, DataType dt) {
return new Element(rs, dt, DataKind.USER, false, 1);
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
index 69be245..f558117 100644
--- a/graphics/java/android/renderscript/ProgramStore.java
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -147,17 +147,17 @@
if (b.mOut != null) {
outID = b.mOut.mID;
}
- rs.nProgramFragmentStoreBegin(inID, outID);
- rs.nProgramFragmentStoreDepthFunc(b.mDepthFunc.mID);
- rs.nProgramFragmentStoreDepthMask(b.mDepthMask);
- rs.nProgramFragmentStoreColorMask(b.mColorMaskR,
+ rs.nProgramStoreBegin(inID, outID);
+ rs.nProgramStoreDepthFunc(b.mDepthFunc.mID);
+ rs.nProgramStoreDepthMask(b.mDepthMask);
+ rs.nProgramStoreColorMask(b.mColorMaskR,
b.mColorMaskG,
b.mColorMaskB,
b.mColorMaskA);
- rs.nProgramFragmentStoreBlendFunc(b.mBlendSrc.mID, b.mBlendDst.mID);
- rs.nProgramFragmentStoreDither(b.mDither);
+ rs.nProgramStoreBlendFunc(b.mBlendSrc.mID, b.mBlendDst.mID);
+ rs.nProgramStoreDither(b.mDither);
- int id = rs.nProgramFragmentStoreCreate();
+ int id = rs.nProgramStoreCreate();
return new ProgramStore(id, rs);
}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index e9f8fe6..92ac573 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -71,7 +71,7 @@
native void nContextBindRootScript(int script);
native void nContextBindSampler(int sampler, int slot);
- native void nContextBindProgramFragmentStore(int pfs);
+ native void nContextBindProgramStore(int pfs);
native void nContextBindProgramFragment(int pf);
native void nContextBindProgramVertex(int pf);
native void nContextBindProgramRaster(int pr);
@@ -138,7 +138,6 @@
native void nScriptSetClearDepth(int script, float depth);
native void nScriptSetClearStencil(int script, int stencil);
native void nScriptSetTimeZone(int script, byte[] timeZone);
- native void nScriptSetRoot(boolean isRoot);
native void nScriptInvoke(int id, int slot);
native void nScriptInvokeData(int id, int slot);
native void nScriptInvokeV(int id, int slot, byte[] params);
@@ -154,13 +153,13 @@
native void nSamplerSet(int param, int value);
native int nSamplerCreate();
- native void nProgramFragmentStoreBegin(int in, int out);
- native void nProgramFragmentStoreDepthFunc(int func);
- native void nProgramFragmentStoreDepthMask(boolean enable);
- native void nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a);
- native void nProgramFragmentStoreBlendFunc(int src, int dst);
- native void nProgramFragmentStoreDither(boolean enable);
- native int nProgramFragmentStoreCreate();
+ native void nProgramStoreBegin(int in, int out);
+ native void nProgramStoreDepthFunc(int func);
+ native void nProgramStoreDepthMask(boolean enable);
+ native void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a);
+ native void nProgramStoreBlendFunc(int src, int dst);
+ native void nProgramStoreDither(boolean enable);
+ native int nProgramStoreCreate();
native int nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
native void nProgramRasterSetLineWidth(int pr, float v);
diff --git a/graphics/java/android/renderscript/RenderScriptGL.java b/graphics/java/android/renderscript/RenderScriptGL.java
index d1df23d..e90b4fc 100644
--- a/graphics/java/android/renderscript/RenderScriptGL.java
+++ b/graphics/java/android/renderscript/RenderScriptGL.java
@@ -74,9 +74,9 @@
nContextBindRootScript(safeID(s));
}
- public void contextBindProgramFragmentStore(ProgramStore p) {
+ public void contextBindProgramStore(ProgramStore p) {
validate();
- nContextBindProgramFragmentStore(safeID(p));
+ nContextBindProgramStore(safeID(p));
}
public void contextBindProgramFragment(ProgramFragment p) {
diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java
index c1ba000..5959be4 100644
--- a/graphics/java/android/renderscript/ScriptC.java
+++ b/graphics/java/android/renderscript/ScriptC.java
@@ -39,11 +39,11 @@
protected ScriptC(RenderScript rs, Resources resources, int resourceID, boolean isRoot) {
super(0, rs);
- mID = internalCreate(rs, resources, resourceID, isRoot);
+ mID = internalCreate(rs, resources, resourceID);
}
- private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID, boolean isRoot) {
+ private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) {
byte[] pgm;
int pgmLength;
InputStream is = resources.openRawResource(resourceID);
@@ -74,7 +74,6 @@
rs.nScriptCBegin();
rs.nScriptCSetScript(pgm, 0, pgmLength);
- rs.nScriptSetRoot(isRoot);
return rs.nScriptCCreate();
}
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index 62d3867..14422b2 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -108,48 +108,9 @@
super.finalize();
}
- public static Type createFromClass(RenderScript rs, Class c, int size) {
- Element e = Element.createFromClass(rs, c);
- Builder b = new Builder(rs, e);
- b.add(Dimension.X, size);
- Type t = b.create();
- e.destroy();
-
- // native fields
- {
- Field[] fields = c.getFields();
- int[] arTypes = new int[fields.length];
- int[] arBits = new int[fields.length];
-
- for(int ct=0; ct < fields.length; ct++) {
- Field f = fields[ct];
- Class fc = f.getType();
- if(fc == int.class) {
- arTypes[ct] = Element.DataType.SIGNED_32.mID;
- arBits[ct] = 32;
- } else if(fc == short.class) {
- arTypes[ct] = Element.DataType.SIGNED_16.mID;
- arBits[ct] = 16;
- } else if(fc == byte.class) {
- arTypes[ct] = Element.DataType.SIGNED_8.mID;
- arBits[ct] = 8;
- } else if(fc == float.class) {
- arTypes[ct] = Element.DataType.FLOAT_32.mID;
- arBits[ct] = 32;
- } else {
- throw new IllegalArgumentException("Unkown field type");
- }
- }
- rs.nTypeSetupFields(t, arTypes, arBits, fields);
- }
- t.mJavaClass = c;
- return t;
- }
-
public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
- Type t = createFromClass(rs, c, size);
- t.setName(scriptName);
- return t;
+ android.util.Log.e("RenderScript", "Calling depricated createFromClass");
+ return null;
}
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 2a7ad38..7170e5a 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -949,13 +949,6 @@
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
}
-static void
-nScriptSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
- rsScriptSetRoot(con, isRoot);
-}
// -----------------------------------
@@ -1019,83 +1012,63 @@
return (jint)rsScriptCCreate(con);
}
-static void
-nScriptCAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- const char* n = _env->GetStringUTFChars(name, NULL);
- LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value);
- rsScriptCSetDefineI32(con, n, value);
- _env->ReleaseStringUTFChars(name, n);
-}
-
-static void
-nScriptCAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- const char* n = _env->GetStringUTFChars(name, NULL);
- LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value);
- rsScriptCSetDefineF(con, n, value);
- _env->ReleaseStringUTFChars(name, n);
-}
-
// ---------------------------------------------------------------------------
static void
-nProgramFragmentStoreBegin(JNIEnv *_env, jobject _this, jint in, jint out)
+nProgramStoreBegin(JNIEnv *_env, jobject _this, jint in, jint out)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out);
- rsProgramFragmentStoreBegin(con, (RsElement)in, (RsElement)out);
+ LOG_API("nProgramStoreBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out);
+ rsProgramStoreBegin(con, (RsElement)in, (RsElement)out);
}
static void
-nProgramFragmentStoreDepthFunc(JNIEnv *_env, jobject _this, jint func)
+nProgramStoreDepthFunc(JNIEnv *_env, jobject _this, jint func)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreDepthFunc, con(%p), func(%i)", con, func);
- rsProgramFragmentStoreDepthFunc(con, (RsDepthFunc)func);
+ LOG_API("nProgramStoreDepthFunc, con(%p), func(%i)", con, func);
+ rsProgramStoreDepthFunc(con, (RsDepthFunc)func);
}
static void
-nProgramFragmentStoreDepthMask(JNIEnv *_env, jobject _this, jboolean enable)
+nProgramStoreDepthMask(JNIEnv *_env, jobject _this, jboolean enable)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreDepthMask, con(%p), enable(%i)", con, enable);
- rsProgramFragmentStoreDepthMask(con, enable);
+ LOG_API("nProgramStoreDepthMask, con(%p), enable(%i)", con, enable);
+ rsProgramStoreDepthMask(con, enable);
}
static void
-nProgramFragmentStoreColorMask(JNIEnv *_env, jobject _this, jboolean r, jboolean g, jboolean b, jboolean a)
+nProgramStoreColorMask(JNIEnv *_env, jobject _this, jboolean r, jboolean g, jboolean b, jboolean a)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreColorMask, con(%p), r(%i), g(%i), b(%i), a(%i)", con, r, g, b, a);
- rsProgramFragmentStoreColorMask(con, r, g, b, a);
+ LOG_API("nProgramStoreColorMask, con(%p), r(%i), g(%i), b(%i), a(%i)", con, r, g, b, a);
+ rsProgramStoreColorMask(con, r, g, b, a);
}
static void
-nProgramFragmentStoreBlendFunc(JNIEnv *_env, jobject _this, int src, int dst)
+nProgramStoreBlendFunc(JNIEnv *_env, jobject _this, int src, int dst)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreBlendFunc, con(%p), src(%i), dst(%i)", con, src, dst);
- rsProgramFragmentStoreBlendFunc(con, (RsBlendSrcFunc)src, (RsBlendDstFunc)dst);
+ LOG_API("nProgramStoreBlendFunc, con(%p), src(%i), dst(%i)", con, src, dst);
+ rsProgramStoreBlendFunc(con, (RsBlendSrcFunc)src, (RsBlendDstFunc)dst);
}
static void
-nProgramFragmentStoreDither(JNIEnv *_env, jobject _this, jboolean enable)
+nProgramStoreDither(JNIEnv *_env, jobject _this, jboolean enable)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreDither, con(%p), enable(%i)", con, enable);
- rsProgramFragmentStoreDither(con, enable);
+ LOG_API("nProgramStoreDither, con(%p), enable(%i)", con, enable);
+ rsProgramStoreDither(con, enable);
}
static jint
-nProgramFragmentStoreCreate(JNIEnv *_env, jobject _this)
+nProgramStoreCreate(JNIEnv *_env, jobject _this)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentStoreCreate, con(%p)", con);
+ LOG_API("nProgramStoreCreate, con(%p)", con);
- return (jint)rsProgramFragmentStoreCreate(con);
+ return (jint)rsProgramStoreCreate(con);
}
// ---------------------------------------------------------------------------
@@ -1225,11 +1198,11 @@
}
static void
-nContextBindProgramFragmentStore(JNIEnv *_env, jobject _this, jint pfs)
+nContextBindProgramStore(JNIEnv *_env, jobject _this, jint pfs)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nContextBindProgramFragmentStore, con(%p), pfs(%p)", con, (RsProgramFragmentStore)pfs);
- rsContextBindProgramFragmentStore(con, (RsProgramFragmentStore)pfs);
+ LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs);
+ rsContextBindProgramStore(con, (RsProgramStore)pfs);
}
static void
@@ -1441,7 +1414,6 @@
{"nScriptSetClearDepth", "(IF)V", (void*)nScriptSetClearDepth },
{"nScriptSetClearStencil", "(II)V", (void*)nScriptSetClearStencil },
{"nScriptSetTimeZone", "(I[B)V", (void*)nScriptSetTimeZone },
-{"nScriptSetRoot", "(Z)V", (void*)nScriptSetRoot },
{"nScriptInvoke", "(II)V", (void*)nScriptInvoke },
{"nScriptInvokeData", "(II)V", (void*)nScriptInvokeData },
{"nScriptInvokeV", "(II[B)V", (void*)nScriptInvokeV },
@@ -1453,13 +1425,13 @@
{"nScriptCSetScript", "([BII)V", (void*)nScriptCSetScript },
{"nScriptCCreate", "()I", (void*)nScriptCCreate },
-{"nProgramFragmentStoreBegin", "(II)V", (void*)nProgramFragmentStoreBegin },
-{"nProgramFragmentStoreDepthFunc", "(I)V", (void*)nProgramFragmentStoreDepthFunc },
-{"nProgramFragmentStoreDepthMask", "(Z)V", (void*)nProgramFragmentStoreDepthMask },
-{"nProgramFragmentStoreColorMask", "(ZZZZ)V", (void*)nProgramFragmentStoreColorMask },
-{"nProgramFragmentStoreBlendFunc", "(II)V", (void*)nProgramFragmentStoreBlendFunc },
-{"nProgramFragmentStoreDither", "(Z)V", (void*)nProgramFragmentStoreDither },
-{"nProgramFragmentStoreCreate", "()I", (void*)nProgramFragmentStoreCreate },
+{"nProgramStoreBegin", "(II)V", (void*)nProgramStoreBegin },
+{"nProgramStoreDepthFunc", "(I)V", (void*)nProgramStoreDepthFunc },
+{"nProgramStoreDepthMask", "(Z)V", (void*)nProgramStoreDepthMask },
+{"nProgramStoreColorMask", "(ZZZZ)V", (void*)nProgramStoreColorMask },
+{"nProgramStoreBlendFunc", "(II)V", (void*)nProgramStoreBlendFunc },
+{"nProgramStoreDither", "(Z)V", (void*)nProgramStoreDither },
+{"nProgramStoreCreate", "()I", (void*)nProgramStoreCreate },
{"nProgramBindConstants", "(III)V", (void*)nProgramBindConstants },
{"nProgramBindTexture", "(III)V", (void*)nProgramBindTexture },
@@ -1483,7 +1455,7 @@
{"nLightSetPosition", "(IFFF)V", (void*)nLightSetPosition },
{"nContextBindRootScript", "(I)V", (void*)nContextBindRootScript },
-{"nContextBindProgramFragmentStore","(I)V", (void*)nContextBindProgramFragmentStore },
+{"nContextBindProgramStore", "(I)V", (void*)nContextBindProgramStore },
{"nContextBindProgramFragment", "(I)V", (void*)nContextBindProgramFragment },
{"nContextBindProgramVertex", "(I)V", (void*)nContextBindProgramVertex },
{"nContextBindProgramRaster", "(I)V", (void*)nContextBindProgramRaster },
diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h
index 979df9f..20eef72 100644
--- a/include/camera/CameraParameters.h
+++ b/include/camera/CameraParameters.h
@@ -221,9 +221,30 @@
// Example value: "true". Read only.
static const char KEY_SMOOTH_ZOOM_SUPPORTED[];
+ // The distances (in meters) from the camera to where an object appears to
+ // be in focus. The object is sharpest at the optimal focus distance. The
+ // depth of field is the far focus distance minus near focus distance.
+ //
+ // Applications can read this parameter anytime to get the latest focus
+ // distances. If the focus mode is FOCUS_MODE_EDOF, the values may be all
+ // 0, which means focus distance is not applicable. If the focus mode is
+ // FOCUS_MODE_CONTINUOUS and autofocus has started, focus distances may
+ // change from time to time.
+ //
+ // Far focus distance > optimal focus distance > near focus distance. If
+ // the far focus distance is infinity, the value should be "Infinity" (case
+ // sensitive). The format is three float values separated by commas. The
+ // first is near focus distance. The second is optimal focus distance. The
+ // third is far focus distance.
+ // Example value: "0.95,1.9,Infinity" or "0.049,0.05,0.051". Read only.
+ static const char KEY_FOCUS_DISTANCES[];
+
// Value for KEY_ZOOM_SUPPORTED or KEY_SMOOTH_ZOOM_SUPPORTED.
static const char TRUE[];
+ // Value for KEY_FOCUS_DISTANCES.
+ static const char FOCUS_DISTANCE_INFINITY[];
+
// Values for white balance settings.
static const char WHITE_BALANCE_AUTO[];
static const char WHITE_BALANCE_INCANDESCENT[];
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index 14b30ae..cc4ab74 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -398,7 +398,8 @@
int frameCount,
uint32_t flags,
const sp<IMemory>& sharedBuffer,
- audio_io_handle_t output);
+ audio_io_handle_t output,
+ bool enforceFrameCount);
sp<IAudioTrack> mAudioTrack;
sp<IMemory> mCblkMemory;
@@ -420,7 +421,8 @@
callback_t mCbf;
void* mUserData;
- uint32_t mNotificationFrames;
+ uint32_t mNotificationFramesReq; // requested number of frames between each notification callback
+ uint32_t mNotificationFramesAct; // actual number of frames between each notification callback
sp<IMemory> mSharedBuffer;
int mLoopCount;
uint32_t mRemainingFrames;
diff --git a/include/media/mediarecorder.h b/include/media/mediarecorder.h
index 9ea6c7b..eead166 100644
--- a/include/media/mediarecorder.h
+++ b/include/media/mediarecorder.h
@@ -135,7 +135,8 @@
enum media_recorder_info_type {
MEDIA_RECORDER_INFO_UNKNOWN = 1,
MEDIA_RECORDER_INFO_MAX_DURATION_REACHED = 800,
- MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED = 801
+ MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED = 801,
+ MEDIA_RECORDER_INFO_STOP_PREMATURELY = 802
};
// ----------------------------------------------------------------------------
diff --git a/include/media/stagefright/AMRWriter.h b/include/media/stagefright/AMRWriter.h
index 34f3c4a..dd11809 100644
--- a/include/media/stagefright/AMRWriter.h
+++ b/include/media/stagefright/AMRWriter.h
@@ -49,9 +49,13 @@
volatile bool mDone;
volatile bool mReachedEOS;
pthread_t mThread;
+ int64_t mEstimatedSizeBytes;
+ int64_t mEstimatedDurationUs;
static void *ThreadWrapper(void *);
void threadFunc();
+ bool exceedsFileSizeLimit();
+ bool exceedsFileDurationLimit();
AMRWriter(const AMRWriter &);
AMRWriter &operator=(const AMRWriter &);
diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h
index eb00140..2519379 100644
--- a/include/media/stagefright/AudioSource.h
+++ b/include/media/stagefright/AudioSource.h
@@ -46,7 +46,7 @@
virtual ~AudioSource();
private:
- enum { kMaxBufferSize = 8192 };
+ enum { kMaxBufferSize = 2048 };
AudioRecord *mRecord;
status_t mInitCheck;
diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h
index 3afa598..42d6634 100644
--- a/include/media/stagefright/CameraSource.h
+++ b/include/media/stagefright/CameraSource.h
@@ -28,7 +28,6 @@
class ICamera;
class IMemory;
-class ISurface;
class Camera;
class CameraSource : public MediaSource {
@@ -38,8 +37,6 @@
virtual ~CameraSource();
- void setPreviewSurface(const sp<ISurface> &surface);
-
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
@@ -52,7 +49,6 @@
friend class CameraSourceListener;
sp<Camera> mCamera;
- sp<ISurface> mPreviewSurface;
Mutex mLock;
Condition mFrameAvailableCondition;
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index 6064fc4..3c85eca 100644
--- a/include/media/stagefright/MPEG4Writer.h
+++ b/include/media/stagefright/MPEG4Writer.h
@@ -68,12 +68,16 @@
bool mStreamableFile;
off_t mEstimatedMoovBoxSize;
uint32_t mInterleaveDurationUs;
+ int64_t mStartTimestampUs;
Mutex mLock;
List<Track *> mTracks;
List<off_t> mBoxes;
+ void setStartTimestamp(int64_t timeUs);
+ int64_t getStartTimestamp(); // Not const
+
void lock();
void unlock();
@@ -82,6 +86,8 @@
off_t addLengthPrefixedSample_l(MediaBuffer *buffer);
inline size_t write(const void *ptr, size_t size, size_t nmemb, FILE* stream);
+ bool exceedsFileSizeLimit();
+ bool exceedsFileDurationLimit();
MPEG4Writer(const MPEG4Writer &);
MPEG4Writer &operator=(const MPEG4Writer &);
diff --git a/include/media/stagefright/MediaWriter.h b/include/media/stagefright/MediaWriter.h
index b8232c6..b15f69c 100644
--- a/include/media/stagefright/MediaWriter.h
+++ b/include/media/stagefright/MediaWriter.h
@@ -19,6 +19,7 @@
#define MEDIA_WRITER_H_
#include <utils/RefBase.h>
+#include <media/IMediaPlayerClient.h>
namespace android {
@@ -31,10 +32,23 @@
virtual bool reachedEOS() = 0;
virtual status_t start() = 0;
virtual void stop() = 0;
+ virtual void setMaxFileSize(int64_t bytes) { mMaxFileSizeLimitBytes = bytes; }
+ virtual void setMaxFileDuration(int64_t durationUs) { mMaxFileDurationLimitUs = durationUs; }
+ virtual void setListener(const sp<IMediaPlayerClient>& listener) {
+ mListener = listener;
+ }
protected:
virtual ~MediaWriter() {}
+ int64_t mMaxFileSizeLimitBytes;
+ int64_t mMaxFileDurationLimitUs;
+ sp<IMediaPlayerClient> mListener;
+ void notify(int msg, int ext1, int ext2) {
+ if (mListener != NULL) {
+ mListener->notify(msg, ext1, ext2);
+ }
+ }
private:
MediaWriter(const MediaWriter &);
MediaWriter &operator=(const MediaWriter &);
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 1d76a1a..f836c55 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -156,8 +156,8 @@
void setComponentRole();
- void setAMRFormat(bool isWAMR);
- void setAACFormat(int32_t numChannels, int32_t sampleRate);
+ void setAMRFormat(bool isWAMR, int32_t bitRate);
+ void setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate);
status_t setVideoPortFormatType(
OMX_U32 portIndex,
diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h
index 8e2db20..cd47fdf 100644
--- a/include/private/media/AudioTrackShared.h
+++ b/include/private/media/AudioTrackShared.h
@@ -32,6 +32,18 @@
#define MAX_RUN_TIMEOUT_MS 1000
#define WAIT_PERIOD_MS 10
+#define CBLK_UNDERRUN_MSK 0x0001
+#define CBLK_UNDERRUN_ON 0x0001 // underrun (out) or overrrun (in) indication
+#define CBLK_UNDERRUN_OFF 0x0000 // no underrun
+#define CBLK_DIRECTION_MSK 0x0002
+#define CBLK_DIRECTION_OUT 0x0002 // this cblk is for an AudioTrack
+#define CBLK_DIRECTION_IN 0x0000 // this cblk is for an AudioRecord
+#define CBLK_FORCEREADY_MSK 0x0004
+#define CBLK_FORCEREADY_ON 0x0004 // track is considered ready immediately by AudioFlinger
+#define CBLK_FORCEREADY_OFF 0x0000 // track is ready when buffer full
+#define CBLK_INVALID_MSK 0x0008
+#define CBLK_INVALID_ON 0x0008 // track buffer is invalidated by AudioFlinger: must be re-created
+#define CBLK_INVALID_OFF 0x0000
struct audio_track_cblk_t
{
@@ -44,12 +56,12 @@
volatile uint32_t server;
uint32_t userBase;
uint32_t serverBase;
- void* buffers;
- uint32_t frameCount;
- // Cache line boundary
- uint32_t loopStart;
- uint32_t loopEnd;
- int loopCount;
+ void* buffers;
+ uint32_t frameCount;
+ // Cache line boundary
+ uint32_t loopStart;
+ uint32_t loopEnd;
+ int loopCount;
volatile union {
uint16_t volume[2];
uint32_t volumeLR;
@@ -58,15 +70,16 @@
// NOTE: audio_track_cblk_t::frameSize is not equal to AudioTrack::frameSize() for
// 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
- uint32_t frameSize;
- uint8_t channels;
- uint8_t flowControlFlag; // underrun (out) or overrrun (in) indication
- uint8_t out; // out equals 1 for AudioTrack and 0 for AudioRecord
- uint8_t forceReady;
+
+ uint8_t frameSize;
+ uint8_t channelCount;
+ uint16_t flags;
+
uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger
uint16_t waitTimeMs; // Cumulated wait time
- // Cache line boundary (32 bytes)
+ uint32_t reserved;
+ // Cache line boundary (32 bytes)
audio_track_cblk_t();
uint32_t stepUser(uint32_t frameCount);
bool stepServer(uint32_t frameCount);
diff --git a/include/private/surfaceflinger/SharedBufferStack.h b/include/private/surfaceflinger/SharedBufferStack.h
index c23832d..a1a02e0 100644
--- a/include/private/surfaceflinger/SharedBufferStack.h
+++ b/include/private/surfaceflinger/SharedBufferStack.h
@@ -295,7 +295,8 @@
friend class BufferList;
uint32_t mask, curr;
const_iterator(uint32_t mask) :
- mask(mask), curr(31 - __builtin_clz(mask)) { }
+ mask(mask), curr(__builtin_clz(mask)) {
+ }
public:
inline bool operator == (const const_iterator& rhs) const {
return mask == rhs.mask;
@@ -304,9 +305,9 @@
return mask != rhs.mask;
}
inline int operator *() const { return curr; }
- inline const const_iterator& operator ++(int) {
- mask &= ~curr;
- curr = 31 - __builtin_clz(mask);
+ inline const const_iterator& operator ++() {
+ mask &= ~(1<<(31-curr));
+ curr = __builtin_clz(mask);
return *this;
}
};
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 06443ef..3b38d83 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -783,7 +783,7 @@
AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, int id)
: Thread(false),
mAudioFlinger(audioFlinger), mSampleRate(0), mFrameCount(0), mChannelCount(0),
- mFormat(0), mFrameSize(1), mStandby(false), mId(id), mExiting(false)
+ mFrameSize(1), mFormat(0), mStandby(false), mId(id), mExiting(false)
{
}
@@ -816,7 +816,7 @@
int AudioFlinger::ThreadBase::channelCount() const
{
- return mChannelCount;
+ return (int)mChannelCount;
}
int AudioFlinger::ThreadBase::format() const
@@ -873,11 +873,12 @@
LOGV("processConfigEvents() remaining events %d", mConfigEvents.size());
ConfigEvent *configEvent = mConfigEvents[0];
mConfigEvents.removeAt(0);
- // release mLock because audioConfigChanged() will lock AudioFlinger mLock
- // before calling Audioflinger::audioConfigChanged_l() thus creating
- // potential cross deadlock between AudioFlinger::mLock and mLock
+ // release mLock before locking AudioFlinger mLock: lock order is always
+ // AudioFlinger then ThreadBase to avoid cross deadlock
mLock.unlock();
- audioConfigChanged(configEvent->mEvent, configEvent->mParam);
+ mAudioFlinger->mLock.lock();
+ audioConfigChanged_l(configEvent->mEvent, configEvent->mParam);
+ mAudioFlinger->mLock.unlock();
delete configEvent;
mLock.lock();
}
@@ -953,8 +954,6 @@
mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream);
mStreamTypes[stream].mute = mAudioFlinger->streamMute(stream);
}
- // notify client processes that a new input has been opened
- sendConfigEvent(AudioSystem::OUTPUT_OPENED);
}
AudioFlinger::PlaybackThread::~PlaybackThread()
@@ -1064,7 +1063,7 @@
status_t lStatus;
if (mType == DIRECT) {
- if (sampleRate != mSampleRate || format != mFormat || channelCount != mChannelCount) {
+ if (sampleRate != mSampleRate || format != mFormat || channelCount != (int)mChannelCount) {
LOGE("createTrack_l() Bad parameter: sampleRate %d format %d, channelCount %d for output %p",
sampleRate, format, channelCount, mOutput);
lStatus = BAD_VALUE;
@@ -1234,16 +1233,17 @@
return mOutput->getParameters(keys);
}
-void AudioFlinger::PlaybackThread::audioConfigChanged(int event, int param) {
+// destroyTrack_l() must be called with AudioFlinger::mLock held
+void AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) {
AudioSystem::OutputDescriptor desc;
void *param2 = 0;
- LOGV("PlaybackThread::audioConfigChanged, thread %p, event %d, param %d", this, event, param);
+ LOGV("PlaybackThread::audioConfigChanged_l, thread %p, event %d, param %d", this, event, param);
switch (event) {
case AudioSystem::OUTPUT_OPENED:
case AudioSystem::OUTPUT_CONFIG_CHANGED:
- desc.channels = mChannelCount;
+ desc.channels = mChannels;
desc.samplingRate = mSampleRate;
desc.format = mFormat;
desc.frameCount = mFrameCount;
@@ -1257,17 +1257,16 @@
default:
break;
}
- Mutex::Autolock _l(mAudioFlinger->mLock);
mAudioFlinger->audioConfigChanged_l(event, mId, param2);
}
void AudioFlinger::PlaybackThread::readOutputParameters()
{
mSampleRate = mOutput->sampleRate();
- mChannelCount = AudioSystem::popCount(mOutput->channels());
-
+ mChannels = mOutput->channels();
+ mChannelCount = (uint16_t)AudioSystem::popCount(mChannels);
mFormat = mOutput->format();
- mFrameSize = mOutput->frameSize();
+ mFrameSize = (uint16_t)mOutput->frameSize();
mFrameCount = mOutput->bufferSize() / mFrameSize;
// FIXME - Current mixer implementation only supports stereo output: Always
@@ -1614,66 +1613,22 @@
return mixerStatus;
}
-void AudioFlinger::MixerThread::getTracks(
- SortedVector < sp<Track> >& tracks,
- SortedVector < wp<Track> >& activeTracks,
- int streamType)
+void AudioFlinger::MixerThread::invalidateTracks(int streamType)
{
- LOGV ("MixerThread::getTracks() mixer %p, mTracks.size %d, mActiveTracks.size %d", this, mTracks.size(), mActiveTracks.size());
+ LOGV ("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d", this, streamType, mTracks.size());
Mutex::Autolock _l(mLock);
size_t size = mTracks.size();
for (size_t i = 0; i < size; i++) {
sp<Track> t = mTracks[i];
if (t->type() == streamType) {
- tracks.add(t);
- int j = mActiveTracks.indexOf(t);
- if (j >= 0) {
- t = mActiveTracks[j].promote();
- if (t != NULL) {
- activeTracks.add(t);
+ t->mCblk->lock.lock();
+ t->mCblk->flags |= CBLK_INVALID_ON;
+ t->mCblk->cv.signal();
+ t->mCblk->lock.unlock();
}
}
}
- }
- size = activeTracks.size();
- for (size_t i = 0; i < size; i++) {
- mActiveTracks.remove(activeTracks[i]);
- }
-
- size = tracks.size();
- for (size_t i = 0; i < size; i++) {
- sp<Track> t = tracks[i];
- mTracks.remove(t);
- deleteTrackName_l(t->name());
- }
-}
-
-void AudioFlinger::MixerThread::putTracks(
- SortedVector < sp<Track> >& tracks,
- SortedVector < wp<Track> >& activeTracks)
-{
- LOGV ("MixerThread::putTracks() mixer %p, tracks.size %d, activeTracks.size %d", this, tracks.size(), activeTracks.size());
- Mutex::Autolock _l(mLock);
- size_t size = tracks.size();
- for (size_t i = 0; i < size ; i++) {
- sp<Track> t = tracks[i];
- int name = getTrackName_l();
-
- if (name < 0) return;
-
- t->mName = name;
- t->mThread = this;
- mTracks.add(t);
-
- int j = activeTracks.indexOf(t);
- if (j >= 0) {
- mActiveTracks.add(t);
- // force buffer refilling and no ramp volume when the track is mixed for the first time
- t->mFillingUpStatus = Track::FS_FILLING;
- }
- }
-}
// getTrackName_l() must be called with ThreadBase::mLock held
int AudioFlinger::MixerThread::getTrackName_l()
@@ -2342,13 +2297,13 @@
// clear all buffers
mCblk->frameCount = frameCount;
mCblk->sampleRate = sampleRate;
- mCblk->channels = (uint8_t)channelCount;
+ mCblk->channelCount = (uint8_t)channelCount;
if (sharedBuffer == 0) {
mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t));
// Force underrun condition to avoid false underrun callback until first data is
// written to buffer
- mCblk->flowControlFlag = 1;
+ mCblk->flags = CBLK_UNDERRUN_ON;
} else {
mBuffer = sharedBuffer->pointer();
}
@@ -2366,12 +2321,12 @@
// clear all buffers
mCblk->frameCount = frameCount;
mCblk->sampleRate = sampleRate;
- mCblk->channels = (uint8_t)channelCount;
+ mCblk->channelCount = (uint8_t)channelCount;
mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t));
// Force underrun condition to avoid false underrun callback until first data is
// written to buffer
- mCblk->flowControlFlag = 1;
+ mCblk->flags = CBLK_UNDERRUN_ON;
mBufferEnd = (uint8_t *)mBuffer + bufferSize;
}
}
@@ -2433,7 +2388,7 @@
}
int AudioFlinger::ThreadBase::TrackBase::channelCount() const {
- return (int)mCblk->channels;
+ return (int)mCblk->channelCount;
}
void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t frames) const {
@@ -2445,9 +2400,9 @@
if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||
((unsigned long)bufferStart & (unsigned long)(cblk->frameSize - 1))) {
LOGE("TrackBase::getBuffer buffer out of range:\n start: %p, end %p , mBuffer %p mBufferEnd %p\n \
- server %d, serverBase %d, user %d, userBase %d, channels %d",
+ server %d, serverBase %d, user %d, userBase %d, channelCount %d",
bufferStart, bufferEnd, mBuffer, mBufferEnd,
- cblk->server, cblk->serverBase, cblk->user, cblk->userBase, cblk->channels);
+ cblk->server, cblk->serverBase, cblk->user, cblk->userBase, cblk->channelCount);
return 0;
}
@@ -2532,7 +2487,7 @@
(mClient == NULL) ? getpid() : mClient->pid(),
mStreamType,
mFormat,
- mCblk->channels,
+ mCblk->channelCount,
mFrameCount,
mState,
mMute,
@@ -2589,9 +2544,9 @@
if (mFillingUpStatus != FS_FILLING) return true;
if (mCblk->framesReady() >= mCblk->frameCount ||
- mCblk->forceReady) {
+ (mCblk->flags & CBLK_FORCEREADY_MSK)) {
mFillingUpStatus = FS_FILLED;
- mCblk->forceReady = 0;
+ mCblk->flags &= ~CBLK_FORCEREADY_MSK;
return true;
}
return false;
@@ -2706,8 +2661,8 @@
TrackBase::reset();
// Force underrun condition to avoid false underrun callback until first data is
// written to buffer
- mCblk->flowControlFlag = 1;
- mCblk->forceReady = 0;
+ mCblk->flags |= CBLK_UNDERRUN_ON;
+ mCblk->flags &= ~CBLK_FORCEREADY_MSK;
mFillingUpStatus = FS_FILLING;
mResetDone = true;
}
@@ -2818,7 +2773,7 @@
TrackBase::reset();
// Force overerrun condition to avoid false overrun callback until first data is
// read from buffer
- mCblk->flowControlFlag = 1;
+ mCblk->flags |= CBLK_UNDERRUN_ON;
}
}
@@ -2827,7 +2782,7 @@
snprintf(buffer, size, " %05d %03u %03u %04u %01d %05u %08x %08x\n",
(mClient == NULL) ? getpid() : mClient->pid(),
mFormat,
- mCblk->channels,
+ mCblk->channelCount,
mFrameCount,
mState,
mCblk->sampleRate,
@@ -2851,13 +2806,13 @@
PlaybackThread *playbackThread = (PlaybackThread *)thread.unsafe_get();
if (mCblk != NULL) {
- mCblk->out = 1;
+ mCblk->flags |= CBLK_DIRECTION_OUT;
mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
mCblk->volume[0] = mCblk->volume[1] = 0x1000;
mOutBuffer.frameCount = 0;
playbackThread->mTracks.add(this);
- LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channels %d mBufferEnd %p",
- mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channels, mBufferEnd);
+ LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channelCount %d mBufferEnd %p",
+ mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channelCount, mBufferEnd);
} else {
LOGW("Error creating output track on thread %p", playbackThread);
}
@@ -2892,7 +2847,7 @@
{
Buffer *pInBuffer;
Buffer inBuffer;
- uint32_t channels = mCblk->channels;
+ uint32_t channelCount = mCblk->channelCount;
bool outputBufferFull = false;
inBuffer.frameCount = frames;
inBuffer.i16 = data;
@@ -2908,10 +2863,10 @@
if (mBufferQueue.size() < kMaxOverFlowBuffers) {
uint32_t startFrames = (mCblk->frameCount - frames);
pInBuffer = new Buffer;
- pInBuffer->mBuffer = new int16_t[startFrames * channels];
+ pInBuffer->mBuffer = new int16_t[startFrames * channelCount];
pInBuffer->frameCount = startFrames;
pInBuffer->i16 = pInBuffer->mBuffer;
- memset(pInBuffer->raw, 0, startFrames * channels * sizeof(int16_t));
+ memset(pInBuffer->raw, 0, startFrames * channelCount * sizeof(int16_t));
mBufferQueue.add(pInBuffer);
} else {
LOGW ("OutputTrack::write() %p no more buffers in queue", this);
@@ -2949,12 +2904,12 @@
}
uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount : pInBuffer->frameCount;
- memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * channels * sizeof(int16_t));
+ memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * channelCount * sizeof(int16_t));
mCblk->stepUser(outFrames);
pInBuffer->frameCount -= outFrames;
- pInBuffer->i16 += outFrames * channels;
+ pInBuffer->i16 += outFrames * channelCount;
mOutBuffer.frameCount -= outFrames;
- mOutBuffer.i16 += outFrames * channels;
+ mOutBuffer.i16 += outFrames * channelCount;
if (pInBuffer->frameCount == 0) {
if (mBufferQueue.size()) {
@@ -2974,10 +2929,10 @@
if (thread != 0 && !thread->standby()) {
if (mBufferQueue.size() < kMaxOverFlowBuffers) {
pInBuffer = new Buffer;
- pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channels];
+ pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channelCount];
pInBuffer->frameCount = inBuffer.frameCount;
pInBuffer->i16 = pInBuffer->mBuffer;
- memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channels * sizeof(int16_t));
+ memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channelCount * sizeof(int16_t));
mBufferQueue.add(pInBuffer);
LOGV("OutputTrack::write() %p thread %p adding overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
} else {
@@ -2993,10 +2948,10 @@
if (mCblk->user < mCblk->frameCount) {
frames = mCblk->frameCount - mCblk->user;
pInBuffer = new Buffer;
- pInBuffer->mBuffer = new int16_t[frames * channels];
+ pInBuffer->mBuffer = new int16_t[frames * channelCount];
pInBuffer->frameCount = frames;
pInBuffer->i16 = pInBuffer->mBuffer;
- memset(pInBuffer->raw, 0, frames * channels * sizeof(int16_t));
+ memset(pInBuffer->raw, 0, frames * channelCount * sizeof(int16_t));
mBufferQueue.add(pInBuffer);
} else if (mActive) {
stop();
@@ -3274,7 +3229,6 @@
mReqChannelCount = AudioSystem::popCount(channels);
mReqSampleRate = sampleRate;
readInputParameters();
- sendConfigEvent(AudioSystem::INPUT_OPENED);
}
@@ -3371,7 +3325,7 @@
framesIn = framesOut;
mRsmpInIndex += framesIn;
framesOut -= framesIn;
- if (mChannelCount == mReqChannelCount ||
+ if ((int)mChannelCount == mReqChannelCount ||
mFormat != AudioSystem::PCM_16_BIT) {
memcpy(dst, src, framesIn * mFrameSize);
} else {
@@ -3392,7 +3346,7 @@
}
if (framesOut && mFrameCount == mRsmpInIndex) {
if (framesOut == mFrameCount &&
- (mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) {
+ ((int)mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) {
mBytesRead = mInput->read(buffer.raw, mInputBytes);
framesOut = 0;
} else {
@@ -3689,14 +3643,14 @@
return mInput->getParameters(keys);
}
-void AudioFlinger::RecordThread::audioConfigChanged(int event, int param) {
+void AudioFlinger::RecordThread::audioConfigChanged_l(int event, int param) {
AudioSystem::OutputDescriptor desc;
void *param2 = 0;
switch (event) {
case AudioSystem::INPUT_OPENED:
case AudioSystem::INPUT_CONFIG_CHANGED:
- desc.channels = mChannelCount;
+ desc.channels = mChannels;
desc.samplingRate = mSampleRate;
desc.format = mFormat;
desc.frameCount = mFrameCount;
@@ -3708,7 +3662,6 @@
default:
break;
}
- Mutex::Autolock _l(mAudioFlinger->mLock);
mAudioFlinger->audioConfigChanged_l(event, mId, param2);
}
@@ -3720,9 +3673,10 @@
mResampler = 0;
mSampleRate = mInput->sampleRate();
- mChannelCount = AudioSystem::popCount(mInput->channels());
+ mChannels = mInput->channels();
+ mChannelCount = (uint16_t)AudioSystem::popCount(mChannels);
mFormat = mInput->format();
- mFrameSize = mInput->frameSize();
+ mFrameSize = (uint16_t)mInput->frameSize();
mInputBytes = mInput->bufferSize();
mFrameCount = mInputBytes / mFrameSize;
mRsmpInBuffer = new int16_t[mFrameCount * mChannelCount];
@@ -3827,6 +3781,8 @@
if (pChannels) *pChannels = channels;
if (pLatencyMs) *pLatencyMs = thread->latency();
+ // notify client processes of the new output creation
+ thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
return mNextThreadId;
}
@@ -3848,6 +3804,8 @@
DuplicatingThread *thread = new DuplicatingThread(this, thread1, ++mNextThreadId);
thread->addOutputTrack(thread2);
mPlaybackThreads.add(mNextThreadId, thread);
+ // notify client processes of the new output creation
+ thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
return mNextThreadId;
}
@@ -3977,6 +3935,8 @@
input->standby();
+ // notify client processes of the new input creation
+ thread->audioConfigChanged_l(AudioSystem::INPUT_OPENED);
return mNextThreadId;
}
@@ -4017,22 +3977,16 @@
}
LOGV("setStreamOutput() stream %d to output %d", stream, output);
+ audioConfigChanged_l(AudioSystem::STREAM_CONFIG_CHANGED, output, &stream);
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
if (thread != dstThread &&
thread->type() != PlaybackThread::DIRECT) {
MixerThread *srcThread = (MixerThread *)thread;
- SortedVector < sp<MixerThread::Track> > tracks;
- SortedVector < wp<MixerThread::Track> > activeTracks;
- srcThread->getTracks(tracks, activeTracks, stream);
- if (tracks.size()) {
- dstThread->putTracks(tracks, activeTracks);
+ srcThread->invalidateTracks(stream);
}
}
- }
-
- dstThread->sendConfigEvent(AudioSystem::STREAM_CONFIG_CHANGED, stream);
return NO_ERROR;
}
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 13aac8b..f35f38b 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -342,7 +342,7 @@
virtual bool checkForNewParameters_l() = 0;
virtual status_t setParameters(const String8& keyValuePairs);
virtual String8 getParameters(const String8& keys) = 0;
- virtual void audioConfigChanged(int event, int param = 0) = 0;
+ virtual void audioConfigChanged_l(int event, int param = 0) = 0;
void sendConfigEvent(int event, int param = 0);
void sendConfigEvent_l(int event, int param = 0);
void processConfigEvents();
@@ -366,9 +366,10 @@
sp<AudioFlinger> mAudioFlinger;
uint32_t mSampleRate;
size_t mFrameCount;
- int mChannelCount;
+ uint32_t mChannels;
+ uint16_t mChannelCount;
+ uint16_t mFrameSize;
int mFormat;
- uint32_t mFrameSize;
Condition mParamCond;
Vector<String8> mNewParameters;
status_t mParamStatus;
@@ -546,7 +547,7 @@
void restore() { if (mSuspended) mSuspended--; }
bool isSuspended() { return (mSuspended != 0); }
virtual String8 getParameters(const String8& keys);
- virtual void audioConfigChanged(int event, int param = 0);
+ virtual void audioConfigChanged_l(int event, int param = 0);
virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
struct stream_type_t {
@@ -612,11 +613,7 @@
// Thread virtuals
virtual bool threadLoop();
- void getTracks(SortedVector < sp<Track> >& tracks,
- SortedVector < wp<Track> >& activeTracks,
- int streamType);
- void putTracks(SortedVector < sp<Track> >& tracks,
- SortedVector < wp<Track> >& activeTracks);
+ void invalidateTracks(int streamType);
virtual bool checkForNewParameters_l();
virtual status_t dumpInternals(int fd, const Vector<String16>& args);
@@ -763,7 +760,7 @@
virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
virtual bool checkForNewParameters_l();
virtual String8 getParameters(const String8& keys);
- virtual void audioConfigChanged(int event, int param = 0);
+ virtual void audioConfigChanged_l(int event, int param = 0);
void readInputParameters();
virtual unsigned int getInputFramesLost();
diff --git a/libs/audioflinger/AudioPolicyManagerBase.cpp b/libs/audioflinger/AudioPolicyManagerBase.cpp
index c8b3f48..381a958 100644
--- a/libs/audioflinger/AudioPolicyManagerBase.cpp
+++ b/libs/audioflinger/AudioPolicyManagerBase.cpp
@@ -1249,6 +1249,17 @@
LOGV("setDeviceConnectionState() closing A2DP and duplicated output!");
if (mDuplicatedOutput != 0) {
+ AudioOutputDescriptor *dupOutputDesc = mOutputs.valueFor(mDuplicatedOutput);
+ AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput);
+ // As all active tracks on duplicated output will be deleted,
+ // and as they were also referenced on hardware output, the reference
+ // count for their stream type must be adjusted accordingly on
+ // hardware output.
+ for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
+ int refCount = dupOutputDesc->mRefCount[i];
+ hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,-refCount);
+ }
+
mpClientInterface->closeOutput(mDuplicatedOutput);
delete mOutputs.valueFor(mDuplicatedOutput);
mOutputs.removeItem(mDuplicatedOutput);
@@ -1288,11 +1299,6 @@
for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
if (getStrategy((AudioSystem::stream_type)i) == strategy) {
mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput);
- int refCount = a2dpOutputDesc->mRefCount[i];
- // in the case of duplicated output, the ref count is first incremented
- // and then decremented on hardware output tus keeping its value
- hwOutputDesc->changeRefCount((AudioSystem::stream_type)i, refCount);
- a2dpOutputDesc->changeRefCount((AudioSystem::stream_type)i,-refCount);
}
}
// do not change newDevice if it was already set before this call by a previous call to
@@ -1318,11 +1324,6 @@
for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) {
if (getStrategy((AudioSystem::stream_type)i) == strategy) {
mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, a2dpOutput);
- int refCount = hwOutputDesc->mRefCount[i];
- // in the case of duplicated output, the ref count is first incremented
- // and then decremented on hardware output tus keeping its value
- a2dpOutputDesc->changeRefCount((AudioSystem::stream_type)i, refCount);
- hwOutputDesc->changeRefCount((AudioSystem::stream_type)i,-refCount);
}
}
}
diff --git a/libs/camera/Camera.cpp b/libs/camera/Camera.cpp
index 3346b1f..2fbddd5 100644
--- a/libs/camera/Camera.cpp
+++ b/libs/camera/Camera.cpp
@@ -92,7 +92,12 @@
Camera::~Camera()
{
- disconnect();
+ // We don't need to call disconnect() here because if the CameraService
+ // thinks we are the owner of the hardware, it will hold a (strong)
+ // reference to us, and we can't possibly be here. We also don't want to
+ // call disconnect() here if we are in the same process as mediaserver,
+ // because we may be invoked by CameraService::Client::connect() and will
+ // deadlock if we call any method of ICamera here.
}
int32_t Camera::getNumberOfCameras()
diff --git a/libs/camera/CameraParameters.cpp b/libs/camera/CameraParameters.cpp
index cfb7ba1..7b4c7f6 100644
--- a/libs/camera/CameraParameters.cpp
+++ b/libs/camera/CameraParameters.cpp
@@ -69,8 +69,10 @@
const char CameraParameters::KEY_ZOOM_RATIOS[] = "zoom-ratios";
const char CameraParameters::KEY_ZOOM_SUPPORTED[] = "zoom-supported";
const char CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED[] = "smooth-zoom-supported";
+const char CameraParameters::KEY_FOCUS_DISTANCES[] = "focus-distances";
const char CameraParameters::TRUE[] = "true";
+const char CameraParameters::FOCUS_DISTANCE_INFINITY[] = "Infinity";
// Values for white balance settings.
const char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
index 95571e7..c1910ff 100644
--- a/libs/rs/Android.mk
+++ b/libs/rs/Android.mk
@@ -91,13 +91,15 @@
rsNoise.cpp \
rsProgram.cpp \
rsProgramFragment.cpp \
- rsProgramFragmentStore.cpp \
+ rsProgramStore.cpp \
rsProgramRaster.cpp \
rsProgramVertex.cpp \
rsSampler.cpp \
rsScript.cpp \
rsScriptC.cpp \
rsScriptC_Lib.cpp \
+ rsScriptC_LibCL.cpp \
+ rsScriptC_LibGL.cpp \
rsShaderCache.cpp \
rsSignal.cpp \
rsSimpleMesh.cpp \
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 7415ba9..5e246ce 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -44,7 +44,7 @@
typedef void * RsProgram;
typedef void * RsProgramVertex;
typedef void * RsProgramFragment;
-typedef void * RsProgramFragmentStore;
+typedef void * RsProgramStore;
typedef void * RsProgramRaster;
typedef void (* RsBitmapCallback_t)(void *);
diff --git a/libs/rs/RenderScriptEnv.h b/libs/rs/RenderScriptEnv.h
index 99b8c04..144e539 100644
--- a/libs/rs/RenderScriptEnv.h
+++ b/libs/rs/RenderScriptEnv.h
@@ -12,7 +12,7 @@
typedef void * RsSimpleMesh;
typedef void * RsType;
typedef void * RsProgramFragment;
-typedef void * RsProgramFragmentStore;
+typedef void * RsProgramStore;
typedef void * RsLight;
diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java
index f45684c..e26b051 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmRS.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java
@@ -213,11 +213,10 @@
Log.e("rs", "Done loading named");
- mStripPositionType = Type.createFromClass(mRS, StripPosition.class, 1);
+ //mStripPositionType = Type.createFromClass(mRS, StripPosition.class, 1);
ScriptC.Builder sb = new ScriptC.Builder(mRS);
sb.setScript(mRes, R.raw.filmstrip);
- //sb.setRoot(true);
//sb.setType(mStripPositionType, "Pos", 1);
mScriptStrip = sb.create();
mScriptStrip.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index a589d5b..4ad25ae 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -4,8 +4,8 @@
param RsScript sampler
}
-ContextBindProgramFragmentStore {
- param RsProgramFragmentStore pgm
+ContextBindProgramStore {
+ param RsProgramStore pgm
}
ContextBindProgramFragment {
@@ -293,10 +293,6 @@
togglePlay
}
-ScriptSetRoot {
- param bool isRoot
- }
-
ScriptSetVarI {
param RsScript s
param uint32_t slot
@@ -332,47 +328,38 @@
ret RsScript
}
-ScriptCSetDefineF {
- param const char* name
- param float value
- }
-ScriptCSetDefineI32 {
- param const char* name
- param int32_t value
- }
-
-ProgramFragmentStoreBegin {
+ProgramStoreBegin {
param RsElement in
param RsElement out
}
-ProgramFragmentStoreColorMask {
+ProgramStoreColorMask {
param bool r
param bool g
param bool b
param bool a
}
-ProgramFragmentStoreBlendFunc {
+ProgramStoreBlendFunc {
param RsBlendSrcFunc srcFunc
param RsBlendDstFunc destFunc
}
-ProgramFragmentStoreDepthMask {
+ProgramStoreDepthMask {
param bool enable
}
-ProgramFragmentStoreDither {
+ProgramStoreDither {
param bool enable
}
-ProgramFragmentStoreDepthFunc {
+ProgramStoreDepthFunc {
param RsDepthFunc func
}
-ProgramFragmentStoreCreate {
- ret RsProgramFragmentStore
+ProgramStoreCreate {
+ ret RsProgramStore
}
ProgramRasterCreate {
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 017500b..da85f83 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -111,6 +111,9 @@
LOGE("eglCreateContext returned EGL_NO_CONTEXT");
}
gGLContextCount++;
+
+ eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth);
+ eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
}
void Context::deinitEGL()
@@ -131,7 +134,7 @@
{
ObjectBaseRef<ProgramFragment> frag(mFragment);
ObjectBaseRef<ProgramVertex> vtx(mVertex);
- ObjectBaseRef<ProgramFragmentStore> store(mFragmentStore);
+ ObjectBaseRef<ProgramStore> store(mFragmentStore);
ObjectBaseRef<ProgramRaster> raster(mRaster);
uint32_t ret = s->run(this, launchID);
@@ -155,11 +158,8 @@
{
timerSet(RS_TIMER_CLEAR_SWAP);
- eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth);
- eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
- glViewport(0, 0, mEGL.mWidth, mEGL.mHeight);
+ glViewport(0, 0, mWidth, mHeight);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-
glClearColor(mRootScript->mEnviroment.mClearColor[0],
mRootScript->mEnviroment.mClearColor[1],
mRootScript->mEnviroment.mClearColor[2],
@@ -299,13 +299,13 @@
}
if (rsc->mIsGraphicsContext) {
- rsc->mStateRaster.init(rsc, rsc->mEGL.mWidth, rsc->mEGL.mHeight);
+ rsc->mStateRaster.init(rsc);
rsc->setRaster(NULL);
- rsc->mStateVertex.init(rsc, rsc->mEGL.mWidth, rsc->mEGL.mHeight);
+ rsc->mStateVertex.init(rsc);
rsc->setVertex(NULL);
- rsc->mStateFragment.init(rsc, rsc->mEGL.mWidth, rsc->mEGL.mHeight);
+ rsc->mStateFragment.init(rsc);
rsc->setFragment(NULL);
- rsc->mStateFragmentStore.init(rsc, rsc->mEGL.mWidth, rsc->mEGL.mHeight);
+ rsc->mStateFragmentStore.init(rsc);
rsc->setFragmentStore(NULL);
rsc->mStateVertexArray.init(rsc);
}
@@ -493,6 +493,8 @@
mWndSurface = sur;
if (mWndSurface != NULL) {
+ mWidth = w;
+ mHeight = h;
bool first = false;
if (!mEGL.mContext) {
first = true;
@@ -510,11 +512,7 @@
ret = eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext);
checkEglError("eglMakeCurrent", ret);
- eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth);
- eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
- mWidth = w;
- mHeight = h;
- mStateVertex.updateSize(this, w, h);
+ mStateVertex.updateSize(this);
if ((int)mWidth != mEGL.mWidth || (int)mHeight != mEGL.mHeight) {
LOGE("EGL/Surface mismatch EGL (%i x %i) SF (%i x %i)", mEGL.mWidth, mEGL.mHeight, mWidth, mHeight);
@@ -582,7 +580,7 @@
mRootScript.set(s);
}
-void Context::setFragmentStore(ProgramFragmentStore *pfs)
+void Context::setFragmentStore(ProgramStore *pfs)
{
rsAssert(mIsGraphicsContext);
if (pfs == NULL) {
@@ -806,9 +804,9 @@
s->bindToContext(&rsc->mStateSampler, slot);
}
-void rsi_ContextBindProgramFragmentStore(Context *rsc, RsProgramFragmentStore vpfs)
+void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs)
{
- ProgramFragmentStore *pfs = static_cast<ProgramFragmentStore *>(vpfs);
+ ProgramStore *pfs = static_cast<ProgramStore *>(vpfs);
rsc->setFragmentStore(pfs);
}
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 8249f5b..4a6072d60 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -33,7 +33,7 @@
#include "rsSampler.h"
#include "rsLight.h"
#include "rsProgramFragment.h"
-#include "rsProgramFragmentStore.h"
+#include "rsProgramStore.h"
#include "rsProgramRaster.h"
#include "rsProgramVertex.h"
#include "rsShaderCache.h"
@@ -71,7 +71,7 @@
TypeState mStateType;
SamplerState mStateSampler;
ProgramFragmentState mStateFragment;
- ProgramFragmentStoreState mStateFragmentStore;
+ ProgramStoreState mStateFragmentStore;
ProgramRasterState mStateRaster;
ProgramVertexState mStateVertex;
LightState mStateLight;
@@ -85,12 +85,12 @@
void setRaster(ProgramRaster *);
void setVertex(ProgramVertex *);
void setFragment(ProgramFragment *);
- void setFragmentStore(ProgramFragmentStore *);
+ void setFragmentStore(ProgramStore *);
void updateSurface(void *sur);
const ProgramFragment * getFragment() {return mFragment.get();}
- const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();}
+ const ProgramStore * getFragmentStore() {return mFragmentStore.get();}
const ProgramRaster * getRaster() {return mRaster.get();}
const ProgramVertex * getVertex() {return mVertex.get();}
@@ -118,15 +118,15 @@
ProgramVertex * getDefaultProgramVertex() const {
return mStateVertex.mDefault.get();
}
- ProgramFragmentStore * getDefaultProgramFragmentStore() const {
+ ProgramStore * getDefaultProgramStore() const {
return mStateFragmentStore.mDefault.get();
}
ProgramRaster * getDefaultProgramRaster() const {
return mStateRaster.mDefault.get();
}
- uint32_t getWidth() const {return mEGL.mWidth;}
- uint32_t getHeight() const {return mEGL.mHeight;}
+ uint32_t getWidth() const {return mWidth;}
+ uint32_t getHeight() const {return mHeight;}
ThreadIO mIO;
@@ -221,7 +221,7 @@
ObjectBaseRef<Script> mRootScript;
ObjectBaseRef<ProgramFragment> mFragment;
ObjectBaseRef<ProgramVertex> mVertex;
- ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
+ ObjectBaseRef<ProgramStore> mFragmentStore;
ObjectBaseRef<ProgramRaster> mRaster;
diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp
index 478a6dc..70e2868 100644
--- a/libs/rs/rsProgram.cpp
+++ b/libs/rs/rsProgram.cpp
@@ -195,7 +195,7 @@
if (rsc->props.mLogShaders) {
LOGV("Loading shader type %x, ID %i", type, mShaderID);
- LOGV(mShader.string());
+ LOGV("%s", mShader.string());
}
if (mShaderID) {
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index d192195..c3fd5c5 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -300,7 +300,7 @@
}
-void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
+void ProgramFragmentState::init(Context *rsc)
{
uint32_t tmp[5] = {
RS_TEX_ENV_MODE_NONE, 0,
@@ -328,7 +328,7 @@
{
ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
pf->incUserRef();
- LOGE("rsi_ProgramFragmentCreate %p", pf);
+ //LOGE("rsi_ProgramFragmentCreate %p", pf);
return pf;
}
@@ -338,7 +338,7 @@
{
ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
pf->incUserRef();
- LOGE("rsi_ProgramFragmentCreate2 %p", pf);
+ //LOGE("rsi_ProgramFragmentCreate2 %p", pf);
return pf;
}
diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h
index 9fa565d..db91524 100644
--- a/libs/rs/rsProgramFragment.h
+++ b/libs/rs/rsProgramFragment.h
@@ -57,7 +57,7 @@
~ProgramFragmentState();
ProgramFragment *mPF;
- void init(Context *rsc, int32_t w, int32_t h);
+ void init(Context *rsc);
void deinit(Context *rsc);
ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
index 13887d1..c095635 100644
--- a/libs/rs/rsProgramRaster.cpp
+++ b/libs/rs/rsProgramRaster.cpp
@@ -102,7 +102,7 @@
{
}
-void ProgramRasterState::init(Context *rsc, int32_t w, int32_t h)
+void ProgramRasterState::init(Context *rsc)
{
ProgramRaster *pr = new ProgramRaster(rsc, false, false, false);
mDefault.set(pr);
diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h
index c3a9c90..04eaaa8 100644
--- a/libs/rs/rsProgramRaster.h
+++ b/libs/rs/rsProgramRaster.h
@@ -56,7 +56,7 @@
public:
ProgramRasterState();
~ProgramRasterState();
- void init(Context *rsc, int32_t w, int32_t h);
+ void init(Context *rsc);
void deinit(Context *rsc);
ObjectBaseRef<ProgramRaster> mDefault;
diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramStore.cpp
similarity index 78%
rename from libs/rs/rsProgramFragmentStore.cpp
rename to libs/rs/rsProgramStore.cpp
index 8a2157f..ff70509 100644
--- a/libs/rs/rsProgramFragmentStore.cpp
+++ b/libs/rs/rsProgramStore.cpp
@@ -15,7 +15,7 @@
*/
#include "rsContext.h"
-#include "rsProgramFragmentStore.h"
+#include "rsProgramStore.h"
#include <GLES/gl.h>
#include <GLES/glext.h>
@@ -24,7 +24,7 @@
using namespace android::renderscript;
-ProgramFragmentStore::ProgramFragmentStore(Context *rsc) :
+ProgramStore::ProgramStore(Context *rsc) :
Program(rsc)
{
mAllocFile = __FILE__;
@@ -46,11 +46,11 @@
}
-ProgramFragmentStore::~ProgramFragmentStore()
+ProgramStore::~ProgramStore()
{
}
-void ProgramFragmentStore::setupGL(const Context *rsc, ProgramFragmentStoreState *state)
+void ProgramStore::setupGL(const Context *rsc, ProgramStoreState *state)
{
if (state->mLast.get() == this) {
return;
@@ -85,7 +85,7 @@
}
}
-void ProgramFragmentStore::setupGL2(const Context *rsc, ProgramFragmentStoreState *state)
+void ProgramStore::setupGL2(const Context *rsc, ProgramStoreState *state)
{
if (state->mLast.get() == this) {
return;
@@ -121,12 +121,12 @@
}
-void ProgramFragmentStore::setDitherEnable(bool enable)
+void ProgramStore::setDitherEnable(bool enable)
{
mDitherEnable = enable;
}
-void ProgramFragmentStore::setDepthFunc(RsDepthFunc func)
+void ProgramStore::setDepthFunc(RsDepthFunc func)
{
mDepthTestEnable = true;
@@ -156,12 +156,12 @@
}
}
-void ProgramFragmentStore::setDepthMask(bool mask)
+void ProgramStore::setDepthMask(bool mask)
{
mDepthWriteEnable = mask;
}
-void ProgramFragmentStore::setBlendFunc(RsBlendSrcFunc src, RsBlendDstFunc dst)
+void ProgramStore::setBlendFunc(RsBlendSrcFunc src, RsBlendDstFunc dst)
{
mBlendEnable = true;
if ((src == RS_BLEND_SRC_ONE) &&
@@ -227,7 +227,7 @@
}
}
-void ProgramFragmentStore::setColorMask(bool r, bool g, bool b, bool a)
+void ProgramStore::setColorMask(bool r, bool g, bool b, bool a)
{
mColorRWriteEnable = r;
mColorGWriteEnable = g;
@@ -236,24 +236,24 @@
}
-ProgramFragmentStoreState::ProgramFragmentStoreState()
+ProgramStoreState::ProgramStoreState()
{
mPFS = NULL;
}
-ProgramFragmentStoreState::~ProgramFragmentStoreState()
+ProgramStoreState::~ProgramStoreState()
{
delete mPFS;
}
-void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h)
+void ProgramStoreState::init(Context *rsc)
{
- ProgramFragmentStore *pfs = new ProgramFragmentStore(rsc);
+ ProgramStore *pfs = new ProgramStore(rsc);
mDefault.set(pfs);
}
-void ProgramFragmentStoreState::deinit(Context *rsc)
+void ProgramStoreState::deinit(Context *rsc)
{
mDefault.clear();
mLast.clear();
@@ -263,42 +263,42 @@
namespace android {
namespace renderscript {
-void rsi_ProgramFragmentStoreBegin(Context * rsc, RsElement in, RsElement out)
+void rsi_ProgramStoreBegin(Context * rsc, RsElement in, RsElement out)
{
delete rsc->mStateFragmentStore.mPFS;
- rsc->mStateFragmentStore.mPFS = new ProgramFragmentStore(rsc);
+ rsc->mStateFragmentStore.mPFS = new ProgramStore(rsc);
}
-void rsi_ProgramFragmentStoreDepthFunc(Context *rsc, RsDepthFunc func)
+void rsi_ProgramStoreDepthFunc(Context *rsc, RsDepthFunc func)
{
rsc->mStateFragmentStore.mPFS->setDepthFunc(func);
}
-void rsi_ProgramFragmentStoreDepthMask(Context *rsc, bool mask)
+void rsi_ProgramStoreDepthMask(Context *rsc, bool mask)
{
rsc->mStateFragmentStore.mPFS->setDepthMask(mask);
}
-void rsi_ProgramFragmentStoreColorMask(Context *rsc, bool r, bool g, bool b, bool a)
+void rsi_ProgramStoreColorMask(Context *rsc, bool r, bool g, bool b, bool a)
{
rsc->mStateFragmentStore.mPFS->setColorMask(r, g, b, a);
}
-void rsi_ProgramFragmentStoreBlendFunc(Context *rsc, RsBlendSrcFunc src, RsBlendDstFunc dst)
+void rsi_ProgramStoreBlendFunc(Context *rsc, RsBlendSrcFunc src, RsBlendDstFunc dst)
{
rsc->mStateFragmentStore.mPFS->setBlendFunc(src, dst);
}
-RsProgramFragmentStore rsi_ProgramFragmentStoreCreate(Context *rsc)
+RsProgramStore rsi_ProgramStoreCreate(Context *rsc)
{
- ProgramFragmentStore *pfs = rsc->mStateFragmentStore.mPFS;
+ ProgramStore *pfs = rsc->mStateFragmentStore.mPFS;
pfs->incUserRef();
rsc->mStateFragmentStore.mPFS = 0;
return pfs;
}
-void rsi_ProgramFragmentStoreDither(Context *rsc, bool enable)
+void rsi_ProgramStoreDither(Context *rsc, bool enable)
{
rsc->mStateFragmentStore.mPFS->setDitherEnable(enable);
}
diff --git a/libs/rs/rsProgramFragmentStore.h b/libs/rs/rsProgramStore.h
similarity index 71%
rename from libs/rs/rsProgramFragmentStore.h
rename to libs/rs/rsProgramStore.h
index 3412c99..d686aa8 100644
--- a/libs/rs/rsProgramFragmentStore.h
+++ b/libs/rs/rsProgramStore.h
@@ -23,16 +23,16 @@
namespace android {
namespace renderscript {
-class ProgramFragmentStoreState;
+class ProgramStoreState;
-class ProgramFragmentStore : public Program
+class ProgramStore : public Program
{
public:
- ProgramFragmentStore(Context *);
- virtual ~ProgramFragmentStore();
+ ProgramStore(Context *);
+ virtual ~ProgramStore();
- virtual void setupGL(const Context *, ProgramFragmentStoreState *);
- virtual void setupGL2(const Context *, ProgramFragmentStoreState *);
+ virtual void setupGL(const Context *, ProgramStoreState *);
+ virtual void setupGL2(const Context *, ProgramStoreState *);
void setDepthFunc(RsDepthFunc);
void setDepthMask(bool);
@@ -60,19 +60,19 @@
bool mStencilTestEnable;
};
-class ProgramFragmentStoreState
+class ProgramStoreState
{
public:
- ProgramFragmentStoreState();
- ~ProgramFragmentStoreState();
- void init(Context *rsc, int32_t w, int32_t h);
+ ProgramStoreState();
+ ~ProgramStoreState();
+ void init(Context *rsc);
void deinit(Context *rsc);
- ObjectBaseRef<ProgramFragmentStore> mDefault;
- ObjectBaseRef<ProgramFragmentStore> mLast;
+ ObjectBaseRef<ProgramStore> mDefault;
+ ObjectBaseRef<ProgramStore> mLast;
- ProgramFragmentStore *mPFS;
+ ProgramStore *mPFS;
};
diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
index a2b2df4..c3264aed 100644
--- a/libs/rs/rsProgramVertex.cpp
+++ b/libs/rs/rsProgramVertex.cpp
@@ -362,7 +362,7 @@
{
}
-void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h)
+void ProgramVertexState::init(Context *rsc)
{
RsElement e = (RsElement) Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1);
@@ -382,13 +382,13 @@
color[2] = 1.f;
color[3] = 1.f;
- updateSize(rsc, w, h);
+ updateSize(rsc);
}
-void ProgramVertexState::updateSize(Context *rsc, int32_t w, int32_t h)
+void ProgramVertexState::updateSize(Context *rsc)
{
Matrix m;
- m.loadOrtho(0,w, h,0, -1,1);
+ m.loadOrtho(0,rsc->getWidth(), rsc->getHeight(),0, -1,1);
mDefaultAlloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4);
m.loadIdentity();
diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h
index 28554cc..bdac978 100644
--- a/libs/rs/rsProgramVertex.h
+++ b/libs/rs/rsProgramVertex.h
@@ -71,9 +71,9 @@
ProgramVertexState();
~ProgramVertexState();
- void init(Context *rsc, int32_t w, int32_t h);
+ void init(Context *rsc);
void deinit(Context *rsc);
- void updateSize(Context *rsc, int32_t w, int32_t h);
+ void updateSize(Context *rsc);
ObjectBaseRef<ProgramVertex> mDefault;
ObjectBaseRef<ProgramVertex> mLast;
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 1c63c11..b0bbb22 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -97,12 +97,6 @@
LOGE("rsi_ScriptSetType");
}
-void rsi_ScriptSetInvoke(Context *rsc, const char *name, uint32_t slot)
-{
- LOGE("rsi_ScriptSetInvoke");
-}
-
-
void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
{
//LOGE("rsi_ScriptInvoke %i", slot);
@@ -145,7 +139,7 @@
}
s->setupScript();
- LOGE("rsi_ScriptInvokeV, len=%i", len);
+ //LOGE("rsi_ScriptInvokeV, len=%i", len);
const uint32_t * dPtr = (const uint32_t *)data;
switch(len) {
case 0:
@@ -177,11 +171,6 @@
}
-void rsi_ScriptSetRoot(Context * rsc, bool isRoot)
-{
- LOGE("rsi_ScriptSetRoot");
-}
-
void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value)
{
Script *s = static_cast<Script *>(vs);
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index f05269a..c2fe8ef 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/rsScript.h
@@ -27,7 +27,7 @@
class ProgramVertex;
class ProgramFragment;
class ProgramRaster;
-class ProgramFragmentStore;
+class ProgramStore;
#define MAX_SCRIPT_BANKS 32
@@ -50,7 +50,7 @@
ObjectBaseRef<ProgramVertex> mVertex;
ObjectBaseRef<ProgramFragment> mFragment;
ObjectBaseRef<ProgramRaster> mRaster;
- ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
+ ObjectBaseRef<ProgramStore> mFragmentStore;
uint32_t mInvokeFunctionCount;
InvokeFunc_t *mInvokeFunctions;
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 45c3052..1cf8f97 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -71,6 +71,22 @@
}
}
+const Allocation *ScriptC::ptrToAllocation(const void *ptr) const
+{
+ if (!ptr) {
+ return NULL;
+ }
+ for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) {
+ if (!mSlots[ct].get())
+ continue;
+ if (mSlots[ct]->getPtr() == ptr) {
+ return mSlots[ct].get();
+ }
+ }
+ LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
+ return NULL;
+}
+
uint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
{
@@ -136,7 +152,16 @@
static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
{
- const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
+ const ScriptCState::SymbolTable_t *sym;
+ sym = ScriptCState::lookupSymbol(name);
+ if (sym) {
+ return sym->mPtr;
+ }
+ sym = ScriptCState::lookupSymbolCL(name);
+ if (sym) {
+ return sym->mPtr;
+ }
+ sym = ScriptCState::lookupSymbolGL(name);
if (sym) {
return sym->mPtr;
}
@@ -151,9 +176,7 @@
s->mBccScript = bccCreateScript();
bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength);
bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL);
- LOGE("ScriptCState::runCompiler 3");
bccCompileScript(s->mBccScript);
- LOGE("ScriptCState::runCompiler 4");
bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot);
bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit);
LOGE("root %p, init %p", s->mProgram.mRoot, s->mProgram.mInit);
@@ -183,7 +206,7 @@
s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
- s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
+ s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore());
s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
if (s->mProgram.mRoot) {
@@ -193,6 +216,7 @@
bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]);
for (int ct=0; ct < pragmaCount; ct+=2) {
+ //LOGE("pragme %s %s", str[ct], str[ct+1]);
if (!strcmp(str[ct], "version")) {
continue;
}
@@ -298,16 +322,6 @@
return s;
}
-void rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
-{
- LOGE("Error rsi_ScriptCSetDefineF");
-}
-
-void rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
-{
- LOGE("Error rsi_ScriptCSetDefineI");
-}
-
}
}
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index c23fb73..1aab08c 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -52,6 +52,8 @@
BCCscript* mBccScript;
+ const Allocation *ptrToAllocation(const void *) const;
+
virtual void setupScript();
virtual uint32_t run(Context *, uint32_t launchID);
};
@@ -76,8 +78,10 @@
const char * mName;
void * mPtr;
};
- static SymbolTable_t gSyms[];
+ //static SymbolTable_t gSyms[];
static const SymbolTable_t * lookupSymbol(const char *);
+ static const SymbolTable_t * lookupSymbolCL(const char *);
+ static const SymbolTable_t * lookupSymbolGL(const char *);
};
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 5cf0fdb..f976676 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -22,13 +22,6 @@
#include "acc/acc.h"
#include "utils/Timers.h"
-#define GL_GLEXT_PROTOTYPES
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
#include <time.h>
using namespace android;
@@ -40,153 +33,6 @@
ScriptC * sc = (ScriptC *) tls->mScript
-static float SC_acospi(float v) {
- return acosf(v)/ M_PI;
-}
-
-static float SC_asinpi(float v) {
- return asinf(v) / M_PI;
-}
-
-static float SC_atanpi(float v) {
- return atanf(v) / M_PI;
-}
-
-static float SC_atan2pi(float y, float x) {
- return atan2f(y, x) / M_PI;
-}
-
-static float SC_cospi(float v) {
- return cosf(v * M_PI);
-}
-
-static float SC_exp10(float v) {
- return pow(10.f, v);
-
-}
-
-static float SC_fract(float v, int *iptr) {
- int i = (int)floor(v);
- iptr[0] = i;
- return fmin(v - i, 0x1.fffffep-1f);
-}
-
-static float SC_log2(float v) {
- return log10(v) / log10(2.f);
-}
-
-static float SC_pown(float v, int p) {
- return powf(v, (float)p);
-}
-
-static float SC_powr(float v, float p) {
- return powf(v, p);
-}
-
-float SC_rootn(float v, int r) {
- return pow(v, 1.f / r);
-}
-
-float SC_rsqrt(float v) {
- return 1.f / sqrtf(v);
-}
-
-float SC_sincos(float v, float *cosptr) {
- *cosptr = cosf(v);
- return sinf(v);
-}
-
-static float SC_sinpi(float v) {
- return sinf(v * M_PI);
-}
-
-static float SC_tanpi(float v) {
- return tanf(v * M_PI);
-}
-
- //{ "logb", (void *)& },
- //{ "mad", (void *)& },
- //{ "nan", (void *)& },
- //{ "tgamma", (void *)& },
-
-//////////////////////////////////////////////////////////////////////////////
-// Integer
-//////////////////////////////////////////////////////////////////////////////
-
-
-static uint32_t SC_abs_i32(int32_t v) {return abs(v);}
-static uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);}
-static uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);}
-
-static uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);}
-static uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);}
-static uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);}
-static int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);}
-static int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);}
-static int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);}
-
-static uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);}
-static uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);}
-static uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);}
-static int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);}
-static int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);}
-static int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);}
-
-static uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);}
-static uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);}
-static uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);}
-static int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);}
-static int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);}
-static int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);}
-
-//////////////////////////////////////////////////////////////////////////////
-// Float util
-//////////////////////////////////////////////////////////////////////////////
-
-static float SC_clamp_f32(float amount, float low, float high)
-{
- return amount < low ? low : (amount > high ? high : amount);
-}
-
-static float SC_degrees(float radians)
-{
- return radians * (180.f / M_PI);
-}
-
-static float SC_max_f32(float v, float v2)
-{
- return rsMax(v, v2);
-}
-
-static float SC_min_f32(float v, float v2)
-{
- return rsMin(v, v2);
-}
-
-static float SC_mix_f32(float start, float stop, float amount)
-{
- //LOGE("lerpf %f %f %f", start, stop, amount);
- return start + (stop - start) * amount;
-}
-
-static float SC_radians(float degrees)
-{
- return degrees * (M_PI / 180.f);
-}
-
-static float SC_step_f32(float edge, float v)
-{
- if (v < edge) return 0.f;
- return 1.f;
-}
-
-static float SC_sign_f32(float value)
-{
- if (value > 0) return 1.f;
- if (value < 0) return -1.f;
- return value;
-}
-
//////////////////////////////////////////////////////////////////////////////
@@ -211,23 +57,6 @@
float y;
} vec2_t;
-//////////////////////////////////////////////////////////////////////////////
-// IO routines
-//////////////////////////////////////////////////////////////////////////////
-
-static float* SC_loadSimpleMeshVerticesF(RsSimpleMesh mesh, uint32_t idx)
-{
- SimpleMesh *tm = static_cast<SimpleMesh *>(mesh);
- void *vp = tm->mVertexBuffers[idx]->getPtr();;
- return static_cast<float *>(vp);
-}
-
-static void SC_updateSimpleMesh(RsSimpleMesh mesh)
-{
- GET_TLS();
- SimpleMesh *sm = static_cast<SimpleMesh *>(mesh);
- sm->uploadAll(rsc);
-}
//////////////////////////////////////////////////////////////////////////////
// Vec3 routines
@@ -620,255 +449,6 @@
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Context
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
-{
- GET_TLS();
- rsi_ProgramBindTexture(rsc,
- static_cast<ProgramFragment *>(vpf),
- slot,
- static_cast<Allocation *>(va));
-
-}
-
-static void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
-{
- GET_TLS();
- rsi_ProgramBindSampler(rsc,
- static_cast<ProgramFragment *>(vpf),
- slot,
- static_cast<Sampler *>(vs));
-
-}
-
-static void SC_bindProgramFragmentStore(RsProgramFragmentStore pfs)
-{
- GET_TLS();
- rsi_ContextBindProgramFragmentStore(rsc, pfs);
-}
-
-static void SC_bindProgramFragment(RsProgramFragment pf)
-{
- GET_TLS();
- rsi_ContextBindProgramFragment(rsc, pf);
-}
-
-static void SC_bindProgramVertex(RsProgramVertex pv)
-{
- GET_TLS();
- rsi_ContextBindProgramVertex(rsc, pv);
-}
-
-static void SC_bindProgramRaster(RsProgramRaster pv)
-{
- GET_TLS();
- rsi_ContextBindProgramRaster(rsc, pv);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// VP
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_vpLoadModelMatrix(const rsc_Matrix *m)
-{
- GET_TLS();
- rsc->getVertex()->setModelviewMatrix(m);
-}
-
-static void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
-{
- GET_TLS();
- rsc->getVertex()->setTextureMatrix(m);
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Drawing
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_drawLine(float x1, float y1, float z1,
- float x2, float y2, float z2)
-{
- GET_TLS();
- if (!rsc->setupCheck()) {
- return;
- }
-
- float vtx[] = { x1, y1, z1, x2, y2, z2 };
- VertexArray va;
- va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
- if (rsc->checkVersion2_0()) {
- va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
- } else {
- va.setupGL(rsc, &rsc->mStateVertexArray);
- }
-
- glDrawArrays(GL_LINES, 0, 2);
-}
-
-static void SC_drawPoint(float x, float y, float z)
-{
- GET_TLS();
- if (!rsc->setupCheck()) {
- return;
- }
-
- float vtx[] = { x, y, z };
-
- VertexArray va;
- va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
- if (rsc->checkVersion2_0()) {
- va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
- } else {
- va.setupGL(rsc, &rsc->mStateVertexArray);
- }
-
- glDrawArrays(GL_POINTS, 0, 1);
-}
-
-static void SC_drawQuadTexCoords(float x1, float y1, float z1,
- float u1, float v1,
- float x2, float y2, float z2,
- float u2, float v2,
- float x3, float y3, float z3,
- float u3, float v3,
- float x4, float y4, float z4,
- float u4, float v4)
-{
- GET_TLS();
- if (!rsc->setupCheck()) {
- return;
- }
-
- //LOGE("Quad");
- //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
- //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
- //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
- //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
-
- float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
- const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
-
- VertexArray va;
- va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
- va.addLegacy(GL_FLOAT, 2, 8, RS_KIND_TEXTURE, false, (uint32_t)tex);
- if (rsc->checkVersion2_0()) {
- va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
- } else {
- va.setupGL(rsc, &rsc->mStateVertexArray);
- }
-
-
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-static void SC_drawQuad(float x1, float y1, float z1,
- float x2, float y2, float z2,
- float x3, float y3, float z3,
- float x4, float y4, float z4)
-{
- SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
- x2, y2, z2, 1, 1,
- x3, y3, z3, 1, 0,
- x4, y4, z4, 0, 0);
-}
-
-static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
-{
- GET_TLS();
- ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
- rsc->setVertex(rsc->getDefaultProgramVertex());
- //rsc->setupCheck();
-
- //GLint crop[4] = {0, h, w, -h};
-
- float sh = rsc->getHeight();
-
- SC_drawQuad(x, sh - y, z,
- x+w, sh - y, z,
- x+w, sh - (y+h), z,
- x, sh - (y+h), z);
- rsc->setVertex((ProgramVertex *)tmp.get());
-}
-
-static void SC_drawSpriteScreenspaceCropped(float x, float y, float z, float w, float h,
- float cx0, float cy0, float cx1, float cy1)
-{
- GET_TLS();
- if (!rsc->setupCheck()) {
- return;
- }
-
- GLint crop[4] = {cx0, cy0, cx1, cy1};
- glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
- glDrawTexfOES(x, y, z, w, h);
-}
-
-static void SC_drawSprite(float x, float y, float z, float w, float h)
-{
- GET_TLS();
- float vin[3] = {x, y, z};
- float vout[4];
-
- //LOGE("ds in %f %f %f", x, y, z);
- rsc->getVertex()->transformToScreen(rsc, vout, vin);
- //LOGE("ds out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
- vout[0] /= vout[3];
- vout[1] /= vout[3];
- vout[2] /= vout[3];
-
- vout[0] *= rsc->getWidth() / 2;
- vout[1] *= rsc->getHeight() / 2;
- vout[0] += rsc->getWidth() / 2;
- vout[1] += rsc->getHeight() / 2;
-
- vout[0] -= w/2;
- vout[1] -= h/2;
-
- //LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]);
-
- // U, V, W, H
- SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
- //rsc->setupCheck();
-}
-
-
-static void SC_drawRect(float x1, float y1,
- float x2, float y2, float z)
-{
- //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
- SC_drawQuad(x1, y2, z,
- x2, y2, z,
- x2, y1, z,
- x1, y1, z);
-}
-
-static void SC_drawSimpleMesh(RsSimpleMesh vsm)
-{
- GET_TLS();
- SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
- if (!rsc->setupCheck()) {
- return;
- }
- sm->render(rsc);
-}
-
-static void SC_drawSimpleMeshRange(RsSimpleMesh vsm, uint32_t start, uint32_t len)
-{
- GET_TLS();
- SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
- if (!rsc->setupCheck()) {
- return;
- }
- sm->renderRange(rsc, start, len);
-}
-
-
//////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////
@@ -911,131 +491,6 @@
}
-static void SC_color(float r, float g, float b, float a)
-{
- GET_TLS();
- rsc->mStateVertex.color[0] = r;
- rsc->mStateVertex.color[1] = g;
- rsc->mStateVertex.color[2] = b;
- rsc->mStateVertex.color[3] = a;
- if (!rsc->checkVersion2_0()) {
- glColor4f(r, g, b, a);
- }
-}
-
-static void SC_pointAttenuation(float a, float b, float c)
-{
- GLfloat params[] = { a, b, c };
- glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, params);
-}
-
-static void SC_hsbToRgb(float h, float s, float b, float* rgb)
-{
- float red = 0.0f;
- float green = 0.0f;
- float blue = 0.0f;
-
- float x = h;
- float y = s;
- float z = b;
-
- float hf = (x - (int) x) * 6.0f;
- int ihf = (int) hf;
- float f = hf - ihf;
- float pv = z * (1.0f - y);
- float qv = z * (1.0f - y * f);
- float tv = z * (1.0f - y * (1.0f - f));
-
- switch (ihf) {
- case 0: // Red is the dominant color
- red = z;
- green = tv;
- blue = pv;
- break;
- case 1: // Green is the dominant color
- red = qv;
- green = z;
- blue = pv;
- break;
- case 2:
- red = pv;
- green = z;
- blue = tv;
- break;
- case 3: // Blue is the dominant color
- red = pv;
- green = qv;
- blue = z;
- break;
- case 4:
- red = tv;
- green = pv;
- blue = z;
- break;
- case 5: // Red is the dominant color
- red = z;
- green = pv;
- blue = qv;
- break;
- }
-
- rgb[0] = red;
- rgb[1] = green;
- rgb[2] = blue;
-}
-
-static int SC_hsbToAbgr(float h, float s, float b, float a)
-{
- //LOGE("hsb a %f, %f, %f %f", h, s, b, a);
- float rgb[3];
- SC_hsbToRgb(h, s, b, rgb);
- //LOGE("rgb %f, %f, %f ", rgb[0], rgb[1], rgb[2]);
- return int(a * 255.0f) << 24 |
- int(rgb[2] * 255.0f) << 16 |
- int(rgb[1] * 255.0f) << 8 |
- int(rgb[0] * 255.0f);
-}
-
-static void SC_hsb(float h, float s, float b, float a)
-{
- GET_TLS();
- float rgb[3];
- SC_hsbToRgb(h, s, b, rgb);
- if (rsc->checkVersion2_0()) {
- glVertexAttrib4f(1, rgb[0], rgb[1], rgb[2], a);
- } else {
- glColor4f(rgb[0], rgb[1], rgb[2], a);
- }
-}
-
-static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
-{
- GET_TLS();
- rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
-}
-
-static void SC_uploadToBufferObject(RsAllocation va)
-{
- GET_TLS();
- rsi_AllocationUploadToBufferObject(rsc, va);
-}
-
-static void SC_syncToGL(RsAllocation va)
-{
- GET_TLS();
- Allocation *a = static_cast<Allocation *>(va);
-
-}
-
-static void SC_ClearColor(float r, float g, float b, float a)
-{
- //LOGE("c %f %f %f %f", r, g, b, a);
- GET_TLS();
- sc->mEnviroment.mClearColor[0] = r;
- sc->mEnviroment.mClearColor[1] = g;
- sc->mEnviroment.mClearColor[2] = b;
- sc->mEnviroment.mClearColor[3] = a;
-}
static void SC_debugF(const char *s, float f)
{
@@ -1057,18 +512,6 @@
LOGE("%s 0x%x", s, i);
}
-static uint32_t SC_getWidth()
-{
- GET_TLS();
- return rsc->getWidth();
-}
-
-static uint32_t SC_getHeight()
-{
- GET_TLS();
- return rsc->getHeight();
-}
-
static uchar4 SC_convertColorTo8888_f3(float r, float g, float b) {
uchar4 t;
t.f[0] = (uint8_t)(r * 255.f);
@@ -1120,6 +563,14 @@
return a / b;
}
+int SC_getAllocation(const void *ptr)
+{
+ GET_TLS();
+ const Allocation *alloc = sc->ptrToAllocation(ptr);
+ return (int)alloc;
+}
+
+
//////////////////////////////////////////////////////////////////////////////
// Class implementation
//////////////////////////////////////////////////////////////////////////////
@@ -1141,115 +592,9 @@
// ::= f # float
// ::= d # double
-ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
+static ScriptCState::SymbolTable_t gSyms[] = {
{ "__divsi3", (void *)&SC_divsi3 },
- // IO
- { "loadSimpleMeshVerticesF", (void *)&SC_loadSimpleMeshVerticesF },
- { "updateSimpleMesh", (void *)&SC_updateSimpleMesh },
-
- // OpenCL math
- { "_Z4acosf", (void *)&acosf },
- { "_Z5acoshf", (void *)&acoshf },
- { "_Z6acospif", (void *)&SC_acospi },
- { "_Z4asinf", (void *)&asinf },
- { "_Z5asinhf", (void *)&asinhf },
- { "_Z6asinpif", (void *)&SC_asinpi },
- { "_Z4atanf", (void *)&atanf },
- { "_Z5atan2f", (void *)&atan2f },
- { "_Z6atanpif", (void *)&SC_atanpi },
- { "_Z7atan2pif", (void *)&SC_atan2pi },
- { "_Z4cbrtf", (void *)&cbrtf },
- { "_Z4ceilf", (void *)&ceilf },
- { "_Z8copysignff", (void *)©signf },
- { "_Z3cosf", (void *)&cosf },
- { "_Z4coshf", (void *)&coshf },
- { "_Z5cospif", (void *)&SC_cospi },
- { "_Z4erfcf", (void *)&erfcf },
- { "_Z3erff", (void *)&erff },
- { "_Z3expf", (void *)&expf },
- { "_Z4exp2f", (void *)&exp2f },
- { "_Z5exp10f", (void *)&SC_exp10 },
- { "_Z5expm1f", (void *)&expm1f },
- { "_Z4fabsf", (void *)&fabsf },
- { "_Z4fdimff", (void *)&fdimf },
- { "_Z5floorf", (void *)&floorf },
- { "_Z3fmafff", (void *)&fmaf },
- { "_Z4fmaxff", (void *)&fmaxf },
- { "_Z4fminff", (void *)&fminf }, // float fmin(float, float)
- { "_Z4fmodff", (void *)&fmodf },
- { "_Z5fractfPf", (void *)&SC_fract },
- { "_Z5frexpfPi", (void *)&frexpf },
- { "_Z5hypotff", (void *)&hypotf },
- { "_Z5ilogbf", (void *)&ilogbf },
- { "_Z5ldexpfi", (void *)&ldexpf },
- { "_Z6lgammaf", (void *)&lgammaf },
- { "_Z3logf", (void *)&logf },
- { "_Z4log2f", (void *)&SC_log2 },
- { "_Z5log10f", (void *)&log10f },
- { "_Z5log1pf", (void *)&log1pf },
- //{ "logb", (void *)& },
- //{ "mad", (void *)& },
- { "modf", (void *)&modff },
- //{ "nan", (void *)& },
- { "_Z9nextafterff", (void *)&nextafterf },
- { "_Z3powff", (void *)&powf },
- { "_Z4pownfi", (void *)&SC_pown },
- { "_Z4powrff", (void *)&SC_powr },
- { "_Z9remainderff", (void *)&remainderf },
- { "remquo", (void *)&remquof },
- { "_Z4rintf", (void *)&rintf },
- { "_Z5rootnfi", (void *)&SC_rootn },
- { "_Z5roundf", (void *)&roundf },
- { "_Z5rsqrtf", (void *)&SC_rsqrt },
- { "_Z3sinf", (void *)&sinf },
- { "sincos", (void *)&SC_sincos },
- { "_Z4sinhf", (void *)&sinhf },
- { "_Z5sinpif", (void *)&SC_sinpi },
- { "_Z4sqrtf", (void *)&sqrtf },
- { "_Z3tanf", (void *)&tanf },
- { "_Z4tanhf", (void *)&tanhf },
- { "_Z5tanpif", (void *)&SC_tanpi },
- //{ "tgamma", (void *)& },
- { "_Z5truncf", (void *)&truncf },
-
- // OpenCL Int
- { "_Z3absi", (void *)&SC_abs_i32 },
- { "_Z3abss", (void *)&SC_abs_i16 },
- { "_Z3absc", (void *)&SC_abs_i8 },
- { "_Z3clzj", (void *)&SC_clz_u32 },
- { "_Z3clzt", (void *)&SC_clz_u16 },
- { "_Z3clzh", (void *)&SC_clz_u8 },
- { "_Z3clzi", (void *)&SC_clz_i32 },
- { "_Z3clzs", (void *)&SC_clz_i16 },
- { "_Z3clzc", (void *)&SC_clz_i8 },
- { "_Z3maxjj", (void *)&SC_max_u32 },
- { "_Z3maxtt", (void *)&SC_max_u16 },
- { "_Z3maxhh", (void *)&SC_max_u8 },
- { "_Z3maxii", (void *)&SC_max_i32 },
- { "_Z3maxss", (void *)&SC_max_i16 },
- { "_Z3maxcc", (void *)&SC_max_i8 },
- { "_Z3minjj", (void *)&SC_min_u32 },
- { "_Z3mintt", (void *)&SC_min_u16 },
- { "_Z3minhh", (void *)&SC_min_u8 },
- { "_Z3minii", (void *)&SC_min_i32 },
- { "_Z3minss", (void *)&SC_min_i16 },
- { "_Z3mincc", (void *)&SC_min_i8 },
-
- // OpenCL 6.11.4
- { "_Z5clampfff", (void *)&SC_clamp_f32 },
- { "_Z7degreesf", (void *)&SC_degrees },
- { "_Z3maxff", (void *)&SC_max_f32 },
- { "_Z3minff", (void *)&SC_min_f32 },
- { "_Z3mixfff", (void *)&SC_mix_f32 },
- { "_Z7radiansf", (void *)&SC_radians },
- { "_Z4stepff", (void *)&SC_step_f32 },
- //{ "smoothstep", (void *)& },
- { "_Z4signf", (void *)&SC_sign_f32 },
-
-
-
-
{ "modf", (void *)&fmod },
{ "_Z4fracf", (void *)&SC_frac },
//{ "sinf_fast", (void *)&SC_sinf_fast },
@@ -1314,19 +659,6 @@
{ "vec4Dot", (void *)&SC_vec4Dot },
{ "vec4Scale", (void *)&SC_vec4Scale },
- // context
- { "bindProgramFragment", (void *)&SC_bindProgramFragment },
- { "bindProgramFragmentStore", (void *)&SC_bindProgramFragmentStore },
- { "bindProgramStore", (void *)&SC_bindProgramFragmentStore },
- { "bindProgramVertex", (void *)&SC_bindProgramVertex },
- { "bindProgramRaster", (void *)&SC_bindProgramRaster },
- { "bindSampler", (void *)&SC_bindSampler },
- { "bindTexture", (void *)&SC_bindTexture },
-
- // vp
- { "vpLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
- { "vpLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
-
// allocation
{ "allocGetDimX", (void *)&SC_allocGetDimX },
{ "allocGetDimY", (void *)&SC_allocGetDimY },
@@ -1334,35 +666,8 @@
{ "allocGetDimLOD", (void *)&SC_allocGetDimLOD },
{ "allocGetDimFaces", (void *)&SC_allocGetDimFaces },
- // drawing
- { "drawRect", (void *)&SC_drawRect },
- { "drawQuad", (void *)&SC_drawQuad },
- { "drawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
- { "drawSprite", (void *)&SC_drawSprite },
- { "drawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
- { "drawSpriteScreenspaceCropped", (void *)&SC_drawSpriteScreenspaceCropped },
- { "drawLine", (void *)&SC_drawLine },
- { "drawPoint", (void *)&SC_drawPoint },
- { "drawSimpleMesh", (void *)&SC_drawSimpleMesh },
- { "drawSimpleMeshRange", (void *)&SC_drawSimpleMeshRange },
-
// misc
- { "pfClearColor", (void *)&SC_ClearColor },
- { "color", (void *)&SC_color },
- { "hsb", (void *)&SC_hsb },
- { "hsbToRgb", (void *)&SC_hsbToRgb },
- { "hsbToAbgr", (void *)&SC_hsbToAbgr },
- { "pointAttenuation", (void *)&SC_pointAttenuation },
-
- { "uploadToTexture", (void *)&SC_uploadToTexture },
- { "uploadToBufferObject", (void *)&SC_uploadToBufferObject },
-
- { "syncToGL", (void *)&SC_syncToGL },
-
- { "getWidth", (void *)&SC_getWidth },
- { "getHeight", (void *)&SC_getHeight },
-
{ "sendToClient", (void *)&SC_toClient },
{ "_Z18convertColorTo8888fff", (void *)&SC_convertColorTo8888_f3 },
@@ -1377,6 +682,8 @@
{ "debugPi", (void *)&SC_debugPi },
{ "scriptCall", (void *)&SC_scriptCall },
+ { "rsGetAllocation", (void *)&SC_getAllocation },
+
{ NULL, NULL }
};
diff --git a/libs/rs/rsScriptC_LibCL.cpp b/libs/rs/rsScriptC_LibCL.cpp
new file mode 100644
index 0000000..ce8e7b2
--- /dev/null
+++ b/libs/rs/rsScriptC_LibCL.cpp
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+#include "rsScriptC.h"
+
+// Implements rs_cl.rsh
+
+
+using namespace android;
+using namespace android::renderscript;
+
+
+static float SC_acospi(float v) {
+ return acosf(v)/ M_PI;
+}
+
+static float SC_asinpi(float v) {
+ return asinf(v) / M_PI;
+}
+
+static float SC_atanpi(float v) {
+ return atanf(v) / M_PI;
+}
+
+static float SC_atan2pi(float y, float x) {
+ return atan2f(y, x) / M_PI;
+}
+
+static float SC_cospi(float v) {
+ return cosf(v * M_PI);
+}
+
+static float SC_exp10(float v) {
+ return pow(10.f, v);
+
+}
+
+static float SC_fract(float v, int *iptr) {
+ int i = (int)floor(v);
+ iptr[0] = i;
+ return fmin(v - i, 0x1.fffffep-1f);
+}
+
+static float SC_log2(float v) {
+ return log10(v) / log10(2.f);
+}
+
+static float SC_pown(float v, int p) {
+ return powf(v, (float)p);
+}
+
+static float SC_powr(float v, float p) {
+ return powf(v, p);
+}
+
+float SC_rootn(float v, int r) {
+ return pow(v, 1.f / r);
+}
+
+float SC_rsqrt(float v) {
+ return 1.f / sqrtf(v);
+}
+
+float SC_sincos(float v, float *cosptr) {
+ *cosptr = cosf(v);
+ return sinf(v);
+}
+
+static float SC_sinpi(float v) {
+ return sinf(v * M_PI);
+}
+
+static float SC_tanpi(float v) {
+ return tanf(v * M_PI);
+}
+
+ //{ "logb", (void *)& },
+ //{ "mad", (void *)& },
+ //{ "nan", (void *)& },
+ //{ "tgamma", (void *)& },
+
+//////////////////////////////////////////////////////////////////////////////
+// Integer
+//////////////////////////////////////////////////////////////////////////////
+
+
+static uint32_t SC_abs_i32(int32_t v) {return abs(v);}
+static uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);}
+static uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);}
+
+static uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);}
+static uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);}
+static uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);}
+static int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);}
+static int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);}
+static int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);}
+
+static uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);}
+static uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);}
+static uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);}
+static int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);}
+static int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);}
+static int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);}
+
+static uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);}
+static uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);}
+static uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);}
+static int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);}
+static int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);}
+static int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);}
+
+//////////////////////////////////////////////////////////////////////////////
+// Float util
+//////////////////////////////////////////////////////////////////////////////
+
+static float SC_clamp_f32(float amount, float low, float high)
+{
+ return amount < low ? low : (amount > high ? high : amount);
+}
+
+static float SC_degrees(float radians)
+{
+ return radians * (180.f / M_PI);
+}
+
+static float SC_max_f32(float v, float v2)
+{
+ return rsMax(v, v2);
+}
+
+static float SC_min_f32(float v, float v2)
+{
+ return rsMin(v, v2);
+}
+
+static float SC_mix_f32(float start, float stop, float amount)
+{
+ //LOGE("lerpf %f %f %f", start, stop, amount);
+ return start + (stop - start) * amount;
+}
+
+static float SC_radians(float degrees)
+{
+ return degrees * (M_PI / 180.f);
+}
+
+static float SC_step_f32(float edge, float v)
+{
+ if (v < edge) return 0.f;
+ return 1.f;
+}
+
+static float SC_sign_f32(float value)
+{
+ if (value > 0) return 1.f;
+ if (value < 0) return -1.f;
+ return value;
+}
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Class implementation
+//////////////////////////////////////////////////////////////////////////////
+
+// llvm name mangling ref
+// <builtin-type> ::= v # void
+// ::= b # bool
+// ::= c # char
+// ::= a # signed char
+// ::= h # unsigned char
+// ::= s # short
+// ::= t # unsigned short
+// ::= i # int
+// ::= j # unsigned int
+// ::= l # long
+// ::= m # unsigned long
+// ::= x # long long, __int64
+// ::= y # unsigned long long, __int64
+// ::= f # float
+// ::= d # double
+
+static ScriptCState::SymbolTable_t gSyms[] = {
+ // OpenCL math
+ { "_Z4acosf", (void *)&acosf },
+ { "_Z5acoshf", (void *)&acoshf },
+ { "_Z6acospif", (void *)&SC_acospi },
+ { "_Z4asinf", (void *)&asinf },
+ { "_Z5asinhf", (void *)&asinhf },
+ { "_Z6asinpif", (void *)&SC_asinpi },
+ { "_Z4atanf", (void *)&atanf },
+ { "_Z5atan2f", (void *)&atan2f },
+ { "_Z6atanpif", (void *)&SC_atanpi },
+ { "_Z7atan2pif", (void *)&SC_atan2pi },
+ { "_Z4cbrtf", (void *)&cbrtf },
+ { "_Z4ceilf", (void *)&ceilf },
+ { "_Z8copysignff", (void *)©signf },
+ { "_Z3cosf", (void *)&cosf },
+ { "_Z4coshf", (void *)&coshf },
+ { "_Z5cospif", (void *)&SC_cospi },
+ { "_Z4erfcf", (void *)&erfcf },
+ { "_Z3erff", (void *)&erff },
+ { "_Z3expf", (void *)&expf },
+ { "_Z4exp2f", (void *)&exp2f },
+ { "_Z5exp10f", (void *)&SC_exp10 },
+ { "_Z5expm1f", (void *)&expm1f },
+ { "_Z4fabsf", (void *)&fabsf },
+ { "_Z4fdimff", (void *)&fdimf },
+ { "_Z5floorf", (void *)&floorf },
+ { "_Z3fmafff", (void *)&fmaf },
+ { "_Z4fmaxff", (void *)&fmaxf },
+ { "_Z4fminff", (void *)&fminf }, // float fmin(float, float)
+ { "_Z4fmodff", (void *)&fmodf },
+ { "_Z5fractfPf", (void *)&SC_fract },
+ { "_Z5frexpfPi", (void *)&frexpf },
+ { "_Z5hypotff", (void *)&hypotf },
+ { "_Z5ilogbf", (void *)&ilogbf },
+ { "_Z5ldexpfi", (void *)&ldexpf },
+ { "_Z6lgammaf", (void *)&lgammaf },
+ { "_Z3logf", (void *)&logf },
+ { "_Z4log2f", (void *)&SC_log2 },
+ { "_Z5log10f", (void *)&log10f },
+ { "_Z5log1pf", (void *)&log1pf },
+ //{ "logb", (void *)& },
+ //{ "mad", (void *)& },
+ { "modf", (void *)&modff },
+ //{ "nan", (void *)& },
+ { "_Z9nextafterff", (void *)&nextafterf },
+ { "_Z3powff", (void *)&powf },
+ { "_Z4pownfi", (void *)&SC_pown },
+ { "_Z4powrff", (void *)&SC_powr },
+ { "_Z9remainderff", (void *)&remainderf },
+ { "remquo", (void *)&remquof },
+ { "_Z4rintf", (void *)&rintf },
+ { "_Z5rootnfi", (void *)&SC_rootn },
+ { "_Z5roundf", (void *)&roundf },
+ { "_Z5rsqrtf", (void *)&SC_rsqrt },
+ { "_Z3sinf", (void *)&sinf },
+ { "sincos", (void *)&SC_sincos },
+ { "_Z4sinhf", (void *)&sinhf },
+ { "_Z5sinpif", (void *)&SC_sinpi },
+ { "_Z4sqrtf", (void *)&sqrtf },
+ { "_Z3tanf", (void *)&tanf },
+ { "_Z4tanhf", (void *)&tanhf },
+ { "_Z5tanpif", (void *)&SC_tanpi },
+ //{ "tgamma", (void *)& },
+ { "_Z5truncf", (void *)&truncf },
+
+ // OpenCL Int
+ { "_Z3absi", (void *)&SC_abs_i32 },
+ { "_Z3abss", (void *)&SC_abs_i16 },
+ { "_Z3absc", (void *)&SC_abs_i8 },
+ { "_Z3clzj", (void *)&SC_clz_u32 },
+ { "_Z3clzt", (void *)&SC_clz_u16 },
+ { "_Z3clzh", (void *)&SC_clz_u8 },
+ { "_Z3clzi", (void *)&SC_clz_i32 },
+ { "_Z3clzs", (void *)&SC_clz_i16 },
+ { "_Z3clzc", (void *)&SC_clz_i8 },
+ { "_Z3maxjj", (void *)&SC_max_u32 },
+ { "_Z3maxtt", (void *)&SC_max_u16 },
+ { "_Z3maxhh", (void *)&SC_max_u8 },
+ { "_Z3maxii", (void *)&SC_max_i32 },
+ { "_Z3maxss", (void *)&SC_max_i16 },
+ { "_Z3maxcc", (void *)&SC_max_i8 },
+ { "_Z3minjj", (void *)&SC_min_u32 },
+ { "_Z3mintt", (void *)&SC_min_u16 },
+ { "_Z3minhh", (void *)&SC_min_u8 },
+ { "_Z3minii", (void *)&SC_min_i32 },
+ { "_Z3minss", (void *)&SC_min_i16 },
+ { "_Z3mincc", (void *)&SC_min_i8 },
+
+ // OpenCL 6.11.4
+ { "_Z5clampfff", (void *)&SC_clamp_f32 },
+ { "_Z7degreesf", (void *)&SC_degrees },
+ { "_Z3maxff", (void *)&SC_max_f32 },
+ { "_Z3minff", (void *)&SC_min_f32 },
+ { "_Z3mixfff", (void *)&SC_mix_f32 },
+ { "_Z7radiansf", (void *)&SC_radians },
+ { "_Z4stepff", (void *)&SC_step_f32 },
+ //{ "smoothstep", (void *)& },
+ { "_Z4signf", (void *)&SC_sign_f32 },
+
+ { NULL, NULL }
+};
+
+const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolCL(const char *sym)
+{
+ ScriptCState::SymbolTable_t *syms = gSyms;
+
+ while (syms->mPtr) {
+ if (!strcmp(syms->mName, sym)) {
+ return syms;
+ }
+ syms++;
+ }
+ return NULL;
+}
+
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
new file mode 100644
index 0000000..c9d5034
--- /dev/null
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -0,0 +1,528 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+#include "rsScriptC.h"
+#include "rsMatrix.h"
+#include "rsNoise.h"
+
+#include "acc/acc.h"
+#include "utils/Timers.h"
+
+#define GL_GLEXT_PROTOTYPES
+
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include <time.h>
+
+using namespace android;
+using namespace android::renderscript;
+
+#define GET_TLS() Context::ScriptTLSStruct * tls = \
+ (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
+ Context * rsc = tls->mContext; \
+ ScriptC * sc = (ScriptC *) tls->mScript
+
+
+//////////////////////////////////////////////////////////////////////////////
+// IO routines
+//////////////////////////////////////////////////////////////////////////////
+
+static void SC_updateSimpleMesh(RsSimpleMesh mesh)
+{
+ GET_TLS();
+ SimpleMesh *sm = static_cast<SimpleMesh *>(mesh);
+ sm->uploadAll(rsc);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Context
+//////////////////////////////////////////////////////////////////////////////
+
+static void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
+{
+ GET_TLS();
+ rsi_ProgramBindTexture(rsc,
+ static_cast<ProgramFragment *>(vpf),
+ slot,
+ static_cast<Allocation *>(va));
+
+}
+
+static void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
+{
+ GET_TLS();
+ rsi_ProgramBindSampler(rsc,
+ static_cast<ProgramFragment *>(vpf),
+ slot,
+ static_cast<Sampler *>(vs));
+
+}
+
+static void SC_bindProgramStore(RsProgramStore pfs)
+{
+ GET_TLS();
+ rsi_ContextBindProgramStore(rsc, pfs);
+}
+
+static void SC_bindProgramFragment(RsProgramFragment pf)
+{
+ GET_TLS();
+ rsi_ContextBindProgramFragment(rsc, pf);
+}
+
+static void SC_bindProgramVertex(RsProgramVertex pv)
+{
+ GET_TLS();
+ rsi_ContextBindProgramVertex(rsc, pv);
+}
+
+static void SC_bindProgramRaster(RsProgramRaster pv)
+{
+ GET_TLS();
+ rsi_ContextBindProgramRaster(rsc, pv);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// VP
+//////////////////////////////////////////////////////////////////////////////
+
+static void SC_vpLoadModelMatrix(const rsc_Matrix *m)
+{
+ GET_TLS();
+ rsc->getVertex()->setModelviewMatrix(m);
+}
+
+static void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
+{
+ GET_TLS();
+ rsc->getVertex()->setTextureMatrix(m);
+}
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Drawing
+//////////////////////////////////////////////////////////////////////////////
+
+static void SC_drawLine(float x1, float y1, float z1,
+ float x2, float y2, float z2)
+{
+ GET_TLS();
+ if (!rsc->setupCheck()) {
+ return;
+ }
+
+ float vtx[] = { x1, y1, z1, x2, y2, z2 };
+ VertexArray va;
+ va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
+
+ glDrawArrays(GL_LINES, 0, 2);
+}
+
+static void SC_drawPoint(float x, float y, float z)
+{
+ GET_TLS();
+ if (!rsc->setupCheck()) {
+ return;
+ }
+
+ float vtx[] = { x, y, z };
+
+ VertexArray va;
+ va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
+
+ glDrawArrays(GL_POINTS, 0, 1);
+}
+
+static void SC_drawQuadTexCoords(float x1, float y1, float z1,
+ float u1, float v1,
+ float x2, float y2, float z2,
+ float u2, float v2,
+ float x3, float y3, float z3,
+ float u3, float v3,
+ float x4, float y4, float z4,
+ float u4, float v4)
+{
+ GET_TLS();
+ if (!rsc->setupCheck()) {
+ return;
+ }
+
+ //LOGE("Quad");
+ //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
+ //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
+ //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
+ //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
+
+ float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
+ const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
+
+ VertexArray va;
+ va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
+ va.addLegacy(GL_FLOAT, 2, 8, RS_KIND_TEXTURE, false, (uint32_t)tex);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
+
+
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+}
+
+static void SC_drawQuad(float x1, float y1, float z1,
+ float x2, float y2, float z2,
+ float x3, float y3, float z3,
+ float x4, float y4, float z4)
+{
+ SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
+ x2, y2, z2, 1, 1,
+ x3, y3, z3, 1, 0,
+ x4, y4, z4, 0, 0);
+}
+
+static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
+{
+ GET_TLS();
+ ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
+ rsc->setVertex(rsc->getDefaultProgramVertex());
+ //rsc->setupCheck();
+
+ //GLint crop[4] = {0, h, w, -h};
+
+ float sh = rsc->getHeight();
+
+ SC_drawQuad(x, sh - y, z,
+ x+w, sh - y, z,
+ x+w, sh - (y+h), z,
+ x, sh - (y+h), z);
+ rsc->setVertex((ProgramVertex *)tmp.get());
+}
+
+static void SC_drawSpriteScreenspaceCropped(float x, float y, float z, float w, float h,
+ float cx0, float cy0, float cx1, float cy1)
+{
+ GET_TLS();
+ if (!rsc->setupCheck()) {
+ return;
+ }
+
+ GLint crop[4] = {cx0, cy0, cx1, cy1};
+ glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
+ glDrawTexfOES(x, y, z, w, h);
+}
+
+static void SC_drawSprite(float x, float y, float z, float w, float h)
+{
+ GET_TLS();
+ float vin[3] = {x, y, z};
+ float vout[4];
+
+ //LOGE("ds in %f %f %f", x, y, z);
+ rsc->getVertex()->transformToScreen(rsc, vout, vin);
+ //LOGE("ds out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
+ vout[0] /= vout[3];
+ vout[1] /= vout[3];
+ vout[2] /= vout[3];
+
+ vout[0] *= rsc->getWidth() / 2;
+ vout[1] *= rsc->getHeight() / 2;
+ vout[0] += rsc->getWidth() / 2;
+ vout[1] += rsc->getHeight() / 2;
+
+ vout[0] -= w/2;
+ vout[1] -= h/2;
+
+ //LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]);
+
+ // U, V, W, H
+ SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
+ //rsc->setupCheck();
+}
+
+
+static void SC_drawRect(float x1, float y1,
+ float x2, float y2, float z)
+{
+ //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
+ SC_drawQuad(x1, y2, z,
+ x2, y2, z,
+ x2, y1, z,
+ x1, y1, z);
+}
+
+static void SC_drawSimpleMesh(RsSimpleMesh vsm)
+{
+ GET_TLS();
+ SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
+ if (!rsc->setupCheck()) {
+ return;
+ }
+ sm->render(rsc);
+}
+
+static void SC_drawSimpleMeshRange(RsSimpleMesh vsm, uint32_t start, uint32_t len)
+{
+ GET_TLS();
+ SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
+ if (!rsc->setupCheck()) {
+ return;
+ }
+ sm->renderRange(rsc, start, len);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+static void SC_color(float r, float g, float b, float a)
+{
+ GET_TLS();
+ rsc->mStateVertex.color[0] = r;
+ rsc->mStateVertex.color[1] = g;
+ rsc->mStateVertex.color[2] = b;
+ rsc->mStateVertex.color[3] = a;
+ if (!rsc->checkVersion2_0()) {
+ glColor4f(r, g, b, a);
+ }
+}
+
+static void SC_pointAttenuation(float a, float b, float c)
+{
+ GLfloat params[] = { a, b, c };
+ glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, params);
+}
+
+static void SC_hsbToRgb(float h, float s, float b, float* rgb)
+{
+ float red = 0.0f;
+ float green = 0.0f;
+ float blue = 0.0f;
+
+ float x = h;
+ float y = s;
+ float z = b;
+
+ float hf = (x - (int) x) * 6.0f;
+ int ihf = (int) hf;
+ float f = hf - ihf;
+ float pv = z * (1.0f - y);
+ float qv = z * (1.0f - y * f);
+ float tv = z * (1.0f - y * (1.0f - f));
+
+ switch (ihf) {
+ case 0: // Red is the dominant color
+ red = z;
+ green = tv;
+ blue = pv;
+ break;
+ case 1: // Green is the dominant color
+ red = qv;
+ green = z;
+ blue = pv;
+ break;
+ case 2:
+ red = pv;
+ green = z;
+ blue = tv;
+ break;
+ case 3: // Blue is the dominant color
+ red = pv;
+ green = qv;
+ blue = z;
+ break;
+ case 4:
+ red = tv;
+ green = pv;
+ blue = z;
+ break;
+ case 5: // Red is the dominant color
+ red = z;
+ green = pv;
+ blue = qv;
+ break;
+ }
+
+ rgb[0] = red;
+ rgb[1] = green;
+ rgb[2] = blue;
+}
+
+static int SC_hsbToAbgr(float h, float s, float b, float a)
+{
+ //LOGE("hsb a %f, %f, %f %f", h, s, b, a);
+ float rgb[3];
+ SC_hsbToRgb(h, s, b, rgb);
+ //LOGE("rgb %f, %f, %f ", rgb[0], rgb[1], rgb[2]);
+ return int(a * 255.0f) << 24 |
+ int(rgb[2] * 255.0f) << 16 |
+ int(rgb[1] * 255.0f) << 8 |
+ int(rgb[0] * 255.0f);
+}
+
+static void SC_hsb(float h, float s, float b, float a)
+{
+ GET_TLS();
+ float rgb[3];
+ SC_hsbToRgb(h, s, b, rgb);
+ if (rsc->checkVersion2_0()) {
+ glVertexAttrib4f(1, rgb[0], rgb[1], rgb[2], a);
+ } else {
+ glColor4f(rgb[0], rgb[1], rgb[2], a);
+ }
+}
+
+static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
+{
+ GET_TLS();
+ rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
+}
+
+static void SC_uploadToBufferObject(RsAllocation va)
+{
+ GET_TLS();
+ rsi_AllocationUploadToBufferObject(rsc, va);
+}
+
+static void SC_syncToGL(RsAllocation va)
+{
+ GET_TLS();
+ Allocation *a = static_cast<Allocation *>(va);
+
+}
+
+static void SC_ClearColor(float r, float g, float b, float a)
+{
+ //LOGE("c %f %f %f %f", r, g, b, a);
+ GET_TLS();
+ sc->mEnviroment.mClearColor[0] = r;
+ sc->mEnviroment.mClearColor[1] = g;
+ sc->mEnviroment.mClearColor[2] = b;
+ sc->mEnviroment.mClearColor[3] = a;
+}
+
+static uint32_t SC_getWidth()
+{
+ GET_TLS();
+ return rsc->getWidth();
+}
+
+static uint32_t SC_getHeight()
+{
+ GET_TLS();
+ return rsc->getHeight();
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Class implementation
+//////////////////////////////////////////////////////////////////////////////
+
+// llvm name mangling ref
+// <builtin-type> ::= v # void
+// ::= b # bool
+// ::= c # char
+// ::= a # signed char
+// ::= h # unsigned char
+// ::= s # short
+// ::= t # unsigned short
+// ::= i # int
+// ::= j # unsigned int
+// ::= l # long
+// ::= m # unsigned long
+// ::= x # long long, __int64
+// ::= y # unsigned long long, __int64
+// ::= f # float
+// ::= d # double
+
+static ScriptCState::SymbolTable_t gSyms[] = {
+ // IO
+ { "updateSimpleMesh", (void *)&SC_updateSimpleMesh },
+
+ // context
+ { "bindProgramFragment", (void *)&SC_bindProgramFragment },
+ { "bindProgramStore", (void *)&SC_bindProgramStore },
+ { "bindProgramVertex", (void *)&SC_bindProgramVertex },
+ { "bindProgramRaster", (void *)&SC_bindProgramRaster },
+ { "bindSampler", (void *)&SC_bindSampler },
+ { "bindTexture", (void *)&SC_bindTexture },
+
+ // vp
+ { "vpLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
+ { "vpLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
+
+ // drawing
+ { "drawRect", (void *)&SC_drawRect },
+ { "drawQuad", (void *)&SC_drawQuad },
+ { "drawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
+ { "drawSprite", (void *)&SC_drawSprite },
+ { "drawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
+ { "drawSpriteScreenspaceCropped", (void *)&SC_drawSpriteScreenspaceCropped },
+ { "drawLine", (void *)&SC_drawLine },
+ { "drawPoint", (void *)&SC_drawPoint },
+ { "drawSimpleMesh", (void *)&SC_drawSimpleMesh },
+ { "drawSimpleMeshRange", (void *)&SC_drawSimpleMeshRange },
+
+
+ // misc
+ { "pfClearColor", (void *)&SC_ClearColor },
+ { "color", (void *)&SC_color },
+ { "hsb", (void *)&SC_hsb },
+ { "hsbToRgb", (void *)&SC_hsbToRgb },
+ { "hsbToAbgr", (void *)&SC_hsbToAbgr },
+ { "pointAttenuation", (void *)&SC_pointAttenuation },
+
+ { "uploadToTexture", (void *)&SC_uploadToTexture },
+ { "uploadToBufferObject", (void *)&SC_uploadToBufferObject },
+
+ { "syncToGL", (void *)&SC_syncToGL },
+
+ { "getWidth", (void *)&SC_getWidth },
+ { "getHeight", (void *)&SC_getHeight },
+
+ { NULL, NULL }
+};
+
+const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
+{
+ ScriptCState::SymbolTable_t *syms = gSyms;
+
+ while (syms->mPtr) {
+ if (!strcmp(syms->mName, sym)) {
+ return syms;
+ }
+ syms++;
+ }
+ return NULL;
+}
+
diff --git a/libs/rs/scriptc/rs_math.rsh b/libs/rs/scriptc/rs_math.rsh
index 48ab066..1d2f1e4 100644
--- a/libs/rs/scriptc/rs_math.rsh
+++ b/libs/rs/scriptc/rs_math.rsh
@@ -650,4 +650,5 @@
extern void matrixScale(void *mat, float x, float y, float z);
extern void matrixTranslate(void *mat, float x, float y, float z);
+extern rs_allocation rsGetAllocation(const void *);
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
index af89e9a..51de1da 100644
--- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -73,7 +73,7 @@
DisplayHardware::DisplayHardware(
const sp<SurfaceFlinger>& flinger,
uint32_t dpy)
- : DisplayHardwareBase(flinger, dpy)
+ : DisplayHardwareBase(flinger, dpy), mFlags(0)
{
init(dpy);
}
diff --git a/libs/surfaceflinger_client/SharedBufferStack.cpp b/libs/surfaceflinger_client/SharedBufferStack.cpp
index 4a98026..dab8ed8 100644
--- a/libs/surfaceflinger_client/SharedBufferStack.cpp
+++ b/libs/surfaceflinger_client/SharedBufferStack.cpp
@@ -182,10 +182,22 @@
int tail = computeTail();
snprintf(buffer, SIZE,
"%s[ head=%2d, available=%2d, queued=%2d, tail=%2d ] "
- "reallocMask=%08x, inUse=%2d, identity=%d, status=%d\n",
+ "reallocMask=%08x, inUse=%2d, identity=%d, status=%d",
prefix, stack.head, stack.available, stack.queued, tail,
stack.reallocMask, stack.inUse, stack.identity, stack.status);
result.append(buffer);
+
+ snprintf(buffer, SIZE, " { ");
+ result.append(buffer);
+
+ for (int i=0 ; i<mNumBuffers ; i++) {
+ snprintf(buffer, SIZE, "%d ", stack.index[i]);
+ result.append(buffer);
+ }
+
+ snprintf(buffer, SIZE, " }\n");
+ result.append(buffer);
+
return result;
}
@@ -323,6 +335,7 @@
// lock the buffer before advancing head, which automatically unlocks
// the buffer we preventively locked upon entering this function
+
head = (head + 1) % numBuffers;
android_atomic_write(stack.index[head], &stack.inUse);
@@ -416,7 +429,7 @@
{
SharedBufferStack& stack( *mSharedStack );
- queued_head = ((queued_head+1 >= mNumBuffers) ? 0 : queued_head+1);
+ queued_head = (queued_head + 1) % mNumBuffers;
stack.index[queued_head] = buf;
QueueUpdate update(this);
@@ -449,9 +462,11 @@
status_t SharedBufferClient::setBufferCount(int bufferCount)
{
+ SharedBufferStack& stack( *mSharedStack );
if (uint32_t(bufferCount) >= NUM_BUFFER_MAX)
return BAD_VALUE;
mNumBuffers = bufferCount;
+ queued_head = (stack.head + stack.queued) % mNumBuffers;
return NO_ERROR;
}
@@ -560,6 +575,7 @@
int base = numBuffers;
int32_t avail = stack.available;
int tail = head - avail + 1;
+
if (tail >= 0) {
int8_t* const index = const_cast<int8_t*>(stack.index);
const int nb = numBuffers - head;
@@ -573,8 +589,9 @@
// fill the new free space with unused buffers
BufferList::const_iterator curr(mBufferList.free_begin());
for (int i=0 ; i<extra ; i++) {
- stack.index[base+i] = *curr++;
- mBufferList.add(stack.index[base+i]);
+ stack.index[base+i] = *curr;
+ mBufferList.add(*curr);
+ ++curr;
}
mNumBuffers = newNumBuffers;
diff --git a/libs/surfaceflinger_client/SurfaceComposerClient.cpp b/libs/surfaceflinger_client/SurfaceComposerClient.cpp
index 3117495..85167da 100644
--- a/libs/surfaceflinger_client/SurfaceComposerClient.cpp
+++ b/libs/surfaceflinger_client/SurfaceComposerClient.cpp
@@ -58,7 +58,7 @@
// Must not be holding SurfaceComposerClient::mLock when acquiring gLock here.
static Mutex gLock;
static sp<ISurfaceComposer> gSurfaceManager;
-static DefaultKeyedVector< sp<IBinder>, sp<SurfaceComposerClient> > gActiveConnections;
+static DefaultKeyedVector< sp<IBinder>, wp<SurfaceComposerClient> > gActiveConnections;
static SortedVector<sp<SurfaceComposerClient> > gOpenTransactions;
static sp<IMemoryHeap> gServerCblkMemory;
static volatile surface_flinger_cblk_t* gServerCblk;
@@ -195,7 +195,7 @@
{ // scope for lock
Mutex::Autolock _l(gLock);
- client = gActiveConnections.valueFor(conn);
+ client = gActiveConnections.valueFor(conn).promote();
}
if (client == 0) {
@@ -383,8 +383,8 @@
const size_t N = gActiveConnections.size();
VERBOSE("openGlobalTransaction (%ld clients)", N);
for (size_t i=0; i<N; i++) {
- sp<SurfaceComposerClient> client(gActiveConnections.valueAt(i));
- if (gOpenTransactions.indexOf(client) < 0) {
+ sp<SurfaceComposerClient> client(gActiveConnections.valueAt(i).promote());
+ if (client != 0 && gOpenTransactions.indexOf(client) < 0) {
if (client->openTransaction() == NO_ERROR) {
if (gOpenTransactions.add(client) < 0) {
// Ooops!
diff --git a/libs/surfaceflinger_client/tests/SharedBufferStack/SharedBufferStackTest.cpp b/libs/surfaceflinger_client/tests/SharedBufferStack/SharedBufferStackTest.cpp
index 6732580..f490a65 100644
--- a/libs/surfaceflinger_client/tests/SharedBufferStack/SharedBufferStackTest.cpp
+++ b/libs/surfaceflinger_client/tests/SharedBufferStack/SharedBufferStackTest.cpp
@@ -24,6 +24,43 @@
using namespace android;
+void log(const char* prefix, int *b, size_t num);
+void test0(SharedBufferServer& s, SharedBufferClient& c, size_t num, int* list);
+
+// ----------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ SharedClient client;
+ SharedBufferServer s(&client, 0, 4, 0);
+ SharedBufferClient c(&client, 0, 4, 0);
+
+ printf("basic test 0\n");
+ int list0[4] = {0, 1, 2, 3};
+ test0(s, c, 4, list0);
+
+ printf("basic test 1\n");
+ int list1[4] = {2, 1, 0, 3};
+ test0(s, c, 4, list1);
+
+ int b = c.dequeue();
+ c.lock(b);
+ c.queue(b);
+ s.retireAndLock();
+
+ printf("basic test 2\n");
+ int list2[4] = {1, 2, 3, 0};
+ test0(s, c, 4, list2);
+
+
+ printf("resize test\n");
+ s.resize(6);
+ c.setBufferCount(6);
+ int list3[6] = {3, 2, 1, 4, 5, 0};
+ test0(s, c, 6, list3);
+
+ return 0;
+}
void log(const char* prefix, int *b, size_t num)
{
@@ -34,18 +71,20 @@
printf("\n");
}
-int main(int argc, char** argv)
+// ----------------------------------------------------------------------------
+
+void test0(
+ SharedBufferServer& s,
+ SharedBufferClient& c,
+ size_t num,
+ int* list)
{
status_t err;
- const size_t num = 4;
- SharedClient client;
- SharedBufferServer s(&client, 0, num, 0);
- SharedBufferClient c(&client, 0, num, 0);
int b[num], u[num], r[num];
for (size_t i=0 ; i<num ; i++) {
b[i] = c.dequeue();
- assert(b[i]==i);
+ assert(b[i]==list[i]);
}
log("DQ", b, num);
@@ -64,7 +103,7 @@
for (size_t i=0 ; i<num-1 ; i++) {
r[i] = s.retireAndLock();
- assert(r[i]==i);
+ assert(r[i]==list[i]);
err = s.unlock(r[i]);
assert(err == 0);
}
@@ -79,7 +118,7 @@
log(" Q", b+num-1, 1);
r[num-1] = s.retireAndLock();
- assert(r[num-1]==num-1);
+ assert(r[num-1]==list[num-1]);
err = s.unlock(r[num-1]);
assert(err == 0);
log("RT", r+num-1, 1);
@@ -89,7 +128,7 @@
for (size_t i=0 ; i<num ; i++) {
b[i] = c.dequeue();
- assert(b[i]==i);
+ assert(b[i]==list[i]);
}
log("DQ", b, num);
@@ -102,7 +141,7 @@
for (size_t i=0 ; i<num-1 ; i++) {
u[i] = b[num-2-i];
}
- u[num-1] = num-1;
+ u[num-1] = b[num-1];
for (size_t i=0 ; i<num-1 ; i++) {
err = c.queue(u[i]);
@@ -127,7 +166,7 @@
log(" Q", b+num-1, 1);
r[num-1] = s.retireAndLock();
- assert(r[num-1]==num-1);
+ assert(r[num-1]==list[num-1]);
err = s.unlock(r[num-1]);
assert(err == 0);
log("RT", r+num-1, 1);
@@ -170,7 +209,7 @@
log(" Q", u+num-1, 1);
r[num-1] = s.retireAndLock();
- assert(r[num-1]==num-1);
+ assert(r[num-1]==u[num-1]);
err = s.unlock(r[num-1]);
assert(err == 0);
log("RT", r+num-1, 1);
@@ -224,10 +263,9 @@
log(" Q", u+num-1, 1);
r[num-1] = s.retireAndLock();
- assert(r[num-1]==num-1);
+ assert(r[num-1]==u[num-1]);
err = s.unlock(r[num-1]);
assert(err == 0);
log("RT", r+num-1, 1);
-
- return 0;
+ printf("\n");
}
diff --git a/media/libdrm/mobile2/Android.mk b/media/libdrm/mobile2/Android.mk
deleted file mode 100644
index e187139..0000000
--- a/media/libdrm/mobile2/Android.mk
+++ /dev/null
@@ -1,79 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# ---------------------------------------
-# First project
-#
-# Build DRM2 core library
-#
-# Output: libdrm2.so
-# ---------------------------------------
-include $(CLEAR_VARS)
-
-common_SRC_FILES := \
- src/util/ustl-1.0/bktrace.cpp \
- src/util/ustl-1.0/memblock.cpp \
- src/util/ustl-1.0/ofstream.cpp \
- src/util/ustl-1.0/ualgobase.cpp \
- src/util/ustl-1.0/unew.cpp \
- src/util/ustl-1.0/cmemlink.cpp \
- src/util/ustl-1.0/memlink.cpp \
- src/util/ustl-1.0/sistream.cpp \
- src/util/ustl-1.0/ubitset.cpp \
- src/util/ustl-1.0/ustdxept.cpp \
- src/util/ustl-1.0/fstream.cpp \
- src/util/ustl-1.0/mistream.cpp \
- src/util/ustl-1.0/sostream.cpp \
- src/util/ustl-1.0/uexception.cpp \
- src/util/ustl-1.0/ustring.cpp \
- src/util/xml/DomExpatAgent.cpp \
- src/util/xml/ExpatWrapper.cpp \
- src/util/xml/XMLDocumentImpl.cpp \
- src/util/xml/XMLElementImpl.cpp \
- src/util/domcore/CharacterDataImpl.cpp \
- src/util/domcore/ElementImpl.cpp \
- src/util/domcore/NodeListImpl.cpp \
- src/util/domcore/DocumentImpl.cpp \
- src/util/domcore/NodeImpl.cpp \
- src/util/domcore/TextImpl.cpp \
- src/util/domcore/DOMException.cpp \
- src/util/domcore/NodeIterator.cpp \
- src/util/crypto/DrmCrypto.cpp \
- src/rights/RoManager.cpp \
- src/rights/Asset.cpp \
- src/rights/Ro.cpp \
- src/rights/OperationPermission.cpp \
- src/rights/Right.cpp \
- src/rights/Constraint.cpp \
- src/drmmanager/DrmManager.cpp \
- src/dcf/DrmDcfCommon.cpp \
- src/dcf/DrmDcfContainer.cpp \
- src/dcf/DrmIStream.cpp \
- src/dcf/DrmRawContent.cpp \
- src/roap/RoapMessageHandler.cpp \
- src/roap/Registration.cpp
-
-ifeq ($(TARGET_ARCH),arm)
- LOCAL_CFLAGS += -fstrict-aliasing -fomit-frame-pointer
-endif
-
-common_CFLAGS := -W -g -DPLATFORM_ANDROID
-
-common_C_INCLUDES +=\
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/src/util/ustl-1.0 \
- external/expat/lib \
- external/openssl \
- external/openssl/include
-
-LOCAL_SRC_FILES := $(common_SRC_FILES)
-LOCAL_CFLAGS += $(common_CFLAGS)
-LOCAL_C_INCLUDES += $(common_C_INCLUDES)
-
-LOCAL_SHARED_LIBRARIES := libexpat libcrypto
-LOCAL_MODULE := libdrm2
-
-ifeq ($(TARGET_OS)-$(TARGET_ARCH),linux-x86)
-LOCAL_CFLAGS += -DUSTL_ANDROID_X86
-endif
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libdrm/mobile2/include/Drm2CommonTypes.h b/media/libdrm/mobile2/include/Drm2CommonTypes.h
deleted file mode 100644
index 8ad3a731..0000000
--- a/media/libdrm/mobile2/include/Drm2CommonTypes.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DRM2COMMONTYPES_H_
-#define _DRM2COMMONTYPES_H_
-#include <stdint.h>
-
-#ifdef DRM2_UT
-#define PROTECTED public
-#define PRIVATE public
-#else
-#define PROTECTED protected
-#define PRIVATE private
-#endif
-
-#endif
diff --git a/media/libdrm/mobile2/include/dcf/DrmDcfCommon.h b/media/libdrm/mobile2/include/dcf/DrmDcfCommon.h
deleted file mode 100644
index 9ca7b3f..0000000
--- a/media/libdrm/mobile2/include/dcf/DrmDcfCommon.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DCF_COMM_H__
-#define __DCF_COMM_H__
-
-#include <Drm2CommonTypes.h>
-#include <arpa/inet.h>
-#include <mistream.h>
-#include <ustring.h>
-
-using namespace ustl;
-
-////DCF box type list
-const uint32_t DCF_CONTAINER_BOX = uint32_t('m' << 24 | 'r' << 16 | 'd' << 8 | 'o');
-const uint32_t DCF_USER_TYPE = uint32_t('d' << 24 | 'i' << 16 | 'u' << 8 | 'u');
-const uint32_t DCF_FILE_TYPE = uint32_t('p' << 24 | 'y' << 16 | 't' << 8 | 'f');
-const uint32_t DCF_FILE_BRAND = uint32_t('f' << 24 | 'c' << 16 | 'd' << 8 | 'o');
-
-
-/**
- * The basic box class.
- */
-class Box
-{
-public:
- /**
- * constructor for Box, used to parse Box
- * \param box Box data
- */
- Box(const uint8_t* box);
-
- /**
- * copy constructor for Box
- * \param dcfBox Box object used to init a new Box object
- */
- Box(const Box& dcfBox);
-
- /**
- * assignment operator for Box
- * \param other Box object used to assign to a exist Box object
- */
- Box& operator=(const Box& other);
-
- /** Destructor for Box */
- virtual ~Box();
-
- /**
- * get the size of Box
- * \param none
- * \return
- * the size
- */
- uint64_t getSize(void) const;
-
- /**
- * get the type of Box
- * \param none
- * \return
- * the type
- */
- uint32_t getType(void) const;
-
- /**
- * get the user type of Box
- * \param none
- * \return
- * the user type
- */
- const uint8_t* getUsertype(void) const;
-
- /**
- * get the length of Box
- * \param none
- * \return
- * the length
- */
- virtual uint32_t getLen(void) const;
-PRIVATE:
- static const uint32_t USER_TYPE_LEN = 16;
-
- uint32_t mSize;
- uint32_t mType;
- uint64_t mLargeSize;
- uint8_t* mUserType;
- uint32_t mBoxLength;
-};
-
-/**
- * The fullBox class.
- */
-class FullBox : public Box
-{
-public:
- /**
- * constructor for FullBox, used to parse FullBox
- * \param fullBox FullBox data
- */
- FullBox(const uint8_t* fullBox);
-
- /** Destructor for FullBox */
- virtual ~FullBox(){}
-
- /**
- * get the version of FullBox
- * \param none
- * \return
- * the version
- */
- uint8_t getVersion(void) const;
-
- /**
- * get the flag of FullBox
- * \param none
- * \return
- * the flag
- */
- const uint8_t* getFlag(void) const;
-
- /**
- * get the length of FullBox
- * \param none
- * \return
- * the length
- */
- virtual uint32_t getLen(void) const;
-PRIVATE:
- static const uint32_t FLAG_LEN = 3;
-
- uint8_t mVersion;
- uint8_t mFlag[FLAG_LEN];
- uint32_t mFullBoxLength;
-};
-
-////// textal header class
-class TextualHeader
-{
-public:
- /** default constructor of DrmInStream */
- TextualHeader(){};
-
- /**
- * constructor for TextualHeader, used to parse textal header
- * \param inData textal header data
- */
- TextualHeader(const string& inData);
-
- /**
- * get the name of textal header
- * \param none
- * \return
- * the name
- */
- string getName() const;
-
- /**
- * get the value of textal header
- * \param none
- * \return
- * the value
- */
- string getValue() const;
-
- /**
- * get the parameter of textal header
- * \param none
- * \return
- * the parameter
- */
- string getParam() const;
-PRIVATE:
- string name;
- string value;
- string param;
-};
-
-extern int64_t ntoh_int64(int64_t in);
-
-#endif
diff --git a/media/libdrm/mobile2/include/dcf/DrmDcfContainer.h b/media/libdrm/mobile2/include/dcf/DrmDcfContainer.h
deleted file mode 100644
index 14da450..0000000
--- a/media/libdrm/mobile2/include/dcf/DrmDcfContainer.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DCF_CONTAINER_H__
-#define __DCF_CONTAINER_H__
-
-#include <Drm2CommonTypes.h>
-#include <uvector.h>
-#include <dcf/DrmIStream.h>
-#include <dcf/DrmDcfCommon.h>
-
-class DrmInStream;
-
-/////////dcf container
-class DcfContainer : public FullBox
-{
-public:
- friend class DrmInStream;
-
- /** default constructor of DcfContainer */
- DcfContainer(istream& inRawData):FullBox(NULL),mConStream(inRawData){}
-
- /**
- * constructor for DcfContainer, used to parse DCF container
- * \param data DCF container data
- * \param len DCF container data len
- * \param off the offset from the start of DCF container
- */
- DcfContainer(const uint8_t* data,istream& inRawData,uint64_t conOff);
-
- /** Destructor for DcfContainer */
- ~DcfContainer();
-
- /**
- * get the content type of one content
- * \param none
- * \return
- * the content type
- */
- string getContentType(void) const;
-
- /**
- * get the encryption method apply to content
- * \param none
- * \return
- * the encryption method
- */
- uint8_t getEncryptionMethod(void) const;
-
- /**
- * get the padding scheme apply to content
- * \param none
- * \return
- * the padding scheme
- */
- uint8_t getPaddingScheme(void) const;
-
- /**
- * get the length of plain content
- * \param none
- * \return
- * the length of plain content
- */
- uint64_t getPlaintextLength(void) const;
-
- /**
- * get the length of content ID
- * \param none
- * \return
- * the length of content ID
- */
- uint16_t getContentIDLength(void) const;
-
- /**
- * get the length of rights issuer URL
- * \param none
- * \return
- * the length of rights issuer URL
- */
- uint16_t getRightsIssuerURLLength(void) const;
-
- /**
- * get the length of textal header
- * \param none
- * \return
- * the length of textal header
- */
- uint16_t getTextualHeadersLength(void) const;
-
- /**
- * get the content ID of one content
- * \param none
- * \return
- * the content ID
- */
- string getContentID(void) const;
-
- /**
- * get the rights issuer URL
- * \param none
- * \return
- * the rights issuer URL
- */
- string getRightsIssuerURL(void) const;
-
- /**
- * get the preview method
- * \param none
- * \return
- * the preview method
- */
- string getPreviewMethod(void) const;
-
- /**
- * get the location of content
- * \param none
- * \return
- * the location of content
- */
- string getContentLocation(void) const;
-
- /**
- * get the URL of content
- * \param none
- * \return
- * the URL of content
- */
- string getContentURL(void) const;
-
- /**
- * get the customer head
- * \param none
- * \return
- * the customer head
- */
- vector<string> getCustomerHead(void) const;
-
- /**
- * get the preview element data
- * \param none
- * \return
- * the DRM Instream of preview element data
- */
- DrmInStream getPreviewElementData(void) const;
-
- /**
- * get the plain content
- * \param none
- * \return
- * the DRM Instream of plain content
- */
- DrmInStream getDecryptContent(uint8_t* decryptKey) const;
-
- /**
- * get the istream of DCF
- * \param none
- * \return
- * the istream of DCF
- */
- istream& getStream(void) const;
-
-PRIVATE:
- static const uint32_t USER_DATA_FLAG = 0x01;
-
- uint8_t mContentTypeLen;
- string mContentType;
- uint8_t mEncryptionMethod;
- uint8_t mPaddingScheme;
- uint64_t mPlaintextLength;
- uint16_t mContentIDLength;
- uint16_t mRightsIssuerURLLength;
- uint16_t mTextualHeadersLength;
- string mContentID;
- string mRightsIssuerURL;
- vector<TextualHeader*> mTextualHeaders;
- bool mSilentFirst;
- string mSlientMethod;
- string mSilentRightsURL;
- string mPreviewMethod;
- string mPreviewElementURI;
- string mPreviewRightsURL;
- string mContentURL;
- string mContentVersion;
- string mContentLocation;
- vector<string> mCustomHeader;
- bool mHasUserData;
- uint64_t mDataLen;
- istream& mConStream;
- uint64_t mDecOffset;
-
-PRIVATE:
- // parse text header
- bool parseTextualHeaders(const uint8_t* data, uint32_t len);
- void copy(const DcfContainer& container);
- DcfContainer(const DcfContainer& container):FullBox(NULL),mConStream(container.mConStream){}
- DcfContainer& operator=(const DcfContainer& other){return *this;}
-};
-
-
-#endif
diff --git a/media/libdrm/mobile2/include/dcf/DrmIStream.h b/media/libdrm/mobile2/include/dcf/DrmIStream.h
deleted file mode 100644
index 10e264e..0000000
--- a/media/libdrm/mobile2/include/dcf/DrmIStream.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DRM_ISTREAM_H__
-#define __DRM_ISTREAM_H__
-
-#include <Drm2CommonTypes.h>
-#include <util/crypto/DrmCrypto.h>
-#include <dcf/DrmDcfContainer.h>
-#include <ustring.h>
-
-using namespace ustl;
-
-class DcfContainer;
-
-class DrmInStream
-{
-public:
- /** default constructor of DrmInStream */
- DrmInStream():mDecryptPos(0){}
-
- /**
- * constructor for DrmInStream, used to read DCF content
- * \param encFile DCF container data
- * \param len DCF container data len
- * \param off the offset from the start of DCF container
- */
- DrmInStream(const DcfContainer* container,uint8_t* Key);
-
- /**
- * get the size of DRM Instream
- * \param none
- * \return
- * the size of DRM Instream
- */
- uint64_t size() const;
-
- /**
- * read data from DRM Instream
- * \param data the buffer to store read data
- * \param len how much data need to read
- * \return
- * the actual len of read data
- */
- uint64_t read(uint8_t* data,uint64_t len);
-
-PRIVATE:
- static const uint32_t AES_IV_LEN = 16;
- static const uint32_t AES_KEY_LEN = 16;
- static const uint32_t AES_BLOCK_LEN = 16;
-
- const DcfContainer* mDcfCon;
- uint64_t mDecryptPos;
- uint8_t mAesKey[AES_KEY_LEN];
-};
-
-
-
-#endif
-
-
-
-
-
diff --git a/media/libdrm/mobile2/include/dcf/DrmRawContent.h b/media/libdrm/mobile2/include/dcf/DrmRawContent.h
deleted file mode 100644
index 2d433af..0000000
--- a/media/libdrm/mobile2/include/dcf/DrmRawContent.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __DRM_CONTENT_H__
-#define __DRM_CONTENT_H__
-
-#include <Drm2CommonTypes.h>
-#include <dcf/DrmDcfContainer.h>
-
-/////////////raw content
-class DrmRawContent
-{
-public:
- /**
- * constructor for DrmRawContent, used to parse DCF
- * \param inRawData input stream of raw data.
- */
- DrmRawContent(istream& inRawData);
-
- /** Destructor for DrmRawContent */
- ~DrmRawContent();
-
- /**
- * get DCF container
- * \param none
- * \return
- * the DCF container
- */
- vector<DcfContainer*> getContents(void) const;
-
- /**
- * get the length of DCF hash
- * \param none
- * \return
- * the length of DCF hash
- */
- uint32_t getDcfHashLen() const;
-
- /**
- * get DCF hash
- * \param outDcfHash the buffer to store DCF hash
- * \return
- * none
- */
- void getDcfHash(uint8_t* outDcfHash) const;
-
-PRIVATE:
- static const uint32_t DCF_HASH_LEN = 20;
- static const uint32_t FIX_HEADER_LEN = 20;
- static const uint32_t MAX_PIECE_LEN = (100 * 1024);
-
- uint8_t mDcfHash[DCF_HASH_LEN];
- vector<DcfContainer*> mContainer;
-
-PRIVATE:
- bool parseDcfHeader(const uint8_t* dcfHead);
- DrmRawContent(const DrmRawContent& rawContent){}
- DrmRawContent& operator=(const DrmRawContent& other){return *this;}
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/drmmanager/DrmManager.h b/media/libdrm/mobile2/include/drmmanager/DrmManager.h
deleted file mode 100644
index c8bfbc1..0000000
--- a/media/libdrm/mobile2/include/drmmanager/DrmManager.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DRMMANAGER_
-#define _DRMMANAGER_
-
-#include <Drm2CommonTypes.h>
-#include <ofstream.h>
-#include <sostream.h>
-#include <ustring.h>
-#include <sistream.h>
-#include <uvector.h>
-
-using namespace ustl;
-
-/** It should be removed after real DcfContainer is ready */
-#define DcfContainer string
-static const int16_t DRM_OK = 1;
-
-class DrmManager
-{
-public:
- /**
- * Error definition
- */
- static const int16_t DRM_MANAGER_BASE = 100;
- static const int16_t ERR_DCFSTREAM_NOT_INITIALIZED = DRM_MANAGER_BASE+1;
- static const int16_t ERR_WRONG_DCFDATA = DRM_MANAGER_BASE+2;
- static const int16_t ERR_WRONG_RIGHTS = DRM_MANAGER_BASE+3;
-
- /**
- * Constructor for DrmManager,used to open local dcf file.
- * @param inRawData input stream of raw data.
- */
- DrmManager(istream *inRawData);
-
- /**
- * Constructor for DrmManager,used to separate dcf file and trig message when upper
- * application downloading one multipart message from CI.
- * @param inRawData input stream of raw data.
- */
- DrmManager(istream * inRawData, string mimeType);
-
- /** Destructor for DomExpatAgent. */
- ~DrmManager();
- /**
- * Config DRM engine
- * Fix me later
- */
- bool config();
-
- /**
- * Consume rights according to specified operation, DrmManager will check.
- * @param operationType the type of operation.
- * @return the operation result.
- */
- int16_t consumeRights(int16_t operationType);
-
- /**
- * Get the list of all dcf containers object reference in the dcf file.
- * @param the vector of the dcf objects list returned.
- * @return the operation result.
- */
- int16_t getListOfDcfObjects(vector<DcfContainer*> **outDcfList);
-
- /**
- * Open one Dcf container to read the decrypted data according to specified
- * operation.
- * @param oneDcfObject the reference of the DcfContainer.
- * @param operationType the type of operation.
- * @param decrypted data returned.
- * @return the operation result.
- */
- int16_t openDecryptedContent(DcfContainer *oneDcfObject,
- int16_t operationType,
- istream *outDecryptedData);
-
- /**
- * Get the separated Dcf raw data from multipart message.
- * @return the ifstream of the dcf raw data which should be stored by upper
- * application.
- */
- ifstream* getOriginalMediaData(void);
-
- /**
- * Handle DRM2.0 push message
- */
- bool handlePushMsg(uint8_t* data, string mimeType);
-
-PRIVATE:
- istream *mDcfStream; /**< the handler of dcf stream. */
- vector<DcfContainer*> mDcfs; /**< all the dcf containers included in one dcf file. */
-};
-
-#endif //_DRMMANAGER_
diff --git a/media/libdrm/mobile2/include/rights/Asset.h b/media/libdrm/mobile2/include/rights/Asset.h
deleted file mode 100644
index 66696dd..0000000
--- a/media/libdrm/mobile2/include/rights/Asset.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _ASSET_H
-#define _ASSET_H
-
-#include <ustring.h>
-#include <uvector.h>
-#include <Drm2CommonTypes.h>
-#include <rights/Right.h>
-using namespace ustl;
-
-class Asset {
-public:
- /**
- * Constructor for asset.
- */
- Asset();
-
- /**
- * Destructor for asset.
- */
- ~Asset();
-
- /**
- * Test whether asset has parent or not.
- * @return true/false to indicate the result.
- */
- bool hasParent();
-
- /**
- * Set id of asset.
- * @param id the id of asset.
- */
- void setID(const string &id);
-
- /**
- * Get the id of content.
- * @return asset id.
- */
- const string& getID() const;
-
- /**
- * Set contend id related to asset.
- * @param id the id of content.
- */
- void setContentID(const string &id);
-
- /**
- * Get content id.
- * @return content id.
- */
- const string& getContentID() const;
-
- /**
- * Set digest value of DCF.
- * @param value the DCF digest value.
- */
- void setDCFDigest(const string &value);
-
- /**
- * Get the DCF digest value.
- * @return the digest value of DCF.
- */
- const string& getDCFDigest() const;
-
- /**
- * Set encrypted key in asset.
- * @param the encrypted key.
- */
- void setEncryptedKey(const string &key);
-
- /**
- * Get encrypted key.
- * @return encypted key.
- */
- const string& getEncrytedKey() const;
-
- /**
- * Get cek.
- * @return cek.
- */
- const char* getCek() const;
-
- /**
- * Set the retrieval method of key.
- * @param rm the retrieval method of the key.
- */
- void setKeyRetrievalMethod(const string &rm);
-
- /**
- * Set parent content id for asset.
- * @param id the parent content id.
- */
- void setParentContentID(const string &id);
-
- /**
- * Get the parent content id of the asset.
- * @return the parent content id.
- */
- const string& getParentContentID() const;
-
- /**
- * Recover the CEK using private key.
- */
- void recoverCek();
-
-PRIVATE:
- string mAssetID;
- string mContentID;
- string mDigestMethod;
- string mDigestValue;
- string mEncryptedMethod;
- string mEncryptedKey;
- string mRetrievalMethod;
- string mParentContentID;
- string mCek;
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/rights/Constraint.h b/media/libdrm/mobile2/include/rights/Constraint.h
deleted file mode 100644
index bcf5afe..0000000
--- a/media/libdrm/mobile2/include/rights/Constraint.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _CONSTRAINT_H
-#define _CONSTRAINT_H
-
-#include <Drm2CommonTypes.h>
-#include <ustring.h>
-#include <uvector.h>
-using namespace ustl;
-
-struct Context {
- string id;
- string version;
-};
-
-const int INIT_VALUE = -1;
-
-class Constraint {
-public:
- enum MODE {NONE, MOVE, COPY}; /**< export mode type. */
-
- /**
- * Construtor for constraint.
- */
- Constraint();
-
- /**
- * Destructor for constraint.
- */
- ~Constraint();
-
-public:
- /**
- * Test whether constraint is valid or not
- * @param time the specitic time to test.
- * @return true/false to indicate the result.
- */
- bool isValid(long time) const;
-
- /**
- * Test whether constraint is unconstraint or not
- * @return true/false to indicate the result.
- */
- bool isUnConstraint() const;
-
- /**
- * Test whether constraint is datetime related or not.
- * @return true/false to indicate the result.
- */
- bool isDateTimeConstraint() const;
-
- /**
- * Test whether constraint contain interval or not
- * @return true/false to indicate the result.
- */
- bool isIntervalConstraint() const;
-
- /**
- * Test whether constraint is timed count or not
- * @return true/false to indicate the result.
- */
- bool isTimedCountConstraint() const;
-
- /**
- * Set the start time value of constraint.
- * @param time the specific time value.
- */
- void setStartTime(long time);
-
- /**
- * Get the start time.
- * @return value of start time.
- */
- long getStartTime() const;
-
- /**
- * Set the end time.
- * @param time the value of end time.
- */
- void setEndTime(long time);
-
- /**
- * Get the end time.
- * @param return the value of end time.
- */
- long getEndTime() const;
-
- /**
- * Set the accumulated .
- * @param time the specific time.
- */
- void setAccumulated(long time);
-
- /**
- * Get the accumulated.
- * @return the value of accumulated
- */
- long getAccumulated() const;
-
- /**
- * Set the count.
- * @param count the value of count.
- */
- void setCount(int count);
-
- /**
- * Get the count.
- * @return value of count.
- */
- int getCount() const;
-
- /**
- * Set the value of timer.
- * @param timer the value of the timer.
- */
- void setTimer(int timer);
-
- /**
- * Get the timer.
- * @return value of time.
- */
- int getTimer() const;
-
- /**
- * Set the timedCount.
- * @param timedCount the value of timedCount.
- */
- void setTimedCount(int timedCount);
-
- /**
- * Get the timedCount.
- * @return the value of timedCount.
- */
- int getTimedCount() const;
-
- /**
- * Set the interval.
- * @param interval the value of interval.
- */
- void setInterval(int interval);
-
- /**
- * Get the interval.
- * @return the value of interval.
- */
- int getInterval() const;
-
- /**
- * set export mode.
- * @param mode the mode type of export.
- */
- void setExportMode(MODE mode);
-
- /**
- * Get the export mode.
- * @return the export mode.
- */
- MODE getExportMode() const;
-
- /**
- * Consume the constraint.
- * @return true/false to indicate whether consume succesfully or not.
- */
- bool consume();
-
-PRIVATE:
- int mCount; /**< the count. */
- int mTimedCount; /**< timed count. */
- int mTimer; /**< timer for timed count. */
- long mStart; /**< start time. */
- long mEnd; /**< end time. */
- int mInterval; /**< interval. */
- long mAccumulated; /**< accumlated. */
- vector<Context> mSystemList; /**< system list. */
- MODE mExport; /**< export mode. */
-};
-#endif
diff --git a/media/libdrm/mobile2/include/rights/OperationPermission.h b/media/libdrm/mobile2/include/rights/OperationPermission.h
deleted file mode 100644
index 28cba7b..0000000
--- a/media/libdrm/mobile2/include/rights/OperationPermission.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _OPERATIONPERMISSION_H
-#define _OPERATIONPERMISSION_H
-
-#include <Drm2CommonTypes.h>
-#include <rights/Constraint.h>
-
-class OperationPermission {
-public:
- enum OPERATION {NONE, PLAY, DISPLAY, EXECUTE, PRINT, EXPORT, COMMON};
-
- /**
- * Construtor of OperationPermission.
- */
- OperationPermission();
-
- /**
- * Construtor of OperationPermission.
- * @param type the specific operation type.
- * @param cst the constraint related with operation permission.
- */
- OperationPermission(OPERATION type, Constraint* cst=NULL);
-
- /**
- * Destrutor of OperationPermission.
- */
- ~OperationPermission();
-
- /**
- * Set the type for operation permission.
- * @param type the specific type.
- */
- void setType(OPERATION type);
-
- /**
- * Get the type of operation permission.
- * @return operation type.
- */
- OPERATION getType() const;
-
- /**
- * Add constraint for operation permission.
- * @param constraint the constraint related with operation permission.
- */
- void addConstraint(Constraint* constraint);
-
- /**
- * Add constraint for operation permission.
- * @return constraint related with operation permission.
- */
- Constraint* getConstraint() const;
-
-PRIVATE:
- OPERATION mType;
- Constraint* mConstraint;
-
-PRIVATE:
- /**
- * Disable the assignment between OperationPermissions.
- */
- OperationPermission& operator=(const OperationPermission &op);
-
- /**
- * Disable copy construtor.
- */
- OperationPermission(const OperationPermission &op);
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/rights/Right.h b/media/libdrm/mobile2/include/rights/Right.h
deleted file mode 100644
index 347e484..0000000
--- a/media/libdrm/mobile2/include/rights/Right.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _RIGHT_H
-#define _RIGHT_H
-
-#include <Drm2CommonTypes.h>
-#include <uvector.h>
-#include <ustring.h>
-#include <rights/Constraint.h>
-#include <rights/OperationPermission.h>
-using namespace ustl;
-
-class Right {
-public:
- /**
- * Constructor for Right.
- */
- Right();
-
- /**
- * Destructor for Right.
- */
- ~Right();
-
- /**
- * Add the asset id related with right into asset name list.
- * @param id the id of the asset.
- */
- void addAssetID(const string& id);
-
- /**
- * Add a operation permission into right's operation permission list.
- * @param op a pointer of operation permission.
- */
- void addOperationPermission(OperationPermission* op);
-
- /**
- * Get the constraint related with operation type.
- * @param type the specific operation type.
- * @return NULL if not found otherwise the constraint pointer.
- */
- Constraint* getConstraint(OperationPermission::OPERATION type);
-
- /**
- * Test whether the right has specific operation type or not.
- * @param type the specific type.
- * @return true/false to indicate the result.
- */
- bool checkPermission(OperationPermission::OPERATION type);
-
-public:
- vector<string> mAssetNameList;
-
-PRIVATE:
- vector<OperationPermission*> mOpList;
-
-PRIVATE:
-
- /**
- * Disable the assignment between rights.
- */
- Right& operator=(const Right& right);
-
- /**
- * Disable copy constructor.
- */
- Right(const Right& right);
- };
-
-#endif
diff --git a/media/libdrm/mobile2/include/rights/Ro.h b/media/libdrm/mobile2/include/rights/Ro.h
deleted file mode 100644
index 0bf0a97..0000000
--- a/media/libdrm/mobile2/include/rights/Ro.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _RO_H_
-#define _RO_H_
-
-#include <rights/Asset.h>
-#include <rights/Right.h>
-#include <uvector.h>
-#include <ustring.h>
-#include <sistream.h>
-using namespace ustl;
-
-class Asset;
-class XMLDocumentImpl;
-class XMLElementImpl;
-class NodeImpl;
-
-class Ro {
-public:
- enum ERRCODE { RO_NULL_STREAM, RO_ERR_BAD_XML, RO_OK, RO_BAD };
-
- /**
- * Constructor for Ro.
- */
- Ro();
-
- /**
- * Destructor for Ro.
- */
- ~Ro();
-
- /**
- * Set id for Ro.
- * @param id the id of Ro.
- */
- void setRoID(string &id);
-
- /**
- * Get the id of Ro.
- * @return the id of Ro.
- */
- const string& getRoID() const;
-
- /**
- * Set version for Ro.
- */
- void setRoVersion(string &version);
-
- /**
- * Add a asset into ro's asset list.
- * @param asset the pointer of asset.
- */
- void addAsset(Asset* asset);
-
- /**
- * Add a right into ro's right list.
- * @param right the pointer of right.
- */
- void addRight(Right* right);
-
- /**
- * Save the Ro.
- */
- bool save();
-
- /**
- * Verify the Ro.
- */
- bool verify();
-
- /**
- * Parse the ro from stream.
- * @param roStream the input ro stream.
- * @return RO_OK if parse successfully otherwise return error code.
- */
- ERRCODE parse(istringstream *roStream);
-
- /**
- * Check the permission of the content.
- * @param type the operation type.
- * @param contentID the specific contentID.
- * @return true/false to indicate result.
- */
- bool checkPermission(OperationPermission::OPERATION type,
- const string& contentID);
-
- /**
- * Consume the right related to content.
- * @param type the operation type.
- * @param contentID the specific contentID.
- * @return the status of consume.
- */
- ERRCODE consume(OperationPermission::OPERATION type,
- const string& contentID);
-
- /**
- * Get CEK of content.
- * @param contentID the specific content id.
- * @return "" if not found otherwise return CEK.
- */
- string getContentCek(const string& contentID);
-
- /**
- * Get Digest value of content.
- * @param contentID the specific content id.
- * @return "" if not found otherwise return digest value.
- */
- string getContentHash(const string& contentID);
-
-PRIVATE:
- /**
- * Handle the xml dom document.
- * @param doc the pointer to the dom document.
- * @return true/false to indicate the result.
- */
- bool handleDocument(const XMLDocumentImpl* doc);
-
- /**
- * Handle the xml dom node which contains <right> element.
- * @param curNode the dom node which contains <right> element.
- * @return true/false to indicate the result.
- */
- bool handleRights(const NodeImpl *curNode);
-
- /**
- * Handle the xml dom node which contains the <agreement> element.
- * @param curNode the dom node which contains <agreement> element.
- * @return true/false to indicate the result.
- */
- bool handleAgreement(const NodeImpl *curNode);
-
- /**
- * Handle the xml dom node which contains the <asset> element.
- * @param curNode the dom node which contains <asset> element.
- * @return true/false to indicate the result.
- */
- bool handleAsset(const NodeImpl *curNode);
-
- /**
- * Handle the xml dom node which contains the <permission> element.
- * @param curNode the dom node which contains <permission> element.
- * @return true/false to indicate the result.
- */
- bool handlePermission(const NodeImpl *curNode);
-
- /**
- * Get the constraint in xml dom node.
- * @param curNode the dom node which contains constraint.
- * @return the constraint.
- */
- Constraint* getConstraint(const NodeImpl *curNode);
-
- /**
- * Convert ISO8601 time to long.
- * @param ts the string with ISO8601 time.
- * @return the result value.
- */
- long convertISO8601DateTimeToLong(const char* ts);
-
- /**
- * Convert ISO8601 period to long.
- * @param ts the string with ISO8601 period.
- * @return the result value.
- */
- long convertISO8601PeriodToLong(const char* ts);
-
- /**
- * Load the rights related with specific contentinto content rights list.
- * @param contentID the specific content id.
- */
- void loadRights(const string& contentID);
-
- /**
- * Free the current content rights list.
- */
- void freeRights();
-
-PRIVATE:
- /**
- * Disable the assignment between rights.
- */
- Ro& operator=(const Ro& ro);
-
- /**
- * Disable copy constructor.
- */
- Ro(const Ro& ro);
-
-public:
- vector<Asset*> mAssetList;
- vector<Right*> mRightList;
-
-PRIVATE:
- string mRoID; /** the Ro id. */
- string mRoVersion; /** the Ro version. */
- XMLDocumentImpl *mDoc; /**< the xml document handle. */
- vector<Right*> mContentRightList; /**< the right list to store the result related with specific content. */
- Right* mProperRight; /**< the right to consume. */
-};
-#endif
diff --git a/media/libdrm/mobile2/include/rights/RoManager.h b/media/libdrm/mobile2/include/rights/RoManager.h
deleted file mode 100644
index 71e9eef..0000000
--- a/media/libdrm/mobile2/include/rights/RoManager.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _ROMANAGER_H
-#define _ROMANAGER_H
-
-#include <Drm2CommonTypes.h>
-#include <ustring.h>
-#include <rights/Ro.h>
-
-using namespace ustl;
-
-class RoManager {
-
-public:
- /**
- * Singleton instance function.
- * @return the singleton pointer.
- */
- static RoManager* Instance();
-
- /**
- * Destructor for ExpatWrapper.
- */
- ~RoManager();
-
- /**
- * Install Ro from stream.
- * @param roStream the input ro stream.
- * @return the status of installaltion.
- */
- Ro::ERRCODE installRo(istringstream *roStream);
-
- /**
- * Check whether Ro in cache or not.
- * @param roID the specific roID.
- * @return true/false to indicate result.
- */
- bool checkRoInCache(const string& roID);
-
- /**
- * Get the ro.
- * @param roID the specific id of ro.
- * @return NULL if not found otherwise return ro.
- */
- Ro* getRo(const string& roID);
-
- /**
- * Get all the Ro.
- * @return ro list.
- */
- vector<Ro*> getAllRo();
-
- /**
- * Get ro which contained rights of specific content.
- * @param contentID the specific id of content.
- * @return NULL if not fount otherwise the related ro.
- */
- Ro* getRoByContentID(const string& contentID);
-
- /**
- * Delete Ro by its id.
- * @param roID the specific roID.
- * @return true/false to indicate the result.
- */
- bool deleteRo(const string& roID);
-
-
-PRIVATE:
- /**
- * Constructor for RoManager.
- */
- RoManager();
-
-PRIVATE:
- static RoManager* msInstance; /**< singleton instance pointer. */
- vector<Ro*> mRoList; /**< the ro list. */
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/roap/Registration.h b/media/libdrm/mobile2/include/roap/Registration.h
deleted file mode 100644
index 0beed8e..0000000
--- a/media/libdrm/mobile2/include/roap/Registration.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _REGISTRATION_
-#define _REGISTRATION_
-
-#include <roap/RoapMessageHandler.h>
-
-class Registration : public RoapMessageHandler
-{
-public:
- /**
- * Constructor for Registration.
- * @param type the address of RI.
- */
- Registration(string riAddres);
-
- /**
- * Registration with the RI.
- * @return the result of registration.
- */
- int16_t registerWithRI();
-
- /**
- * Create one specified client message based on message template xml file.
- * @param type the message type.
- * @return the pointer of the document object of the message if successful,otherwise
- * return NULL.
- */
- XMLDocumentImpl* createClientMsg(int16_t type);
-}
-#endif _REGISTRATION_
diff --git a/media/libdrm/mobile2/include/roap/RoapMessageHandler.h b/media/libdrm/mobile2/include/roap/RoapMessageHandler.h
deleted file mode 100644
index c31047f..0000000
--- a/media/libdrm/mobile2/include/roap/RoapMessageHandler.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _ROAPMESSAGEHADLER_
-#define _ROAPMESSAGEHADLER_
-
-#include <Drm2CommonTypes.h>
-#include <util/xml/XMLDocumentImpl.h>
-
-class RoapMessageHandler
-{
-public:
- /**
- * define all the client message types.
- */
- enum msgType {DeviceHello=1,RegistrationRequest,RORequest};
-
- /**
- * Constructor for DrmManager,used to open local dcf file.
- * @param type the message type.
- */
- RoapMessageHandler();
-
- /**
- * Create one specified client message based on message template xml file.
- * @param type the message type.
- * @return the pointer of the document object of the message if successful,otherwise
- * return NULL.
- */
- XMLDocumentImpl* createClientMsg(msgType type);
-
- /**
- * Handle received message from RI.
- * @return true if successful, otherwise return false.
- */
- bool handlePeerMsg();
-
- /**
- * Send the client message to RI
- */
- int16_t send();
-
- /**
- * Receive message from RI and parse it
- * @return the pointer of the parsed document.
- */
- XMLDocumentImpl* receive();
-
-PROTECTED:
- XMLDocumentImpl * mDoc;
-PRIVATE:
- int16_t mMsgType;
-};
-#endif //_ROAPMESSAGEHADLER_
diff --git a/media/libdrm/mobile2/include/util/crypto/DrmCrypto.h b/media/libdrm/mobile2/include/util/crypto/DrmCrypto.h
deleted file mode 100644
index 10e7bc1..0000000
--- a/media/libdrm/mobile2/include/util/crypto/DrmCrypto.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DRMCRYPTO_H_
-#define _DRMCRYPTO_H_
-
-#include <Drm2CommonTypes.h>
-#include <openssl/aes.h>
-#include <openssl/hmac.h>
-#include <openssl/sha.h>
-#include <openssl/rsa.h>
-
-// AES encrypt mode
-typedef enum {AES_128_CBC = 0x01,AES_128_CTR = 0x02}AesMode;
-
-// aes crypto for decrypt
-class AesAgent
-{
- public:
- AesAgent(const AesMode method,const unsigned char* decryptedKey)
- :mode(method),AesKey(decryptedKey){};
-
- /**
- * decrypt data using AES, now only support 128 bits CBC
- * \param iv 128 bits initialization vector/counter
- * prefixing the ciphertext
- * \param encData encrypted data
- * \param encLen the length of encData
- * \param decData the buffer to store decrypted data
- * \param decLen the actual length of decrypted data
- * \return
- * >= succeed, the padding length
- * < 0 failed
- */
- int32_t decContent( unsigned char* iv,
- const unsigned char* encData,
- const unsigned long encLen,
- unsigned char* decData);
- static const int32_t AES_DEC_FAILED = -1;
-
- PRIVATE:
- static const uint32_t AES_KEY_BITS = 128;
- const AesMode mode;
- const unsigned char* AesKey;
-
- PRIVATE:
- // get the actual length of decrypt data
- void discardPaddingByte(unsigned char* decryptedBuf,unsigned long* decryptedBufLen);
-};
-
-// Sha1 crypto for hash
-class Sha1Agent
-{
- public:
- /**
- * compute hash using Sha1
- * \param inData the data to be hashed
- * \param inLen the length of inData
- * \param outHash the hash of inData
- * \return none
- */
- void computeHash( const unsigned char* inData,
- unsigned long inLen,
- unsigned char* outHash) const;
-
- /**
- * get the length of SHA1 hash
- * \param none
- * \return
- * the length of SHA1 hash
- */
- unsigned long getShaLen(void) const
- {
- return SHA_DIGEST_LENGTH;
- }
-};
-
-// Hmac-Sha1 crypto for MAC
-class HmacSha1Agent
-{
- public:
- HmacSha1Agent(const unsigned char* Key, int key_len)
- :macKey(Key),keyLen(key_len){};
-
- /**
- * compute MAC using Hmac-Sha1
- * \param inData the data to be MAC
- * \param inLen the length of inData
- * \param outMac the MAC of inData
- * \return none
- */
- void computeMac( const unsigned char* inData,
- unsigned long inLen,
- unsigned char* outMac) const;
-
- /**
- * get the length of HMAC-SHA1 MAC
- * \param none
- * \return
- * the length of HMAC-SHA1 MAC
- */
- unsigned long getHmacLen(void) const
- {
- return SHA_DIGEST_LENGTH;
- }
-
- PRIVATE:
- const unsigned char* macKey;
- const int keyLen;
-};
-
-// Rsa crypto for signature,verify signature and key transport
-class RsaAgent
-{
- public:
- RsaAgent(RSA& Key):rsaKey(Key)
- {
- rsaSize = (unsigned int)RSA_size(&Key);
- };
-
- // signature algorithm
- typedef enum {RSA_PSS,RSA_SHA1}RsaAlg;
-
- /**
- * Do signature using RSA-PSS
- * \param rawData the data to be signature
- * \param rawLen the length of inData
- * \param sigData the buffer to store the signature of rawData
- * \param sigAlg signature algorithm
- * \return
- * true succeed
- * false failed
- */
- bool signature( const unsigned char* rawData,
- const unsigned long rawLen,
- unsigned char* sigData,
- const RsaAlg sigAlg);
-
- /**
- * get the length of signature
- * \param none
- * \return
- * the length of signature
- */
- unsigned int getSigLen(void) const
- {
- return rsaSize;
- }
-
- /**
- * Verify signature using RSA-PSS
- * \param sigData the data to be verify
- * \param sigLen the length of sigData
- * \param rawData the data from which the sigData generated
- * \param rawLen the length of rawData
- * \param sigAlg signature algorithm
- * \return
- * true succeed
- * false failed
- */
- bool sigVerify(unsigned char* sigData,
- unsigned long sigLen,
- const unsigned char* rawData,
- const unsigned long rawLen,
- const RsaAlg sigAlg);
-
-
- /**
- * Decrypt data using RSA
- * \param encData encrypted data
- * \param encLen the length of encData
- * \param decData the buffer to store decrypted data
- * \return
- * -1 decrypted failed
- * >0 the actual length of decrypted data
- */
- int decrypt( const unsigned char* encData,
- const unsigned long encLen,
- unsigned char* decData);
-
- /**
- * get the length of decrypted data
- * \param none
- * \return
- * the length of decrypted data
- */
- unsigned int getDecLen(void) const
- {
- return rsaSize;
- }
-
- PRIVATE:
- RSA& rsaKey;
- unsigned int rsaSize;
-};
-
-
-#endif /* _DRMCRYPTO_H_ */
diff --git a/media/libdrm/mobile2/include/util/domcore/CharacterDataImpl.h b/media/libdrm/mobile2/include/util/domcore/CharacterDataImpl.h
deleted file mode 100644
index d1ab31e..0000000
--- a/media/libdrm/mobile2/include/util/domcore/CharacterDataImpl.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __CHARACTER_IMPL__
-#define __CHARACTER_IMPL__
-
-#include "NodeImpl.h"
-#include "DOMString.h"
-
-class CharacterDataImpl : public NodeImpl
-{
-private:
- DOMString* charData;
-public:
-
- /**
- * Default Constructor for CharacterDataImpl.
- */
- CharacterDataImpl();
-
- /**
- * Constructor for CharacterDataImpl.
- * @param data The specify character data.
- */
- CharacterDataImpl(const DOMString* data);
-
- /**
- * The character data of the node that implements this interface. The DOM
- * implementation may not put arbitrary limits on the amount of data
- * that may be stored in a <code>CharacterData</code> node. However,
- * implementation limits may mean that the entirety of a node's data may
- * not fit into a single <code>DOMString</code>. In such cases, the user
- * may call <code>substringData</code> to retrieve the data in
- * appropriately sized pieces.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
- * @exception DOMException
- * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
- * fit in a <code>DOMString</code> variable on the implementation
- * platform.
- * @return the character data.
- */
- const DOMString* getData() const throw (DOMException);
-
- /**
- * The character data of the node that implements this interface. The DOM
- * implementation may not put arbitrary limits on the amount of data
- * that may be stored in a <code>CharacterData</code> node. However,
- * implementation limits may mean that the entirety of a node's data may
- * not fit into a single <code>DOMString</code>. In such cases, the user
- * may call <code>substringData</code> to retrieve the data in
- * appropriately sized pieces.
- * @param data the specify character data.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
- * @exception DOMException
- * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
- * fit in a <code>DOMString</code> variable on the implementation
- * platform.
- */
- void setData(const DOMString* data) throw (DOMException);
-
- /**
- * The number of 16-bit units that are available through <code>data</code>
- * and the <code>substringData</code> method below. This may have the
- * value zero, i.e., <code>CharacterData</code> nodes may be empty.
- * @return the size of characters data.
- */
- int getLength() const;
-
- /**
- * Append the string to the end of the character data of the node. Upon
- * success, <code>data</code> provides access to the concatenation of
- * <code>data</code> and the <code>DOMString</code> specified.
- * @param arg The <code>DOMString</code> to append.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
- */
- void appendData(const DOMString* arg) throw(DOMException);
-
- /** Override getNodeValue() method in NodeImpl.h.*/
- const DOMString* getNodeValue() const throw(DOMException);
-
- /** Override setNodeValue() method in NodeImpl.h */
- void setNodeValue(DOMString* nodeValue) throw(DOMException);
-
- ~CharacterDataImpl();
-};
-#endif /*__CHARACTER_IMPL__*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/DOMException.h b/media/libdrm/mobile2/include/util/domcore/DOMException.h
deleted file mode 100644
index 416519b..0000000
--- a/media/libdrm/mobile2/include/util/domcore/DOMException.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_EXCEPTION__
-#define __DOM_EXCEPTION__
-
-#include <uexception.h>
-using namespace ustl;
-
-/**
- * DOM operations only raise exceptions in "exceptional" circumstances, i.e.,
- * when an operation is impossible to perform (either for logical reasons, because data is lost,
- * or because the implementation has become unstable). In general, DOM methods return specific error
- * values in ordinary processing situations, such as out-of-bound errors when using <code>NodeList</code>.
- * <p>Implementations should raise other exceptions under other circumstances. For example, implementations
- * should raise an implementation-dependent exception if a null argument is passed.
- * Some languages and object systems do not support the concept of exceptions.
- * For such systems, error conditions may be indicated using native error reporting mechanisms.
- * For some bindings, for example, methods may return error codes similar to those listed in the corresponding
- * method descriptions.
- */
-class DOMException : public exception {
-
- private:
- short code;
- public:
- DOMException(short code)
- {
- this->code = code;
- }
- public:
-
- enum ExceptionReason {
- /**
- * If index or size is negative, or greater than the allowed value
- */
- INDEX_SIZE_ERR = 1,
-
- /**
- * If the specified range of text does not fit into a DOMString
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- DOMSTRING_SIZE_ERR = 2,
- /**
- * If any node is inserted somewhere it doesn't belong
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- HIERARCHY_REQUEST_ERR = 3,
-
- /**
- * If a node is used in a different document than the one that created it
- * (that doesn't support it)
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- WRONG_DOCUMENT_ERR = 4,
-
- /**
- * If an invalid or illegal character is specified, such as in a name. See
- * production 2 in the XML specification for the definition of a legal
- * character, and production 5 for the definition of a legal name
- * character.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- INVALID_CHARACTER_ERR = 5,
-
- /**
- * If data is specified for a node which does not support data
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- NO_DATA_ALLOWED_ERR = 6,
-
- /**
- * If an attempt is made to modify an object where modifications are not
- * allowed
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- NO_MODIFICATION_ALLOWED_ERR = 7,
-
- /**
- * If an attempt is made to reference a node in a context where it does
- * not exist
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- NOT_FOUND_ERR = 8,
-
- /**
- * If the implementation does not support the requested type of object or
- * operation.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- NOT_SUPPORTED_ERR = 9,
-
- /**
- * If an attempt is made to add an attribute that is already in use
- * elsewhere
- */
- INUSE_ATTRIBUTE_ERR = 10,
-
- /**
- * If an attempt is made to use an object that is not, or is no longer,
- * usable.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- INVALID_STATE_ERR = 11,
-
- /**
- * If an invalid or illegal string is specified.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- SYNTAX_ERR = 12,
-
- /**
- * If an attempt is made to modify the type of the underlying object.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- INVALID_MODIFICATION_ERR = 13,
-
- /**
- * If an attempt is made to create or change an object in a way which is
- * incorrect with regard to namespaces.
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- NAMESPACE_ERR = 14,
-
- /**
- * If a parameter or an operation is not supported by the underlying
- * object.
- * @since http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
- */
- INVALID_ACCESS_ERR = 15,
- };
-public:
- /**
- * Return the exception reason.
- * @return the exception reason.
- */
- short getCode() const
- {
- return code;
- }
-};
-#endif /*__DOMEXCEPTION__*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/DOMString.h b/media/libdrm/mobile2/include/util/domcore/DOMString.h
deleted file mode 100644
index f6f2b14..0000000
--- a/media/libdrm/mobile2/include/util/domcore/DOMString.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_STRING_H__
-#define __DOM_STRING_H__
-
-#include <ustring.h>
-using namespace ustl;
-typedef string DOMString;
-
-const DOMString emptyString = DOMString("");
-
-#endif /*__DOM_STRING_H_*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/DocumentImpl.h b/media/libdrm/mobile2/include/util/domcore/DocumentImpl.h
deleted file mode 100644
index b003e2a..0000000
--- a/media/libdrm/mobile2/include/util/domcore/DocumentImpl.h
+++ /dev/null
Binary files differ
diff --git a/media/libdrm/mobile2/include/util/domcore/ElementImpl.h b/media/libdrm/mobile2/include/util/domcore/ElementImpl.h
deleted file mode 100644
index 2b0bc45..0000000
--- a/media/libdrm/mobile2/include/util/domcore/ElementImpl.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_ELEMENT_IMPL__
-#define __DOM_ELEMENT_IMPL__
-#include "NodeImpl.h"
-#include "NodeListImpl.h"
-#include "NodeType.h"
-
-class ElementImpl : public NodeImpl
-{
-public:
-
- /**
- * The name of the element. For example, in:
- * <pre> <elementExample
- * id="demo"> ... </elementExample> , </pre>
- * <code>tagName</code> has
- * the value <code>"elementExample"</code>. Note that this is
- * case-preserving in XML, as are all of the operations of the DOM. The
- * HTML DOM returns the <code>tagName</code> of an HTML element in the
- * canonical uppercase form, regardless of the case in the source HTML
- * document.
- * @return the element's tag name.
- */
- virtual const DOMString* getTagName() const;
-
- /**
- * Retrieves an attribute value by name.
- * @param name The name of the attribute to retrieve.
- * @return The <code>Attr</code> value as a string, or the empty string
- * if that attribute does not have a specified or default value.
- */
- virtual const DOMString* getAttribute(const DOMString* name) const;
-
- /**
- * Adds a new attribute. If an attribute with that name is already present
- * in the element, its value is changed to be that of the value
- * parameter. This value is a simple string; it is not parsed as it is
- * being set. So any markup (such as syntax to be recognized as an
- * entity reference) is treated as literal text, and needs to be
- * appropriately escaped by the implementation when it is written out.
- * In order to assign an attribute value that contains entity
- * references, the user must create an <code>Attr</code> node plus any
- * <code>Text</code> and <code>EntityReference</code> nodes, build the
- * appropriate subtree, and use <code>setAttributeNode</code> to assign
- * it as the value of an attribute.
- * <br>To set an attribute with a qualified name and namespace URI, use
- * the <code>setAttributeNS</code> method.
- * @param name The name of the attribute to create or alter.
- * @param value Value to set in string form.
- * @exception DOMException
- * INVALID_CHARACTER_ERR: Raised if the specified name contains an
- * illegal character.
- * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
- */
- virtual void setAttribute(const DOMString* name, const DOMString* value) throw (DOMException);
-
- /**
- * Removes an attribute by name. If the removed attribute is known to have
- * a default value, an attribute immediately appears containing the
- * default value as well as the corresponding namespace URI, local name,
- * and prefix when applicable.
- * <br>To remove an attribute by local name and namespace URI, use the
- * <code>removeAttributeNS</code> method.
- * @param name The name of the attribute to remove.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
- */
- virtual void removeAttribute(const DOMString* name) throw (DOMException);
-
- /**
- * Returns a <code>NodeList</code> of all descendant <code>Elements</code>
- * with a given tag name, in the order in which they are encountered in
- * a preorder traversal of this <code>Element</code> tree.
- * @param name The name of the tag to match on. The special value "*"
- * matches all tags.
- * @return A list of matching <code>Element</code> nodes.
- */
- NodeListImpl* getElementsByTagName(const DOMString* name) const;
-
- /** Override getNodeType() method in NodeImpl.h.*/
- virtual bool hasAttributes() const;
-
- /** Override getNodeName() method in NodeImpl.h.*/
- const DOMString* getNodeName() const;
-
- /** Override getNodeType() method in NodeImpl.h.*/
- NodeType getNodeType() const;
-
- /** Defining "click()" method*/
- virtual void click(){}
-
- /** Defining "blur()" method,*/
- virtual void blur(){}
-
- /** Defining "focus()" method*/
- virtual void focus(){}
-
- /** Defining "change()" method*/
- virtual void change(){}
-
- /** Defining "select()" method*/
- virtual void select(){}
-
- /** Defining "onClick()" event input,textarea,button, and anchor*/
- virtual bool onClick(){return true;}
-
- /** Defining "onBlur()" event,for input,textarea,button,anchor and select */
- virtual bool onBlur(){return true;}
-
- /** Defining "onFocus()" event,for input,textarea,button,anchor and select*/
- virtual bool onFocus(){return true;}
-
- /** Defining "onChange()" event,for input,textarea and select tag*/
- virtual bool onChange(){return true;}
-
- /** Defining "onSelect()" event,for textarea and input*/
- virtual bool onSelect(){return true;}
-
- /**
- * when the end tag of one element is found,this method would be called.The basic action is call seCompleted().
- **/
- virtual void endElement() {}
-
-private:
- /**
- * Get elements whose name match on <code>name</code>,than keep they into <code>nodeList</code>.
- * @param name The tag name of the elements to match on.
- * @param nodeList keep all the matched element.
- */
- void getElementsByTagName(const DOMString* name,NodeListImpl* nodeList) const;
-};
-#endif /*__DOM_ELEMENT_IMPL__*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/NodeImpl.h b/media/libdrm/mobile2/include/util/domcore/NodeImpl.h
deleted file mode 100644
index 10423c3..0000000
--- a/media/libdrm/mobile2/include/util/domcore/NodeImpl.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_NODE_IMPL__
-#define __DOM_NODE_IMPL__
-
-#include "DOMException.h"
-#include "NodeType.h"
-#include "DOMString.h"
-class LayoutAttr;
-class DocumentImpl;
-class NodeImpl {
-private:
- /** The pointer to first children */
- NodeImpl* firstChild;
-
- /** The pointer to lastChild children */
- NodeImpl* lastChild;
-
- /** The pointer to previous sibling children */
- NodeImpl* previousSibling;
-
- /** The pointer to next sibling children */
- NodeImpl* nextSibling;
-
- /** The pointer to parent */
- NodeImpl* parent;
-
- /** Current node's document context */
- const DocumentImpl* document;
-
- /**
- * Add next slibing node
- * @param node the node to be add.
- */
- void appendNextSibling(NodeImpl* node);
-
-public:
- /**
- * Default constuctor.
- */
- NodeImpl(): firstChild(NULL),lastChild(NULL),previousSibling(NULL),nextSibling(NULL),parent(NULL),document(NULL) {};
-
- /**
- * Set <code>parentNode</code> as current node's parent.
- *
- * @param parentNode The specify parent node.
- */
- void setParent(NodeImpl* parentNode);
-
- /**
- * Set the node immediately following node.
- *
- * @param siblingNode The special node be insert after current node.
- */
- void setNextSibling(NodeImpl* siblingNode);
-
- /**
- * Returns the node immediately preceding this node.
- *
- * @param siblingNode The special node be insert before current node.
- */
- void setPreviousSibling(NodeImpl* siblingNode);
-
- /**
- * Set <code>childNode</code> as current node's first children. If current
- * node have first child node,it will replace with the <code>childNode</code>.
- *
- * @param childNode The special node be set as the first children node of current
- * node.
- */
- void setFirstChild(NodeImpl* childNode);
-
- /**
- * Set <code>childNode</code> as current node's last children. If current
- * node have last child node,it will replace with the <code>childNode</code>.
- *
- * @param childNode The special node be set as the last children node of current
- * node.
- */
- void setLastChild(NodeImpl* childNode);
-
- /**
- * The name of this node, depending on its type;
- * @return the node's name.
- */
- virtual const DOMString* getNodeName() const = 0;
-
- /**
- * The value of this node, depending on its type;
- * When it is defined to be <code>null</code>, setting it has no effect.
- * @return the value of node.
- * @exception DOMException
- * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
- * fit in a <code>DOMString</code> variable on the implementation
- * platform.
- */
- virtual const DOMString* getNodeValue() const throw (DOMException);
-
- /**
- * Set the node value.
- * @param nodeValue the node value
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
- */
- virtual void setNodeValue(DOMString* nodeValue) throw (DOMException);
-
- /**
- * A code representing the type of the underlying object, as defined above.
- * @return the node's type.
- */
- virtual NodeType getNodeType() const = 0;
-
- /**
- * Returns whether this node (if it is an element) has any attributes.
- * @return <code>true</code> if this node has any attributes,
- * <code>false</code> otherwise.
- * @since DOM Level 2
- */
- virtual bool hasAttributes() const;
-
- /**
- * The parent of this node. All nodes, except <code>Attr</code>,
- * <code>Document</code>, <code>DocumentFragment</code>,
- * <code>Entity</code>, and <code>Notation</code> may have a parent.
- * However, if a node has just been created and not yet added to the
- * tree, or if it has been removed from the tree, this is
- * <code>NULL</code>.
- * @return return current node's parent.
- */
- NodeImpl* getParentNode() const;
-
- /**
- * The first child of this node. If there is no such node, this returns
- * <code>NULL</code>.
- * @return current node first children.
- */
- NodeImpl* getFirstChild() const;
-
- /**
- * The last child of this node. If there is no such node, this returns
- * <code>NULL</code>.
- * @return current node last children.
- */
- NodeImpl* getLastChild() const;
-
- /**
- * The node immediately preceding this node. If there is no such node,
- * this returns <code>NULL</code>.
- * @return current node previous sibling children.
- */
- NodeImpl* getPreviousSibling() const;
-
- /**
- * The node immediately following this node. If there is no such node,
- * this returns <code>NULL</code>.
- * @return return current node next sibling children.
- */
- NodeImpl* getNextSibling() const;
-
- /**
- * Inserts the node <code>newChild</code> before the existing child node
- * <code>refChild</code>. If <code>refChild</code> is <code>NULL</code>,
- * insert <code>newChild</code> at the end of the list of children.
- * <br>If <code>newChild</code> is a <code>DocumentFragment</code> object,
- * all of its children are inserted, in the same order, before
- * <code>refChild</code>. If the <code>newChild</code> is already in the
- * tree, it is first removed.
- * @param newChild The node to insert.
- * @param refChild The reference node, i.e., the node before which the
- * new node must be inserted.
- * @return The node being inserted.
- * @exception DOMException
- * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
- * allow children of the type of the <code>newChild</code> node, or if
- * the node to insert is one of this node's ancestors or this node
- * itself.
- * <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
- * from a different document than the one that created this node.
- * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
- * if the parent of the node being inserted is readonly.
- * <br>NOT_FOUND_ERR: Raised if <code>refChild</code> is not a child of
- * this node.
- */
- NodeImpl* insertBefore(NodeImpl* newChild, NodeImpl* refChild) throw (DOMException);
-
- /**
- * Removes the child node indicated by <code>oldChild</code> from the list
- * of children, and returns it.
- * @param oldChild The node being removed.
- * @return The node removed.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
- * <br>NOT_FOUND_ERR: Raised if <code>oldChild</code> is not a child of
- * this node.
- */
- NodeImpl* removeChild(NodeImpl* oldChild) throw (DOMException);
-
- /**
- * Adds the node <code>newChild</code> to the end of the list of children
- * of this node. If the <code>newChild</code> is already in the tree, it
- * is first removed.
- * @param newChild The node to add.If it is a
- * <code>DocumentFragment</code> object, the entire contents of the
- * document fragment are moved into the child list of this node
- * @return The node added.
- * @exception DOMException
- * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
- * allow children of the type of the <code>newChild</code> node, or if
- * the node to append is one of this node's ancestors or this node
- * itself.
- * <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
- * from a different document than the one that created this node.
- * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
- * if the previous parent of the node being inserted is readonly.
- */
- NodeImpl* appendChild(NodeImpl* newChild) throw (DOMException);
-
- /**
- * Returns whether this node has any children.
- * @return <code>true</code> if this node has any children,
- * <code>false</code> otherwise.
- */
- bool hasChildNodes() const;
-
- virtual ~NodeImpl() {};
-
- /**
- * Get the LayoutAttr of this node
- * @return the pointer to LayoutAttr
- */
- virtual LayoutAttr* getLayoutAttr() const { return NULL;}
-
- /**
- * Set the LayoutAttr of this node
- * @param attr the attributes to be set
- * @return void
- */
- virtual void setLayoutAttr(LayoutAttr* attr) { return;}
-
- /**
- * Set document context.
- * @param document The specify document context.
- */
- void setDocument(const DocumentImpl* document);
-
- /**
- * Get document context.
- * @return the current node's document context.
- */
- const DocumentImpl* getDocument() const;
-};
-#endif /*__DOM_NODE_IMPL__*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/NodeIterator.h b/media/libdrm/mobile2/include/util/domcore/NodeIterator.h
deleted file mode 100644
index 06fda28..0000000
--- a/media/libdrm/mobile2/include/util/domcore/NodeIterator.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_NODE_ITERATOR__
-#define __DOM_NODE_ITERATOR__
-class NodeImpl;
-/**
- * The Iterator is used to visit DOM_TREE.
- * <code>Attention</code>:The Iterator is not safe.
- * When the caller using the Iterator to access the tree,
- * the underlying data was modified, the next() or prev() may not return the right result.
- * means we have a <code>restriction</code>: the Iterator can only be used in the case that the tree structure will
- * not be modified before the end of iteration.
- */
-class NodeIterator {
-private:
- NodeImpl* scopeNode;/** The specify the range of iterating */
- NodeImpl* endNode; /** The specify the end position of iterating */
- NodeImpl* curNode; /** The position of current node.*/
-
- /**
- * Find the specify node's next order node.
- * @param node The specify node.
- * @return The next order node when success.
- * NULL when has an error.
- */
- NodeImpl* findNextOrderNode(NodeImpl* node);
-
- /**
- * Find the specify node's previous order node.
- * @param node The specify node.
- * @return The previous order node when success.
- * NULL when has an error.
- */
- NodeImpl* findPreviousOrderNode(NodeImpl* node);
-public:
- /**
- * Construct for NodeIterator.
- * we must specify <code>start</code> value when we want iterate the DOM_TREE.
- * and we also can specify the <code>scope</code> if want restrict the range of iterator.
- * (eg: restrict the range of iterating at a subtree).otherwise it will iterate the whole DOM_TREE.
- * @param start The start position.
- * @param scope The scope of iterating.
- * @param end The end position of iterating.
- */
- NodeIterator(NodeImpl* start, NodeImpl* scope = NULL, NodeImpl* end = NULL);
-
- /**
- * Get next order node at current position in DOM_TREE.
- * @return NULL On there is not node can be get.
- * The pointer of node On can get next node.
- */
- NodeImpl* next();
-
- /**
- * Get next order node at current position in DOM_TREE.
- * @return NULL On there is not node can be get.
- * The pointer of node On can get previous node.
- */
- NodeImpl* prev();
-};
-#endif /* __DOM_NODE_ITERATOR__ */
diff --git a/media/libdrm/mobile2/include/util/domcore/NodeListImpl.h b/media/libdrm/mobile2/include/util/domcore/NodeListImpl.h
deleted file mode 100644
index 07c0a6a..0000000
--- a/media/libdrm/mobile2/include/util/domcore/NodeListImpl.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __NODE_LIST_IMPL__
-#define __NODE_LIST_IMPL__
-
-#include "NodeImpl.h"
-#include "Vector.h"
-class NodeListImpl {
-private:
- vector<const NodeImpl*> nodeList;
-public:
- /**
- * Add a special node into list.
- * @param newNode specify component.
- */
- void append(const NodeImpl* newNode);
-
- /**
- * Return The special position node pointer.
- * @param index The special position.
- * @return The node's pointer on success.
- * NULL when out of list's boundary.
- */
- const NodeImpl* item(int index) const;
-
- /**
- * Return the length of list.
- * @return the length of list.
- */
- int getLength() const;
-
- ~NodeListImpl();
-};
-#endif /*__NODE_LIST_IMPL__ */
-
diff --git a/media/libdrm/mobile2/include/util/domcore/NodeType.h b/media/libdrm/mobile2/include/util/domcore/NodeType.h
deleted file mode 100644
index 0e51a63..0000000
--- a/media/libdrm/mobile2/include/util/domcore/NodeType.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_NODE_TYPE__
-#define __DOM_NODE_TYPE__
-enum NodeType {
- /**
- * The node is an <code>Element</code>.
- */
- ELEMENT_NODE = 1,
- /**
- * The node is an <code>Attr</code>.
- */
- ATTRIBUTE_NODE = 2,
- /**
- * The node is a <code>Text</code> node.
- */
- TEXT_NODE = 3,
- /**
- * The node type is CDATASection.
- */
- CDATA_SECTION_NODE = 4,
- /**
- * The node type is an EntityReference.
- */
- ENTITY_REFERENCE_NODE = 5,
- /**
- * The node type is an <code>Entity</code>.
- */
- ENTITY_NODE = 6,
- /**
- * The node type is a ProcessingInstruction.
- */
- PROCESSING_INSTRUCTION_NODE = 7,
- /**
- * The node is a Comment
- */
- COMMENT_NODE = 8,
- /**
- * The node is a Document.
- */
- DOCUMENT_NODE = 9,
- /**
- * The node is a DocumentType.
- */
- DOCUMENT_TYPE_NODE = 10,
- /**
- * The node is a DocumentFragment.
- */
- DOCUMENT_FRAGMENT_NODE = 11,
- /**
- * The node is a Notation.
- */
- NOTATION_NODE = 12,
-};
-#endif
diff --git a/media/libdrm/mobile2/include/util/domcore/TextImpl.h b/media/libdrm/mobile2/include/util/domcore/TextImpl.h
deleted file mode 100644
index fc55fcd..0000000
--- a/media/libdrm/mobile2/include/util/domcore/TextImpl.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __DOM_TEXT_IMPL__
-#define __DOM_TEXT_IMPL__
-#include "CharacterDataImpl.h"
-class TextImpl:public CharacterDataImpl
-{
-private:
- const static DOMString nodeName;
-public:
- /** Text default constructor for TextImpl.*/
- TextImpl();
-
- /**
- * Constructor for TextImpl
- * @param data The specify data to be set.
- */
- TextImpl(const DOMString* data);
-
- /** Override getNodeType method in NodeImpl.h */
- NodeType getNodeType() const;
-
- /** Override getNodeName method in NodeImpl.h */
- const DOMString* getNodeName() const;
-};
-#endif /*__DOM_TEXT_IMPL__*/
-
diff --git a/media/libdrm/mobile2/include/util/domcore/stack.h b/media/libdrm/mobile2/include/util/domcore/stack.h
deleted file mode 100644
index cfcf4e5..0000000
--- a/media/libdrm/mobile2/include/util/domcore/stack.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __STACK_H__
-#define __STACK_H__
-#include <ustack.h>
-using namespace ustl;
-#endif /*__STACK_H__*/
-
diff --git a/media/libdrm/mobile2/include/util/xml/DomExpatAgent.h b/media/libdrm/mobile2/include/util/xml/DomExpatAgent.h
deleted file mode 100644
index 9972d5b..0000000
--- a/media/libdrm/mobile2/include/util/xml/DomExpatAgent.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DOMEXPATAGENT_
-#define _DOMEXPATAGENT_
-
-#include <Drm2CommonTypes.h>
-#include <ofstream.h>
-#include <sostream.h>
-#include <ustring.h>
-#include <sistream.h>
-#include <util/domcore/NodeImpl.h>
-#include <util/domcore/DOMString.h>
-#include "ExpatWrapper.h"
-#include "XMLElementImpl.h"
-#include "XMLDocumentImpl.h"
-using namespace ustl;
-
-class DomExpatAgent : public ExpatWrapper {
-public:
- /**
- * Constructor for DomExpatAgent.
- * @param xmlDocPtr XMLDocument pointer.
- */
- DomExpatAgent(XMLDocumentImpl* xmlDocPtr);
-
- /** Destructor for DomExpatAgent. */
- ~DomExpatAgent();
-
- /**
- * Generate XML DOM Document from XML source.
- * @param <code>xmlStream</code> the XML source stream.
- * @return ture or false to indicate whether generate successfully.
- */
- bool generateDocumentFromXML(istringstream *xmlStream);
-
- /**
- * Generate XML stream from XML DOM document.
- * @return xml stream.
- */
- ostringstream* generateXMLFromDocument();
-
- /**
- * deal with start element in Expat.
- */
- virtual void startElement(const XML_Char *name,
- const XML_Char **atts);
-
- /**
- * deal with end element for Expat.
- */
- virtual void endElement(const XML_Char *name);
-
- /**
- * deal with data handler for Expat.
- */
- virtual void dataHandler(const XML_Char *s, int len);
-
-PRIVATE:
- /**
- * Push a xml element with the specific tag name into stack.
- * @param name The name of tag.
- * @param atts The attributes of related tag.
- */
- void pushTag(const DOMString *name, const XML_Char **atts);
-
- /**
- * Append text into top element of stack.
- * @param text The data related to the present tag.
- */
- void appendText(const DOMString *text);
-
- /**
- * Pop the xml element with the specific tag name.
- * @param name The name of tag.
- */
- void popTag(const DOMString *name);
-
- /**
- * Traverse the XML DOM document starting from specific element.
- * @param root The specific element start to traverse.
- */
- void traverse(ElementImpl *root);
-
-PRIVATE:
- vector<NodeImpl*> mStack; /**< the stack to manage the tag. */
- XMLElementImpl* mTopElementPtr; /**< the top element of the stack. */
- XMLDocumentImpl* mXMLDocumentPtr; /**< XML DOM document pointer. */
- ostringstream mXMLostream; /**< xml output stream. */
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/util/xml/ExpatWrapper.h b/media/libdrm/mobile2/include/util/xml/ExpatWrapper.h
deleted file mode 100644
index 5a2d7fe..0000000
--- a/media/libdrm/mobile2/include/util/xml/ExpatWrapper.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _XML_H_
-#define _XML_H_
-
-#include <expat.h>
-#include <ustring.h>
-#include <Drm2CommonTypes.h>
-
-using namespace ustl;
-
-class ExpatWrapper {
-public:
- /**
- * Constructor for ExpatWrapper.
- */
- ExpatWrapper();
-
- /**
- * Destructor for ExpatWrapper.
- */
- virtual ~ExpatWrapper();
-
- /**
- * decode call expat to parse the xml.
- * @param buf The buffer to be parsed.
- * @param len The length of the buffer.
- * @param isFinal The flag to indicate whether the buffer
- * is a fragment or whole xml.
- */
- int decode(const char* buf, int len, int isFinal);
-
- /**
- * virtual funtion to deal with the start element in expat, need implement by child class.
- */
- virtual void startElement(const XML_Char *name, const XML_Char **atts);
-
- /**
- * virtual funtion to deal with the end element in expat, need implement by child class.
- */
- virtual void endElement(const XML_Char *name);
-
- /**
- * virtual funtion to deal with the data handler in expat, need implement by child class.
- */
- virtual void dataHandler(const XML_Char *s, int len);
-
-PRIVATE:
- /**
- * Callback for Expat startElement.
- */
- static void startElementCallback(void *userData, const XML_Char *name, const XML_Char **atts);
-
- /**
- * Callback for Expat endElement.
- */
- static void endElementCallback(void *userData, const XML_Char *name);
-
- /**
- * Callback for Expat dataHandler.
- */
- static void dataHandlerCallback(void *userData, const XML_Char *s, int len);
-
-PRIVATE:
- XML_Parser mParser; /**< The expat parser object. */
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/util/xml/XMLDocumentImpl.h b/media/libdrm/mobile2/include/util/xml/XMLDocumentImpl.h
deleted file mode 100644
index c29b87d..0000000
--- a/media/libdrm/mobile2/include/util/xml/XMLDocumentImpl.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _XMLDOCUMENTIMPL_H_
-#define _XMLDOCUMENTIMPL_H_
-
-#include <Drm2CommonTypes.h>
-#include <util/domcore/DocumentImpl.h>
-
-class XMLDocumentImpl : public DocumentImpl {
-public:
- /** Constructor for XMLDocumentImpl. */
- XMLDocumentImpl();
-
- /** Destructor for XMLDocumentImpl. */
- ~XMLDocumentImpl();
-
- /**
- * Get the first child element of the document.
- * @return the first child <code>Element</code> of document.
- */
- virtual ElementImpl* getDocumentElement() const;
-
- /**
- * Create a XML element with the specific name.
- * @param tagName The specific tag name.
- * @return a new xml <code>Element</code>
- * @exception DOMException
- */
- virtual ElementImpl* createElement(const DOMString* tagName) const throw (DOMException);
-
- /**
- * Create a text node with the specific data.
- * @param data The specific data.
- * @return a new <code>Text</code> node.
- */
- virtual TextImpl* createTextNode(const DOMString* data) const;
-};
-
-#endif
diff --git a/media/libdrm/mobile2/include/util/xml/XMLElementImpl.h b/media/libdrm/mobile2/include/util/xml/XMLElementImpl.h
deleted file mode 100644
index a0c95ec..0000000
--- a/media/libdrm/mobile2/include/util/xml/XMLElementImpl.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _XMLELEMENTIMPL_H_
-#define _XMLELEMENTIMPL_H_
-
-#include <Drm2CommonTypes.h>
-#include <util/domcore/ElementImpl.h>
-#include <util/domcore/DOMString.h>
-#include <umap.h>
-#include <ustring.h>
-using namespace ustl;
-
-typedef map<DOMString, DOMString> DOMStringMap;
-
-class XMLElementImpl : public ElementImpl {
-public:
- /**
- * Constructor for XMLElementImpl.
- * @param tag The name of the tag.
- */
- XMLElementImpl(const DOMString *tag);
-
- /** Destructor for XMLElementImpl. */
- ~XMLElementImpl();
-
- /**
- * Get the attribute map of the XML element.
- * @return <code>DOMStringMap</code>
- */
- const DOMStringMap* getAttributeMap() const;
-
- /**
- * Get the tag name of the element.
- * return tag name.
- */
- virtual const DOMString* getTagName() const;
-
- /**
- * Set the attribute of the element.
- * @param name The key of the attribute.
- * @param value The value of the attribute.
- */
- virtual void setAttribute(const DOMString* name, const DOMString* value) throw (DOMException);
-
- /**
- * Remove the specific attribute.
- * @param name The key of the attribute.
- * @exception DOMException.
- */
- virtual void removeAttribute(const DOMString* name) throw (DOMException);
-
- /**
- * Get the specific attribute.
- * @param name The key of the attribute.
- * @return the value of the attribute.
- */
- virtual const DOMString* getAttribute(const DOMString* name) const;
-
- /**
- * Detect whether element has attributes or not.
- * @return true or false to indicate the result.
- */
- virtual bool hasAttributes() const;
-
- /**
- * Find the first child node in element by its tag name.
- * @param element the specific element to be found.
- * @param tag the specific tag name to be searched.
- * @return NULL if not found otherwise the child node.
- */
- const NodeImpl* findSoloChildNode(const char* tag) const;
-
- /**
- * Get the first text containted in first child of the element.
- * @param tag the specific tag name to be searched.
- * @return NULL if not found otherwise the text.
- */
- const string* getSoloText(const char* tag) const;
-
- /**
- * Get the first child xml element containted in the element.
- * @param tag the specific tag name to be searched.
- * @return NULL if not found otherwise the element.
- */
- const XMLElementImpl* getSoloElement(const char* tag) const;
-
-PRIVATE:
- DOMString mTagName; /**< The tag name. */
- DOMStringMap mAttributeMap; /** The map of attributes. */
-};
-
-#endif
diff --git a/media/libdrm/mobile2/src/dcf/DrmDcfCommon.cpp b/media/libdrm/mobile2/src/dcf/DrmDcfCommon.cpp
deleted file mode 100644
index 0f5e4ac..0000000
--- a/media/libdrm/mobile2/src/dcf/DrmDcfCommon.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dcf/DrmDcfCommon.h>
-
-int64_t ntoh_int64(int64_t x)
-{
- return (((int64_t)(ntohl((int32_t)((x << 32) >> 32))) << 32) | (uint32_t)ntohl(((int32_t)(x >> 32))));
-}
-
-/**
- * Class: Box
- */
-Box::Box(const uint8_t* box):mLargeSize(0),mUserType(NULL)
-{
- if(!box)
- {
- return ;
- }
-
- const uint8_t* p = box;
-
- /* Get the size value */
- mSize = ntohl(*(uint32_t *)p);
- p += sizeof(mSize);
-
- /* Get the type value */
- mType = *((uint32_t *)p);
- p += sizeof(mType);
-
- if (1 == mSize)
- {
- mLargeSize = ntoh_int64(*(uint64_t *)p);
- p += sizeof(mLargeSize);
- }
-
- if (DCF_USER_TYPE == mType)
- {
- mUserType = new uint8_t[USER_TYPE_LEN];
- memcpy(mUserType, p, USER_TYPE_LEN);
- p += USER_TYPE_LEN;
- }
-
- mBoxLength = p - box;
-}
-
-Box::Box(const Box& other)
-{
- mSize = other.mSize;
- mType = other.mType;
- mLargeSize = other.mLargeSize;
- mUserType = NULL;
-
- if(other.mUserType)
- {
- mUserType = new uint8_t[USER_TYPE_LEN];
- memcpy(mUserType,other.mUserType,USER_TYPE_LEN);
- }
-}
-
-Box& Box::operator=(const Box& other)
-{
- if(this == &other)
- {
- return *this;
- }
-
- if(mUserType)
- {
- delete []mUserType;
- mUserType = NULL;
- }
-
- if(other.mUserType)
- {
- mUserType = new uint8_t[USER_TYPE_LEN];
- memcpy(mUserType, other.mUserType, USER_TYPE_LEN);
- }
-
- return *this;
-}
-
-Box::~Box()
-{
- if(mUserType)
- {
- delete []mUserType;
- mUserType = NULL;
- }
-}
-
-uint64_t Box::getSize(void) const
-{
- if(1 == mSize)
- {
- return mLargeSize;
- }
-
- return mSize;
-}
-
-uint32_t Box::getType(void) const
-{
- return mType;
-}
-
-const uint8_t* Box::getUsertype(void) const
-{
- return mUserType;
-}
-
-uint32_t Box::getLen(void) const
-{
- return mBoxLength;
-}
-
-
-/**
- * Class: FullBox
- */
-FullBox::FullBox(const uint8_t* fullBox) : Box(fullBox)
-{
- if(!fullBox)
- {
- return ;
- }
-
- const uint8_t* p = fullBox;
-
- p += Box::getLen();
-
- mVersion = *p;
- p++;
-
- memcpy(mFlag, p,FLAG_LEN);
- p += FLAG_LEN;
-
- mFullBoxLength = p - fullBox;
-}
-
-uint8_t FullBox::getVersion(void) const
-{
- return mVersion;
-}
-
-const uint8_t* FullBox::getFlag(void) const
-{
- return mFlag;
-}
-
-uint32_t FullBox::getLen(void) const
-{
- return mFullBoxLength;
-}
-
-///// class TextualHeader implementation
-TextualHeader::TextualHeader(const string& inData)
-{
- string::size_type loc1 = inData.find(":", 0);
-
- if (loc1 != string::npos)
- {
- name.assign(inData, 0, loc1);
- }
-
- string::size_type loc2 = inData.find(";", loc1 + 1);
-
- if (loc2 != string::npos)
- {
- value.assign(inData, loc1 + 1, loc2 - loc1 - 1);
- param.assign(inData, loc2 + 1, inData.length() - loc2 - 1);
- }
- else
- {
- value.assign(inData, loc1 + 1, inData.length() - loc1 - 1);
- }
-}
-
-string TextualHeader::getName() const
-{
- return name;
-}
-
-string TextualHeader::getValue() const
-{
- return value;
-}
-
-string TextualHeader::getParam() const
-{
- return param;
-}
-
diff --git a/media/libdrm/mobile2/src/dcf/DrmDcfContainer.cpp b/media/libdrm/mobile2/src/dcf/DrmDcfContainer.cpp
deleted file mode 100644
index 517c930..0000000
--- a/media/libdrm/mobile2/src/dcf/DrmDcfContainer.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dcf/DrmDcfContainer.h>
-
-DcfContainer::DcfContainer(const uint8_t* data,istream& inRawData,uint64_t conOff)
- : FullBox(data),mConStream(inRawData)
-{
- if(!data)
- {
- return;
- }
-
- const uint8_t* p = data;
- const uint8_t* flag = this->getFlag();
-
- if(flag[0] & USER_DATA_FLAG)
- {
- mHasUserData = true;
- }
- else
- {
- mHasUserData = false;
- }
-
- p += this->getLen();
-
- FullBox fullBoxDiscrete(p);
-
- p += fullBoxDiscrete.getLen();
-
- mContentTypeLen = *p;
- p++;
-
- mContentType.assign((const char*)p,0,mContentTypeLen);
- p += mContentTypeLen;
-
- // parse common header
- FullBox fullBoxComm(p);
- p += fullBoxComm.getLen();
-
- mEncryptionMethod = *p;
- p++;
-
- mPaddingScheme = *p;
- p++;
-
- mPlaintextLength = ntoh_int64(*((uint64_t *)p));
- p += sizeof(mPlaintextLength);
-
- mContentIDLength = ntohs(*(uint16_t *)p);
- p += sizeof(mContentIDLength);
-
- mRightsIssuerURLLength = ntohs(*(uint16_t *)p);
- p += sizeof(mRightsIssuerURLLength);
-
- mTextualHeadersLength = ntohs(*(uint16_t *)p);
- p += sizeof(mTextualHeadersLength);
-
- mContentID.assign((const char *)p,0,mContentIDLength);
- p += mContentIDLength;
-
- mRightsIssuerURL.assign((const char *)p,0,mRightsIssuerURLLength);
- p += mRightsIssuerURLLength;
-
- // parse textual header
- if (mTextualHeadersLength > 0)
- {
- if(false == parseTextualHeaders(p,mTextualHeadersLength))
- {
- return;
- }
-
- p += mTextualHeadersLength;
- }
-
- ////////////// parser group id
-
- ///parse content
- p = data + this->getLen() + fullBoxDiscrete.getSize();
- FullBox fullBoxContetn(p);
- p += fullBoxContetn.getLen();
- mDataLen = ntoh_int64(*((uint64_t *)p));
- p += sizeof(mDataLen);
-
- mDecOffset = conOff + (p - data);
- p += mDataLen;
-
- /////////////// parser user data
-}
-
-DcfContainer::~DcfContainer()
-{
- uint32_t size = mTextualHeaders.size();
-
- for(uint32_t i = 0; i < size; i++)
- {
- delete mTextualHeaders[i];
- }
-
- mTextualHeaders.clear();
- mCustomHeader.clear();
-}
-
-
-string DcfContainer::getContentType(void) const
-{
- return mContentType;
-}
-
-uint8_t DcfContainer::getEncryptionMethod(void) const
-{
- return mEncryptionMethod;
-}
-
-uint8_t DcfContainer::getPaddingScheme(void) const
-{
- return mPaddingScheme;
-}
-
-uint64_t DcfContainer::getPlaintextLength(void) const
-{
- return mPlaintextLength;
-}
-
-uint16_t DcfContainer::getContentIDLength(void) const
-{
- return mContentIDLength;
-}
-
-uint16_t DcfContainer::getRightsIssuerURLLength(void) const
-{
- return mRightsIssuerURLLength;
-}
-
-uint16_t DcfContainer::getTextualHeadersLength(void) const
-{
- return mTextualHeadersLength;
-}
-
-string DcfContainer::getContentID(void) const
-{
- return mContentID;
-}
-
-string DcfContainer::getRightsIssuerURL(void) const
-{
- return mRightsIssuerURL;
-}
-
-string DcfContainer::getPreviewMethod(void) const
-{
- return mSlientMethod;
-}
-
-string DcfContainer::getContentLocation(void) const
-{
- return mContentLocation;
-}
-
-string DcfContainer::getContentURL(void) const
-{
- return mContentURL;
-}
-
-vector<string> DcfContainer::getCustomerHead(void) const
-{
- return mCustomHeader;
-}
-
-istream& DcfContainer::getStream(void) const
-{
- return mConStream;
-}
-
-DrmInStream DcfContainer::getPreviewElementData(void) const
-{
- // get data based on mPreviewElementURI
- //encryptedData = ;
-
- DrmInStream inStream;
- return inStream;
-}
-
-DrmInStream DcfContainer::getDecryptContent(uint8_t* decryptKey) const
-{
- DrmInStream inStream(this,decryptKey);
- return inStream;
-}
-
-bool DcfContainer::parseTextualHeaders(const uint8_t* data, uint32_t len)
-{
- if(!data)
- {
- return false;
- }
-
- const uint8_t* p = data;
-
- while (len > (uint32_t)(p - data))
- {
- uint32_t l = strlen((const char*)p);
-
- string str((const char*)p, l);
- TextualHeader* tmp = new TextualHeader(str);
-
- if(!tmp)
- {
- return false;
- }
-
- mTextualHeaders.push_back(tmp);
-
- p += l + 1;
- }
-
- uint32_t size = mTextualHeaders.size();
- uint32_t silentpos = 0;
- uint32_t previewpos = 0;
-
- for( uint32_t i = 0; i < size; i++)
- {
- string tempStr = mTextualHeaders[i]->getName();
-
- if(tempStr == "Silent")
- {
- silentpos = i;
- mSlientMethod = mTextualHeaders[i]->getValue();
- mSilentRightsURL = mTextualHeaders[i]->getParam();
- }
- else if(tempStr == "Preview")
- {
- previewpos = i;
- mPreviewMethod = mTextualHeaders[i]->getValue();
-
- if(mPreviewMethod == "instant")
- {
- mPreviewElementURI = mTextualHeaders[i]->getParam();
- }
- else
- {
- mPreviewRightsURL = mTextualHeaders[i]->getParam();
- }
- }
- else if(tempStr == "ContentURL")
- {
- mContentURL = mTextualHeaders[i]->getValue();
- }
- else if(tempStr == "ContentVersion")
- {
- mContentVersion = mTextualHeaders[i]->getValue();
- }
- if(tempStr == "Content-Location")
- {
- mContentLocation = mTextualHeaders[i]->getValue();
- }
- else
- {
- string str = mTextualHeaders[i]->getName();
- str += ":";
- str += mTextualHeaders[i]->getValue();
- mCustomHeader.push_back(str);
- }
- }
-
- if(silentpos < previewpos)
- {
- mSilentFirst = true;
- }
- else
- {
- mSilentFirst = false;
- }
-
- return true;
-}
-
-
-
-
-
diff --git a/media/libdrm/mobile2/src/dcf/DrmIStream.cpp b/media/libdrm/mobile2/src/dcf/DrmIStream.cpp
deleted file mode 100644
index 1bcc16a..0000000
--- a/media/libdrm/mobile2/src/dcf/DrmIStream.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dcf/DrmIStream.h>
-
-
-DrmInStream::DrmInStream(const DcfContainer* container,uint8_t* Key)
-:mDcfCon(container),mDecryptPos(0)
-{
- memcpy(mAesKey,Key,AES_KEY_LEN);
-}
-
-uint64_t DrmInStream::size() const
-{
- return mDcfCon->mPlaintextLength;
-}
-
-uint64_t DrmInStream::read(uint8_t* data, uint64_t len)
-{
- if(!data)
- {
- return 0;
- }
-
- if(mDecryptPos >= mDcfCon->mPlaintextLength)
- {
- return 0;
- }
-
- uint64_t readLen = len;
-
- // come to the end of decrypted data
- if(mDecryptPos + len > mDcfCon->mPlaintextLength)
- {
- readLen = mDcfCon->mPlaintextLength - mDecryptPos;
- }
-
- uint64_t encLen = mDcfCon->mDataLen;
- uint8_t* encData = new uint8_t[encLen];
-
- if(!encData)
- {
- return 0;
- }
-
- mDcfCon->mConStream.seek(mDcfCon->mDecOffset);
- mDcfCon->mConStream.read(encData,encLen);
-
- uint8_t iv[AES_IV_LEN] = {0};
-
- memcpy(iv,encData,AES_IV_LEN);
- encLen -= AES_IV_LEN;
-
- if(AES_128_CBC != mDcfCon->mEncryptionMethod)
- {
- delete []encData;
- return 0;
- }
-
- AesAgent drmAesDecrypt(AES_128_CBC,mAesKey);
- int32_t padLen = drmAesDecrypt.decContent( iv,
- encData + AES_IV_LEN,
- encLen,
- data);
-
- delete []encData;
-
- if(padLen >= 0)
- {
- return readLen;
- }
- else
- {
- return 0;
- }
-}
-
-
-
-
-
diff --git a/media/libdrm/mobile2/src/dcf/DrmRawContent.cpp b/media/libdrm/mobile2/src/dcf/DrmRawContent.cpp
deleted file mode 100644
index 8813e3c..0000000
--- a/media/libdrm/mobile2/src/dcf/DrmRawContent.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dcf/DrmRawContent.h>
-
-
-DrmRawContent::DrmRawContent(istream& inRawData)
-{
- uint32_t count = inRawData.stream_size();
-
- if (count <= MAX_PIECE_LEN)
- {
- uint8_t* data = new uint8_t[count];
-
- if(!data)
- {
- return;
- }
-
- inRawData.read(data,count);
-
- const uint8_t* dcf = data;
-
- //parse DCF file header
- if(false == parseDcfHeader(dcf))
- {
- delete []data;
- return;
- }
-
- dcf = data;
- dcf += FIX_HEADER_LEN;
-
- if(dcf >= (data + count))
- {
- return;
- }
-
- // parse container box
- FullBox conFullBox(dcf);
-
- if(DCF_CONTAINER_BOX != conFullBox.getType())
- {
- return;
- }
-
- //check whether it is multipart DCF or not
- do
- {
- uint64_t size = conFullBox.getSize();
-
- mContainer.push_back(new DcfContainer(dcf,inRawData,dcf-data));
-
- dcf += size;
-
- // come to the end of raw content
- if(dcf >= (data + count))
- {
- break;
- }
-
- conFullBox = FullBox(dcf);
- }while(DCF_CONTAINER_BOX == conFullBox.getType());
-
- // compute DCF hash using Sha1Agent
- Sha1Agent drmSha1Hash;
- drmSha1Hash.computeHash(data,dcf-data,mDcfHash);
-
- //// parse mutable box
-
- delete []data;
- }
-}
-
-DrmRawContent::~DrmRawContent()
-{
- uint32_t size = mContainer.size();
-
- for(uint32_t i = 0; i < size; i++)
- {
- delete mContainer[i];
- }
-
- mContainer.clear();
-}
-
-vector<DcfContainer*> DrmRawContent::getContents(void) const
-{
- return mContainer;
-}
-
-uint32_t DrmRawContent::getDcfHashLen() const
-{
- return DCF_HASH_LEN;
-}
-
-void DrmRawContent::getDcfHash(uint8_t* outDcfHash) const
-{
- if(outDcfHash)
- {
- memcpy(outDcfHash,mDcfHash,DCF_HASH_LEN);
- }
-
- return;
-}
-
-bool DrmRawContent::parseDcfHeader(const uint8_t* dcfHead)
-{
- if(!dcfHead)
- {
- return false;
- }
-
- if(FIX_HEADER_LEN != ntohl(*(uint32_t *)dcfHead))
- {
- return false;
- }
-
- dcfHead += 4;
- uint32_t type = *(uint32_t *)dcfHead;
-
- if(DCF_FILE_TYPE != type)
- {
- return false;
- }
-
- dcfHead += 4;
- type = *(uint32_t *)dcfHead;
-
- if(DCF_FILE_BRAND != type)
- {
- return false;
- }
-
- dcfHead += 4;
- if(2 != ntohl(*(uint32_t *)dcfHead))
- {
- return false;
- }
-
- dcfHead += 4;
- type = *(uint32_t *)dcfHead;
-
- if(DCF_FILE_BRAND != type)
- {
- return false;
- }
-
- dcfHead += 4;
- return true;
-}
diff --git a/media/libdrm/mobile2/src/drmmanager/DrmManager.cpp b/media/libdrm/mobile2/src/drmmanager/DrmManager.cpp
deleted file mode 100644
index 599526f..0000000
--- a/media/libdrm/mobile2/src/drmmanager/DrmManager.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <drmmanager/DrmManager.h>
-#include <ustring.h>
-#include <ofstream.h>
-#include <sostream.h>
-#include <sistream.h>
-using namespace ustl;
-
-/**see DrmManager.h */
-DrmManager::DrmManager(istream * inRawData)
-{
- mDcfStream = NULL;
- if (inRawData != NULL)
- {
- mDcfStream = inRawData;
- }
-}
-
-/**see DrmManager.h */
-DrmManager::DrmManager(istream * inRawData, string mimeType)
-{
- mDcfStream = inRawData;
-}
-
-/**see DrmManager.h */
-int16_t DrmManager::getListOfDcfObjects(vector<DcfContainer*> **outDcfList)
-{
- /** call dcf functions to parse the dcf file*/
- if (NULL == mDcfStream)
- {
- return ERR_DCFSTREAM_NOT_INITIALIZED;
- }
- if (NULL == outDcfList)
- {
- return ERR_DCFSTREAM_NOT_INITIALIZED;
- }
- *outDcfList=&mDcfs;
- return DRM_OK;
-}
-
-/**see DrmManager.h */
-int16_t DrmManager::openDecryptedContent(DcfContainer *oneDcfObject,
- int16_t operationType,
- istream *outDecryptedData)
-{
- return 1;
-}
-
-/**see DrmManager.h */
-DrmManager::~DrmManager()
-{
-
-}
diff --git a/media/libdrm/mobile2/src/rights/Asset.cpp b/media/libdrm/mobile2/src/rights/Asset.cpp
deleted file mode 100644
index 120b465..0000000
--- a/media/libdrm/mobile2/src/rights/Asset.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <rights/Asset.h>
-
-/** see Asset.h */
-Asset::Asset()
-{}
-
-/** see Asset.h */
-Asset::~Asset()
-{}
-
-/** see Asset.h */
-bool Asset::hasParent()
-{
- return false;
-}
-
-/** see Asset.h */
-void Asset::setID(const string &id)
-{
- mAssetID = id;
-}
-
-/** see Asset.h */
-const string& Asset::getID() const
-{
- return mAssetID;
-}
-
-/** see Asset.h */
-void Asset::setContentID(const string &id)
-{
- mContentID = id;
-}
-
-/** see Asset.h */
-const string& Asset::getContentID() const
-{
- return mContentID;
-}
-
-/** see Asset.h */
-void Asset::setEncryptedKey(const string &key)
-{
- mEncryptedKey = key;
-}
-
-/** see Asset.h */
-void Asset::setDCFDigest(const string &value)
-{
- mDigestValue = value;
-}
-
-/** see Asset.h */
-const string& Asset::getDCFDigest() const
-{
- return mDigestValue;
-}
-
-/** see Asset.h */
-void Asset::setKeyRetrievalMethod(const string &rm)
-{
- mRetrievalMethod = rm;
-}
-
-/** see Asset.h */
-void Asset::setParentContentID(const string &id)
-{
- mParentContentID = id;
-}
-
-/** see Asset.h */
-const string& Asset::getEncrytedKey() const
-{
- return mEncryptedKey;
-}
-
-/** see Asset.h */
-const char* Asset::getCek() const
-{
- return NULL;
-}
-
-/** see Asset.h */
-void Asset::recoverCek()
-{
-//fix later.
-
-}
-
-/** see Asset.h */
-const string& Asset::getParentContentID() const
-{
- return mParentContentID;
-}
diff --git a/media/libdrm/mobile2/src/rights/Constraint.cpp b/media/libdrm/mobile2/src/rights/Constraint.cpp
deleted file mode 100644
index 2cb4311..0000000
--- a/media/libdrm/mobile2/src/rights/Constraint.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <rights/Constraint.h>
-
-/** see Constraint.h */
-Constraint::Constraint()
-{
- mCount = INIT_VALUE;
- mTimedCount = INIT_VALUE;
- mTimer = INIT_VALUE;
- mStart = INIT_VALUE;
- mEnd = INIT_VALUE;
- mInterval = INIT_VALUE;
- mAccumulated = INIT_VALUE;
- mExport = NONE;
-}
-
-/** see Constraint.h */
-Constraint::~Constraint()
-{}
-
-/** see Constraint.h */
-bool Constraint::isUnConstraint() const
-{
- return (mCount == INIT_VALUE && mTimedCount == INIT_VALUE &&
- mTimer == INIT_VALUE && mStart == INIT_VALUE &&
- mEnd == INIT_VALUE && mInterval == INIT_VALUE &&
- mAccumulated == INIT_VALUE && mExport == NONE &&
- mSystemList.empty());
-}
-
-/** see Constraint.h */
-bool Constraint::isDateTimeConstraint() const
-{
- return !(mStart == INIT_VALUE && mEnd == INIT_VALUE);
-}
-
-/** see Constraint.h */
-bool Constraint::isIntervalConstraint() const
-{
- return !(mInterval == INIT_VALUE);
-}
-
-/** see Constraint.h */
-bool Constraint::isTimedCountConstraint() const
-{
- return !(mTimedCount == INIT_VALUE);
-}
-
-/** see Constraint.h */
-bool Constraint::isValid(long time) const
-{
- if (isUnConstraint())
- {
- return true;
- }
-
- if (isDateTimeConstraint())
- {
- if (time < mStart || time > mEnd)
- {
- return false;
- }
- }
-
- if (mInterval == 0 || mCount == 0 ||
- mTimedCount == 0 || mAccumulated == 0)
- {
- return false;
- }
-
- return true;
-}
-
-/** see Constraint.h */
-void Constraint::setStartTime(long time)
-{
- mStart = time;
-}
-
-/** see Constraint.h */
-long Constraint::getStartTime() const
-{
- return mStart;
-}
-
-/** see Constraint.h */
-void Constraint::setEndTime(long time)
-{
- mEnd = time;
-}
-
-/** see Constraint.h */
-long Constraint::getEndTime() const
-{
- return mEnd;
-}
-
-/** see Constraint.h */
-void Constraint::setAccumulated(long time)
-{
- mAccumulated = time;
-}
-
-/** see Constraint.h */
-long Constraint::getAccumulated() const
-{
- return mAccumulated;
-}
-
-/** see Constraint.h */
-void Constraint::setCount(int count)
-{
- mCount = count;
-}
-
-/** see Constraint.h */
-int Constraint::getCount() const
-{
- return mCount;
-}
-
-/** see Constraint.h */
-void Constraint::setTimer(int timer)
-{
- mTimer = timer;
-}
-
-/** see Constraint.h */
-int Constraint::getTimer() const
-{
- return mTimer;
-}
-
-/** see Constraint.h */
-void Constraint::setTimedCount(int timedCount)
-{
- mTimedCount = timedCount;
-}
-
-/** see Constraint.h */
-int Constraint::getTimedCount() const
-{
- return mTimedCount;
-}
-
-/** see Constraint.h */
-void Constraint::setInterval(int interval)
-{
- mInterval = interval;
-}
-
-/** see Constraint.h */
-int Constraint::getInterval() const
-{
- return mInterval;
-}
-
-/** see Constraint.h */
-void Constraint::setExportMode(MODE mode)
-{
- mExport = mode;
-}
-
-/** see Constraint.h */
-Constraint::MODE Constraint::getExportMode() const
-{
- return mExport;
-}
-
-/** see Constraint.h */
-bool Constraint::consume()
-{
- if (isUnConstraint())
- {
- return true;
- }
-
- if (mCount > 0)
- {
- mCount--;
- return true;
- }
-
- if (mAccumulated > 0)
- {
- mAccumulated--;
- return true;
- }
-
- if (mTimedCount > 0)
- {
-
- }
- return false;
-}
diff --git a/media/libdrm/mobile2/src/rights/OperationPermission.cpp b/media/libdrm/mobile2/src/rights/OperationPermission.cpp
deleted file mode 100644
index fc75fb1..0000000
--- a/media/libdrm/mobile2/src/rights/OperationPermission.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <rights/OperationPermission.h>
-#include <rights/Constraint.h>
-
-/** see OperationPermission.h */
-OperationPermission::OperationPermission() : mConstraint(NULL)
-{
-
-}
-
-/** see OperationPermission.h */
-OperationPermission::OperationPermission(OPERATION type, Constraint *cst) : mType(type), mConstraint(cst)
-{
-
-}
-
-/** see OperationPermission.h */
-OperationPermission::~OperationPermission()
-{
- delete mConstraint;
-}
-
-/** see OperationPermission.h */
-void OperationPermission::setType(OPERATION type)
-{
- mType = type;
-}
-
-/** see OperationPermission.h */
-OperationPermission::OPERATION OperationPermission::getType() const
-{
- return mType;
-}
-
-/** see OperationPermission.h */
-void OperationPermission::addConstraint(Constraint* constraint)
-{
- mConstraint = constraint;
-}
-
-/** see OperationPermission.h */
-Constraint* OperationPermission::getConstraint() const
-{
- return mConstraint;
-}
diff --git a/media/libdrm/mobile2/src/rights/Right.cpp b/media/libdrm/mobile2/src/rights/Right.cpp
deleted file mode 100644
index 6be9c70..0000000
--- a/media/libdrm/mobile2/src/rights/Right.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <rights/Right.h>
-#include <rights/OperationPermission.h>
-#include <rights/Constraint.h>
-
-/** see Right.h */
-Right::Right()
-{
-
-}
-
-/** see Right.h */
-Right::~Right()
-{
- vector<OperationPermission*>::iterator it;
-
- for (it = mOpList.begin(); it != mOpList.end(); it++)
- {
- delete(*it);
- }
-
- mOpList.clear();
-}
-
-/** see Right.h */
-void Right::addAssetID(const string& id)
-{
- mAssetNameList.push_back(id);
-}
-
-/** see Right.h */
-void Right::addOperationPermission(OperationPermission* op)
-{
- mOpList.push_back(op);
-}
-
-/** see Right.h */
-bool Right::checkPermission(OperationPermission::OPERATION type)
-{
- for (vector<OperationPermission*>::iterator it = mOpList.begin();
- it != mOpList.end(); it++)
- {
- if ((*it)->getType() == type)
- {
- return true;
- }
- }
-
- return false;
-}
-
-/** see Right.h */
-Constraint* Right::getConstraint(OperationPermission::OPERATION type)
-{
- for (vector<OperationPermission*>::iterator it = mOpList.begin();
- it != mOpList.end(); it++)
- {
- if ((*it)->getType() == type)
- {
- return (*it)->getConstraint();
- }
- }
-
- return NULL;
-}
diff --git a/media/libdrm/mobile2/src/rights/Ro.cpp b/media/libdrm/mobile2/src/rights/Ro.cpp
deleted file mode 100644
index 8141e17..0000000
--- a/media/libdrm/mobile2/src/rights/Ro.cpp
+++ /dev/null
@@ -1,831 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <rights/Ro.h>
-#include <rights/Constraint.h>
-#include <rights/OperationPermission.h>
-#include <util/xml/DomExpatAgent.h>
-#include <util/domcore/DOMString.h>
-#include <utils/Log.h>
-
-#include <uassert.h>
-#include <time.h>
-#include <ofstream.h>
-using namespace ustl;
-
-const char *STR_RO_RIGHTS = "o-ex:rights";
-const char *STR_RO_CONTEXT = "o-ex:context";
-const char *STR_RO_AGREEMENT = "o-ex:agreement";
-const char *STR_RO_ASSET = "o-ex:asset";
-const char *STR_RO_INHERIT = "o-ex:inherit";
-const char *STR_RO_DIGEST = "o-ex:digest";
-const char *STR_RO_KEYINFO = "ds:KeyInfo";
-const char *STR_RO_PERMISSION = "o-ex:permission";
-const char *STR_RO_ASSET_ID = "o-ex:id";
-const char *STR_RO_ASSET_IDREF = "o-ex:idref";
-const char *STR_RO_CONTEXT_ID = "o-dd:uid";
-const char *STR_RO_CONTEXT_VERSION = "o-dd:version";
-const char *STR_RO_DIGEST_VALUE = "ds:DigestValue";
-const char *STR_RO_CIPHER_VALUE = "xenc:CipherValue";
-const char *STR_RO_RETRIEVAL_METHOD = "ds:RetrievalMethod";
-const char *STR_RO_PLAY = "o-dd:play";
-const char *STR_RO_DISPLAY = "o-dd:display";
-const char *STR_RO_EXECUTE = "o-dd:execute";
-const char *STR_RO_PRINT = "o-dd:print";
-const char *STR_RO_EXPORT = "o-dd:export";
-const char *STR_RO_CONSTRAINT = "o-ex:constraint";
-const char *STR_RO_COUNT = "o-dd:count";
-const char *STR_RO_TIMEDCOUNT = "o-dd:timed-count";
-const char *STR_RO_TIMER = "oma-dd:timer";
-const char *STR_RO_INTERVAL = "o-dd:interval";
-const char *STR_RO_DATETIME = "o-dd:datetime";
-const char *STR_RO_START = "o-dd:start";
-const char *STR_RO_END = "o-dd:end";
-const char *STR_RO_ACCUMULATED = "o-dd:accumulated";
-const char *STR_RO_INDIVIDUAL = "o-dd:individual";
-const char *STR_RO_SYSTEM = "o-dd:system";
-
-/** see Ro.h */
-Ro::Ro()
-{
- mDoc = new XMLDocumentImpl();
- mProperRight = NULL;
-}
-
-/** see Ro.h */
-Ro::~Ro()
-{
- for (vector<Right*>::iterator itr = mRightList.begin(); itr != mRightList.end(); itr++)
- {
- delete(*itr);
- }
-
- mRightList.clear();
-
- for (vector<Asset*>::iterator ita = mAssetList.begin(); ita != mAssetList.end(); ita++)
- {
- delete(*ita);
- }
-
- mAssetList.clear();
-
- mProperRight = NULL;
- delete mDoc;
-
-}
-
-/** see Ro.h */
-void Ro::setRoID(string& id)
-{
- mRoID = id;
-}
-
-/** see Ro.h */
-const string& Ro::getRoID() const
-{
- return mRoID;
-}
-
-/** see Ro.h */
-void Ro::setRoVersion(string& version)
-{
- mRoVersion = version;
-}
-
-/** see Ro.h */
-void Ro::addAsset(Asset* asset)
-{
- mAssetList.push_back(asset);
-}
-
-/** see Ro.h */
-void Ro::addRight(Right* right)
-{
- mRightList.push_back(right);
-}
-
-/** see Ro.h */
-bool Ro::save()
-{
- LOGI("==============Ro save.=================");
-
- return true;
-}
-
-/** see Ro.h */
-Ro::ERRCODE Ro::parse(istringstream *roStream)
-{
- DomExpatAgent xmlAgent(mDoc);
-
- if (NULL == roStream)
- {
- LOGI("NULL stream");
- return RO_NULL_STREAM;
- }
-
- if (xmlAgent.generateDocumentFromXML(roStream) == false)
- {
- LOGI("generate xml doc error");
- return RO_ERR_BAD_XML;
- }
-
- handleDocument(mDoc);
-
- return RO_OK;
-}
-
-/** see Ro.h */
-bool Ro::handleDocument(const XMLDocumentImpl* doc)
-{
- assert(doc != NULL);
-
- NodeImpl* node = doc->getDocumentElement();
-
- return handleRights(node);
-}
-
-/** see Ro.h */
-bool Ro::handleRights(const NodeImpl *curNode)
-{
- assert(curNode != NULL);
-
- NodeImpl *node = curNode->getFirstChild();
-
- while (NULL != node)
- {
- const DOMString* name;
-
- name = static_cast<const XMLElementImpl*>(node)->getTagName();
-
- if (name->compare(STR_RO_CONTEXT) == 0)
- {
- LOGI("rights context");
- const DOMString *token = NULL;
- token = static_cast<const XMLElementImpl*>(node)->getSoloText(STR_RO_CONTEXT_ID);
-
- if (token)
- {
- LOGI(*token);
- mRoID = *token;
- }
-
- token = static_cast<const XMLElementImpl*>(node)->getSoloText(STR_RO_CONTEXT_VERSION);
- if (token)
- {
- LOGI(*token);
- mRoVersion = *token;
- }
- }
-
- if (name->compare(STR_RO_AGREEMENT) == 0)
- {
-
- LOGI("rights agreement");
- if (handleAgreement(node) == false)
- {
- return false;
- }
- }
-
- node = node->getNextSibling();
- }
- return true;
-}
-
-/** see Ro.h */
-bool Ro::handleAgreement(const NodeImpl *curNode)
-{
- assert(curNode != NULL);
-
- NodeImpl *node = curNode->getFirstChild();
-
- while (NULL != node)
- {
- const DOMString* name;
-
- name = static_cast<const XMLElementImpl*>(node)->getTagName();
-
- if (name->compare(STR_RO_ASSET) == 0)
- {
- // do something about asset.
- LOGI("asset");
-
- if (handleAsset(node) == false)
- {
- return false;
- }
- }
-
- if (name->compare(STR_RO_PERMISSION) == 0)
- {
- // do something about permission.
- LOGI("permission");
-
- if (handlePermission(node) == false)
- {
- return false;
- }
- }
-
- node = node->getNextSibling();
- }
-
- return true;
-}
-
-/** see Ro.h */
-bool Ro::handleAsset(const NodeImpl *curNode)
-{
- assert(curNode != NULL);
-
- Asset *asset = new Asset();
-
- const XMLElementImpl *curElement = static_cast<const XMLElementImpl*>(curNode);
-
- if (curElement->hasAttributes())
- {
- DOMString assetID(STR_RO_ASSET_ID);
- LOGI("asset id:");
-
- const DOMString *id = curElement->getAttribute(&assetID);
-
- if (id)
- {
- asset->setID(*id);
- }
-
- }
-
- NodeImpl* node = curNode->getFirstChild();
-
- const DOMString *name = NULL;
- const string *token = NULL;
-
- while (NULL != node)
- {
- curElement = static_cast<const XMLElementImpl*>(node);
- name = curElement->getTagName();
-
- if (name->compare(STR_RO_CONTEXT) == 0 ||
- name->compare(STR_RO_INHERIT) == 0)
- {
- LOGI("asset context");
-
- token = curElement->getSoloText(STR_RO_CONTEXT_ID);
- if (token)
- {
- LOGI(*token);
-
- if (name->compare(STR_RO_CONTEXT) == 0)
- {
- asset->setContentID(*token);
- }
- else
- {
- //parent ID.
- asset->setParentContentID(*token);
- }
- }
- }
-
- if (name->compare(STR_RO_DIGEST) == 0)
- {
- LOGI("asset digest");
- //digest method is fixed value:
- //http://www.w3.org/2000/09/xmldisig#sha1
- token = curElement->getSoloText(STR_RO_DIGEST_VALUE);
- if (token)
- {
- LOGI(*token);
- asset->setDCFDigest(*token);
- }
- }
-
- if (name->compare(STR_RO_KEYINFO) == 0)
- {
- LOGI("asset keyinfo");
-
- token = curElement->getSoloText(STR_RO_CIPHER_VALUE);
- if (token)
- {
- LOGI(*token);
- asset->setEncryptedKey(*token);
- }
-
- const XMLElementImpl *node = curElement->getSoloElement(STR_RO_RETRIEVAL_METHOD);
-
- if (node)
- {
- if (node->hasAttributes())
- {
- DOMString uri("URI");
- token = node->getAttribute(&uri);
- if (token)
- {
- LOGI(*token);
- asset->setKeyRetrievalMethod(*token);
- }
- }
- }
- }
-
- node = node->getNextSibling();
- }
-
- this->addAsset(asset);
- return true;
-}
-
-/** see Ro.h */
-bool Ro::handlePermission(const NodeImpl *curNode)
-{
- assert(curNode != NULL);
-
- Right *right = new Right();
-
- const XMLElementImpl *curElement = static_cast<const XMLElementImpl*>(curNode);
-
- NodeImpl* node = curNode->getFirstChild();
-
- while (NULL != node)
- {
- const DOMString *name = NULL;
- NodeListImpl *nodeList = NULL;
-
- const string *token = NULL;
- curElement = static_cast<const XMLElementImpl*>(node);
- name = curElement->getTagName();
-
- if (name->compare(STR_RO_ASSET) == 0)
- {
- LOGI("permission asset");
- if (curElement->hasAttributes())
- {
- DOMString assetID(STR_RO_ASSET_IDREF);
- const DOMString *id = curElement->getAttribute(&assetID);
- if (id)
- {
- right->addAssetID(*id);
- LOGI(*id);
- }
- }
- }
-
- OperationPermission::OPERATION type = OperationPermission::NONE;
-
- if (name->compare(STR_RO_PLAY) == 0)
- {
- LOGI("permission play constraint");
- type = OperationPermission::PLAY;
- }
-
- if (name->compare(STR_RO_DISPLAY) == 0)
- {
- LOGI("permission display costraint");
- type = OperationPermission::DISPLAY;
- }
-
- if (name->compare(STR_RO_EXECUTE) == 0)
- {
- LOGI("permission execute constraint");
- type = OperationPermission::EXECUTE;
- }
-
- if (name->compare(STR_RO_EXPORT) == 0)
- {
- LOGI("permission export constraint");
- type = OperationPermission::EXPORT;
- }
-
- if (name->compare(STR_RO_PRINT) == 0)
- {
- LOGI("permission print constraint");
- type = OperationPermission::PRINT;
- }
-
- Constraint *cst = NULL;
-
- if (name->compare(STR_RO_CONSTRAINT) == 0)
- {
- LOGI("permission common constraint");
- type = OperationPermission::COMMON;
- }
-
- cst = getConstraint(curElement);
- if (cst)
- {
- OperationPermission *op = new OperationPermission(type, cst);
- right->addOperationPermission(op);
- }
-
- node = node->getNextSibling();
- }
-
- this->addRight(right);
- return true;
-}
-
-/** see Ro.h */
-long Ro::convertISO8601DateTimeToLong(const char* ts)
-{
- if (NULL == ts)
- {
- return -1;
- }
-
- struct tm time;
- memset(&time, 0, sizeof(struct tm));
-
- strptime(ts, "%FT%T%z", &time);
-
-//need timezone support: return mktime(&time) - timezone;
-//It seems android-sooner doesn't support timezone function.
-//line below is just for building, value would be wrong if no timezone minus.
- return mktime(&time);
-}
-
-/** see Ro.h */
-long Ro::convertISO8601PeriodToLong(const char* ts)
-{
- if (NULL == ts)
- {
- return -1;
- }
-
- int date, hour, min, sec;
- sscanf(ts, "P%dDT%dH%dM%dS", &date, &hour, &min, &sec);
- LOGI("%d %d %d %d", date, hour, min, sec);
- return (date*24*60*60 + hour*60*60 + min*60 + sec);
-}
-
-/** see Ro.h */
-Constraint* Ro::getConstraint(const NodeImpl* curNode)
-{
- assert(curNode != NULL);
-
- Constraint *constraint = new Constraint();
-
- const XMLElementImpl *curElement = static_cast<const XMLElementImpl*>(curNode);
-
- const string *name = NULL;
- const string *token = NULL;
-
- if ((token = curElement->getSoloText(STR_RO_COUNT)))
- {
- LOGI(*token);
- constraint->setCount(atoi(token->c_str()));
- }
-
- if ((token = curElement->getSoloText(STR_RO_START)))
- {
- LOGI(*token);
- //start Time
- constraint->setStartTime(convertISO8601DateTimeToLong(token->c_str()));
- }
-
- if ((token = curElement->getSoloText(STR_RO_END)))
- {
- LOGI(*token);
- //end Time
- constraint->setEndTime(convertISO8601DateTimeToLong(token->c_str()));
- }
-
- if ((token = curElement->getSoloText(STR_RO_INTERVAL)))
- {
- LOGI(*token);
- constraint->setInterval(atoi(token->c_str()));
- }
-
- if ((token = curElement->getSoloText(STR_RO_ACCUMULATED)))
- {
- LOGI(*token);
- //Period
- constraint->setAccumulated(convertISO8601PeriodToLong(token->c_str()));
- }
-
- if ((token = curElement->getSoloText(STR_RO_TIMEDCOUNT)))
- {
- LOGI(*token);
- constraint->setTimedCount(atoi(token->c_str()));
-
- const XMLElementImpl *node = curElement->getSoloElement(STR_RO_TIMEDCOUNT);
-
- if (node)
- {
- if (node->hasAttributes())
- {
- DOMString timer(STR_RO_TIMER);
- token = node->getAttribute(&timer);
- if (token)
- {
- LOGI(*token);
- constraint->setTimer(atoi(token->c_str()));
- }
- }
- }
-
- }
-
- return constraint;
-}
-
-/** see Ro.h */
-void Ro::loadRights(const string& contentID)
-{
- for (vector<Right*>::iterator it = this->mRightList.begin();
- it != this->mRightList.end(); it++)
- {
- if ((*it)->mAssetNameList.empty())
- {
- mContentRightList.push_back(*it);
- }
- else
- {
- for (vector<Asset*>::iterator ita = this->mAssetList.begin();
- ita != this->mAssetList.end(); ita++)
- {
- for (vector<string>::iterator its = (*it)->mAssetNameList.begin();
- its != (*it)->mAssetNameList.end(); its++)
- {
- if ((*its).compare((*ita)->getID()) == 0)
- {
- if (contentID.compare((*ita)->getContentID()) == 0)
- {
- LOGI("find content right");
- mContentRightList.push_back(*it);
- }
- }
- }
- }
- }
-
-
- }
-
-}
-
-/** see Ro.h */
-void Ro::freeRights()
-{
- mContentRightList.clear();
-}
-
-/** see Ro.h */
-bool Ro::checkPermission(OperationPermission::OPERATION type,
- const string& contentID)
-{
- loadRights(contentID);
-
- for (vector<Right*>::iterator it = mContentRightList.begin(); it != mContentRightList.end(); it++)
- {
- if ((*it)->checkPermission(type))
- {
- freeRights();
- return true;
- }
-
- }
- freeRights();
- return false;
-}
-
-/** see Ro.h */
-Ro::ERRCODE Ro::consume(OperationPermission::OPERATION type,
- const string& contentID)
-{
- loadRights(contentID);
-
- //check in mRightList
- vector<Right*>::iterator it;
- vector<Right*> tmpList;
- vector<Right*> retList;
- Constraint *constraint = NULL;
- long ealiestEnd = -1;
- bool hasCommonConstraint = false;
- bool hasUnconstraint = false;
- bool hasDateTimeConstraint = false;
- bool hasTimedCountConstraint = false;
- bool hasIntervalConstraint = false;
-
-
- //apply the RO rule, if do not satisfy the constraint, .
- //proper right select process
-
- for (it = mContentRightList.begin(); it != mContentRightList.end(); it++)
- {
- if ((*it)->checkPermission(type))
- {
- constraint = (*it)->getConstraint(OperationPermission::COMMON);
- if (constraint)
- {
- if (!constraint->isValid(time(NULL)))
- {
- continue;
- }
-
- hasCommonConstraint = true;
- tmpList.push_back(*it);
- }
-
- constraint = (*it)->getConstraint(type);
- assert(constraint != NULL);
-
- if (!constraint->isValid(time(NULL)))
- {
- continue;
- }
-
- if (constraint->isUnConstraint())
- {
- //use uncontrainted firstly.
- hasUnconstraint = true;
- tmpList.push_back(*it);
- break;
- }
-
- if (constraint->isDateTimeConstraint())
- {
- //use datetime constraint in high priority.
- //if contain multipe constraints, use the earliest expire time.
- hasDateTimeConstraint = true;
- tmpList.push_back(*it);
- continue;
- }
-
- if (constraint->isTimedCountConstraint())
- {
- //illegal Operation when time counted
- if (type == OperationPermission::PRINT ||
- type == OperationPermission::EXPORT)
- {
- continue;
- }
-
- hasTimedCountConstraint = true;
- tmpList.push_back(*it);
- continue;
- }
-
- if (constraint->isIntervalConstraint())
- {
- hasIntervalConstraint = true;
- tmpList.push_back(*it);
- continue;
- }
-
- tmpList.push_back(*it);
- }
- }
-
-
- for (it = tmpList.begin(); it != tmpList.end(); it++)
- {
- if (hasUnconstraint == true)
- {
- //delete other constraint
- constraint = (*it)->getConstraint(type);
- if (constraint)
- {
- if (constraint->isUnConstraint())
- {
- retList.push_back(*it);
- break;
- }
- }
- continue;
- }
-
- if (hasDateTimeConstraint == true)
- {
- //delete other constraint
- constraint = (*it)->getConstraint(type);
- if (constraint)
- {
- if (constraint->isDateTimeConstraint())
- {
- long tt = constraint->getEndTime();
-
- if (ealiestEnd == -1)
- {
- ealiestEnd = tt;
- retList.push_back(*it);
- }
- else if (ealiestEnd > tt)
- {
- ealiestEnd = tt;
- retList.pop_back();
- retList.push_back(*it);
- }
- }
- }
- continue;
- }
-
- if (hasIntervalConstraint == true)
- {
- //delete other constraint
- constraint = (*it)->getConstraint(type);
- if (constraint)
- {
- if (constraint->isIntervalConstraint())
- {
- retList.push_back(*it);
- }
- }
- continue;
- }
-
- if (hasTimedCountConstraint == true)
- {
- constraint = (*it)->getConstraint(type);
- if (constraint)
- {
- if (constraint->isTimedCountConstraint())
- {
- retList.push_back(*it);
- }
- }
- continue;
- }
-
- retList.push_back(*it);
- }
-
- if (retList.size() == 0)
- {
- freeRights();
- return RO_BAD;
- }
-
- LOGI("Proper right has %d", retList.size());
-
- assert(retList.size() == 1);
-
- mProperRight = retList[0];
- constraint = retList[0]->getConstraint(OperationPermission::COMMON);
- if (constraint)
- {
- if (constraint->consume() == false)
- {
- freeRights();
- return RO_BAD;
- }
- }
-
- constraint = retList[0]->getConstraint(type);
- if (constraint)
- {
- if (constraint->consume() == false)
- {
- freeRights();
- return RO_BAD;
- }
- }
-
- //update the constraint
- freeRights();
- return RO_OK;
-}
-
-/** see Ro.h */
-string Ro::getContentCek(const string& contentID)
-{
- for (vector<Asset*>::iterator it = mAssetList.begin();
- it != mAssetList.end(); it++)
- {
- if (contentID.compare((*it)->getContentID()) == 0)
- {
- return (*it)->getCek();
- }
- }
-
- return "";
-}
-
-/** see Ro.h */
-string Ro::getContentHash(const string& contentID)
-{
- for (vector<Asset*>::iterator it = mAssetList.begin();
- it != mAssetList.end(); it++)
- {
- if (contentID.compare((*it)->getContentID()) == 0)
- {
- return (*it)->getDCFDigest();
- }
- }
-
- return "";
-}
diff --git a/media/libdrm/mobile2/src/rights/RoManager.cpp b/media/libdrm/mobile2/src/rights/RoManager.cpp
deleted file mode 100644
index a115d21..0000000
--- a/media/libdrm/mobile2/src/rights/RoManager.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <rights/RoManager.h>
-#include <rights/Asset.h>
-
-using namespace ustl;
-
-RoManager* RoManager::msInstance = NULL;
-
-/** see RoManager.h */
-RoManager* RoManager::Instance()
-{
- if (NULL == msInstance)
- {
- msInstance = new RoManager();
- }
-
- return msInstance;
-}
-
-/** see RoManager.h */
-RoManager::RoManager()
-{
-//load the ro list from local system.
-}
-
-/** see RoManager.h */
-RoManager::~RoManager()
-{
- msInstance = NULL;
-
- for (vector<Ro*>::iterator it = mRoList.begin();
- it != mRoList.end(); it++)
- {
- delete (*it);
- }
-
- mRoList.clear();
-}
-
-/** see RoManager.h */
-Ro::ERRCODE RoManager::installRo(istringstream *roStream)
-{
- Ro *ro = new Ro();
-
- Ro::ERRCODE ret = ro->parse(roStream);
-
- if (Ro::RO_OK == ret)
- {
- ro->save();
-
- mRoList.push_back(ro);
- }
-
- return ret;
-}
-
-/** see RoManager.h */
-Ro* RoManager::getRoByContentID(const string& contentID)
-{
- for (vector<Ro*>::iterator it = mRoList.begin();
- it != mRoList.end(); it++)
- {
- for (vector<Asset*>::iterator ita = (*it)->mAssetList.begin();
- ita != (*it)->mAssetList.end(); ita++)
- {
- if (contentID.compare((*ita)->getContentID()) == 0)
- {
- return *it;
- }
- }
- }
-
- return NULL;
-}
-
-/** see RoManager.h */
-Ro* RoManager::getRo(const string& roID)
-{
- for (vector<Ro*>::iterator it = mRoList.begin();
- it != mRoList.end(); it++)
- {
- if (roID.compare((*it)->getRoID()) == 0)
- {
- return (*it);
- }
- }
-
- return NULL;
-}
-
-/** see RoManager.h */
-vector<Ro*> RoManager::getAllRo()
-{
- return mRoList;
-}
-
-/** see RoManager.h */
-bool RoManager::deleteRo(const string& roID)
-{
- return true;
-}
-
-/** see RoManager.h */
-bool RoManager::checkRoInCache(const string& roID)
-{
- return true;
-}
-
diff --git a/media/libdrm/mobile2/src/roap/Registration.cpp b/media/libdrm/mobile2/src/roap/Registration.cpp
deleted file mode 100644
index 9d6f459..0000000
--- a/media/libdrm/mobile2/src/roap/Registration.cpp
+++ /dev/null
@@ -1 +0,0 @@
-/**/
diff --git a/media/libdrm/mobile2/src/roap/RoapMessageHandler.cpp b/media/libdrm/mobile2/src/roap/RoapMessageHandler.cpp
deleted file mode 100644
index 9d190ee..0000000
--- a/media/libdrm/mobile2/src/roap/RoapMessageHandler.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <roap/RoapMessageHandler.h>
-#include <util/xml/DomExpatAgent.h>
-#include <util/xml/XMLDocumentImpl.h>
-#include <util/domcore/NodeListImpl.h>
-#include <util/domcore/DOMString.h>
-#include <ofstream.h>
-using namespace ustl;
-
-/**see RoapMessageHandler.h */
-RoapMessageHandler::RoapMessageHandler()
-{
- mDoc = NULL;
-}
-
-/**see RoapMessageHandler.h */
-XMLDocumentImpl* RoapMessageHandler::createClientMsg(RoapMessageHandler::msgType type)
-{
- /* load template from files temporarily, FIX ME later */
- string msgTemplate;
- switch (type)
- {
- case RoapMessageHandler::DeviceHello:
- msgTemplate.append("deviceHello.xml");
- break;
- case RoapMessageHandler::RegistrationRequest:
- msgTemplate.append("deviceHello.xml");
- break;
- case RoapMessageHandler::RORequest:
- msgTemplate.append("deviceHello.xml");
- break;
- default:
- return NULL;
- }
- ifstream xmlStream(msgTemplate.c_str());
- XMLDocumentImpl* xmlDoc = new XMLDocumentImpl();
- DomExpatAgent domExpatAgent1(xmlDoc);
- if (domExpatAgent1.generateDocumentFromXML(&xmlStream))
- {
- return xmlDoc;
- }
- else
- {
- delete(xmlDoc);
- return NULL;
- }
-}
-
diff --git a/media/libdrm/mobile2/src/util/crypto/DrmCrypto.cpp b/media/libdrm/mobile2/src/util/crypto/DrmCrypto.cpp
deleted file mode 100644
index fbbefb8..0000000
--- a/media/libdrm/mobile2/src/util/crypto/DrmCrypto.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <util/crypto/DrmCrypto.h>
-#include <ustring.h>
-
-using namespace ustl;
-
-void AesAgent::discardPaddingByte( unsigned char* decryptedBuf,unsigned long* decryptedBufLen)
-{
- if(!decryptedBuf)
- {
- return;
- }
-
- int i;
- unsigned long tmpLen = *decryptedBufLen;
-
- // Check whether the last several bytes are padding or not
- for ( i = 1; i < decryptedBuf[tmpLen - 1]; i++)
- {
- if (decryptedBuf[tmpLen - 1 - i] != decryptedBuf[tmpLen - 1])
- break;
- }
-
- // They are padding bytes
- if (i == decryptedBuf[tmpLen - 1])
- {
- *decryptedBufLen = tmpLen - i;
- }
-
- return;
-}
-
-int32_t AesAgent::decContent( unsigned char* iv,
- const unsigned char* encData,
- unsigned long encLen,
- unsigned char* decData)
-{
- if(AES_128_CBC == mode)
- {
- AES_KEY key;
- AES_set_decrypt_key(AesKey,AES_KEY_BITS,&key);
-
- uint8_t *tmpBuf = new uint8_t[encLen];
-
- AES_cbc_encrypt( encData,
- tmpBuf,
- encLen,
- &key,
- iv,
- AES_DECRYPT);
-
- unsigned long tempLen = encLen;
- discardPaddingByte(tmpBuf,&tempLen);
-
- memcpy(decData, tmpBuf, tempLen);
-
- delete []tmpBuf;
- return encLen - tempLen;
- }
- else
- {
- return AES_DEC_FAILED;
- }
-}
-
-void Sha1Agent::computeHash( const unsigned char* inData,
- unsigned long inLen,
- unsigned char* outHash) const
-{
- EVP_Digest(inData,inLen,outHash,NULL,EVP_sha1(),NULL);
- return;
-}
-
-void HmacSha1Agent::computeMac( const unsigned char* inData,
- unsigned long inLen,
- unsigned char* outData) const
-{
- HMAC(EVP_sha1(),macKey,keyLen,inData,inLen,outData,NULL);
- return;
-}
-
-bool RsaAgent::signature( const unsigned char* rawData,
- unsigned long rawLen,
- unsigned char* sigData,
- RsaAlg sigAlg)
-{
- switch(sigAlg)
- {
- case RSA_PSS:
- {
- unsigned char mHash[SHA_DIGEST_LENGTH];
- Sha1Agent sha1;
- sha1.computeHash(rawData,rawLen,mHash);
-
- unsigned char EM[rsaSize];
- if( 0 == RSA_padding_add_PKCS1_PSS( &rsaKey,
- EM,
- mHash,
- EVP_sha1(),
- SHA_DIGEST_LENGTH))
- {
- return false;
- }
-
- if(0 > RSA_private_encrypt( SHA_DIGEST_LENGTH,
- EM,
- sigData,
- &rsaKey,
- RSA_PKCS1_PADDING))
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- break;
- case RSA_SHA1:
- {
- unsigned char mHash[SHA_DIGEST_LENGTH];
- Sha1Agent sha1;
- sha1.computeHash(rawData,rawLen,mHash);
-
- if(0 != RSA_sign( NID_sha1WithRSA,
- mHash,
- SHA_DIGEST_LENGTH,
- sigData,
- &rsaSize,
- &rsaKey))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- break;
- default:
- return false;
- }
-
- return false;
-}
-
-bool RsaAgent::sigVerify( unsigned char* sigData,
- unsigned long sigLen,
- const unsigned char* rawData,
- unsigned long rawLen,
- RsaAlg sigAlg)
-{
- if( sigAlg == RSA_PSS)
- {
- unsigned char decSigData[rsaSize];
-
- if(0 > RSA_public_decrypt(sigLen,
- sigData,
- decSigData,
- &rsaKey,
- RSA_PKCS1_PADDING))
- {
- return false;
- }
- else
- {
- unsigned char mHash[SHA_DIGEST_LENGTH];
- Sha1Agent sha1;
- sha1.computeHash(rawData,rawLen,mHash);
-
- if( 0 == RSA_verify_PKCS1_PSS( &rsaKey,
- mHash,
- EVP_sha1(),
- decSigData,
- -1))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- }
- else if(sigAlg == RSA_SHA1)
- {
- unsigned char mHash[SHA_DIGEST_LENGTH];
- Sha1Agent sha1;
- sha1.computeHash(rawData,rawLen,mHash);
-
- if(0 != RSA_verify( NID_sha1WithRSA,
- mHash,
- SHA_DIGEST_LENGTH,
- sigData,
- sigLen,
- &rsaKey))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
-}
-
-int RsaAgent::decrypt( const unsigned char* encData,
- unsigned long encLen,
- unsigned char* decData)
-{
- return RSA_private_decrypt( encLen,
- encData,
- decData,
- &rsaKey,
- RSA_PKCS1_PADDING);
-}
diff --git a/media/libdrm/mobile2/src/util/domcore/CharacterDataImpl.cpp b/media/libdrm/mobile2/src/util/domcore/CharacterDataImpl.cpp
deleted file mode 100644
index 0fe699a..0000000
--- a/media/libdrm/mobile2/src/util/domcore/CharacterDataImpl.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/CharacterDataImpl.h>
-
-/** see CharacterDataImpl.h */
-const DOMString* CharacterDataImpl::getData() const throw (DOMException)
-{
- return charData;
-}
-
-/** see CharacterDataImpl.h */
-CharacterDataImpl::CharacterDataImpl():charData(NULL)
-{
-}
-
-/** see CharacterDataImpl.h*/
-CharacterDataImpl::CharacterDataImpl(const DOMString* data):charData(NULL)
-{
- if (data != NULL)
- charData = new DOMString(*data);
-}
-
-/** see CharacterDataImpl.h */
-void CharacterDataImpl::setData(const DOMString* data) throw (DOMException)
-{
-
- if (charData != NULL)
- delete charData;
-
- if (data == NULL)
- charData = NULL;
- else
- charData = new DOMString(*data);
-}
-
-/** see CharacterDataImpl.h */
-int CharacterDataImpl::getLength() const
-{
- return charData != NULL ? charData->length() : 0;
-}
-
-/** see CharacterDataImpl.h */
-void CharacterDataImpl::appendData(const DOMString* arg) throw(DOMException)
-{
- if (arg != NULL) {
- if (charData != NULL)
- charData->append(*arg);
- else
- charData = new DOMString(*arg);
- }
-}
-
-/** see CharacterDataImpl.h */
-const DOMString* CharacterDataImpl::getNodeValue() const throw(DOMException)
-{
- return getData();
-}
-
-/** see CharacterDataImpl.h */
-void CharacterDataImpl::setNodeValue(DOMString* nodeValue) throw(DOMException)
-{
- setData(nodeValue);
-}
-
-/** see CharacterDataImpl.h */
-CharacterDataImpl::~CharacterDataImpl()
-{
- delete charData;
-}
-
diff --git a/media/libdrm/mobile2/src/util/domcore/DOMException.cpp b/media/libdrm/mobile2/src/util/domcore/DOMException.cpp
deleted file mode 100644
index da9d3ce..0000000
--- a/media/libdrm/mobile2/src/util/domcore/DOMException.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
diff --git a/media/libdrm/mobile2/src/util/domcore/DocumentImpl.cpp b/media/libdrm/mobile2/src/util/domcore/DocumentImpl.cpp
deleted file mode 100644
index ebf46fb..0000000
--- a/media/libdrm/mobile2/src/util/domcore/DocumentImpl.cpp
+++ /dev/null
Binary files differ
diff --git a/media/libdrm/mobile2/src/util/domcore/ElementImpl.cpp b/media/libdrm/mobile2/src/util/domcore/ElementImpl.cpp
deleted file mode 100644
index df48831..0000000
--- a/media/libdrm/mobile2/src/util/domcore/ElementImpl.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/ElementImpl.h>
-
-/** see ElementImpl.h */
-NodeType ElementImpl::getNodeType() const
-{
- return ELEMENT_NODE;
-}
-
-/** see ElementImpl.h */
-const DOMString* ElementImpl::getNodeName() const
-{
- return getTagName();
-}
-
-/** see ElementImpl.h */
-const DOMString* ElementImpl::getTagName() const
-{
- return NULL;
-}
-
-/** see ElementImpl.h */
-void ElementImpl::setAttribute(const DOMString* name, const DOMString* value) throw (DOMException)
-{
-
-}
-
-/** see ElementImpl.h */
-void ElementImpl::removeAttribute(const DOMString* name) throw (DOMException)
-{
-
-}
-
-/** see ElementImpl.h */
-const DOMString* ElementImpl::getAttribute(const DOMString* name) const
-{
- return NULL;
-}
-
-/** see ElementImpl.h */
-void ElementImpl::getElementsByTagName(const DOMString* name, NodeListImpl* nodeList) const
-{
- NodeImpl* node = getFirstChild();
-
- if (node == NULL || name == NULL || nodeList == NULL)
- return;
-
- do {
-
- if (node->getNodeType() == ELEMENT_NODE) {
- ElementImpl* elementNode = static_cast<ElementImpl*>(node);
- if (*elementNode->getTagName() == *name)
- /* if current is element node and tag name is equal to <code>name</code>,put it into nodeList */
- nodeList->append(node);
- /*
- * visit DOM tree recursively,
- * get all Elements node whose tage name is equal to name.
- */
- elementNode->getElementsByTagName(name, nodeList);
- }
-
- /* set current node's next sibling node as current node.*/
- node = node->getNextSibling();
- } while(node != NULL);
-}
-
-/** see ElementImpl.h */
-NodeListImpl* ElementImpl::getElementsByTagName(const DOMString* name) const
-{
- NodeListImpl* nodeList = new NodeListImpl();
-
- if (nodeList == NULL || name == NULL)
- return NULL;
-
- getElementsByTagName(name,nodeList);
-
- return nodeList;
-}
-
-/** see ElementImpl.h */
-bool ElementImpl::hasAttributes() const
-{
- return false;
-}
diff --git a/media/libdrm/mobile2/src/util/domcore/NodeImpl.cpp b/media/libdrm/mobile2/src/util/domcore/NodeImpl.cpp
deleted file mode 100644
index 183c55e..0000000
--- a/media/libdrm/mobile2/src/util/domcore/NodeImpl.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/NodeImpl.h>
-#include <util/domcore/DocumentImpl.h>
-
-/** see NodeImpl.h. */
-void NodeImpl::setParent(NodeImpl* parentNode)
-{
- this->parent = parentNode;
-}
-
-/** see NodeImpl.h. */
-void NodeImpl::setNextSibling(NodeImpl* siblingNode)
-{
- this->nextSibling = siblingNode;
-}
-/** see NodeImpl.h. */
-void NodeImpl::setPreviousSibling(NodeImpl* siblingNode)
-{
- this->previousSibling = siblingNode;
-}
-
-/** see NodeImpl.h. */
-void NodeImpl::setFirstChild(NodeImpl* childNode)
-{
- this->firstChild = childNode;
-}
-
-/** see NodeImpl.h. */
-void NodeImpl::setLastChild(NodeImpl* childNode)
-{
- this->lastChild = childNode;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::getParentNode() const
-{
- return parent;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::getFirstChild() const
-{
- return firstChild;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::getLastChild() const
-{
- return lastChild;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::getPreviousSibling() const
-{
- return previousSibling;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::getNextSibling() const
-{
- return nextSibling;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::insertBefore(NodeImpl* newChild, NodeImpl* refChild) throw (DOMException)
-{
- if (newChild == NULL)
- #if PLATFORM_ANDROID
- return NULL;
- #else
- throw DOMException(DOMException::WRONG_DOCUMENT_ERR);
- #endif
- if (refChild == NULL || refChild->getParentNode() != this)
- #if PLATFORM_ANDROID
- return NULL;
- #else
- throw DOMException(DOMException::NOT_FOUND_ERR);
- #endif
-
- NodeImpl* parentNode = newChild->getParentNode();
-
- if (parentNode != NULL)
- parentNode->removeChild(newChild);
-
- NodeImpl* prevSiblingNode = refChild->getPreviousSibling();
-
- if (prevSiblingNode != NULL)
- prevSiblingNode->appendNextSibling(newChild);
- else
- setFirstChild(newChild);
-
- newChild->appendNextSibling(refChild);
- newChild->setParent(this);
-
- return newChild;
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::removeChild(NodeImpl* oldChild) throw (DOMException)
-{
-
- if (oldChild == NULL || oldChild->getParentNode() != this )
- #if PLATFORM_ANDROID
- return NULL;
- #else
- throw DOMException(DOMException::NOT_FOUND_ERR);
- #endif
-
- NodeImpl* parentNode = oldChild->getParentNode();
- NodeImpl* nextSiblingNode = oldChild->getNextSibling();
- NodeImpl* prevSiblingNode = oldChild->getPreviousSibling();
-
- if (prevSiblingNode == NULL && nextSiblingNode != NULL) {
- /*
- * children's previous sibling node == NULL and next sibling node !=
- * NULL, means the children node is the first node of its parent.
- * so set the children's next sibling node as the first node of its parent.
- */
- parentNode->setFirstChild(nextSiblingNode);
- nextSiblingNode->setPreviousSibling(NULL);
-
- } else if (prevSiblingNode != NULL && nextSiblingNode == NULL) {
- /*
- * children's previous sibling node != NULL and next sibling node ==
- * NULL, means the child node is the last node of parent.so set the
- * last node of children's parent as children's previous sibling node.
- */
- prevSiblingNode->setNextSibling(NULL);
- parentNode->setLastChild(prevSiblingNode);
-
- } else if (prevSiblingNode != NULL && nextSiblingNode != NULL) {
- /*
- * children's previous sibling node != NULL and next sibling node !=
- * NULL,means the node is neither first child nor last children of its parent.
- */
- prevSiblingNode->appendNextSibling(nextSiblingNode);
-
- } else if (prevSiblingNode == NULL && nextSiblingNode == NULL) {
- /*
- * this means it's only one children node of its parent.
- * so adjust the first child and last child to NULL when remove the children node.
- */
- this->setFirstChild(NULL);
- this->setLastChild(NULL);
- }
-
- oldChild->setParent(NULL);
- oldChild->setNextSibling(NULL);
- oldChild->setPreviousSibling(NULL);
-
- return oldChild;
-}
-
-/** see NodeImpl.h. */
-void NodeImpl::appendNextSibling(NodeImpl* node)
-{
- if (node == NULL)
- return;
-
- setNextSibling(node);
- node->setPreviousSibling(this);
-}
-
-/** see NodeImpl.h. */
-NodeImpl* NodeImpl::appendChild(NodeImpl* newChild) throw (DOMException)
-{
- if (newChild == NULL)
- #if PLATFORM_ANDROID
- return NULL;
- #else
- throw DOMException(DOMException::WRONG_DOCUMENT_ERR);
- #endif
- /* If newChild have parent,remove it from its parent at first.*/
- NodeImpl* parent = newChild->getParentNode();
- if (parent != NULL)
- parent->removeChild(newChild);
-
- if (getFirstChild() == NULL && getLastChild() == NULL) {
- /* There are not any nodes in current node.*/
- setFirstChild(newChild);
- } else if (getLastChild() != NULL) {
- getLastChild()->appendNextSibling(newChild);
- }
-
- newChild->setParent(this);
- setLastChild(newChild);
-
-
- return newChild;
-}
-
-/** see NodeImpl.h. */
-bool NodeImpl::hasChildNodes() const
-{
- return getFirstChild() != NULL;
-}
-
-/** see NodeImpl.h. */
-const DOMString* NodeImpl::getNodeValue() const throw (DOMException)
-{
- return NULL;
-}
-
-/** see NodeImpl.h. */
-void NodeImpl::setNodeValue(DOMString* nodeValue) throw (DOMException)
-{
-}
-
-/** see NodeImpl.h. */
-bool NodeImpl::hasAttributes() const
-{
- return false;
-}
-
-/** see NodeImpl.h */
-const DocumentImpl* NodeImpl::getDocument() const
-{
- return document;
-}
-
-/** see NodeImpl.h */
-void NodeImpl::setDocument(const DocumentImpl* document)
-{
- this->document = document;
-}
diff --git a/media/libdrm/mobile2/src/util/domcore/NodeIterator.cpp b/media/libdrm/mobile2/src/util/domcore/NodeIterator.cpp
deleted file mode 100644
index fe13669..0000000
--- a/media/libdrm/mobile2/src/util/domcore/NodeIterator.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/NodeImpl.h>
-#include <util/domcore/NodeIterator.h>
-
-/** see NodeIterator.h */
-NodeIterator::NodeIterator(NodeImpl* start,NodeImpl* scope,NodeImpl* end): scopeNode(scope),endNode(end),curNode(start)
-{
-}
-
-/** see NodeIterator.h */
-NodeImpl* NodeIterator::findNextOrderNode(NodeImpl* node)
-{
- if (node == endNode)
- return NULL;
-
- if (node != NULL) {
- if (node->hasChildNodes() == true) {
- node = node->getFirstChild();
- }else if (node == scopeNode && node->hasChildNodes() == false) {
- node = NULL;
- } else if (node->getNextSibling() != NULL) {
- node = node->getNextSibling();
- } else {
- while (node != scopeNode && node != NULL && node->getNextSibling() == NULL) {
- node = node->getParentNode();
- }
- if (node == scopeNode)
- node = NULL;
- if (node != NULL)
- node = node->getNextSibling();
- }
- }
- if (node == endNode || node == scopeNode)
- node = NULL;
-
- return node;
-}
-
-/** see NodeIterator.h */
-NodeImpl* NodeIterator::next()
-{
- NodeImpl* node = NULL;
-
- node = findNextOrderNode(curNode);
-
- if (node != NULL)
- curNode = node;
-
- return node;
-}
-
-/** see NodeIterator.h */
-NodeImpl* NodeIterator::prev()
-{
- NodeImpl* node;
-
- node = findPreviousOrderNode(curNode);
-
- if (node != NULL)
- curNode = node;
-
- return node;
-}
-
-/** see NodeIterator.h */
-NodeImpl* NodeIterator::findPreviousOrderNode(NodeImpl* node)
-{
- if (node == NULL || node == endNode)
- return NULL;
-
- if (node->getPreviousSibling() != NULL) {
- node = node->getPreviousSibling();
- while(node != NULL && node->hasChildNodes() == true)
- node = node->getLastChild();
- } else {
- if (node == scopeNode)
- node = NULL;
- else
- node = node->getParentNode();
- }
-
- if (node == scopeNode || node == endNode)
- return NULL;
-
- return node;
-}
-
diff --git a/media/libdrm/mobile2/src/util/domcore/NodeListImpl.cpp b/media/libdrm/mobile2/src/util/domcore/NodeListImpl.cpp
deleted file mode 100644
index 710d62d..0000000
--- a/media/libdrm/mobile2/src/util/domcore/NodeListImpl.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/NodeListImpl.h>
-
-/** see NodeListImpl.h*/
-void NodeListImpl::append(const NodeImpl* newNode)
-{
- if (newNode == NULL)
- return;
-
- nodeList.push_back(newNode);
-}
-
-/** see NodeListImpl.h*/
-const NodeImpl* NodeListImpl::item(int index) const
-{
- int size = nodeList.size();
-
- if (size == 0 || index > size - 1 || index < 0)
- return NULL;
-
- return nodeList.at(index);
-}
-
-/** see NodeListImpl.h*/
-int NodeListImpl::getLength() const
-{
- return nodeList.size();
-}
-
-/** see NodeListImpl.h*/
-NodeListImpl::~NodeListImpl()
-{
- nodeList.clear();
-}
diff --git a/media/libdrm/mobile2/src/util/domcore/TextImpl.cpp b/media/libdrm/mobile2/src/util/domcore/TextImpl.cpp
deleted file mode 100644
index 5e421d5..0000000
--- a/media/libdrm/mobile2/src/util/domcore/TextImpl.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/domcore/TextImpl.h>
-
-const DOMString TextImpl::nodeName = "#TEXT";
-
-/** see TextImpl.h */
-TextImpl::TextImpl()
-{
-}
-
-/** see TextImpl.h */
-TextImpl::TextImpl(const DOMString* data):CharacterDataImpl(data)
-{
-}
-
-/** see TextImpl.h */
-NodeType TextImpl::getNodeType() const
-{
- return TEXT_NODE;
-}
-
-/** see TextImpl.h */
-const DOMString* TextImpl::getNodeName() const
-{
- return &nodeName;
-}
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.cpp
deleted file mode 100644
index ae66463..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2006 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// bktrace.cc
-//
-
-#include "bktrace.h"
-#include "sostream.h"
-#include "mistream.h"
-#include "uassert.h"
-#if linux && __GNUC__ && !defined(HAVE_ANDROID_OS)
- #include <execinfo.h>
-#else
- static inline int backtrace (void**, int) { return (0); }
- static inline char** backtrace_symbols (void* const*, int) { return (NULL); }
-#endif
-#if __GNUC__ >= 3 && !PLATFORM_ANDROID
- #include <cxxabi.h>
-#endif
-
-namespace ustl {
-
-/// Default constructor. The backtrace is obtained here.
-CBacktrace::CBacktrace (void)
-: m_Symbols (NULL),
- m_nFrames (0),
- m_SymbolsSize (0)
-{
-#if !PLATFORM_ANDROID
- try {
-#endif
- m_nFrames = backtrace (VectorBlock (m_Addresses));
- GetSymbols();
-#if !PLATFORM_ANDROID
- } catch (...) {}
-#endif
-}
-
-/// Copy constructor.
-CBacktrace::CBacktrace (const CBacktrace& v)
-: m_Symbols (NULL),
- m_nFrames (0),
- m_SymbolsSize (0)
-{
- operator= (v);
-}
-
-/// Copy operator.
-const CBacktrace& CBacktrace::operator= (const CBacktrace& v)
-{
- memcpy (m_Addresses, v.m_Addresses, sizeof(m_Addresses));
- m_Symbols = strdup (v.m_Symbols);
- m_nFrames = v.m_nFrames;
- m_SymbolsSize = v.m_SymbolsSize;
- return (*this);
-}
-
-/// Converts a string returned by backtrace_symbols into readable form.
-static size_t ExtractAbiName (const char* isym, char* nmbuf)
-{
- // Prepare the demangled name, if possible
- size_t nmSize = 0;
- if (isym) {
- // Copy out the name; the strings are: "file(function+0x42) [0xAddress]"
- const char* mnStart = strchr (isym, '(');
- if (++mnStart == (const char*)(1))
- mnStart = isym;
- const char* mnEnd = strchr (isym, '+');
- const char* isymEnd = isym + strlen (isym);
- if (!mnEnd)
- mnEnd = isymEnd;
- nmSize = min (size_t (distance (mnStart, mnEnd)), 256U);
- memcpy (nmbuf, mnStart, nmSize);
- }
- nmbuf[nmSize] = 0;
- // Demangle
- demangle_type_name (nmbuf, 256U, &nmSize);
- return (nmSize);
-}
-
-/// Tries to get symbol information for the addresses.
-void CBacktrace::GetSymbols (void)
-{
- auto_ptr<char*> symbols (backtrace_symbols (m_Addresses, m_nFrames));
- if (!symbols.get())
- return;
- char nmbuf [256];
- size_t symSize = 1;
- for (uoff_t i = 0; i < m_nFrames; ++ i)
- symSize += ExtractAbiName (symbols.get()[i], nmbuf) + 1;
- if (!(m_Symbols = (char*) calloc (symSize, 1)))
- return;
- for (uoff_t i = 0; m_SymbolsSize < symSize - 1; ++ i) {
- size_t sz = ExtractAbiName (symbols.get()[i], nmbuf);
- memcpy (m_Symbols + m_SymbolsSize, nmbuf, sz);
- m_SymbolsSize += sz + 1;
- m_Symbols [m_SymbolsSize - 1] = '\n';
- }
-}
-
-/// Default destructor.
-CBacktrace::~CBacktrace (void)
-{
- free_nullok (m_Symbols);
-}
-
-#if SIZE_OF_LONG == 8
- #define ADDRESS_FMT "%16p "
-#else
- #define ADDRESS_FMT "%8p "
-#endif
-
-/// Prints the backtrace to \p os.
-void CBacktrace::text_write (ostringstream& os) const
-{
- const char *ss = m_Symbols, *se;
- for (uoff_t i = 0; i < m_nFrames; ++ i) {
- os.format (ADDRESS_FMT, m_Addresses[i]);
- se = strchr (ss, '\n') + 1;
- os.write (ss, distance (ss, se));
- ss = se;
- }
-}
-
-/// Reads the object from stream \p is.
-void CBacktrace::read (istream& is)
-{
- assert (is.aligned (alignof (m_Addresses[0])) && "Backtrace object contains pointers and must be void* aligned");
- is >> m_nFrames >> m_SymbolsSize;
- free_nullok (m_Symbols);
- m_Symbols = (char*) malloc (m_SymbolsSize + 1);
- is.read (m_Symbols, m_SymbolsSize);
- m_Symbols [m_SymbolsSize] = 0;
- is.align();
- is.read (m_Addresses, m_nFrames * sizeof(void*));
-}
-
-/// Writes the object to stream \p os.
-void CBacktrace::write (ostream& os) const
-{
- assert (os.aligned (alignof (m_Addresses[0])) && "Backtrace object contains pointers and must be void* aligned");
- os << m_nFrames << m_SymbolsSize;
- os.write (m_Symbols, m_SymbolsSize);
- os.align();
- os.write (m_Addresses, m_nFrames * sizeof(void*));
-}
-
-/// Returns the size of the written object.
-size_t CBacktrace::stream_size (void) const
-{
- return (Align (stream_size_of (m_nFrames) +
- stream_size_of (m_SymbolsSize) +
- m_nFrames * sizeof(void*) +
- m_SymbolsSize));
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.h b/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.h
deleted file mode 100644
index 7b8c0ea..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/bktrace.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2006 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// bktrace.h
-//
-
-#ifndef BKTRACE_H_63ABB1E4388CEDD975DBE58B57DE474F
-#define BKTRACE_H_63ABB1E4388CEDD975DBE58B57DE474F
-
-#include "ulimits.h"
-
-namespace ustl {
-
-class ostringstream;
-class istream;
-class ostream;
-
-/// \class CBacktrace bktrace.h ustl.h
-///
-/// \brief Stores the backtrace from the point of construction.
-///
-/// The backtrace, or callstack, is the listing of functions called to
-/// reach the construction of this object. This is useful for debugging,
-/// to print the location of an error. To get meaningful output you'll
-/// need to use a debug build with symbols and with frame pointers. For
-/// GNU ld you will also need to link with the -rdynamic option to see
-/// actual function names instead of __gxx_personality0+0xF4800.
-///
-class CBacktrace {
-public:
- CBacktrace (void);
- CBacktrace (const CBacktrace& v);
- ~CBacktrace (void);
- const CBacktrace& operator= (const CBacktrace& v);
- void text_write (ostringstream& os) const;
- void read (istream& is);
- void write (ostream& os) const;
- size_t stream_size (void) const;
-private:
- void GetSymbols (void);
-private:
- void* m_Addresses [64]; ///< Addresses of each function on the stack.
- char* m_Symbols; ///< Symbols corresponding to each address.
- uint32_t m_nFrames; ///< Number of addresses in m_Addresses.
- uint32_t m_SymbolsSize; ///< Size of m_Symbols.
-};
-
-} // namespace ustl
-
-ALIGNOF(ustl::CBacktrace, sizeof(void*))
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/bsconf.h b/media/libdrm/mobile2/src/util/ustl-1.0/bsconf.h
deleted file mode 100644
index 79b4af1..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/bsconf.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* This file is part of bsconf - a configure replacement.
- *
- * This is the configuration file used by bsconf.c to specify information
- * specific to your project that it needs to substitute into files listed
- * in g_Files. Being a configuration file, this file can be used or
- * modified entirely without restriction. You should change all values
- * appropriately to the name of your project and its requirements. The
- * bsconf license does not apply to this file. It can and should be
- * treated as a template for the creation of your own configuration file.
- *
- * All substituted variable names are given without enclosing @@. For
- * example: "CC" will match "@CC@" in config.h.in and replace it with
- * "gcc" in config.h.
-*/
-
-#include "uassert.h"
-
-#define BSCONF_VERSION 0x03
-
-#define PACKAGE_NAME "ustl"
-#define LIB_MAJOR "1"
-#define LIB_MINOR "0"
-#define LIB_BUILD "0"
-
-#define PACKAGE_VERSION LIB_MAJOR "." LIB_MINOR
-#define PACKAGE_TARNAME PACKAGE_NAME
-#define PACKAGE_STRING PACKAGE_NAME " " PACKAGE_VERSION
-#define PACKAGE_BUGREPORT "Mike Sharov <msharov@users.sourceforge.net>"
-
-static cpchar_t g_Files [] = {
- "Config.mk",
- "config.h",
- "ustl.spec"
-};
-
-/* Values substitute @VARNAME@ */
-static cpchar_t g_EnvVars [] = {
- "CC",
- "LD",
- "CXX",
- "CPP",
- "HOME",
- "CXXFLAGS",
- "LDFLAGS",
- "CPPFLAGS",
- "LDFLAGS",
- "CFLAGS"
-};
-
-/* VARIABLE PROGRAM HOW TO CALL IF NOT FOUND */
-static cpchar_t g_ProgVars [] = {
- "CC", "gcc", "gcc", "@CC@",
- "CC", "cc", "cc", "gcc",
- "CXX", "g++", "g++", "@CXX@",
- "CXX", "c++", "c++", "g++",
- "LD", "ld", "ld", "ld",
- "AR", "ar", "ar", "echo",
- "RANLIB", "ranlib", "ranlib", "touch",
- "DOXYGEN", "doxygen", "doxygen", "echo",
- "INSTALL", "install", "install -c", "cp"
-};
-
-/* NAME IF NOT FOUND IF FOUND */
-static cpchar_t g_Headers [] = {
- "assert.h", "#undef HAVE_ASSERT_H", "#define HAVE_ASSERT_H 1",
- "ctype.h", "#undef HAVE_CTYPE_H", "#define HAVE_CTYPE_H 1",
- "errno.h", "#undef HAVE_ERRNO_H", "#define HAVE_ERRNO_H 1",
- "fcntl.h", "#undef HAVE_FCNTL_H", "#define HAVE_FCNTL_H 1",
- "float.h", "#undef HAVE_FLOAT_H", "#define HAVE_FLOAT_H 1",
- "inttypes.h", "#undef HAVE_INTTYPES_H", "#define HAVE_INTTYPES_H 1",
- "limits.h", "#undef HAVE_LIMITS_H", "#define HAVE_LIMITS_H 1",
- "locale.h", "#undef HAVE_LOCALE_H", "#define HAVE_LOCALE_H 1",
- "malloc.h", "#undef HAVE_MALLOC_H", "#define HAVE_MALLOC_H 1",
- "alloca.h", "#undef HAVE_ALLOCA_H", "#define HAVE_ALLOCA_H 1",
- "memory.h", "#undef HAVE_MEMORY_H", "#define HAVE_MEMORY_H 1",
- "signal.h", "#undef HAVE_SIGNAL_H", "#define HAVE_SIGNAL_H 1",
- "stdarg.h", "#undef HAVE_STDARG_H", "#define HAVE_STDARG_H 1",
- "stddef.h", "#undef HAVE_STDDEF_H", "#define HAVE_STDDEF_H 1",
- "stdint.h", "#undef HAVE_STDINT_H", "#define HAVE_STDINT_H 1",
- "stdio.h", "#undef HAVE_STDIO_H", "#define HAVE_STDIO_H 1",
- "stdlib.h", "#undef HAVE_STDLIB_H", "#define HAVE_STDLIB_H 1",
- "string.h", "#undef HAVE_STRING_H", "#define HAVE_STRING_H 1",
- "strings.h", "#undef HAVE_STRINGS_H", "#define HAVE_STRINGS_H 1",
- "sys/stat.h", "#undef HAVE_SYS_STAT_H", "#define HAVE_SYS_STAT_H 1",
- "sys/types.h", "#undef HAVE_SYS_TYPES_H", "#define HAVE_SYS_TYPES_H 1",
- "sys/wait.h", "#undef HAVE_SYS_WAIT_H", "#define HAVE_SYS_WAIT_H 1",
- "time.h", "#undef HAVE_TIME_H", "#define HAVE_TIME_H 1",
- "unistd.h", "#undef HAVE_UNISTD_H", "#define HAVE_UNISTD_H 1",
- "math.h", "#undef HAVE_MATH_H", "#define HAVE_MATH_H 1",
- "stdlib.h", "#undef HAVE_STDLIB_H", "#define HAVE_STDLIB_H 1"
-};
-
-/* NAME IF NOT FOUND IF FOUND */
-static cpchar_t g_Libs [] = {
- "supc++", "", "-lsupc++",
-#if __GNUC__ >= 4
- "gcc", "-lgcc_s", "-lgcc_s",
- "gcc_eh", "", "",
-#elif __GNUC__ >= 3
- "gcc", "-lgcc_s", "-lgcc",
- "gcc_eh", "-lgcc_s", "-lgcc_eh",
-#else
- "gcc", "", "-lgcc",
- "gcc_eh", "", "",
-#endif
- "SystemStubs", "", "-lSystemStubs", /* For MacOS 10.4+ */
- "c", "", "-lc"
-};
-
-/* NAME IF NOT FOUND IF FOUND */
-static cpchar_t g_Functions [] = {
- "atexit", "#undef HAVE_ATEXIT", "#define HAVE_ATEXIT 1",
- "malloc", "#undef HAVE_MALLOC\n", "#define HAVE_MALLOC 1\n",
- "memchr", "#undef HAVE_MEMCHR", "#define HAVE_MEMCHR 1",
- "memmove", "#undef HAVE_MEMMOVE", "#define HAVE_MEMMOVE 1",
- "memset", "#undef HAVE_MEMSET", "#define HAVE_MEMSET 1",
- "ptrdiff_t", "#undef HAVE_PTRDIFF_T", "#define HAVE_PTRDIFF_T 1",
- "strerror", "#undef HAVE_STRERROR", "#define HAVE_STRERROR 1",
- "strsignal", "#undef HAVE_STRSIGNAL", "#define HAVE_STRSIGNAL 1",
- "strtol", "#undef HAVE_STRTOL", "#define HAVE_STRTOL 1",
-#if __GNUC__ >= 3
- "round", "#undef HAVE_ROUND", "#define HAVE_ROUND 1",
-#endif
- "strrchr", "#undef HAVE_STRRCHR", "#define HAVE_STRRCHR 1",
- "__va_copy", "#undef HAVE_VA_COPY", "#define HAVE_VA_COPY 1"
-};
-
-/* NAME WITHOUT TEXT WITH TEXT */
-static cpchar_t g_Components [] = {
- "shared", "#BUILD_SHARED\t= 1", "BUILD_SHARED\t= 1 ",
- "static", "#BUILD_STATIC\t= 1", "BUILD_STATIC\t= 1 ",
- "debug", "#DEBUG\t\t= 1", "DEBUG\t\t= 1 ",
- "bounds", "#undef WANT_STREAM_BOUNDS_CHECKING", "#define WANT_STREAM_BOUNDS_CHECKING 1 ",
- "fastcopy", "#undef WANT_UNROLLED_COPY", "#define WANT_UNROLLED_COPY 1 ",
-#if __GNUC__ >= 3 && (__i386__ || __x86_64__) && !sun
- "mmx", "#undef WANT_MMX", "#define WANT_MMX 1 ",
-#endif
- "libstdc++", "#define WITHOUT_LIBSTDCPP 1", "#undef WITHOUT_LIBSTDCPP",
- "libstdc++", "NOLIBSTDCPP\t= -nodefaultlibs ", "#NOLIBSTDCPP\t= -nodefaultlibs"
-};
-
-/* Parallel to g_Components */
-static SComponentInfo g_ComponentInfos [VectorSize(g_Components) / 3] = {
- { 1, "Builds the shared library (if supported by the OS)" },
- { 0, "Builds the static library" },
- { 0, "Compiles the library with debugging information" },
- { 1, "Disable runtime bounds checking on stream reads/writes" },
- { 1, "Disable specializations for copy/fill" },
-#if __GNUC__ >= 3 && (__i386__ || __x86_64__) && !sun
- { 1, "Disable use of MMX/SSE/3dNow! instructions" },
-#endif
-#if __GNUC__ >= 3
- { 0, "Link with libstdc++" },
- { 0, "" }
-#else
- { 1, "" },
- { 1, "" }
-#endif
-};
-
-/* Substitutes names like @PACKAGE_NAME@ with the second field */
-static cpchar_t g_CustomVars [] = {
- "PACKAGE_NAME", PACKAGE_NAME,
- "PACKAGE_VERSION", PACKAGE_VERSION,
- "PACKAGE_TARNAME", PACKAGE_TARNAME,
- "PACKAGE_STRING", PACKAGE_STRING,
- "PACKAGE_BUGREPORT", PACKAGE_BUGREPORT,
- "LIBNAME", PACKAGE_NAME,
- "LIB_MAJOR", LIB_MAJOR,
- "LIB_MINOR", LIB_MINOR,
- "LIB_BUILD", LIB_BUILD
-};
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.cpp
deleted file mode 100644
index 7250e9f..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// cmemlink.cc
-//
-// See cmemlink.h for documentation.
-//
-
-#include "cmemlink.h"
-#include "ofstream.h"
-#include "strmsize.h"
-#include "ualgo.h"
-#include "uassert.h"
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#undef CPU_HAS_MMX
-#endif
-
-namespace ustl {
-
-/// \brief Attaches the object to pointer \p p of size \p n.
-///
-/// If \p p is NULL and \p n is non-zero, bad_alloc is thrown and current
-/// state remains unchanged.
-///
-void cmemlink::link (const void* p, size_type n)
-{
- if (!p && n)
-#if PLATFORM_ANDROID
- printf("bad alloc\n");
-#else /* !PLATFORM_ANDROID */
- throw bad_alloc (n);
-#endif
- unlink();
- relink (p, n);
-}
-
-/// Writes the object to stream \p os
-void cmemlink::write (ostream& os) const
-{
- const written_size_type sz (size());
- assert (sz == size() && "No support for writing memblocks larger than 4G");
- os << sz;
- os.write (cdata(), sz);
- os.align (alignof (sz));
-}
-
-/// Writes the object to stream \p os
-void cmemlink::text_write (ostringstream& os) const
-{
- os.write (begin(), readable_size());
-}
-
-/// Returns the number of bytes required to write this object to a stream.
-cmemlink::size_type cmemlink::stream_size (void) const
-{
- const written_size_type sz (size());
- return (Align (stream_size_of (sz) + sz, alignof(sz)));
-}
-
-/// Writes the data to file \p "filename".
-void cmemlink::write_file (const char* filename, int mode) const
-{
- fstream f;
- f.exceptions (fstream::allbadbits);
- f.open (filename, fstream::out | fstream::trunc, mode);
- f.write (cdata(), readable_size());
- f.close();
-}
-
-/// swaps the contents with \p l
-void cmemlink::swap (cmemlink& l)
-{
-#if CPU_HAS_MMX && SIZE_OF_POINTER == 4
- asm (
- "movq %0, %%mm0\n\t"
- "movq %2, %%mm1\n\t"
- "movq %%mm0, %2\n\t"
- "movq %%mm1, %0"
- : "=m"(m_Data), "=m"(m_Size), "=m"(l.m_Data), "=m"(l.m_Size)
- :
- : "mm0", "mm1", "st", "st(1)");
- simd::reset_mmx();
-#elif CPU_HAS_SSE && SIZE_OF_POINTER == 8
- asm (
- "movups %0, %%xmm0\n\t"
- "movups %2, %%xmm1\n\t"
- "movups %%xmm0, %2\n\t"
- "movups %%xmm1, %0"
- : "=m"(m_Data), "=m"(m_Size), "=m"(l.m_Data), "=m"(l.m_Size)
- :
- : "xmm0", "xmm1");
-#else
- ::ustl::swap (m_Data, l.m_Data);
- ::ustl::swap (m_Size, l.m_Size);
-#endif
-}
-
-/// Compares to memory block pointed by l. Size is compared first.
-bool cmemlink::operator== (const cmemlink& l) const
-{
- return (l.m_Size == m_Size &&
- (l.m_Data == m_Data || 0 == memcmp (l.m_Data, m_Data, m_Size)));
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.h b/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.h
deleted file mode 100644
index 46a9388..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/cmemlink.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// cmemlink.h
-//
-
-#ifndef CMEMLINK_H_7CFAB32C5C6732ED29B34EF00EA40A12
-#define CMEMLINK_H_7CFAB32C5C6732ED29B34EF00EA40A12
-
-#include "ualgobase.h"
-
-/// The ustl namespace contains all ustl classes and algorithms.
-namespace ustl {
-
-class istream;
-class ostream;
-class ostringstream;
-
-/// \class cmemlink cmemlink.h ustl.h
-/// \ingroup MemoryManagement
-///
-/// \brief A read-only pointer to a sized block of memory.
-///
-/// Use this class the way you would a const pointer to an allocated unstructured block.
-/// The pointer and block size are available through member functions and cast operator.
-///
-/// Example usage:
-///
-/// \code
-/// void* p = malloc (46721);
-/// cmemlink a, b;
-/// a.link (p, 46721);
-/// assert (a.size() == 46721));
-/// b = a;
-/// assert (b.size() == 46721));
-/// assert (b.DataAt(34) == a.DataAt(34));
-/// assert (0 == memcmp (a, b, 12));
-/// \endcode
-///
-class cmemlink {
-public:
- typedef char value_type;
- typedef const value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type reference;
- typedef value_type const_reference;
- typedef size_t size_type;
- typedef uint32_t written_size_type;
- typedef ptrdiff_t difference_type;
- typedef const_pointer const_iterator;
- typedef const_iterator iterator;
- typedef const cmemlink& rcself_t;
-public:
- inline cmemlink (void) : m_Data (NULL), m_Size (0) { }
- inline cmemlink (const void* p, size_type n) : m_Data (const_pointer(p)), m_Size (n) { assert (p || !n); }
- inline cmemlink (const cmemlink& l) : m_Data (l.m_Data), m_Size (l.m_Size) {}
- inline virtual ~cmemlink (void) {}
- void link (const void* p, size_type n);
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, const void*)
- inline void link (const cmemlink& l) { link (l.begin(), l.size()); }
- inline void link (const void* first, const void* last) { link (first, distance (first, last)); }
- inline void relink (const void* p, size_type n);
- inline virtual void unlink (void) { m_Data = NULL; m_Size = 0; }
- inline rcself_t operator= (const cmemlink& l) { link (l); return (*this); }
- bool operator== (const cmemlink& l) const;
- void swap (cmemlink& l);
- inline size_type size (void) const { return (m_Size); }
- inline size_type max_size (void) const { return (size()); }
- inline size_type readable_size (void) const { return (size()); }
- inline bool empty (void) const { return (!size()); }
- inline const_pointer cdata (void) const { return (m_Data); }
- inline iterator begin (void) const { return (iterator (cdata())); }
- inline iterator iat (size_type i) const { assert (i <= size()); return (begin() + i); }
- inline iterator end (void) const { return (iat (size())); }
- inline void resize (size_type n) { m_Size = n; }
- inline void read (istream&) { assert (!"ustl::cmemlink is a read-only object."); }
- void write (ostream& os) const;
- size_type stream_size (void) const;
- void text_write (ostringstream& os) const;
- void write_file (const char* filename, int mode = 0644) const;
-private:
- const_pointer m_Data; ///< Pointer to the data block (const)
- size_type m_Size; ///< size of the data block
-};
-
-/// A fast alternative to link which can be used when relinking to the same block (i.e. when it is resized)
-inline void cmemlink::relink (const void* p, size_type n)
-{
- m_Data = reinterpret_cast<const_pointer>(p);
- m_Size = n;
-}
-
-/// Use with cmemlink-derived classes to link to a static array
-#define static_link(v) link (VectorBlock(v))
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/config.h b/media/libdrm/mobile2/src/util/ustl-1.0/config.h
deleted file mode 100644
index e6e4b7f..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/config.h
+++ /dev/null
@@ -1,296 +0,0 @@
-// config.h
-//
-// Autogenerated from config.h.in by bsconf.
-//
-
-#ifndef CONFIG_H_01E33670634DAAC779EE5FF41CCBB36F
-#define CONFIG_H_01E33670634DAAC779EE5FF41CCBB36F
-
-#include "uassert.h"
-
-#if PLATFORM_ANDROID
-
-#include <utils/Endian.h>
-
-// Byte order macros, converted in utypes.h
-#define USTL_LITTLE_ENDIAN __LITTLE_ENDIAN
-#define USTL_BIG_ENDIAN __BIG_ENDIAN
-#define USTL_BYTE_ORDER __BYTE_ORDER
-
-#if !defined NDEBUG
-#define NDEBUG
-#endif
-#else /* !PLATFORM_ANDROID */
-// Byte order macros, converted in utypes.h
-#define USTL_LITTLE_ENDIAN 4321
-#define USTL_BIG_ENDIAN 1234
-#define USTL_BYTE_ORDER USTL_LITTLE_ENDIAN
-#endif
-
-// Define to the one symbol short name of this package.
-#define USTL_NAME "ustl"
-// Define to the full name and version of this package.
-#define USTL_STRING "ustl 1.0"
-// Define to the version of this package.
-#define USTL_VERSION 0x100
-// Define to the address where bug reports for this package should be sent.
-#define USTL_BUGREPORT "Mike Sharov <msharov@users.sourceforge.net>"
-
-/// Define to 1 if you want stream operations to throw exceptions on
-/// insufficient data or insufficient space. All these errors should
-/// be preventable in output code; the input code should verify the
-/// data in a separate step. It slows down stream operations a lot,
-/// but it's your call. By default only debug builds throw.
-///
-#undef WANT_STREAM_BOUNDS_CHECKING
-
-#if !defined(WANT_STREAM_BOUNDS_CHECKING) && !defined(NDEBUG)
- #define WANT_STREAM_BOUNDS_CHECKING 1
-#endif
-
-/// Define to 1 if you want to build without libstdc++
-#define WITHOUT_LIBSTDCPP 1
-
-/// Define GNU extensions if unavailable.
-#ifndef __GNUC__
- /// GCC (and some other compilers) define '__attribute__'; ustl is using this
- /// macro to alert the compiler to flag inconsistencies in printf/scanf-like
- /// function calls. Just in case '__attribute__' isn't defined, make a dummy.
- ///
- #ifndef __attribute__
- #define __attribute__(p)
- #endif
-#endif
-#if defined(__GNUC__) && __GNUC__ >= 4
- #define DLL_EXPORT __attribute__((visibility("default")))
- #define DLL_LOCAL __attribute__((visibility("hidden")))
-#else
- #define DLL_EXPORT
- #define DLL_LOCAL
-#endif
-#if defined(__GNUC__) && __GNUC__ >= 3 && __i386__
- /// GCC 3+ supports the prefetch directive, which some CPUs use to improve caching
- #define prefetch(p,rw,loc) __builtin_prefetch(p,rw,loc)
-#else
- #define prefetch(p,rw,loc)
-#endif
-#if !defined(__GNUC__) || __GNUC__ < 3
- /// __alignof__ returns the recommended alignment for the type
- #define __alignof__(v) min(sizeof(v), sizeof(void*))
-#endif
-
-/// Define to 1 if you have the `atexit' function.
-#define HAVE_ATEXIT 1
-
-/// Define to 1 if you have the <assert.h> header file.
-#define HAVE_ASSERT_H 1
-
-/// Define to 1 if you have the <ctype.h> header file.
-#define HAVE_CTYPE_H 1
-
-/// Define to 1 if you have the <errno.h> header file.
-#define HAVE_ERRNO_H 1
-
-/// Define to 1 if you have the <fcntl.h> header file.
-#define HAVE_FCNTL_H 1
-
-/// Define to 1 if you have the <float.h> header file.
-#define HAVE_FLOAT_H 1
-
-/// Define to 1 if you have the <inttypes.h> header file.
-#define HAVE_INTTYPES_H 1
-
-/// Define to 1 if you have the <limits.h> header file.
-#define HAVE_LIMITS_H 1
-
-/// Define to 1 if you have the <locale.h> header file.
-#define HAVE_LOCALE_H 1
-
-/// Define to 1 if your system has a working `malloc' function.
-#define HAVE_MALLOC 1
-
-// Define to 1 if you have the <malloc.h> header file.
-#undef HAVE_MALLOC_H
-
-// Define to 1 if you have the <alloca.h> header file.
-#define HAVE_ALLOCA_H 1
-
-// Define to 1 if you have the `memchr' function.
-#define HAVE_MEMCHR 1
-
-// Define to 1 if you have the `memmove' function.
-#define HAVE_MEMMOVE 1
-
-// Define to 1 if you have the <memory.h> header file.
-#define HAVE_MEMORY_H 1
-
-// Define to 1 if you have the `memset' function.
-#define HAVE_MEMSET 1
-
-// Define to 1 if the system has the type `ptrdiff_t'.
-#define HAVE_PTRDIFF_T 1
-
-// Define to 1 if you have the <signal.h> header file.
-#define HAVE_SIGNAL_H 1
-
-// Define to 1 if you have the __va_copy function
-#define HAVE_VA_COPY 1
-
-// Define to 1 if `stat' has the bug that it succeeds when given the
-// zero-length file name argument.
-/* #undef HAVE_STAT_EMPTY_STRING_BUG */
-
-// Define to 1 if you have the <stdarg.h> header file.
-#define HAVE_STDARG_H 1
-
-// Define to 1 if you have the <stddef.h> header file.
-#define HAVE_STDDEF_H 1
-
-// Define to 1 if you have the <stdint.h> header file.
-#define HAVE_STDINT_H 1
-
-// Define to 1 if you have the <stdio.h> header file.
-#define HAVE_STDIO_H 1
-
-// Define to 1 if you have the <stdlib.h> header file.
-#define HAVE_STDLIB_H 1
-
-// Define to 1 if you have the `strerror' function.
-#define HAVE_STRERROR 1
-
-// Define to 1 if you have the <strings.h> header file.
-#define HAVE_STRINGS_H 1
-
-// Define to 1 if you have the <string.h> header file.
-#define HAVE_STRING_H 1
-
-// Define to 1 if you have the `strrchr' function.
-#define HAVE_STRRCHR 1
-
-// Define to 1 if you have the `strsignal' function.
-#undef HAVE_STRSIGNAL
-
-// Define to 1 if you have the `strtol' function.
-#define HAVE_STRTOL 1
-
-// Define to 1 if you have the <sys/stat.h> header file.
-#define HAVE_SYS_STAT_H 1
-
-// Define to 1 if you have the <sys/types.h> header file.
-#define HAVE_SYS_TYPES_H 1
-
-// Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible.
-#define HAVE_SYS_WAIT_H 1
-
-// Define to 1 if you have the <time.h> header file.
-#define HAVE_TIME_H 1
-
-// Define to 1 if you have the <unistd.h> header file.
-#define HAVE_UNISTD_H 1
-
-// Define to 1 if you have the <math.h> header file.
-#define HAVE_MATH_H 1
-
-// Define to 1 if you have the rintf function. Will use rint otherwise.
-#undef HAVE_RINTF
-
-// STDC_HEADERS is defined to 1 on sane systems.
-#if defined(HAVE_ASSERT_H) && defined(HAVE_CTYPE_H) &&\
- defined(HAVE_ERRNO_H) && defined(HAVE_FLOAT_H) &&\
- defined(HAVE_LIMITS_H) && defined(HAVE_LOCALE_H) &&\
- defined(HAVE_MATH_H) && defined(HAVE_SIGNAL_H) &&\
- defined(HAVE_STDARG_H) && defined(HAVE_STDDEF_H) &&\
- defined(HAVE_STDIO_H) && defined(HAVE_STDLIB_H) &&\
- defined(HAVE_STRING_H) && defined(HAVE_TIME_H)
-#define STDC_HEADERS 1
-#endif
-
-// STDC_HEADERS is defined to 1 on unix systems.
-#if defined(HAVE_FCNTL_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H)
-#define STDUNIX_HEADERS 1
-#endif
-
-// Define to 1 if `lstat' dereferences a symlink specified with a trailing slash.
-#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
-
-// Define to 1 if your compiler treats char as a separate type along with
-// signed char and unsigned char. This will create overloads for char.
-#define HAVE_THREE_CHAR_TYPES 1
-
-// Define as the return type of signal handlers (`int' or `void').
-#define RETSIGTYPE void
-
-// Define to 1 if you have 64 bit types available
-#define HAVE_INT64_T 1
-
-// Define to 1 if you have the long long type
-#undef HAVE_LONG_LONG
-
-// Define to 1 if you want unrolled specializations for fill and copy
-#define WANT_UNROLLED_COPY 1
-
-// Define to 1 if you want to use MMX/SSE/3dNow! processor instructions
-#undef WANT_MMX
-
-// Define to byte sizes of types
-#define SIZE_OF_CHAR 1
-#define SIZE_OF_SHORT 2
-#define SIZE_OF_INT 4
-#define SIZE_OF_LONG 4
-#define SIZE_OF_LONG_LONG 8
-#define SIZE_OF_POINTER 4
-#define SIZE_OF_SIZE_T 4
-#define SIZE_OF_BOOL SIZE_OF_LONG
-#if SIZE_OF_SIZE_T == SIZE_OF_LONG
-#define SIZE_T_IS_LONG 1
-#else
-#define SIZE_T_IS_LONG 0
-#endif
-
-// Extended CPU capabilities
-#undef CPU_HAS_FPU
-#undef CPU_HAS_EXT_DEBUG
-#undef CPU_HAS_TIMESTAMPC
-#undef CPU_HAS_MSR
-#undef CPU_HAS_CMPXCHG8
-#undef CPU_HAS_APIC
-#undef CPU_HAS_SYSCALL
-#undef CPU_HAS_MTRR
-#undef CPU_HAS_CMOV
-#undef CPU_HAS_FCMOV
-#if WANT_MMX
-#undef CPU_HAS_MMX
-#undef CPU_HAS_FXSAVE
-#undef CPU_HAS_SSE
-#undef CPU_HAS_SSE2
-#undef CPU_HAS_SSE3
-#undef CPU_HAS_EXT_3DNOW
-#undef CPU_HAS_3DNOW
-#endif
-
-// GCC vector extensions
-#if defined(CPU_HAS_MMX) || defined(CPU_HAS_SSE)
- #define HAVE_VECTOR_EXTENSIONS 1
-#endif
-
-#if CPU_HAS_SSE && defined(__GNUC__)
- #define __sse_align __attribute__((aligned(16)))
-#else
- #define __sse_align
-#endif
-
-// Define to empty if `const' does not conform to ANSI C.
-/* #define const */
-
-// Define as `__inline' if that's what the C compiler calls it, or to nothing
-// if it is not supported.
-/* #define inline __inline */
-
-// Define to `long' if <sys/types.h> does not define.
-/* typedef long off_t; */
-
-// Define to `unsigned' if <sys/types.h> does not define.
-/* typedef long size_t; */
-
-#endif // CONFIG_H_01E33670634DAAC779EE5FF41CCBB36F
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/fstream.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/fstream.cpp
deleted file mode 100644
index 06b9691..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/fstream.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// file.cc
-//
-
-#include "fstream.h"
-#include "uassert.h"
-#include "uexception.h"
-#include "uutility.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <sys/ioctl.h>
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#endif
-
-namespace ustl {
-
-/// Default constructor.
-fstream::fstream (void)
-: ios_base (),
- m_fd (-1),
- m_Filename ()
-{
-}
-
-/// Opens \p filename in \p mode.
-fstream::fstream (const char* filename, openmode mode)
-: ios_base (),
- m_fd (-1),
- m_Filename ()
-{
- open (filename, mode);
-}
-
-/// Attaches to \p nfd of \p filename.
-fstream::fstream (int nfd, const char* filename)
-: ios_base (),
- m_fd (-1),
- m_Filename ()
-{
- attach (nfd, filename);
-}
-
-/// Destructor. Closes if still open, but without throwing.
-fstream::~fstream (void) throw()
-{
- clear (goodbit);
- exceptions (goodbit);
- close();
- assert (!(rdstate() & badbit) && "close failed in the destructor! This may lead to loss of user data. Please call close() manually and either enable exceptions or check the badbit.");
-}
-
-/// Sets state \p s and throws depending on the exception setting.
-void fstream::set_and_throw (iostate s, const char* op)
-{
- if (ios_base::set_and_throw (s))
-#if PLATFORM_ANDROID
- printf("file_exception\n");
-#else /* !PLATFORM_ANDROID */
- throw file_exception (op, name());
-#endif
-}
-
-/// Attaches to the given \p nfd.
-void fstream::attach (int nfd, const char* filename)
-{
- assert (filename && "Don't do that");
- clear (goodbit);
- if (nfd < 0 && ios_base::set_and_throw (badbit))
-#if PLATFORM_ANDROID
- printf("file exception\n");
-#else /* !PLATFORM_ANDROID */
- throw file_exception ("open", filename);
-#endif
- close();
- m_fd = nfd;
- m_Filename = filename;
-}
-
-/// Detaches from the current fd.
-void fstream::detach (void)
-{
- m_fd = -1;
- m_Filename.clear();
-}
-
-/// Converts openmode bits into libc open flags.
-/*static*/ int fstream::om_to_flags (openmode m)
-{
- static const int s_OMFlags [nombits] = {
- 0, // in
- O_CREAT, // out
- O_APPEND, // app
- O_APPEND, // ate
- 0, // binary
- O_TRUNC, // trunc
- O_NONBLOCK, // nonblock
- 0, // nocreate
- O_NOCTTY // noctty
- };
- int flags = (m - 1) & O_ACCMODE; // in and out
- for (uoff_t i = 0; i < VectorSize(s_OMFlags); ++ i)
- if (m & (1 << i))
- flags |= s_OMFlags[i];
- if (m & nocreate)
- flags &= ~O_CREAT;
- return (flags);
-}
-
-/// \brief Opens \p filename in the given mode.
-/// \warning The string at \p filename must exist until the object is closed.
-void fstream::open (const char* filename, openmode mode, mode_t perms)
-{
- int nfd = ::open (filename, om_to_flags(mode), perms);
- attach (nfd, filename);
-}
-
-/// Closes the file and throws on error.
-void fstream::close (void)
-{
- if (m_fd >= 0 && ::close(m_fd))
- set_and_throw (badbit | failbit, "close");
- detach();
-}
-
-/// Moves the current file position to \p n.
-off_t fstream::seek (off_t n, seekdir whence)
-{
- off_t p = lseek (m_fd, n, whence);
- if (p < 0)
- set_and_throw (failbit, "seek");
- return (p);
-}
-
-/// Returns the current file position.
-off_t fstream::pos (void) const
-{
- return (lseek (m_fd, 0, SEEK_CUR));
-}
-
-/// Reads \p n bytes into \p p.
-off_t fstream::read (void* p, off_t n)
-{
- off_t br (0);
- while (br < n && good())
- br += readsome (advance (p, br), n - br);
- return (br);
-}
-
-/// Reads at most \p n bytes into \p p, stopping when it feels like it.
-off_t fstream::readsome (void* p, off_t n)
-{
- ssize_t brn;
- do { brn = ::read (m_fd, p, n); } while (brn < 0 && errno == EINTR);
- if (brn > 0)
- return (brn);
- if (brn < 0 && errno != EAGAIN)
- set_and_throw (failbit, "read");
- if (!brn && ios_base::set_and_throw (eofbit | failbit))
-#if PLATFORM_ANDROID
- printf("stream_bounds_exception\n");
-#else /* !PLATFORM_ANDROID */
- throw stream_bounds_exception ("read", name(), pos(), n, 0);
-#endif
- return (0);
-}
-
-/// Writes \p n bytes from \p p.
-off_t fstream::write (const void* p, off_t n)
-{
- off_t btw (n);
- while (btw) {
- const off_t bw (n - btw);
- ssize_t bwn = ::write (m_fd, advance(p,bw), btw);
- if (bwn > 0)
- btw -= bwn;
- else if (!bwn) {
- if (ios_base::set_and_throw (eofbit | failbit))
-#if PLATFORM_ANDROID
- printf("stream_bounds_exception\n");
-#else /* !PLATFORM_ANDROID */
- throw stream_bounds_exception ("write", name(), pos() - bw, n, bw);
-#endif
- break;
- } else if (errno != EINTR) {
- if (errno != EAGAIN)
- set_and_throw (failbit, "write");
- break;
- }
- }
- return (n - btw);
-}
-
-/// Returns the file size.
-off_t fstream::size (void) const
-{
- struct stat st;
- st.st_size = 0;
- stat (st);
- return (st.st_size);
-}
-
-/// Synchronizes the file's data and status with the disk.
-void fstream::sync (void)
-{
- if (fsync (m_fd))
- set_and_throw (failbit, "sync");
-}
-
-/// Get the stat structure.
-void fstream::stat (struct stat& rs) const
-{
- if (fstat (m_fd, &rs))
-#if PLATFORM_ANDROID
- printf("file_exception\n");
-#else
- throw file_exception ("stat", name());
-#endif
-}
-
-/// Calls the given ioctl. Use IOCTLID macro to pass in both \p name and \p request.
-int fstream::ioctl (const char* rname, int request, long argument)
-{
- int rv = ::ioctl (m_fd, request, argument);
- if (rv < 0)
- set_and_throw (failbit, rname);
- return (rv);
-}
-
-/// Calls the given fcntl. Use FCNTLID macro to pass in both \p name and \p request.
-int fstream::fcntl (const char* rname, int request, long argument)
-{
- int rv = ::fcntl (m_fd, request, argument);
- if (rv < 0)
- set_and_throw (failbit, rname);
- return (rv);
-}
-
-/// Memory-maps the file and returns a link to it.
-memlink fstream::mmap (off_t n, off_t offset)
-{
- void* result = ::mmap (NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED, m_fd, offset);
- if (result == MAP_FAILED)
- set_and_throw (failbit, "mmap");
- return (memlink (result, n));
-}
-
-/// Unmaps a memory-mapped area.
-void fstream::munmap (memlink& l)
-{
- if (::munmap (l.data(), l.size()))
- set_and_throw (failbit, "munmap");
- l.unlink();
-}
-
-/// Synchronizes a memory-mapped area.
-void fstream::msync (memlink& l)
-{
- if (::msync (l.data(), l.size(), MS_ASYNC | MS_INVALIDATE))
- set_and_throw (failbit, "msync");
-}
-
-void fstream::set_nonblock (bool v)
-{
- int curf = fcntl (FCNTLID (F_GETFL));
- if (curf < 0) return;
- if (v) curf |= O_NONBLOCK;
- else curf &= ~O_NONBLOCK;
- fcntl (FCNTLID (F_SETFL), curf);
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/fstream.h b/media/libdrm/mobile2/src/util/ustl-1.0/fstream.h
deleted file mode 100644
index cf60bbd..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/fstream.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// fstream.h
-//
-
-#ifndef FSTREAM_H_056E10F70EAD416443E3B36A2D6B5FA3
-#define FSTREAM_H_056E10F70EAD416443E3B36A2D6B5FA3
-
-#include "uios.h"
-#include "ustring.h"
-
-struct stat;
-
-namespace ustl {
-
-/// \class fstream fstream.h ustl.h
-///
-/// \brief Implements file operations.
-///
-/// This is not implemented as a stream, but rather as a base for one. You
-/// should use ifstream or ofstream if you want flow operators. Otherwise
-/// this only implements functions for binary i/o.
-///
-class fstream : public ios_base {
-public:
- fstream (void);
- explicit fstream (const char* filename, openmode mode = in | out);
- explicit fstream (int nfd, const char* filename = string::empty_string);
- ~fstream (void) throw();
- void open (const char* filename, openmode mode, mode_t perms = 0644);
- void attach (int nfd, const char* filename = string::empty_string);
- void detach (void);
- void close (void);
- void sync (void);
- off_t read (void* p, off_t n);
- off_t readsome (void* p, off_t n);
- off_t write (const void* p, off_t n);
- off_t size (void) const;
- off_t seek (off_t n, seekdir whence = beg);
- off_t pos (void) const;
- void stat (struct stat& rs) const;
- int ioctl (const char* rname, int request, long argument = 0);
- inline int ioctl (const char* rname, int request, int argument) { return (fstream::ioctl (rname, request, long(argument))); }
- inline int ioctl (const char* rname, int request, void* argument) { return (fstream::ioctl (rname, request, intptr_t(argument))); }
- int fcntl (const char* rname, int request, long argument = 0);
- inline int fcntl (const char* rname, int request, int argument) { return (fstream::fcntl (rname, request, long(argument))); }
- inline int fcntl (const char* rname, int request, void* argument) { return (fstream::fcntl (rname, request, intptr_t(argument))); }
- memlink mmap (off_t n, off_t offset = 0);
- void munmap (memlink& l);
- void msync (memlink& l);
- void set_nonblock (bool v = true);
- inline int fd (void) const { return (m_fd); }
- inline bool is_open (void) const { return (fd() >= 0); }
- inline off_t tellg (void) const { return (pos()); }
- inline off_t tellp (void) const { return (pos()); }
- inline void seekg (off_t n, seekdir whence = beg) { seek (n, whence); }
- inline void seekp (off_t n, seekdir whence = beg) { seek (n, whence); }
- inline void flush (void) { sync(); }
- inline const string& name (void) const { return (m_Filename); }
-private:
- DLL_LOCAL static int om_to_flags (openmode m);
- DLL_LOCAL void set_and_throw (iostate s, const char* op);
-private:
- int m_fd; ///< Currently open file descriptor.
- string m_Filename; ///< Currently open filename.
-};
-
-/// Argument macro for fstream::ioctl. Use like fs.ioctl (IOCTLID (TCGETS), &ts).
-#define IOCTLID(r) "ioctl("#r")", r
-#define FCNTLID(r) "fcntl("#r")", r
-
-}
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/memblock.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/memblock.cpp
deleted file mode 100644
index 721433e..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/memblock.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// memblock.cc
-//
-// Allocated memory block.
-//
-
-#include "fstream.h"
-#include "mistream.h"
-#include "memblock.h"
-#include "ualgo.h"
-#include "uassert.h"
-#include "umemory.h"
-
-#include <errno.h>
-
-namespace ustl {
-
-/// Allocates 0 bytes for the internal block.
-memblock::memblock (void)
-: memlink (),
- m_Capacity (0)
-{
-}
-
-/// Allocates \p n bytes for the internal block.
-memblock::memblock (size_type n)
-: memlink (),
- m_Capacity (0)
-{
- resize (n);
-}
-
-/// links to \p p, \p n. Data can not be modified and will not be freed.
-memblock::memblock (const void* p, size_type n)
-: memlink (),
- m_Capacity (0)
-{
- assign (p, n);
-}
-
-/// Links to what \p b is linked to.
-memblock::memblock (const cmemlink& b)
-: memlink (),
- m_Capacity (0)
-{
- assign (b);
-}
-
-/// Links to what \p b is linked to.
-memblock::memblock (const memlink& b)
-: memlink (),
- m_Capacity (0)
-{
- assign (b);
-}
-
-/// Links to what \p b is linked to.
-memblock::memblock (const memblock& b)
-: memlink (),
- m_Capacity (0)
-{
- assign (b);
-}
-
-/// Frees internal data, if appropriate
-/// Only if the block was allocated using resize, or linked to using Manage,
-/// will it be freed. Also, Derived classes should call DestructBlock from
-/// their destructor, because upstream virtual functions are unavailable at
-/// this point and will not be called automatically.
-///
-memblock::~memblock (void)
-{
- if (!is_linked())
- deallocate();
-}
-
-/// resizes the block to \p newSize bytes, reallocating if necessary.
-void memblock::resize (size_type newSize, bool bExact)
-{
- if (m_Capacity < newSize + minimumFreeCapacity())
- reserve (newSize, bExact);
- memlink::resize (newSize);
-}
-
-/// Frees internal data.
-void memblock::deallocate (void) throw()
-{
- if (m_Capacity) {
- assert (cdata() && "Internal error: space allocated, but the pointer is NULL");
- assert (data() && "Internal error: read-only block is marked as allocated space");
- free (data());
- }
- unlink();
-}
-
-/// Assumes control of the memory block \p p of size \p n.
-/// The block assigned using this function will be freed in the destructor.
-void memblock::manage (void* p, size_type n)
-{
- assert (p || !n);
- assert (!m_Capacity && "Already managing something. deallocate or unlink first.");
- link (p, n);
- m_Capacity = n;
-}
-
-/// "Instantiate" a linked block by allocating and copying the linked data.
-void memblock::copy_link (void)
-{
- const cmemlink l (*this);
- if (is_linked())
- unlink();
- assign (l);
-}
-
-/// Copies data from \p p, \p n.
-void memblock::assign (const void* p, size_type n)
-{
- assert ((p != (const void*) cdata() || size() == n) && "Self-assignment can not resize");
- resize (n);
- copy (p, n);
-}
-
-/// \brief Reallocates internal block to hold at least \p newSize bytes.
-///
-/// Additional memory may be allocated, but for efficiency it is a very
-/// good idea to call reserve before doing byte-by-byte edit operations.
-/// The block size as returned by size() is not altered. reserve will not
-/// reduce allocated memory. If you think you are wasting space, call
-/// deallocate and start over. To avoid wasting space, use the block for
-/// only one purpose, and try to get that purpose to use similar amounts
-/// of memory on each iteration.
-///
-void memblock::reserve (size_type newSize, bool bExact)
-{
- if ((newSize += minimumFreeCapacity()) <= m_Capacity)
- return;
- void* oldBlock (is_linked() ? NULL : data());
- if (!bExact)
- newSize = Align (newSize, c_PageSize);
- pointer newBlock = (pointer) realloc (oldBlock, newSize);
- if (!newBlock)
-#if PLATFORM_ANDROID
- printf("bad_alloc\n");
-#else
- throw bad_alloc (newSize);
-#endif
- if (!oldBlock && cdata())
- copy_n (cdata(), min (size() + 1, newSize), newBlock);
- link (newBlock, size());
- m_Capacity = newSize;
-}
-
-/// Swaps the contents with \p l
-void memblock::swap (memblock& l)
-{
- memlink::swap (l);
- ::ustl::swap (m_Capacity, l.m_Capacity);
-}
-
-/// Shifts the data in the linked block from \p start to \p start + \p n.
-memblock::iterator memblock::insert (iterator start, size_type n)
-{
- const uoff_t ip = start - begin();
- assert (ip <= size());
- resize (size() + n, false);
- memlink::insert (iat(ip), n);
- return (iat (ip));
-}
-
-/// Shifts the data in the linked block from \p start + \p n to \p start.
-memblock::iterator memblock::erase (iterator start, size_type n)
-{
- const uoff_t ep = start - begin();
- assert (ep + n <= size());
- memlink::erase (start, n);
- memlink::resize (size() - n);
- return (iat (ep));
-}
-
-/// Unlinks object.
-void memblock::unlink (void)
-{
- memlink::unlink();
- m_Capacity = 0;
-}
-
-/// Reads the object from stream \p s
-void memblock::read (istream& is)
-{
- written_size_type n;
- is >> n;
- is.verify_remaining ("read", "ustl::memblock", n);
- resize (n);
- is.read (data(), writable_size());
- is.align (alignof (n));
-}
-
-/// Reads the entire file \p "filename".
-void memblock::read_file (const char* filename)
-{
- fstream f;
- f.exceptions (fstream::allbadbits);
- f.open (filename, fstream::in);
- const off_t fsize (f.size());
- reserve (fsize);
- f.read (data(), fsize);
- f.close();
- resize (fsize);
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/memblock.h b/media/libdrm/mobile2/src/util/ustl-1.0/memblock.h
deleted file mode 100644
index d85ea0e..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/memblock.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// memblock.h
-//
-
-#ifndef MEMBLOCK_H_7ED63A891164CC43578E63664D52A196
-#define MEMBLOCK_H_7ED63A891164CC43578E63664D52A196
-
-#include "memlink.h"
-
-namespace ustl {
-
-/// \class memblock memblock.h ustl.h
-/// \ingroup MemoryManagement
-///
-/// \brief Allocated memory block.
-///
-/// Adds memory management capabilities to memlink. Uses malloc and realloc to
-/// maintain the internal pointer, but only if allocated using members of this class,
-/// or if linked to using the Manage() member function. Managed memory is automatically
-/// freed in the destructor.
-///
-class memblock : public memlink {
-public:
- static const size_type c_PageSize = 64; ///< The default minimum allocation unit.
-public:
- memblock (void);
- memblock (const void* p, size_type n);
- explicit memblock (size_type n);
- explicit memblock (const cmemlink& b);
- explicit memblock (const memlink& b);
- memblock (const memblock& b);
- virtual ~memblock (void);
- virtual void unlink (void);
- inline void assign (const cmemlink& l) { assign (l.cdata(), l.readable_size()); }
- inline const memblock& operator= (const cmemlink& l) { assign (l); return (*this); }
- inline const memblock& operator= (const memlink& l) { assign (l); return (*this); }
- inline const memblock& operator= (const memblock& l) { assign (l); return (*this); }
- void assign (const void* p, size_type n);
- void swap (memblock& l);
- void reserve (size_type newSize, bool bExact = true);
- void resize (size_type newSize, bool bExact = true);
- iterator insert (iterator start, size_type size);
- iterator erase (iterator start, size_type size);
- inline void clear (void) { resize (0); }
- inline bool is_linked (void) const { return (!m_Capacity && cdata()); }
- inline size_type max_size (void) const { return (is_linked() ? memlink::max_size() : SIZE_MAX); }
- inline size_type capacity (void) const { return (m_Capacity); }
- inline void manage (memlink& l) { manage (l.begin(), l.size()); }
- void deallocate (void) throw();
- void manage (void* p, size_type n);
- void copy_link (void);
- void read (istream& is);
- void read_file (const char* filename);
-protected:
- inline virtual size_type minimumFreeCapacity (void) const { return (0); }
-private:
- size_type m_Capacity; ///< Number of bytes allocated by Resize.
-};
-
-/// Reads object \p l from stream \p is
-inline istream& operator>> (istream& is, memblock& l)
-{
- l.read (is);
- return (is);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/memlink.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/memlink.cpp
deleted file mode 100644
index bed6601..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/memlink.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// memlink.cc
-//
-// A pointer to a sized block of memory.
-//
-
-#include "mistream.h"
-#include "uassert.h"
-#include "ustdxept.h"
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#endif
-
-namespace ustl {
-
-/// Reads the object from stream \p s
-void memlink::read (istream& is)
-{
- written_size_type n;
- is >> n;
- is.verify_remaining ("read", "ustl::memlink", n);
- if (n > size())
-#if PLATFORM_ANDROID
- printf("length error\n");
-#else
- throw length_error ("memlink can not increase the size of the linked storage for reading");
-#endif
- resize (n);
- is.read (data(), n);
- is.align (alignof (n));
-}
-
-/// Copies data from \p p, \p n to the linked block starting at \p start.
-void memlink::copy (iterator start, const void* p, size_type n)
-{
- assert (data() || !n);
- assert (p || !n);
- assert (start >= begin() && start + n <= end());
- if (p)
- copy_n (const_iterator(p), n, start);
-}
-
-/// Fills the linked block with the given pattern.
-/// \arg start Offset at which to start filling the linked block
-/// \arg p Pointer to the pattern.
-/// \arg elSize Size of the pattern.
-/// \arg elCount Number of times to write the pattern.
-/// Total number of bytes written is \p elSize * \p elCount.
-///
-void memlink::fill (iterator start, const void* p, size_type elSize, size_type elCount)
-{
- assert (data() || !elCount || !elSize);
- assert (start >= begin() && start + elSize * elCount <= end());
- if (elSize == 1)
- fill_n (start, elCount, *reinterpret_cast<const uint8_t*>(p));
- else while (elCount--)
- start = copy_n (const_iterator(p), elSize, start);
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/memlink.h b/media/libdrm/mobile2/src/util/ustl-1.0/memlink.h
deleted file mode 100644
index 25d9928..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/memlink.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// memlink.h
-
-#ifndef MEMLINK_H_798D25827C8E322D2D7E734B169FF5FC
-#define MEMLINK_H_798D25827C8E322D2D7E734B169FF5FC
-
-#include "cmemlink.h"
-#include "ualgo.h"
-#include "uassert.h"
-
-namespace ustl {
-
-/// \class memlink memlink.h ustl.h
-/// \ingroup MemoryManagement
-///
-/// \brief Wrapper for pointer to block with size.
-///
-/// Use this class the way you would a pointer to an allocated unstructured block.
-/// The pointer and block size are available through member functions and cast operator.
-///
-/// Example usage:
-/// \code
-/// void* p = malloc (46721);
-/// memlink a, b;
-/// a.link (p, 46721);
-/// assert (a.size() == 46721));
-/// b = a;
-/// assert (b.size() == 46721));
-/// assert (b.begin() + 34 == a.begin + 34);
-/// assert (0 == memcmp (a, b, 12));
-/// a.fill (673, b, 42, 67);
-/// b.erase (87, 12);
-/// \endcode
-///
-class memlink : public cmemlink {
-public:
- typedef value_type* pointer;
- typedef cmemlink::pointer const_pointer;
- typedef cmemlink::const_iterator const_iterator;
- typedef pointer iterator;
- typedef const memlink& rcself_t;
-public:
- inline memlink (void) : cmemlink() {}
- inline memlink (void* p, size_type n) : cmemlink (p, n) {}
- inline memlink (const void* p, size_type n) : cmemlink (p, n) {}
- inline memlink (rcself_t l) : cmemlink (l) {}
- inline explicit memlink (const cmemlink& l) : cmemlink (l) {}
- inline pointer data (void) { return (const_cast<pointer>(cdata())); }
- inline iterator begin (void) { return (iterator (data())); }
- inline iterator iat (size_type i) { assert (i <= size()); return (begin() + i); }
- inline iterator end (void) { return (iat (size())); }
- inline const_iterator begin (void) const { return (cmemlink::begin()); }
- inline const_iterator end (void) const { return (cmemlink::end()); }
- inline const_iterator iat (size_type i) const { return (cmemlink::iat (i)); }
- size_type writable_size (void) const { return (size()); }
- inline rcself_t operator= (const cmemlink& l) { cmemlink::operator= (l); return (*this); }
- inline rcself_t operator= (rcself_t l) { cmemlink::operator= (l); return (*this); }
- inline void link (const void* p, size_type n) { cmemlink::link (p, n); }
- inline void link (void* p, size_type n) { cmemlink::link (p, n); }
- inline void link (const cmemlink& l) { cmemlink::link (l); }
- inline void link (memlink& l) { cmemlink::link (l); }
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, void*)
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, const void*)
- inline void link (const void* first, const void* last) { link (first, distance (first, last)); }
- inline void link (void* first, void* last) { link (first, distance (first, last)); }
- inline void relink (const void* p, size_type n) { cmemlink::relink (p, n); }
- inline void relink (void* p, size_type n) { cmemlink::relink (p, n); }
- inline void copy (const cmemlink& l) { copy (begin(), l.cdata(), l.size()); }
- inline void copy (const void* p, size_type n) { copy (begin(), p, n); }
- void copy (iterator offset, const void* p, size_type n);
- inline void swap (memlink& l) { cmemlink::swap (l); }
- void fill (iterator start, const void* p, size_type elsize, size_type elCount = 1);
- inline void insert (iterator start, size_type size);
- inline void erase (iterator start, size_type size);
- void read (istream& is);
-};
-
-/// Shifts the data in the linked block from \p start to \p start + \p n.
-/// The contents of the uncovered bytes is undefined.
-inline void memlink::insert (iterator start, size_type n)
-{
- assert (data() || !n);
- assert (cmemlink::begin() || !n);
- assert (start >= begin() && start + n <= end());
- rotate (start, end() - n, end());
-}
-
-/// Shifts the data in the linked block from \p start + \p n to \p start.
-/// The contents of the uncovered bytes is undefined.
-inline void memlink::erase (iterator start, size_type n)
-{
- assert (data() || !n);
- assert (cmemlink::begin() || !n);
- assert (start >= begin() && start + n <= end());
- rotate (start, start + n, end());
-}
-
-/// Reads object \p l from stream \p is
-inline istream& operator>> (istream& is, memlink& l)
-{
- l.read (is);
- return (is);
-}
-
-/// Use with memlink-derived classes to allocate and link to stack space.
-#define alloca_link(m,n) (m).link (alloca (n), (n))
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/mistream.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/mistream.cpp
deleted file mode 100644
index ad998289..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/mistream.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// mstream.cpp
-//
-// Helper classes to read and write packed binary streams.
-//
-
-#include "mistream.h"
-#include "sostream.h"
-#include "ualgo.h"
-#include "uassert.h"
-#include "ustring.h"
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#endif
-
-namespace ustl {
-
-//--------------------------------------------------------------------
-
-/// \brief Constructs a stream attached to nothing.
-/// A stream attached to nothing is not usable. Call Link() functions
-/// inherited from cmemlink to attach to some memory block.
-///
-istream::istream (void)
-: cmemlink (),
- m_Pos (0)
-{
-}
-
-/// Attaches the stream to a block at \p p of size \p n.
-istream::istream (const void* p, size_type n)
-: cmemlink (p, n),
- m_Pos (0)
-{
-}
-
-/// Attaches to the block pointed to by \p source.
-istream::istream (const cmemlink& source)
-: cmemlink (source),
- m_Pos (0)
-{
-}
-
-/// Attaches to the block pointed to by source of size source.pos()
-istream::istream (const ostream& source)
-: cmemlink (source.begin(), source.pos()),
- m_Pos (0)
-{
-}
-
-/// Swaps contents with \p is
-void istream::swap (istream& is)
-{
- cmemlink::swap (is);
- ::ustl::swap (m_Pos, is.m_Pos);
-}
-
-/// Checks that \p n bytes are available in the stream, or else throws.
-void istream::verify_remaining (const char* op, const char* type, size_t n) const
-{
- if (remaining() < n)
-#if PLATFORM_ANDROID
- printf("stream bounds exception\n");
-#else
- throw stream_bounds_exception (op, type, pos(), n, remaining());
-#endif
-}
-
-/// Reads \p n bytes into \p buffer.
-void istream::read (void* buffer, size_type n)
-{
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("read", "binary data", n);
-#else
- assert (remaining() >= n && "Reading past end of buffer. Make sure you are reading the right format.");
-#endif
- copy_n (ipos(), n, reinterpret_cast<value_type*>(buffer));
- m_Pos += n;
-}
-
-/// Reads a null-terminated string into \p str.
-void istream::read_strz (string& str)
-{
- const_iterator zp = find (ipos(), end(), string::c_Terminator);
- if (zp == end())
- zp = ipos();
- const size_type strl = distance (ipos(), zp);
- str.resize (strl);
- copy (ipos(), zp, str.begin());
- m_Pos += strl + 1;
-}
-
-/// Reads at most \p n bytes into \p s.
-istream::size_type istream::readsome (void* s, size_type n)
-{
- if (remaining() < n)
- underflow (n);
- const size_type ntr (min (n, remaining()));
- read (s, ntr);
- return (ntr);
-}
-
-/// Writes all unread bytes into \p os.
-void istream::write (ostream& os) const
-{
- os.write (ipos(), remaining());
-}
-
-/// Writes the object to stream \p os.
-void istream::text_write (ostringstream& os) const
-{
- os.write (ipos(), remaining());
-}
-
-/// Links to \p p of size \p n
-void istream::unlink (void)
-{
- cmemlink::unlink();
- m_Pos = 0;
-}
-
-//--------------------------------------------------------------------
-
-/// \brief Constructs a stream attached to nothing.
-/// A stream attached to nothing is not usable. Call Link() functions
-/// inherited from memlink to attach to some memory block.
-///
-ostream::ostream (void)
-: memlink (),
- m_Pos (0)
-{
-}
-
-/// Attaches the stream to a block at \p p of size \p n.
-ostream::ostream (void* p, size_type n)
-: memlink (p, n),
- m_Pos (0)
-{
-}
-
-/// Attaches to the block pointed to by \p source.
-ostream::ostream (const memlink& source)
-: memlink (source),
- m_Pos (0)
-{
-}
-
-/// Links to \p p of size \p n
-void ostream::unlink (void)
-{
- memlink::unlink();
- m_Pos = 0;
-}
-
-/// Checks that \p n bytes are available in the stream, or else throws.
-void ostream::verify_remaining (const char* op, const char* type, size_t n) const
-{
- if (remaining() < n)
-#if PLATFORM_ANDROID
- printf("stream bounds exception\n");
-#else
- throw stream_bounds_exception (op, type, pos(), n, remaining());
-#endif
-}
-
-/// Aligns the write pointer on \p grain. The skipped bytes are zeroed.
-void ostream::align (size_type grain)
-{
- const size_t r = pos() % grain;
- size_t nb = grain - r;
- if (!r) nb = 0;
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("align", "padding", nb);
-#else
- assert (remaining() >= nb && "Buffer overrun. Check your stream size calculations.");
-#endif
- fill_n (ipos(), nb, '\x0');
- m_Pos += nb;
-}
-
-/// Writes \p n bytes from \p buffer.
-void ostream::write (const void* buffer, size_type n)
-{
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("write", "binary data", n);
-#else
- assert (remaining() >= n && "Buffer overrun. Check your stream size calculations.");
-#endif
- copy_n (const_iterator(buffer), n, ipos());
- m_Pos += n;
-}
-
-/// Writes \p str as a null-terminated string.
-void ostream::write_strz (const char* str)
-{
- write (str, strlen(str));
- iwrite (string::c_Terminator);
-}
-
-/// Writes all available data from \p is.
-void ostream::read (istream& is)
-{
- is.write (*this);
- is.seek (is.size());
-}
-
-/// Writes all written data to \p os.
-void ostream::text_write (ostringstream& os) const
-{
- os.write (begin(), pos());
-}
-
-/// Inserts an empty area of \p size, at \p start.
-void ostream::insert (iterator start, size_type s)
-{
- memlink::insert (start, s);
- m_Pos += s;
-}
-
-/// Erases an area of \p size, at \p start.
-void ostream::erase (iterator start, size_type s)
-{
- m_Pos -= s;
- memlink::erase (start, s);
-}
-
-/// Swaps with \p os
-void ostream::swap (ostream& os)
-{
- memlink::swap (os);
- ::ustl::swap (m_Pos, os.m_Pos);
-}
-
-//--------------------------------------------------------------------
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/mistream.h b/media/libdrm/mobile2/src/util/ustl-1.0/mistream.h
deleted file mode 100644
index 0a7aee7..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/mistream.h
+++ /dev/null
@@ -1,293 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// mistream.h
-//
-#ifndef MISTREAM_H_103AEF1F266C04AA1A817D38705983DA
-#define MISTREAM_H_103AEF1F266C04AA1A817D38705983DA
-
-#include "memlink.h"
-#include "uexception.h"
-#include "strmsize.h"
-#include "uassert.h"
-#include "utf8.h"
-#include "uios.h"
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- #include <typeinfo>
-#endif
-
-namespace ustl {
-
-class ostream;
-class memlink;
-class string;
-
-/// \class istream mistream.h ustl.h
-/// \ingroup BinaryStreams
-///
-/// \brief Helper class to read packed binary streams.
-///
-/// This class contains a set of functions to read integral types from an
-/// unstructured memory block. Unpacking binary file data can be done this
-/// way, for instance. aligning the data is your responsibility, and can
-/// be accomplished by proper ordering of reads and by calling the align()
-/// function. Unaligned access is usually slower by orders of magnitude and,
-/// on some architectures, such as PowerPC, can cause your program to crash.
-/// Therefore, all read functions have asserts to check alignment.
-/// Overreading the end of the stream will also cause a crash (an assert in
-/// debug builds). Oh, and don't be intimidated by the size of the inlines
-/// here. In the assembly code the compiler will usually chop everything down
-/// to five instructions each.
-///
-/// Alignment rules for your objects:
-/// - Assume your writes start off 4-byte aligned.
-/// - After completion, \ref istream::align the stream to at least 4.
-/// - If data portability between 32bit and 64bit platforms is important
-/// (it often is not, in config files and the like), ensure you are always
-/// using fixed-size types and are aligning to a fixed grain. Avoid writing
-/// 8-byte types, and if you do, manually align before doing so.
-/// - Non-default alignment is allowed if you plan to frequently write this
-/// object in array form and alignment would be costly. For example, an
-/// array of uint16_t-sized objects may leave the stream uint16_t aligned
-/// as long as you know about it and will default-align the stream after
-/// writing the array (note: \ref vector will already do this for you)
-///
-/// Example code:
-/// \code
-/// memblock b;
-/// b.read_file ("test.file");
-/// ostream is (b);
-/// is >> boolVar >> ios::talign<int>();
-/// is >> intVar >> floatVar;
-/// is.read (binaryData, binaryDataSize);
-/// is.align();
-/// \endcode
-///
-class istream : public cmemlink, public ios_base {
-public:
- istream (void);
- istream (const void* p, size_type n);
- explicit istream (const cmemlink& source);
- explicit istream (const ostream& source);
- inline iterator end (void) const { return (cmemlink::end()); }
- inline void link (const void* p, size_type n) { cmemlink::link (p, n); }
- inline void link (const cmemlink& l) { cmemlink::link (l.cdata(), l.readable_size()); }
- inline void link (const void* f, const void* l) { cmemlink::link (f, l); }
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, const void*)
- inline void relink (const void* p, size_type n) { cmemlink::relink (p, n); m_Pos = 0; }
- inline void relink (const cmemlink& l) { relink (l.cdata(), l.readable_size()); }
- virtual void unlink (void);
- inline virtual size_type underflow (size_type = 1) { return (remaining()); }
- inline uoff_t pos (void) const { return (m_Pos); }
- inline const_iterator ipos (void) const { return (begin() + pos()); }
- inline size_type remaining (void) const { return (size() - pos()); }
- inline void seek (uoff_t newPos);
- inline void iseek (const_iterator newPos);
- inline void skip (size_type nBytes);
- inline bool aligned (size_type grain = c_DefaultAlignment) const;
- void verify_remaining (const char* op, const char* type, size_t n) const;
- inline size_type align_size (size_type grain = c_DefaultAlignment) const;
- inline void align (size_type grain = c_DefaultAlignment);
- void swap (istream& is);
- void read (void* buffer, size_type size);
- inline void read (memlink& buf) { read (buf.begin(), buf.writable_size()); }
- void read_strz (string& str);
- size_type readsome (void* s, size_type n);
- inline void read (istream&) { }
- void write (ostream& os) const;
- void text_write (ostringstream& os) const;
- inline size_t stream_size (void) const { return (remaining()); }
- template <typename T>
- inline void iread (T& v);
- inline void ungetc (void) { seek (pos() - 1); }
- inline off_t tellg (void) const { return (pos()); }
- inline void seekg (off_t p, seekdir d = beg);
-private:
- uoff_t m_Pos; ///< The current read position.
-};
-
-//----------------------------------------------------------------------
-
-template <typename T, typename Stream>
-inline size_t required_stream_size (T, const Stream&) { return (1); }
-template <typename T>
-inline size_t required_stream_size (T v, const istream&) { return (stream_size_of(v)); }
-
-template <typename Stream>
-inline bool stream_at_eof (const Stream& stm) { return (stm.eof()); }
-template <>
-inline bool stream_at_eof (const istream&) { return (false); }
-
-/// \class istream_iterator
-/// \ingroup BinaryStreamIterators
-///
-/// \brief An iterator over an istream to use with uSTL algorithms.
-///
-template <typename T, typename Stream = istream>
-class istream_iterator {
-public:
- typedef T value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef size_t size_type;
-public:
- istream_iterator (void) : m_pis (NULL), m_v() {}
- explicit istream_iterator (Stream& is) : m_pis (&is), m_v() { Read(); }
- istream_iterator (const istream_iterator& i) : m_pis (i.m_pis), m_v (i.m_v) {}
- /// Reads and returns the next value.
- inline const T& operator* (void) { return (m_v); }
- inline istream_iterator& operator++ (void) { Read(); return (*this); }
- inline istream_iterator& operator-- (void) { m_pis->seek (m_pis->pos() - 2 * stream_size_of(m_v)); return (operator++()); }
- inline istream_iterator operator++ (int) { istream_iterator old (*this); operator++(); return (old); }
- inline istream_iterator operator-- (int) { istream_iterator old (*this); operator--(); return (old); }
- inline istream_iterator& operator+= (size_type n) { while (n--) operator++(); return (*this); }
- inline istream_iterator& operator-= (size_type n) { m_pis->seek (m_pis->pos() - (n + 1) * stream_size_of(m_v)); return (operator++()); }
- inline istream_iterator operator- (size_type n) const { istream_iterator result (*this); return (result -= n); }
- inline difference_type operator- (const istream_iterator& i) const { return (distance (i.m_pis->pos(), m_pis->pos()) / stream_size_of(m_v)); }
- inline bool operator== (const istream_iterator& i) const { return ((!m_pis && !i.m_pis) || (m_pis && i.m_pis && m_pis->pos() == i.m_pis->pos())); }
- inline bool operator< (const istream_iterator& i) const { return (!i.m_pis || (m_pis && m_pis->pos() < i.m_pis->pos())); }
-private:
- void Read (void)
- {
- if (!m_pis)
- return;
- const size_t rs (required_stream_size (m_v, *m_pis));
- if (m_pis->remaining() < rs && m_pis->underflow (rs) < rs) {
- m_pis = NULL;
- return;
- }
- *m_pis >> m_v;
- if (stream_at_eof (*m_pis))
- m_pis = NULL;
- }
-private:
- Stream* m_pis; ///< The host stream.
- T m_v; ///< Last read value; cached to be returnable as a const reference.
-};
-
-//----------------------------------------------------------------------
-
-/// Sets the current read position to \p newPos
-inline void istream::seek (uoff_t newPos)
-{
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- if (newPos > size())
- throw stream_bounds_exception ("seekg", "byte", pos(), newPos - pos(), size());
-#else
- assert (newPos <= size());
-#endif
- m_Pos = newPos;
-}
-
-/// Sets the current read position to \p newPos
-inline void istream::iseek (const_iterator newPos)
-{
- seek (distance (begin(), newPos));
-}
-
-/// Sets the current write position to \p p based on \p d.
-inline void istream::seekg (off_t p, seekdir d)
-{
- switch (d) {
- case beg: seek (p); break;
- case cur: seek (pos() + p); break;
- case ios_base::end: seek (size() - p); break;
- }
-}
-
-/// Skips \p nBytes without reading them.
-inline void istream::skip (size_type nBytes)
-{
- seek (pos() + nBytes);
-}
-
-/// Returns the number of bytes to skip to be aligned on \p grain.
-inline istream::size_type istream::align_size (size_type grain) const
-{
- return (Align (pos(), grain) - pos());
-}
-
-/// Returns \c true if the read position is aligned on \p grain
-inline bool istream::aligned (size_type grain) const
-{
- assert (uintptr_t(begin()) % grain == 0 && "Streams should be attached aligned at the maximum element grain to avoid bus errors.");
- return (pos() % grain == 0);
-}
-
-/// aligns the read position on \p grain
-inline void istream::align (size_type grain)
-{
- seek (Align (pos(), grain));
-}
-
-/// Reads type T from the stream via a direct pointer cast.
-template <typename T>
-inline void istream::iread (T& v)
-{
- assert (aligned (alignof (T())));
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("read", typeid(v).name(), sizeof(T));
-#else
- assert (remaining() >= sizeof(T));
-#endif
- v = *reinterpret_cast<const T*>(ipos());
- m_Pos += sizeof(T);
-}
-
-#define ISTREAM_OPERATOR(type) \
-inline istream& operator>> (istream& is, type& v) { is.iread(v); return (is); }
-
-template <typename T>
-ISTREAM_OPERATOR(T*)
-ISTREAM_OPERATOR(int8_t)
-ISTREAM_OPERATOR(uint8_t)
-ISTREAM_OPERATOR(int16_t)
-ISTREAM_OPERATOR(uint16_t)
-ISTREAM_OPERATOR(int32_t)
-ISTREAM_OPERATOR(uint32_t)
-ISTREAM_OPERATOR(float)
-ISTREAM_OPERATOR(double)
-ISTREAM_OPERATOR(wchar_t)
-#if SIZE_OF_BOOL == SIZE_OF_CHAR
-ISTREAM_OPERATOR(bool)
-#else
-inline istream& operator>> (istream& is, bool& v)
-{ uint8_t v8; is.iread (v8); v = v8; return (is); }
-#endif
-#if HAVE_THREE_CHAR_TYPES
-ISTREAM_OPERATOR(char)
-#endif
-#if HAVE_INT64_T
-ISTREAM_OPERATOR(int64_t)
-ISTREAM_OPERATOR(uint64_t)
-#endif
-#if SIZE_OF_LONG == SIZE_OF_INT
-ISTREAM_OPERATOR(long)
-ISTREAM_OPERATOR(unsigned long)
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-ISTREAM_OPERATOR(long long)
-ISTREAM_OPERATOR(unsigned long long)
-#endif
-
-//----------------------------------------------------------------------
-
-typedef istream_iterator<utf8subchar_t> istream_iterator_for_utf8;
-typedef utf8in_iterator<istream_iterator_for_utf8> utf8istream_iterator;
-
-/// Returns a UTF-8 adaptor reading from \p is.
-inline utf8istream_iterator utf8in (istream& is)
-{
- istream_iterator_for_utf8 si (is);
- return (utf8istream_iterator (si));
-}
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/mostream.h b/media/libdrm/mobile2/src/util/ustl-1.0/mostream.h
deleted file mode 100644
index fb04196..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/mostream.h
+++ /dev/null
@@ -1,260 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// mostream.h
-
-#ifndef MOSTREAM_H_24A8C5397E0848216573E5670930FC9A
-#define MOSTREAM_H_24A8C5397E0848216573E5670930FC9A
-
-#include "memlink.h"
-#include "uassert.h"
-#include "uexception.h"
-#include "utf8.h"
-#include "uios.h"
-#include <typeinfo>
-
-namespace ustl {
-
-class istream;
-class string;
-
-/// \class ostream mostream.h ustl.h
-/// \ingroup BinaryStreams
-///
-/// \brief Helper class to write packed binary streams.
-///
-/// This class contains a set of functions to write integral types into an
-/// unstructured memory block. Packing binary file data can be done this
-/// way, for instance. aligning the data is your responsibility, and can
-/// be accomplished by proper ordering of writes and by calling \ref ostream::align.
-/// Unaligned access is usually slower by orders of magnitude and,
-/// on some architectures, such as PowerPC, can cause your program to crash.
-/// Therefore, all write functions have asserts to check alignment.
-/// See \ref istream documentation for rules on designing your data format.
-/// Overwriting the end of the stream will also cause a crash (an assert in
-/// debug builds). Oh, and don't be intimidated by the size of the inlines
-/// here. In the assembly code the compiler will usually chop everything down
-/// to five instructions each.
-///
-/// Example code:
-/// \code
-/// memblock b;
-/// ostream os (b);
-/// os << boolVar << ios::talign<int>();
-/// os << intVar << floatVar;
-/// os.write (binaryData, binaryDataSize);
-/// os.align();
-/// b.resize (os.pos());
-/// b.write_file ("test.file");
-/// \endcode
-///
-class ostream : public memlink, public ios_base {
-public:
- ostream (void);
- ostream (void* p, size_type n);
- explicit ostream (const memlink& source);
- inline iterator end (void) { return (memlink::end()); }
- inline const_iterator end (void) const { return (memlink::end()); }
- inline void seek (uoff_t newPos);
- inline void iseek (const_iterator newPos);
- inline void skip (size_type nBytes);
- inline uoff_t pos (void) const { return (m_Pos); }
- inline iterator ipos (void) { return (begin() + pos()); }
- inline const_iterator ipos (void) const { return (begin() + pos()); }
- inline size_type remaining (void) const;
- inline bool aligned (size_type grain = c_DefaultAlignment) const;
- void verify_remaining (const char* op, const char* type, size_t n) const;
- inline size_type align_size (size_type grain = c_DefaultAlignment) const;
- void align (size_type grain = c_DefaultAlignment);
- void write (const void* buffer, size_type size);
- inline void write (const cmemlink& buf);
- void write_strz (const char* str);
- void read (istream& is);
- inline void write (ostream& os) const { os.write (begin(), pos()); }
- void text_write (ostringstream& os) const;
- inline size_t stream_size (void) const { return (pos()); }
- void insert (iterator start, size_type size);
- void erase (iterator start, size_type size);
- void swap (ostream& os);
- template <typename T>
- inline void iwrite (const T& v);
- inline virtual size_type overflow (size_type = 1){ return (remaining()); }
- virtual void unlink (void);
- inline void link (void* p, size_type n) { memlink::link (p, n); }
- inline void link (memlink& l) { memlink::link (l.data(), l.writable_size()); }
- inline void link (void* f, void* l) { memlink::link (f, l); }
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, void*)
- inline void relink (void* p, size_type n) { memlink::relink (p, n); m_Pos = 0; }
- inline void relink (memlink& l) { relink (l.data(), l.writable_size()); }
- inline void seekp (off_t p, seekdir d = beg);
- inline off_t tellp (void) const { return (pos()); }
-protected:
- inline void SetPos (uoff_t newPos) { m_Pos = newPos; }
-private:
- uoff_t m_Pos; ///< Current write position.
-};
-
-//----------------------------------------------------------------------
-
-/// \class ostream_iterator mostream.h ustl.h
-/// \ingroup BinaryStreamIterators
-///
-/// \brief An iterator over an ostream to use with uSTL algorithms.
-///
-template <typename T, typename Stream = ostream>
-class ostream_iterator {
-public:
- typedef T value_type;
- typedef ptrdiff_t difference_type;
- typedef value_type* pointer;
- typedef value_type& reference;
- typedef ostream::size_type size_type;
-public:
- inline explicit ostream_iterator (Stream& os)
- : m_Os (os) {}
- inline ostream_iterator (const ostream_iterator& iter)
- : m_Os (iter.m_Os) {}
- /// Writes \p v into the stream.
- inline ostream_iterator& operator= (const T& v)
- { m_Os << v; return (*this); }
- inline ostream_iterator& operator* (void) { return (*this); }
- inline ostream_iterator& operator++ (void) { return (*this); }
- inline ostream_iterator operator++ (int) { return (*this); }
- inline ostream_iterator& operator+= (size_type n) { m_Os.skip (n); return (*this); }
- inline bool operator== (const ostream_iterator& i) const
- { return (m_Os.pos() == i.m_Os.pos()); }
- inline bool operator< (const ostream_iterator& i) const
- { return (m_Os.pos() < i.m_Os.pos()); }
-private:
- Stream& m_Os;
-};
-
-//----------------------------------------------------------------------
-
-typedef ostream_iterator<utf8subchar_t> ostream_iterator_for_utf8;
-typedef utf8out_iterator<ostream_iterator_for_utf8> utf8ostream_iterator;
-
-/// Returns a UTF-8 adaptor writing to \p os.
-inline utf8ostream_iterator utf8out (ostream& os)
-{
- ostream_iterator_for_utf8 si (os);
- return (utf8ostream_iterator (si));
-}
-
-//----------------------------------------------------------------------
-
-/// Move the write pointer to \p newPos
-inline void ostream::seek (uoff_t newPos)
-{
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- if (newPos > size())
- throw stream_bounds_exception ("seekp", "byte", pos(), newPos - pos(), size());
-#else
- assert (newPos <= size());
-#endif
- SetPos (newPos);
-}
-
-/// Sets the current write position to \p newPos
-inline void ostream::iseek (const_iterator newPos)
-{
- seek (distance (begin(), const_cast<iterator>(newPos)));
-}
-
-/// Sets the current write position to \p p based on \p d.
-inline void ostream::seekp (off_t p, seekdir d)
-{
- switch (d) {
- case beg: seek (p); break;
- case cur: seek (pos() + p); break;
- case ios_base::end: seek (size() - p); break;
- }
-}
-
-/// Skips \p nBytes without writing anything.
-inline void ostream::skip (size_type nBytes)
-{
- seek (pos() + nBytes);
-}
-
-/// Returns number of bytes remaining in the write buffer.
-inline ostream::size_type ostream::remaining (void) const
-{
- return (size() - pos());
-}
-
-/// Returns \c true if the write pointer is aligned on \p grain
-inline bool ostream::aligned (size_type grain) const
-{
- assert (uintptr_t(begin()) % grain == 0 && "Streams should be attached aligned at the maximum element grain to avoid bus errors.");
- return (pos() % grain == 0);
-}
-
-/// Returns the number of bytes to skip to be aligned on \p grain.
-inline ostream::size_type ostream::align_size (size_type grain) const
-{
- return (Align (pos(), grain) - pos());
-}
-
-/// Writes the contents of \p buf into the stream as a raw dump.
-inline void ostream::write (const cmemlink& buf)
-{
- write (buf.begin(), buf.size());
-}
-
-/// Writes type T into the stream via a direct pointer cast.
-template <typename T>
-inline void ostream::iwrite (const T& v)
-{
- assert (aligned (alignof (v)));
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("write", typeid(v).name(), sizeof(T));
-#else
- assert (remaining() >= sizeof(T));
-#endif
- *reinterpret_cast<T*>(ipos()) = v;
- SetPos (pos() + sizeof(T));
-}
-
-#define OSTREAM_OPERATOR(type) \
-inline ostream& operator<< (ostream& os, type v) { os.iwrite(v); return (os); }
-
-template <typename T>
-OSTREAM_OPERATOR(T*)
-OSTREAM_OPERATOR(int8_t)
-OSTREAM_OPERATOR(uint8_t)
-OSTREAM_OPERATOR(int16_t)
-OSTREAM_OPERATOR(uint16_t)
-OSTREAM_OPERATOR(int32_t)
-OSTREAM_OPERATOR(uint32_t)
-OSTREAM_OPERATOR(float)
-OSTREAM_OPERATOR(double)
-OSTREAM_OPERATOR(wchar_t)
-#if SIZE_OF_BOOL == SIZE_OF_CHAR
-OSTREAM_OPERATOR(bool)
-#else
-inline ostream& operator<< (ostream& os, bool v)
-{ os.iwrite (uint8_t(v)); return (os); }
-#endif
-#if HAVE_THREE_CHAR_TYPES
-OSTREAM_OPERATOR(char)
-#endif
-#if HAVE_INT64_T
-OSTREAM_OPERATOR(int64_t)
-OSTREAM_OPERATOR(uint64_t)
-#endif
-#if SIZE_OF_LONG == SIZE_OF_INT
-OSTREAM_OPERATOR(long)
-OSTREAM_OPERATOR(unsigned long)
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-OSTREAM_OPERATOR(long long)
-OSTREAM_OPERATOR(unsigned long long)
-#endif
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.cpp
deleted file mode 100644
index 0948a4d3..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ofstream.cc
-//
-
-#include "ofstream.h"
-#include "ustring.h"
-#include "uexception.h"
-#include <unistd.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-ifstream cin (STDIN_FILENO);
-ofstream cout (STDOUT_FILENO);
-ofstream cerr (STDERR_FILENO);
-
-//----------------------------------------------------------------------
-
-/// Default constructor.
-ofstream::ofstream (void)
-: ostringstream (),
- m_File ()
-{
- reserve (255);
-}
-
-/// Constructs a stream for writing to \p Fd.
-ofstream::ofstream (int Fd)
-: ostringstream (),
- m_File (Fd)
-{
- clear (m_File.rdstate());
- reserve (255);
-}
-
-/// Constructs a stream for writing to \p filename.
-ofstream::ofstream (const char* filename, openmode mode)
-: ostringstream (),
- m_File (filename, mode)
-{
- clear (m_File.rdstate());
-}
-
-/// Default destructor.
-ofstream::~ofstream (void)
-{
-#if PLATFORM_ANDROID
- flush();
-#else /* !PLATFORM_ANDROID */
- try { flush(); } catch (...) {}
-#endif
-}
-
-/// Flushes the buffer to the file.
-void ofstream::flush (void)
-{
- while (pos() && overflow (remaining()));
- m_File.sync();
- clear (m_File.rdstate());
-}
-
-/// Seeks to \p p based on \p d.
-void ofstream::seekp (off_t p, seekdir d)
-{
- flush();
- m_File.seekp (p, d);
- clear (m_File.rdstate());
-}
-
-/// Called when more buffer space (\p n bytes) is needed.
-ofstream::size_type ofstream::overflow (size_type n)
-{
- if (eof() || (n > remaining() && n < capacity() - pos()))
- return (ostringstream::overflow (n));
- size_type bw = m_File.write (cdata(), pos());
- clear (m_File.rdstate());
- erase (begin(), bw);
- if (remaining() < n)
- ostringstream::overflow (n);
- return (remaining());
-}
-
-//----------------------------------------------------------------------
-
-/// Constructs a stream to read from \p Fd.
-ifstream::ifstream (int Fd)
-: istringstream (),
- m_Buffer (255),
- m_File (Fd)
-{
- link (m_Buffer.data(), 0U);
-}
-
-/// Constructs a stream to read from \p filename.
-ifstream::ifstream (const char* filename, openmode mode)
-: istringstream (),
- m_Buffer (255),
- m_File (filename, mode)
-{
- clear (m_File.rdstate());
- link (m_Buffer.data(), 0U);
-}
-
-/// Reads at least \p n more bytes and returns available bytes.
-ifstream::size_type ifstream::underflow (size_type n)
-{
- if (eof())
- return (istringstream::underflow (n));
-
- const ssize_t freeSpace = m_Buffer.size() - pos();
- const ssize_t neededFreeSpace = max (n, m_Buffer.size() / 2);
- const size_t oughtToErase = Align (max (0, neededFreeSpace - freeSpace));
- const size_t nToErase = min (pos(), oughtToErase);
- m_Buffer.memlink::erase (m_Buffer.begin(), nToErase);
- const uoff_t oldPos (pos() - nToErase);
-
- size_type br = oldPos;
- if (m_Buffer.size() - br < n) {
- m_Buffer.resize (br + neededFreeSpace);
- link (m_Buffer.data(), 0U);
- }
- cout.flush();
-
- while (br - oldPos < n && m_File.good())
- br += m_File.readsome (m_Buffer.begin() + br, m_Buffer.size() - br);
- clear (m_File.rdstate());
-
- m_Buffer[br] = string::c_Terminator;
- link (m_Buffer.data(), br);
- seek (oldPos);
- return (remaining());
-}
-
-/// Flushes the input.
-void ifstream::sync (void)
-{
- istringstream::sync();
- underflow (0U);
- m_File.sync();
- clear (m_File.rdstate());
-}
-
-/// Seeks to \p p based on \p d.
-void ifstream::seekg (off_t p, seekdir d)
-{
- m_Buffer.clear();
- link (m_Buffer);
- m_File.seekg (p, d);
- clear (m_File.rdstate());
-}
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.h b/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.h
deleted file mode 100644
index 7780833..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ofstream.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ofstream.h
-//
-
-#ifndef FDOSTREAM_H_5E27FC3D530BF3CA04D6C73F5700EECC
-#define FDOSTREAM_H_5E27FC3D530BF3CA04D6C73F5700EECC
-
-#include "sistream.h"
-#include "sostream.h"
-#include "fstream.h"
-
-namespace ustl {
-
-/// \class ofstream fdostream.h ustl.h
-/// \ingroup DeviceStreams
-/// \brief A string stream that writes to an fd. Implements cout and cerr.
-class ofstream : public ostringstream {
-public:
- ofstream (void);
- explicit ofstream (int Fd);
- explicit ofstream (const char* filename, openmode mode = out);
- virtual ~ofstream (void);
- inline void open (const char* filename, openmode mode = out) { m_File.open (filename, mode); clear (m_File.rdstate()); }
- inline void close (void) { m_File.close(); clear (m_File.rdstate()); }
- inline bool is_open (void) const { return (m_File.is_open()); }
- inline iostate exceptions (iostate v) { ostringstream::exceptions(v); return (m_File.exceptions(v)); }
- inline void setstate (iostate v) { ostringstream::setstate(v); m_File.setstate(v); }
- inline void clear (iostate v = goodbit) { ostringstream::clear(v); m_File.clear(v); }
- inline off_t tellp (void) const { return (m_File.tellp() + ostringstream::tellp()); }
- inline int fd (void) const { return (m_File.fd()); }
- inline void stat (struct stat& rs) const { m_File.stat (rs); }
- inline void set_nonblock (bool v = true) { m_File.set_nonblock (v); }
- inline int ioctl (const char* rname, int request, long argument = 0) { return (m_File.ioctl (rname, request, argument)); }
- inline int ioctl (const char* rname, int request, int argument) { return (m_File.ioctl (rname, request, argument)); }
- inline int ioctl (const char* rname, int request, void* argument) { return (m_File.ioctl (rname, request, argument)); }
- void seekp (off_t p, seekdir d = beg);
- void flush (void);
- virtual size_type overflow (size_type n = 1);
-private:
- fstream m_File;
-};
-
-/// \class ifstream fdostream.h ustl.h
-/// \ingroup DeviceStreams
-/// \brief A string stream that reads from an fd. Implements cin.
-class ifstream : public istringstream {
-public:
- ifstream (void);
- explicit ifstream (int Fd);
- explicit ifstream (const char* filename, openmode mode = in);
- inline void open (const char* filename, openmode mode = in) { m_File.open (filename, mode); clear (m_File.rdstate()); }
- inline void close (void) { m_File.close(); clear (m_File.rdstate()); }
- inline bool is_open (void) const { return (m_File.is_open()); }
- inline iostate exceptions (iostate v) { istringstream::exceptions(v); return (m_File.exceptions(v)); }
- inline void setstate (iostate v) { istringstream::setstate(v); m_File.setstate(v); }
- inline void clear (iostate v = goodbit) { istringstream::clear(v); m_File.clear(v); }
- inline off_t tellg (void) const { return (m_File.tellg() - remaining()); }
- inline int fd (void) const { return (m_File.fd()); }
- inline void stat (struct stat& rs) const { m_File.stat (rs); }
- inline void set_nonblock (bool v = true) { m_File.set_nonblock (v); }
- inline int ioctl (const char* rname, int request, long argument = 0) { return (m_File.ioctl (rname, request, argument)); }
- inline int ioctl (const char* rname, int request, int argument) { return (m_File.ioctl (rname, request, argument)); }
- inline int ioctl (const char* rname, int request, void* argument) { return (m_File.ioctl (rname, request, argument)); }
- void seekg (off_t p, seekdir d = beg);
- void sync (void);
- virtual size_type underflow (size_type n = 1);
-private:
- string m_Buffer;
- fstream m_File;
-};
-
-extern ofstream cout, cerr;
-extern ifstream cin;
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/simd.h b/media/libdrm/mobile2/src/util/ustl-1.0/simd.h
deleted file mode 100644
index 950efc2..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/simd.h
+++ /dev/null
@@ -1,465 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file simd.h
-/// \brief SIMD-type algorithms, with hardware acceleration, if available.
-///
-/// All algorithms are container-based because iterator syntax is just too
-/// damn verbose and because the specializations need to be able to tell
-/// how many elements are in the container in order to choose proper SIMD
-/// instruction set (i.e.: 4 floats select SSE, while 2 floats select 3dNow!)
-/// Specializations are only for the tuple template because the container
-/// must be of a fixed and compile-time-known size for the compiler to be
-/// able to choose the specialization.
-///
-
-#ifndef SIMD_H_39BE2D970DF4BD00508CCFFB482496F9
-#define SIMD_H_39BE2D970DF4BD00508CCFFB482496F9
-
-#include "uassert.h"
-#include "ulimits.h"
-#if HAVE_MATH_H
- #include <math.h>
-#endif
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#undef CPU_HAS_MMX
-#endif
-
-namespace ustl {
-namespace simd {
-
-//----------------------------------------------------------------------
-// Generic algorithms
-//----------------------------------------------------------------------
-
-/// Applies \p op to each element in \p op1.
-template <typename Ctr, typename UnaryOperation>
-inline void packop (Ctr& op1, UnaryOperation op)
-{
- foreach (typename Ctr::iterator, i, op1)
- op (*i);
-}
-
-/// Applies \p op to each element in \p op1 and \p op2 and stores in \p op2.
-template <typename Ctr, typename BinaryOperation>
-inline void packop (const Ctr& op1, Ctr& op2, BinaryOperation op)
-{
- assert (op2.size() <= op1.size());
- typename Ctr::const_iterator i1 (op1.begin());
- typename Ctr::iterator i2 (op2.begin());
- for (; i2 != op2.end(); ++i1, ++i2)
- *i2 = op (*i2, *i1);
-}
-
-/// Applies \p op to corresponding elements in \p op1 and \p op2 and stores in \p result.
-template <typename Ctr, typename BinaryOperation>
-inline void packop (const Ctr& op1, const Ctr& op2, Ctr& result, BinaryOperation op)
-{
- assert (op1.size() <= op2.size() && op1.size() <= result.size());
- passign (op1, result);
- packop (op2, result);
-}
-
-/// Copies \p op1 into \p result.
-template <typename Ctr>
-inline void passign (const Ctr& op1, Ctr& result)
-{
- assert (op1.size() <= result.size());
- typename Ctr::iterator d (result.begin());
- foreach (typename Ctr::const_iterator, s, op1)
- *d++ = *s;
-}
-
-/// Copies \p result.size() elements from \p op1 to \p result.
-template <typename Ctr>
-inline void ipassign (typename Ctr::const_iterator op1, Ctr& result)
-{
- foreach (typename Ctr::iterator, d, result)
- *d = *op1++;
-}
-
-template <typename Ctr1, typename Ctr2, typename ConvertFunction>
-inline void pconvert (const Ctr1& op1, Ctr2& op2, ConvertFunction f)
-{
- assert (op1.size() <= op2.size());
- typename Ctr1::const_iterator i1 (op1.begin());
- typename Ctr2::iterator i2 (op2.begin());
- for (; i1 != op1.end(); ++i1, ++i2)
- *i2 = f (*i1);
-}
-
-// Functionoids for SIMD operations, like saturation arithmetic, shifts, etc.
-STD_BINARY_FUNCTOR (fpadds, T, ((b > numeric_limits<T>::max() - a) ? numeric_limits<T>::max() : a + b))
-STD_BINARY_FUNCTOR (fpsubs, T, ((a < numeric_limits<T>::min() + b) ? numeric_limits<T>::min() : a - b))
-STD_BINARY_FUNCTOR (fpshl, T, (a << b))
-STD_BINARY_FUNCTOR (fpshr, T, (a >> b))
-STD_BINARY_FUNCTOR (fpmin, T, (min (a, b)))
-STD_BINARY_FUNCTOR (fpmax, T, (max (a, b)))
-STD_BINARY_FUNCTOR (fpavg, T, ((a + b + 1) / 2))
-STD_CONVERSION_FUNCTOR (fcast, (D(a)))
-#if HAVE_MATH_H
-STD_UNARY_FUNCTOR (fpreciprocal,T, (1 / a))
-STD_UNARY_FUNCTOR (fpsqrt, T, (reset_mmx(), T (sqrt (a))))
-STD_UNARY_FUNCTOR (fprecipsqrt, T, (reset_mmx(), 1 / T(sqrt (a))))
-STD_UNARY_FUNCTOR (fsin, T, (reset_mmx(), T (sin (a))))
-STD_UNARY_FUNCTOR (fcos, T, (reset_mmx(), T (cos (a))))
-STD_UNARY_FUNCTOR (ftan, T, (reset_mmx(), T (tan (a))))
-#if HAVE_RINTF
-STD_CONVERSION_FUNCTOR (fround, (reset_mmx(), D(rintf(a))))
-#else
-STD_CONVERSION_FUNCTOR (fround, (reset_mmx(), D(rint(a))))
-#endif
-template <> inline int32_t fround<double,int32_t>::operator()(const double& a) const { reset_mmx(); return (int32_t(rint(a))); }
-#endif
-template <> inline float fpavg<float>::operator()(const float& a, const float& b) const { return ((a + b) / 2); }
-template <> inline double fpavg<double>::operator()(const double& a, const double& b) const { return ((a + b) / 2); }
-
-#define SIMD_PACKEDOP1(name, operation) \
-template <typename Ctr> \
-inline void name (Ctr& op1) \
-{ \
- typedef typename Ctr::value_type value_t; \
- packop (op1, operation<value_t>()); \
-}
-#define SIMD_PACKEDOP2(name, operation) \
-template <typename Ctr> \
-inline void name (const Ctr& op1, Ctr& op2) \
-{ \
- typedef typename Ctr::value_type value_t; \
- packop (op1, op2, operation<value_t>()); \
-}
-#define SIMD_PACKEDOP3(name, operation) \
-template <typename Ctr> \
-inline void name (const Ctr& op1, const Ctr& op2, Ctr& result) \
-{ \
- typedef typename Ctr::value_type value_t; \
- packop (op1, op2, result, operation<value_t>()); \
-}
-#define SIMD_SINGLEOP1(name, operation) \
-template <typename T> \
-inline T name (T op) \
-{ \
- operation<T> obj; \
- return (obj(op)); \
-}
-#define SIMD_CONVERTOP(name, operation) \
-template <typename Ctr1, typename Ctr2> \
-inline void name (const Ctr1& op1, Ctr2& op2) \
-{ \
- typedef typename Ctr1::value_type value1_t; \
- typedef typename Ctr2::value_type value2_t; \
- pconvert (op1, op2, operation<value1_t, value2_t>());\
-}
-
-SIMD_PACKEDOP2 (padd, plus)
-SIMD_PACKEDOP2 (psub, minus)
-SIMD_PACKEDOP2 (pmul, multiplies)
-SIMD_PACKEDOP2 (pdiv, divides)
-SIMD_PACKEDOP2 (pand, bitwise_and)
-SIMD_PACKEDOP2 (por, bitwise_or)
-SIMD_PACKEDOP2 (pxor, bitwise_xor)
-SIMD_PACKEDOP2 (pshl, fpshl)
-SIMD_PACKEDOP2 (pshr, fpshr)
-SIMD_PACKEDOP2 (psubs, fpsubs)
-SIMD_PACKEDOP2 (pmin, fpmin)
-SIMD_PACKEDOP2 (pmax, fpmax)
-SIMD_PACKEDOP2 (pavg, fpavg)
-
-SIMD_PACKEDOP3 (padd, plus)
-SIMD_PACKEDOP3 (psub, minus)
-SIMD_PACKEDOP3 (pmul, multiplies)
-SIMD_PACKEDOP3 (pdiv, divides)
-SIMD_PACKEDOP3 (pand, bitwise_and)
-SIMD_PACKEDOP3 (por, bitwise_or)
-SIMD_PACKEDOP3 (pxor, bitwise_xor)
-SIMD_PACKEDOP3 (pshl, fpshl)
-SIMD_PACKEDOP3 (pshr, fpshr)
-SIMD_PACKEDOP3 (padds, fpadds)
-SIMD_PACKEDOP3 (psubs, fpsubs)
-SIMD_PACKEDOP3 (pmin, fpmin)
-SIMD_PACKEDOP3 (pmax, fpmax)
-SIMD_PACKEDOP3 (pavg, fpavg)
-
-#if HAVE_MATH_H
-SIMD_PACKEDOP1 (precip, fpreciprocal)
-SIMD_PACKEDOP1 (psqrt, fpsqrt)
-SIMD_PACKEDOP1 (precipsqrt, fprecipsqrt)
-SIMD_PACKEDOP1 (psin, fsin)
-SIMD_PACKEDOP1 (pcos, fcos)
-SIMD_PACKEDOP1 (ptan, ftan)
-
-SIMD_SINGLEOP1 (srecip, fpreciprocal)
-SIMD_SINGLEOP1 (ssqrt, fpsqrt)
-SIMD_SINGLEOP1 (srecipsqrt, fprecipsqrt)
-SIMD_SINGLEOP1 (ssin, fsin)
-SIMD_SINGLEOP1 (scos, fcos)
-SIMD_SINGLEOP1 (stan, ftan)
-
-SIMD_CONVERTOP (pround, fround)
-
-template <typename T> inline int32_t sround (T op) { fround<T,int32_t> obj; return (obj (op)); }
-#endif
-
-#undef SIMD_SINGLEOP1
-#undef SIMD_PACKEDOP3
-#undef SIMD_PACKEDOP2
-#undef SIMD_PACKEDOP1
-
-//----------------------------------------------------------------------
-// Vector types to cast tuple data to
-//----------------------------------------------------------------------
-
-#if HAVE_VECTOR_EXTENSIONS && __GNUC__ >= 4
-#define VECTOR_ATTRIBUTE(mode,vs) __attribute__((vector_size(vs)))
-#else
-#define VECTOR_ATTRIBUTE(mode,vs)
-#endif
-typedef uint8_t v8qi_t VECTOR_ATTRIBUTE (V8QI,8);
-typedef uint16_t v4hi_t VECTOR_ATTRIBUTE (V4HI,8);
-typedef uint16_t v8hi_t VECTOR_ATTRIBUTE (V8HI,16);
-typedef uint32_t v2si_t VECTOR_ATTRIBUTE (V2SI,8);
-typedef uint32_t v4si_t VECTOR_ATTRIBUTE (V4SI,16);
-#if HAVE_INT64_T
-typedef uint64_t v1di_t VECTOR_ATTRIBUTE (V1DI,8);
-#endif
-typedef float v2sf_t VECTOR_ATTRIBUTE (V2SF,8);
-typedef float v4sf_t VECTOR_ATTRIBUTE (V4SF,16);
-typedef double v2df_t VECTOR_ATTRIBUTE (V2DF,16);
-#undef VECTOR_ATTRIBUTE
-
-//----------------------------------------------------------------------
-// Hardware accelerated specializations
-//----------------------------------------------------------------------
-
-#define SIMD_PKOP2_SPEC(n, type, optype) \
-template <> \
-inline void packop (const tuple<n,type>& oin, tuple<n,type>& oout, optype<type>)
-#define SIMD_PASSIGN_SPEC(n, type) \
-template <> \
-inline void passign (const tuple<n,type>& oin, tuple<n,type>& oout)
-#define SIMD_IPASSIGN_SPEC(n, type) \
-template <> \
-inline void ipassign (tuple<n,type>::const_iterator oin, tuple<n,type>& oout)
-#define SIMD_CONVERT_SPEC(n, type1, type2, optype) \
-template <> \
-inline void pconvert (const tuple<n,type1>& oin, tuple<n,type2>& oout, optype<type1,type2>)
-
-#if CPU_HAS_MMX
-#define STD_MMX_ARGS "=m"(oout[0]) : "m"(oin[0]) : "mm0", "st", "memory"
-#define DBL_MMX_ARGS "=m"(oout[0]), "=m"(oout[2]) : "m"(oin[0]), "m"(oin[2]) : "mm0", "mm1", "st", "st(1)", "memory"
-#define MMX_PKOP2_SPEC(n,type,optype,instruction) \
-SIMD_PKOP2_SPEC(n,type,optype) \
-{ asm ("movq %0, %%mm0\n\t" #instruction " %1, %%mm0\n\tmovq %%mm0, %0" : STD_MMX_ARGS); reset_mmx(); }
-#define MMX_DBL_PKOP2_SPEC(n,type,optype,instruction) \
-SIMD_PKOP2_SPEC(n,type,optype) \
-{ asm ("movq %0, %%mm0\n\tmovq %1, %%mm1\n\t" #instruction " %2, %%mm0\n\t" #instruction " %3, %%mm1\n\tmovq %%mm0, %0\n\tmovq %%mm1, %1" : DBL_MMX_ARGS); reset_mmx(); }
-#define MMX_PASSIGN_SPEC(n,type) \
-SIMD_PASSIGN_SPEC(n,type) \
-{ asm ("movq %1, %%mm0\n\tmovq %%mm0, %0" : STD_MMX_ARGS); reset_mmx(); }
-#define MMX_DBL_PASSIGN_SPEC(n,type) \
-SIMD_PASSIGN_SPEC(n,type) \
-{ asm ("movq %2, %%mm0\n\tmovq %3, %%mm1\n\tmovq %%mm0, %0\n\tmovq %%mm1, %1" : DBL_MMX_ARGS); reset_mmx(); }
-#define MMX_IPASSIGN_SPEC(n,type) \
-SIMD_IPASSIGN_SPEC(n,type) \
-{ asm ("movq %1, %%mm0\n\tmovq %%mm0, %0" : STD_MMX_ARGS); reset_mmx(); }
-#define MMX_DBL_IPASSIGN_SPEC(n,type) \
-SIMD_IPASSIGN_SPEC(n,type) \
-{ asm ("movq %2, %%mm0\n\tmovq %3, %%mm1\n\tmovq %%mm0, %0\n\tmovq %%mm1, %1" : DBL_MMX_ARGS); reset_mmx(); }
-
-MMX_PASSIGN_SPEC(8,uint8_t)
-MMX_PKOP2_SPEC(8,uint8_t,plus,paddb)
-MMX_PKOP2_SPEC(8,uint8_t,minus,psubb)
-MMX_PKOP2_SPEC(8,uint8_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(8,uint8_t,bitwise_or,por)
-MMX_PKOP2_SPEC(8,uint8_t,bitwise_xor,pxor)
-MMX_PKOP2_SPEC(8,uint8_t,fpadds,paddusb)
-MMX_PKOP2_SPEC(8,uint8_t,fpsubs,psubusb)
-
-MMX_PASSIGN_SPEC(8,int8_t)
-MMX_PKOP2_SPEC(8,int8_t,plus,paddb)
-MMX_PKOP2_SPEC(8,int8_t,minus,psubb)
-MMX_PKOP2_SPEC(8,int8_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(8,int8_t,bitwise_or,por)
-MMX_PKOP2_SPEC(8,int8_t,bitwise_xor,pxor)
-MMX_PKOP2_SPEC(8,int8_t,fpadds,paddsb)
-MMX_PKOP2_SPEC(8,int8_t,fpsubs,psubsb)
-
-MMX_PASSIGN_SPEC(4,uint16_t)
-MMX_PKOP2_SPEC(4,uint16_t,plus,paddw)
-MMX_PKOP2_SPEC(4,uint16_t,minus,psubw)
-MMX_PKOP2_SPEC(4,uint16_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(4,uint16_t,bitwise_or,por)
-MMX_PKOP2_SPEC(4,uint16_t,bitwise_xor,pxor)
-/// \todo psllw does not work like other operations, it uses the first element for shift count.
-//MMX_PKOP2_SPEC(4,uint16_t,fpshl,psllw)
-//MMX_PKOP2_SPEC(4,uint16_t,fpshr,psrlw)
-MMX_PKOP2_SPEC(4,uint16_t,fpadds,paddusw)
-MMX_PKOP2_SPEC(4,uint16_t,fpsubs,psubusw)
-
-MMX_PASSIGN_SPEC(4,int16_t)
-MMX_PKOP2_SPEC(4,int16_t,plus,paddw)
-MMX_PKOP2_SPEC(4,int16_t,minus,psubw)
-MMX_PKOP2_SPEC(4,int16_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(4,int16_t,bitwise_or,por)
-MMX_PKOP2_SPEC(4,int16_t,bitwise_xor,pxor)
-//MMX_PKOP2_SPEC(4,int16_t,fpshl,psllw)
-//MMX_PKOP2_SPEC(4,int16_t,fpshr,psrlw)
-MMX_PKOP2_SPEC(4,int16_t,fpadds,paddsw)
-MMX_PKOP2_SPEC(4,int16_t,fpsubs,psubsw)
-
-MMX_PASSIGN_SPEC(2,uint32_t)
-MMX_PKOP2_SPEC(2,uint32_t,plus,paddd)
-MMX_PKOP2_SPEC(2,uint32_t,minus,psubd)
-MMX_PKOP2_SPEC(2,uint32_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(2,uint32_t,bitwise_or,por)
-MMX_PKOP2_SPEC(2,uint32_t,bitwise_xor,pxor)
-//MMX_PKOP2_SPEC(2,uint32_t,fpshl,pslld)
-//MMX_PKOP2_SPEC(2,uint32_t,fpshr,psrld)
-
-MMX_PASSIGN_SPEC(2,int32_t)
-MMX_PKOP2_SPEC(2,int32_t,plus,paddd)
-MMX_PKOP2_SPEC(2,int32_t,minus,psubd)
-MMX_PKOP2_SPEC(2,int32_t,bitwise_and,pand)
-MMX_PKOP2_SPEC(2,int32_t,bitwise_or,por)
-MMX_PKOP2_SPEC(2,int32_t,bitwise_xor,pxor)
-//MMX_PKOP2_SPEC(2,int32_t,fpshl,pslld)
-//MMX_PKOP2_SPEC(2,int32_t,fpshr,psrld)
-
-MMX_DBL_PKOP2_SPEC(4,uint32_t,plus,paddd)
-MMX_DBL_PKOP2_SPEC(4,uint32_t,minus,psubd)
-MMX_DBL_PKOP2_SPEC(4,uint32_t,bitwise_and,pand)
-MMX_DBL_PKOP2_SPEC(4,uint32_t,bitwise_or,por)
-MMX_DBL_PKOP2_SPEC(4,uint32_t,bitwise_xor,pxor)
-//MMX_DBL_PKOP2_SPEC(2,uint32_t,fpshl,pslld)
-//MMX_DBL_PKOP2_SPEC(2,uint32_t,fpshr,psrld)
-
-MMX_DBL_PKOP2_SPEC(4,int32_t,plus,paddd)
-MMX_DBL_PKOP2_SPEC(4,int32_t,minus,psubd)
-MMX_DBL_PKOP2_SPEC(4,int32_t,bitwise_and,pand)
-MMX_DBL_PKOP2_SPEC(4,int32_t,bitwise_or,por)
-MMX_DBL_PKOP2_SPEC(4,int32_t,bitwise_xor,pxor)
-//MMX_DBL_PKOP2_SPEC(2,int32_t,fpshl,pslld)
-//MMX_DBL_PKOP2_SPEC(2,int32_t,fpshr,psrld)
-
-#if CPU_HAS_SSE || CPU_HAS_3DNOW
-MMX_PKOP2_SPEC(8,uint8_t,fpavg,pavgb)
-MMX_PKOP2_SPEC(8,int8_t,fpavg,pavgb)
-MMX_PKOP2_SPEC(4,uint16_t,fpavg,pavgw)
-MMX_PKOP2_SPEC(4,int16_t,fpavg,pavgw)
-MMX_PKOP2_SPEC(8,uint8_t,fpmin,pminub)
-MMX_PKOP2_SPEC(8,uint8_t,fpmax,pmaxub)
-MMX_PKOP2_SPEC(4,int16_t,fpmax,pmaxsw)
-MMX_PKOP2_SPEC(4,int16_t,fpmin,pminsw)
-#endif // CPU_HAS_SSE || CPU_HAS_3DNOW
-
-#if CPU_HAS_3DNOW
-MMX_PASSIGN_SPEC(2,float)
-MMX_PKOP2_SPEC(2,float,plus,pfadd)
-MMX_PKOP2_SPEC(2,float,minus,pfsub)
-MMX_PKOP2_SPEC(2,float,multiplies,pfmul)
-MMX_PKOP2_SPEC(2,float,fpmin,pfmin)
-MMX_PKOP2_SPEC(2,float,fpmax,pfmax)
-#ifndef CPU_HAS_SSE
-MMX_DBL_PKOP2_SPEC(4,float,plus,pfadd)
-MMX_DBL_PKOP2_SPEC(4,float,minus,pfsub)
-MMX_DBL_PKOP2_SPEC(4,float,multiplies,pfmul)
-MMX_DBL_PKOP2_SPEC(4,float,fpmin,pfmin)
-MMX_DBL_PKOP2_SPEC(4,float,fpmax,pfmax)
-#endif
-#endif // CPU_HAS_3DNOW
-
-MMX_IPASSIGN_SPEC(8,uint8_t)
-MMX_IPASSIGN_SPEC(4,uint16_t)
-MMX_IPASSIGN_SPEC(2,uint32_t)
-MMX_IPASSIGN_SPEC(2,float)
-
-#ifndef CPU_HAS_SSE
-MMX_DBL_PASSIGN_SPEC(4,float)
-MMX_DBL_PASSIGN_SPEC(4,uint32_t)
-MMX_DBL_PASSIGN_SPEC(4,int32_t)
-MMX_DBL_IPASSIGN_SPEC(4,float)
-MMX_DBL_IPASSIGN_SPEC(4,uint32_t)
-MMX_DBL_IPASSIGN_SPEC(4,int32_t)
-#endif
-
-#undef MMX_IPASSIGN_SPEC
-#undef MMX_PASSIGN_SPEC
-#undef MMX_PKOP2_SPEC
-#undef STD_MMX_ARGS
-#endif // CPU_HAS_MMX
-
-#if CPU_HAS_SSE
-#define STD_SSE_ARGS "=m"(oout[0]) : "m"(oin[0]) : "xmm0", "memory"
-#define SSE_PKOP2_SPEC(n,type,optype,instruction) \
-SIMD_PKOP2_SPEC(n,type,optype) \
-{ asm ("movups %0, %%xmm0\n\tmovups %1, %%xmm1\n\t" #instruction " %%xmm1, %%xmm0\n\tmovups %%xmm0, %0" : STD_SSE_ARGS);}
-#define SSE_PASSIGN_SPEC(n,type) \
-SIMD_PASSIGN_SPEC(n,type) \
-{ asm ("movups %1, %%xmm0\n\tmovups %%xmm0, %0" : STD_SSE_ARGS);}
-#define SSE_IPASSIGN_SPEC(n,type) \
-SIMD_IPASSIGN_SPEC(n,type) \
-{ asm ("movups %1, %%xmm0\n\tmovups %%xmm0, %0" : STD_SSE_ARGS);}
-SSE_PASSIGN_SPEC(4,float)
-SSE_PASSIGN_SPEC(4,int32_t)
-SSE_PASSIGN_SPEC(4,uint32_t)
-SSE_PKOP2_SPEC(4,float,plus,addps)
-SSE_PKOP2_SPEC(4,float,minus,subps)
-SSE_PKOP2_SPEC(4,float,multiplies,mulps)
-SSE_PKOP2_SPEC(4,float,divides,divps)
-SSE_PKOP2_SPEC(4,float,bitwise_and,andps)
-SSE_PKOP2_SPEC(4,float,bitwise_or,orps)
-SSE_PKOP2_SPEC(4,float,bitwise_xor,xorps)
-SSE_PKOP2_SPEC(4,float,fpmax,maxps)
-SSE_PKOP2_SPEC(4,float,fpmin,minps)
-
-SIMD_CONVERT_SPEC(4,float,int32_t,fround) {
- asm ("cvtps2pi %2, %%mm0\n\t"
- "cvtps2pi %3, %%mm1\n\t"
- "movq %%mm0, %0\n\t"
- "movq %%mm1, %1"
- : DBL_MMX_ARGS);
- reset_mmx();
-}
-SIMD_CONVERT_SPEC(4,int32_t,float,fround) {
- asm ("cvtpi2ps %2, %%xmm0\n\t"
- "shufps $0x4E,%%xmm0,%%xmm0\n\t"
- "cvtpi2ps %1, %%xmm0\n\t"
- "movups %%xmm0, %0"
- : "=m"(oout[0]) : "m"(oin[0]), "m"(oin[2]) : "xmm0", "memory");
-}
-template <> inline int32_t fround<float,int32_t>::operator()(const float& a) const {
- register int32_t rv;
- asm ("movss %1, %%xmm0\n\t"
- "cvtss2si %%xmm0, %0"
- : "=r"(rv) : "m"(a) : "xmm0" );
- return (rv);
-}
-template <> inline uint32_t fround<float,uint32_t>::operator()(const float& a) const {
- register uint32_t rv;
- asm ("movss %1, %%xmm0\n\t"
- "cvtss2si %%xmm0, %0"
- : "=r"(rv) : "m"(a) : "xmm0" );
- return (rv);
-}
-
-SSE_IPASSIGN_SPEC(4,float)
-SSE_IPASSIGN_SPEC(4,int32_t)
-SSE_IPASSIGN_SPEC(4,uint32_t)
-
-#undef SSE_IPASSIGN_SPEC
-#undef SSE_PASSIGN_SPEC
-#undef SSE_PKOP2_SPEC
-#undef STD_SSE_ARGS
-#endif // CPU_HAS_SSE
-
-#undef SIMD_PACKEDOP_SPEC
-
-} // namespace simd
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/sistream.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/sistream.cpp
deleted file mode 100644
index 8a20ddf..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/sistream.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// sistream.cc
-//
-
-#include "sistream.h"
-#include "sostream.h"
-#include "uassert.h"
-#include "ustring.h"
-
-namespace ustl {
-
-const char ios_base::c_DefaultDelimiters [istringstream::c_MaxDelimiters] = " \t\n\r;:,.?";
-
-/// Default constructor.
-istringstream::istringstream (void)
-: istream (),
- m_Base (0)
-{
- set_delimiters (c_DefaultDelimiters);
-}
-
-istringstream::istringstream (const void* p, size_type n)
-: istream (),
- m_Base (0)
-{
- link (p, n);
- set_delimiters (c_DefaultDelimiters);
-}
-
-istringstream::istringstream (const cmemlink& source)
-: istream (),
- m_Base (0)
-{
- link (source);
- set_delimiters (c_DefaultDelimiters);
-}
-
-/// Sets delimiters to the contents of \p delimiters.
-void istringstream::set_delimiters (const char* delimiters)
-{
- fill (VectorRange (m_Delimiters), '\0');
- strncpy (m_Delimiters, delimiters, VectorSize(m_Delimiters)-1);
-}
-
-inline bool istringstream::is_delimiter (char c) const
-{
- return (memchr (m_Delimiters, c, VectorSize(m_Delimiters)-1));
-}
-
-char istringstream::skip_delimiters (void)
-{
- char c = m_Delimiters[0];
- while (is_delimiter(c) && (remaining() || underflow()))
- istream::iread (c);
- return (c);
-}
-
-void istringstream::iread (int8_t& v)
-{
- v = skip_delimiters();
-}
-
-typedef istringstream::iterator issiter_t;
-template <typename T>
-inline void str_to_num (issiter_t i, issiter_t* iend, uint8_t base, T& v)
- { v = strtol (i, const_cast<char**>(iend), base); }
-template <> inline void str_to_num (issiter_t i, issiter_t* iend, uint8_t, double& v)
- { v = strtod (i, const_cast<char**>(iend)); }
-#ifdef HAVE_LONG_LONG
-template <> inline void str_to_num (issiter_t i, issiter_t* iend, uint8_t base, long long& v)
- { v = strtoll (i, const_cast<char**>(iend), base); }
-#endif
-
-template <typename T>
-inline void istringstream::read_number (T& v)
-{
- v = 0;
- if (skip_delimiters() == m_Delimiters[0])
- return;
- ungetc();
- iterator ilast;
- do {
- str_to_num<T> (ipos(), &ilast, m_Base, v);
- } while (ilast == end() && underflow());
- skip (distance (ipos(), ilast));
-}
-
-void istringstream::iread (int32_t& v) { read_number (v); }
-void istringstream::iread (double& v) { read_number (v); }
-#if HAVE_INT64_T
-void istringstream::iread (int64_t& v) { read_number (v); }
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-void istringstream::iread (long long& v) { read_number (v); }
-#endif
-
-void istringstream::iread (wchar_t& v)
-{
- if ((v = skip_delimiters()) == wchar_t(m_Delimiters[0]))
- return;
- size_t cs = Utf8SequenceBytes (v) - 1;
- if (remaining() >= cs || underflow(cs) >= cs) {
- ungetc();
- v = *utf8in (ipos());
- skip (cs + 1);
- }
-}
-
-void istringstream::iread (bool& v)
-{
- static const char tf[2][8] = { "false", "true" };
- char c = skip_delimiters();
- v = (c == 't' || c == '1');
- if (c != tf[v][0])
- return;
- for (const char* tv = tf[v]; c == *tv && (remaining() || underflow()); ++tv)
- istream::iread (c);
- ungetc();
-}
-
-void istringstream::iread (string& v)
-{
- v.clear();
- char prevc, quoteChar = 0, c = skip_delimiters();
- if (c == '\"' || c == '\'')
- quoteChar = c;
- else
- v += c;
- while (remaining() || underflow()) {
- prevc = c;
- istream::iread (c);
- if (!quoteChar && is_delimiter(c))
- break;
- if (prevc == '\\') {
- switch (c) {
- case 't': c = '\t'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 'b': c = '\b'; break;
- case 'E': c = 27; break; // ESC sequence
- case '\"': c = '\"'; break;
- case '\'': c = '\''; break;
- case '\\': c = '\\'; break;
- };
- v.end()[-1] = c;
- } else {
- if (c == quoteChar)
- break;
- v += c;
- }
- }
-}
-
-void istringstream::read (void* buffer, size_type sz)
-{
- if (remaining() < sz && underflow(sz) < sz)
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("read", "", sz);
-#else
- assert (remaining() >= size());
-#endif
- istream::read (buffer, sz);
-}
-
-void istringstream::read (memlink& buf)
-{
- if (remaining() < buf.size() && underflow(buf.size()) < buf.size())
-#ifdef WANT_STREAM_BOUNDS_CHECKING
- verify_remaining ("read", "", buf.size());
-#else
- assert (remaining() >= buf.size());
-#endif
- istream::read (buf);
-}
-
-/// Reads one character from the stream.
-int istringstream::get (void)
-{
- int8_t v = 0;
- if (remaining() || underflow())
- istream::iread (v);
- return (v);
-}
-
-/// Reads characters into \p s until \p delim is found (but not stored or extracted)
-void istringstream::get (string& s, char delim)
-{
- getline (s, delim);
- if (!s.empty() && pos() > 0 && ipos()[-1] == delim)
- ungetc();
-}
-
-/// Reads characters into \p p,n until \p delim is found (but not stored or extracted)
-void istringstream::get (char* p, size_type n, char delim)
-{
- assert (p && !n && "A non-empty buffer is required by this implementation");
- string s;
- get (s, delim);
- const size_t ntc (min (n - 1, s.size()));
- memcpy (p, s.data(), ntc);
- p[ntc] = 0;
-}
-
-/// Reads characters into \p s until \p delim is extracted (but not stored)
-void istringstream::getline (string& s, char delim)
-{
- char oldDelim [VectorSize(m_Delimiters)];
- copy (VectorRange (m_Delimiters), oldDelim);
- fill (VectorRange (m_Delimiters), '\0');
- m_Delimiters[0] = delim;
- iread (s);
- copy (VectorRange (oldDelim), m_Delimiters);
-}
-
-/// Reads characters into \p p,n until \p delim is extracted (but not stored)
-void istringstream::getline (char* p, size_type n, char delim)
-{
- assert (p && !n && "A non-empty buffer is required by this implementation");
- string s;
- getline (s, delim);
- const size_t ntc (min (n - 1, s.size()));
- memcpy (p, s.data(), ntc);
- p[ntc] = 0;
-}
-
-/// Extract until \p delim or \p n chars have been read.
-void istringstream::ignore (size_type n, char delim)
-{
- while (n-- && (remaining() || underflow()) && get() != delim);
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/sistream.h b/media/libdrm/mobile2/src/util/ustl-1.0/sistream.h
deleted file mode 100644
index 924f43b..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/sistream.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// sistream.h
-//
-
-#ifndef SISTREAM_H_0CCA102229A49F5D65EE852E62B27CE2
-#define SISTREAM_H_0CCA102229A49F5D65EE852E62B27CE2
-
-#include "mistream.h"
-#include "uassert.h"
-#include "ustring.h"
-
-namespace ustl {
-
-/// \class istringstream sistream.h ustl.h
-/// \ingroup TextStreams
-///
-/// \brief A stream that reads textual data from a memory block.
-///
-class istringstream : public istream {
-public:
- static const size_type c_MaxDelimiters = 16; ///< Maximum number of word delimiters.
-public:
- istringstream (void);
- istringstream (const void* p, size_type n);
- explicit istringstream (const cmemlink& source);
- void iread (int8_t& v);
- void iread (int32_t& v);
- void iread (double& v);
- void iread (bool& v);
- void iread (wchar_t& v);
- void iread (string& v);
-#ifdef HAVE_INT64_T
- void iread (int64_t& v);
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
- void iread (long long& v);
-#endif
- inline string str (void) const { string s; s.link (*this); return (s); }
- inline void str (const string& s) { link (s); }
- int get (void);
- inline void get (char& c) { c = get(); }
- void get (char* p, size_type n, char delim = '\n');
- void get (string& s, char delim = '\n');
- void getline (char* p, size_type n, char delim = '\n');
- void getline (string& s, char delim = '\n');
- void ignore (size_type n, char delim = '\0');
- inline char peek (void) { int8_t v; iread (v); ungetc(); return (v); }
- inline void putback (char) { ungetc(); }
- inline void unget (void) { ungetc(); }
- void set_delimiters (const char* delimiters);
- inline void set_base (short base);
- inline void set_decimal_separator (char) { }
- inline void set_thousand_separator (char) { }
- void read (void* buffer, size_type size);
- void read (memlink& buf);
- inline void read_strz (string& str);
- inline void sync (void) { skip (remaining()); }
-protected:
- char skip_delimiters (void);
-private:
- inline bool is_delimiter (char c) const;
- template <typename T> void read_number (T& v);
-private:
- char m_Delimiters [c_MaxDelimiters];
- uint8_t m_Base;
-};
-
-/// Sets the numeric base used to read numbers.
-inline void istringstream::set_base (short base)
-{
- m_Base = base;
-}
-
-/// Reads a null-terminated character stream. This is not allowed in this class.
-inline void istringstream::read_strz (string&)
-{
- assert (!"Reading nul characters is not allowed from text streams");
-}
-
-/// Reads one type as another.
-template <typename RealT, typename CastT>
-inline void _cast_read (istringstream& is, RealT& v)
-{
- CastT cv;
- is.iread (cv);
- v = RealT (cv);
-}
-
-inline istringstream& operator>> (istringstream& is, int8_t& v) { is.iread (v); return (is); }
-inline istringstream& operator>> (istringstream& is, int32_t& v){ is.iread (v); return (is); }
-inline istringstream& operator>> (istringstream& is, double& v) { is.iread (v); return (is); }
-inline istringstream& operator>> (istringstream& is, bool& v) { is.iread (v); return (is); }
-inline istringstream& operator>> (istringstream& is, wchar_t& v){ is.iread (v); return (is); }
-inline istringstream& operator>> (istringstream& is, string& v) { is.iread (v); return (is); }
-#if HAVE_INT64_T
-inline istringstream& operator>> (istringstream& is, int64_t& v){ is.iread (v); return (is); }
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-inline istringstream& operator>> (istringstream& is, long long& v) { is.iread (v); return (is); }
-#endif
-
-#define ISTRSTREAM_CAST_OPERATOR(RealT, CastT) \
-inline istringstream& operator>> (istringstream& is, RealT& v) \
-{ _cast_read<RealT,CastT>(is, v); return (is); }
-
-ISTRSTREAM_CAST_OPERATOR (uint8_t, int8_t)
-ISTRSTREAM_CAST_OPERATOR (int16_t, int32_t)
-ISTRSTREAM_CAST_OPERATOR (uint16_t, int32_t)
-ISTRSTREAM_CAST_OPERATOR (uint32_t, int32_t)
-ISTRSTREAM_CAST_OPERATOR (float, double)
-#if HAVE_THREE_CHAR_TYPES
-ISTRSTREAM_CAST_OPERATOR (char, int8_t)
-#endif
-#if HAVE_INT64_T
-ISTRSTREAM_CAST_OPERATOR (uint64_t, int64_t)
-#endif
-#if SIZE_OF_LONG == SIZE_OF_INT
-ISTRSTREAM_CAST_OPERATOR (long, int)
-ISTRSTREAM_CAST_OPERATOR (unsigned long,int)
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-ISTRSTREAM_CAST_OPERATOR (unsigned long long, long long)
-#endif
-#undef ISTRSTREAM_CAST_OPERATOR
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/sostream.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/sostream.cpp
deleted file mode 100644
index 96f0976..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/sostream.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// sostream.h
-//
-
-#include "mistream.h" // for istream_iterator, referenced in utf8.h
-#include "sostream.h"
-#include "uassert.h"
-#include "ulimits.h"
-#include "ustring.h"
-#include <stdio.h>
-
-namespace ustl {
-
-/// Creates an output string stream linked to the given memory area.
-ostringstream::ostringstream (void* p, size_t n)
-: ostream (),
- m_Buffer (),
- m_Flags (0),
- m_Width (0),
- m_Base (10),
- m_Precision (2)
-{
- link (p, n);
-}
-
-/// Creates an output string stream, initializing the buffer with v.
-ostringstream::ostringstream (const string& v)
-: ostream (),
- m_Buffer (v),
- m_Flags (0),
- m_Width (0),
- m_Base (10),
- m_Precision (2)
-{
- ostream::link (m_Buffer);
-}
-
-/// Copies \p s to the internal buffer.
-void ostringstream::str (const string& s)
-{
- m_Buffer = s;
- ostream::link (m_Buffer);
- SetPos (m_Buffer.size());
-}
-
-/// Writes a single character into the stream.
-void ostringstream::iwrite (uint8_t v)
-{
- if (remaining() >= 1 || overflow() >= 1)
- ostream::iwrite (v);
-}
-
-/// Writes \p buf of size \p bufSize through the internal buffer.
-void ostringstream::write_buffer (const char* buf, size_type bufSize)
-{
- size_type btw = 0, written = 0;
- while ((written += btw) < bufSize && (remaining() || overflow(bufSize - written)))
- write (buf + written, btw = min (remaining(), bufSize - written));
-}
-
-/// Simple decimal encoding of \p n into \p fmt.
-inline char* ostringstream::encode_dec (char* fmt, uint32_t n) const
-{
- do {
- *fmt++ = '0' + n % 10;
- } while (n /= 10);
- return (fmt);
-}
-
-/// Generates a sprintf format string for the given type.
-void ostringstream::fmtstring (char* fmt, const char* typestr, bool bInteger) const
-{
- *fmt++ = '%';
- if (m_Width)
- fmt = encode_dec (fmt, m_Width);
- if (m_Flags & left)
- *fmt++ = '-';
- if (!bInteger) {
- *fmt++ = '.';
- fmt = encode_dec (fmt, m_Precision);
- }
- while (*typestr)
- *fmt++ = *typestr++;
- if (bInteger) {
- if (m_Base == 16)
- fmt[-1] = 'X';
- else if (m_Base == 8)
- fmt[-1] = 'o';
- } else {
- if (m_Flags & scientific)
- fmt[-1] = 'E';
- }
- *fmt = 0;
-}
-
-/// Writes \p v into the stream as utf8
-void ostringstream::iwrite (wchar_t v)
-{
- char buffer [8];
- *utf8out(buffer) = v;
- write_buffer (buffer, Utf8Bytes(v));
-}
-
-/// Writes value \p v into the stream as text.
-void ostringstream::iwrite (bool v)
-{
- static const char tf[2][8] = { "false", "true" };
- write_buffer (tf[v], 5 - v);
-}
-
-/// Equivalent to a vsprintf on the string.
-int ostringstream::vformat (const char* fmt, va_list args)
-{
-#if HAVE_VA_COPY
- va_list args2;
-#else
- #define args2 args
- #undef __va_copy
- #define __va_copy(x,y)
-#endif
- size_t rv, space;
- do {
- space = remaining();
- __va_copy (args2, args);
- rv = vsnprintf (ipos(), space, fmt, args2);
- if (ssize_t(rv) < 0)
- rv = space;
- } while (rv >= space && rv < overflow(rv + 1));
- SetPos (pos() + min (rv, space));
- return (rv);
-}
-
-/// Equivalent to a sprintf on the string.
-int ostringstream::format (const char* fmt, ...)
-{
- va_list args;
- va_start (args, fmt);
- const int rv = vformat (fmt, args);
- va_end (args);
- return (rv);
-}
-
-/// Links to string \p l as resizable.
-void ostringstream::link (void* p, size_t n)
-{
- assert ((p || !n) && "The output string buffer must not be read-only");
- ostream::link (p, n);
- m_Buffer.link (p, n);
-}
-
-/// Writes the contents of \p buffer of \p size into the stream.
-void ostringstream::write (const void* buffer, size_type sz)
-{
- if (remaining() < sz && overflow(sz) < sz)
- return;
- ostream::write (buffer, sz);
-}
-
-/// Writes the contents of \p buf into the stream.
-void ostringstream::write (const cmemlink& buf)
-{
- if (remaining() < buf.size() && overflow(buf.size()) < buf.size())
- return;
- ostream::write (buf);
-}
-
-/// Flushes the internal buffer by truncating it at the current position.
-void ostringstream::flush (void)
-{
- m_Buffer.resize (pos());
-}
-
-/// Attempts to create more output space. Returns remaining().
-ostringstream::size_type ostringstream::overflow (size_type n)
-{
- if (n > remaining()) {
- const uoff_t oldPos (pos());
- m_Buffer.reserve (oldPos + n, false);
- m_Buffer.resize (oldPos + n);
- ostream::link (m_Buffer);
- SetPos (oldPos);
- }
- verify_remaining ("write", "text", n);
- return (remaining());
-}
-
-} // namespace ustl
-
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/sostream.h b/media/libdrm/mobile2/src/util/ustl-1.0/sostream.h
deleted file mode 100644
index 11dc328..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/sostream.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// sostream.h
-//
-
-#ifndef SOSTREAM_H_5323DC8C26E181D43278F2F53FDCF19F
-#define SOSTREAM_H_5323DC8C26E181D43278F2F53FDCF19F
-
-#include "uassert.h"
-#include "ustring.h"
-#include "mostream.h"
-
-namespace ustl {
-
-class string;
-
-/// \class ostringstream sostream.h ustl.h
-/// \ingroup TextStreams
-///
-/// \brief This stream writes textual data into a memory block.
-///
-class ostringstream : public ostream {
-public:
- ostringstream (const string& v = string::empty_string);
- ostringstream (void* p, size_t n);
- void iwrite (uint8_t v);
- void iwrite (wchar_t v);
- inline void iwrite (int v) { iformat (v); }
- inline void iwrite (unsigned int v) { iformat (v); }
- inline void iwrite (long int v) { iformat (v); }
- inline void iwrite (unsigned long int v) { iformat (v); }
- inline void iwrite (float v) { iformat (v); }
- inline void iwrite (double v) { iformat (v); }
- void iwrite (bool v);
- inline void iwrite (const char* s) { write_buffer (s, strlen(s)); }
- inline void iwrite (const string& v) { write_buffer (v.begin(), v.size()); }
- inline void iwrite (fmtflags f);
-#if HAVE_LONG_LONG
- inline void iwrite (long long v) { iformat (v); }
- inline void iwrite (unsigned long long v) { iformat (v); }
-#endif
- inline size_type max_size (void) const { return (m_Buffer.max_size()); }
- inline void put (char c) { iwrite (uint8_t(c)); }
- int vformat (const char* fmt, va_list args);
- int format (const char* fmt, ...) __attribute__((__format__(__printf__, 2, 3)));
- inline void set_base (uint16_t b) { m_Base = b; }
- inline void set_width (uint16_t w) { m_Width = w; }
- inline void set_decimal_separator (char) { }
- inline void set_thousand_separator (char) { }
- inline void set_precision (uint16_t v) { m_Precision = v; }
- void link (void* p, size_type n);
- inline void link (memlink& l) { link (l.data(), l.writable_size()); }
- inline const string& str (void) { flush(); return (m_Buffer); }
- void str (const string& s);
- void write (const void* buffer, size_type size);
- void write (const cmemlink& buf);
- inline void write_strz (const char*) { assert (!"Writing nul characters into a text stream is not allowed"); }
- void flush (void);
- virtual size_type overflow (size_type n = 1);
-protected:
- void write_buffer (const char* buf, size_type bufSize);
- inline void reserve (size_type n) { m_Buffer.reserve (n, false); }
- inline size_type capacity (void) const { return (m_Buffer.capacity()); }
-private:
- inline char* encode_dec (char* fmt, uint32_t n) const;
- void fmtstring (char* fmt, const char* typestr, bool bInteger) const;
- template <typename T>
- void iformat (T v);
-private:
- string m_Buffer; ///< The output buffer.
- uint32_t m_Flags; ///< See ios_base::fmtflags.
- uint16_t m_Width; ///< Field width.
- uint8_t m_Base; ///< Numeric base for writing numbers.
- uint8_t m_Precision; ///< Number of digits after the decimal separator.
-};
-
-//----------------------------------------------------------------------
-
-template <typename T>
-inline const char* printf_typestring (const T&) { return (""); }
-#define PRINTF_TYPESTRING_SPEC(type,str) \
-template <> inline const char* printf_typestring (const type&) { return (str); }
-PRINTF_TYPESTRING_SPEC (int, "d")
-PRINTF_TYPESTRING_SPEC (unsigned int, "u")
-PRINTF_TYPESTRING_SPEC (long, "ld")
-PRINTF_TYPESTRING_SPEC (unsigned long, "lu")
-PRINTF_TYPESTRING_SPEC (float, "f")
-PRINTF_TYPESTRING_SPEC (double, "lf")
-#if HAVE_LONG_LONG
-PRINTF_TYPESTRING_SPEC (long long, "lld")
-PRINTF_TYPESTRING_SPEC (unsigned long long, "llu")
-#endif
-#undef PRINTF_TYPESTRING_SPEC
-
-template <typename T>
-void ostringstream::iformat (T v)
-{
- char fmt [16];
- fmtstring (fmt, printf_typestring(v), numeric_limits<T>::is_integer);
- format (fmt, v);
-}
-
-/// Sets the flag \p f in the stream.
-inline void ostringstream::iwrite (fmtflags f)
-{
- switch (f) {
- case oct: set_base (8); break;
- case dec: set_base (10); break;
- case hex: set_base (16); break;
- case left: m_Flags |= left; m_Flags &= ~right; break;
- case right: m_Flags |= right; m_Flags &= ~left; break;
- default: m_Flags |= f; break;
- }
-}
-
-//----------------------------------------------------------------------
-
-#define OSTRSTREAM_OPERATOR(RealT, CastT) \
-inline ostringstream& operator<< (ostringstream& os, RealT v) \
-{ os.iwrite ((CastT) v); return (os); }
-
-template <typename T>
-OSTRSTREAM_OPERATOR (T*, unsigned long int)
-OSTRSTREAM_OPERATOR (const void*, unsigned long int)
-OSTRSTREAM_OPERATOR (void*, unsigned long int)
-OSTRSTREAM_OPERATOR (const char*, const char*)
-OSTRSTREAM_OPERATOR (char*, const char*)
-OSTRSTREAM_OPERATOR (uint8_t*, const char*)
-OSTRSTREAM_OPERATOR (const uint8_t*, const char*)
-OSTRSTREAM_OPERATOR (const string&, const string&)
-OSTRSTREAM_OPERATOR (ios_base::fmtflags,ios_base::fmtflags)
-OSTRSTREAM_OPERATOR (int8_t, uint8_t)
-OSTRSTREAM_OPERATOR (uint8_t, uint8_t)
-OSTRSTREAM_OPERATOR (short int, int)
-OSTRSTREAM_OPERATOR (unsigned short, unsigned int)
-OSTRSTREAM_OPERATOR (int, int)
-OSTRSTREAM_OPERATOR (unsigned int, unsigned int)
-OSTRSTREAM_OPERATOR (long, long)
-OSTRSTREAM_OPERATOR (unsigned long, unsigned long)
-OSTRSTREAM_OPERATOR (float, float)
-OSTRSTREAM_OPERATOR (double, double)
-OSTRSTREAM_OPERATOR (bool, bool)
-OSTRSTREAM_OPERATOR (wchar_t, wchar_t)
-#if HAVE_THREE_CHAR_TYPES
-OSTRSTREAM_OPERATOR (char, uint8_t)
-#endif
-#if HAVE_LONG_LONG
-OSTRSTREAM_OPERATOR (long long, long long)
-OSTRSTREAM_OPERATOR (unsigned long long, unsigned long long)
-#endif
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/strmsize.h b/media/libdrm/mobile2/src/util/ustl-1.0/strmsize.h
deleted file mode 100644
index 5888e15..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/strmsize.h
+++ /dev/null
@@ -1,135 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file strmsize.h
-/// \brief This file contains stream_size_of functions for basic types and *STREAMABLE macros.
-/// stream_size_of functions return the size of the object's data that is written or
-/// read from a stream.
-//
-
-#ifndef STRMSIZE_H_052FF16B2D8A608761BF10333D065073
-#define STRMSIZE_H_052FF16B2D8A608761BF10333D065073
-
-#include "uassert.h"
-
-namespace ustl {
-
-/// Returns the size of the given object. Overloads for standard types are available.
-template <typename T>
-inline size_t stream_size_of (T*) { return (sizeof(T*)); }
-#ifndef DOXYGEN_SHOULD_IGNORE_THIS
-inline size_t stream_size_of (int8_t) { return (sizeof(int8_t)); }
-inline size_t stream_size_of (uint8_t) { return (sizeof(uint8_t)); }
-inline size_t stream_size_of (int16_t) { return (sizeof(int16_t)); }
-inline size_t stream_size_of (uint16_t) { return (sizeof(uint16_t)); }
-inline size_t stream_size_of (int32_t) { return (sizeof(int32_t)); }
-inline size_t stream_size_of (uint32_t) { return (sizeof(uint32_t)); }
-inline size_t stream_size_of (float) { return (sizeof(float)); }
-inline size_t stream_size_of (double) { return (sizeof(double)); }
-inline size_t stream_size_of (bool) { return (sizeof(uint8_t)); }
-inline size_t stream_size_of (wchar_t) { return (sizeof(wchar_t)); }
-#if HAVE_THREE_CHAR_TYPES
-inline size_t stream_size_of (char) { return (sizeof(char)); }
-#endif
-#if HAVE_INT64_T
-inline size_t stream_size_of (int64_t) { return (sizeof(int64_t)); }
-inline size_t stream_size_of (uint64_t) { return (sizeof(uint64_t)); }
-#endif
-#if SIZE_OF_LONG == SIZE_OF_INT
-inline size_t stream_size_of (long v) { return (sizeof (v)); }
-inline size_t stream_size_of (unsigned long v) { return (sizeof (v)); }
-#endif
-#if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
-inline size_t stream_size_of (long long v) { return (sizeof (v)); }
-inline size_t stream_size_of (unsigned long long v) { return (sizeof (v)); }
-#endif
-#endif // DOXYGEN_SHOULD_IGNORE_THIS
-
-} // namespace ustl
-
-/// Declares that T is not written to istream/ostream.
-#define NOT_STREAMABLE(T) \
- namespace ustl { \
- inline istream& operator>> (istream& is, T&) { return (is); } \
- inline ostream& operator<< (ostream& os, const T&) { return (os); } \
- inline size_t stream_size_of (const T&) { return (0); } \
- }
-
-//
-// Extra overloads in this macro are needed because it is the one used for
-// marshalling pointers. Passing a pointer to stream_size_of creates a
-// conversion ambiguity between converting to const pointer& and converting
-// to bool; the compiler always chooses the bool conversion (because it
-// requires 1 conversion instead of 2 for the other choice). There is little
-// point in adding the overloads to other macros, since they are never used
-// for pointers.
-//
-/// Declares that T is to be written as is into binary streams.
-#define INTEGRAL_STREAMABLE(T) \
- namespace ustl { \
- inline istream& operator>> (istream& is, T& v) { is.iread(v); return (is); } \
- inline ostream& operator<< (ostream& os, const T& v) { os.iwrite(v); return (os); } \
- inline ostream& operator<< (ostream& os, T& v) { os.iwrite(v); return (os); } \
- inline size_t stream_size_of (const T& v) { return (sizeof(v)); } \
- inline size_t stream_size_of (T& v) { return (sizeof(v)); } \
- }
-
-#ifdef NDEBUG
- #define STD_STREAMABLE_SZCHK_BEGIN
- #define STD_STREAMABLE_SZCHK_END
-#else
- #define STD_STREAMABLE_SZCHK_BEGIN \
- assert (os.aligned (alignof (v))); \
- const uoff_t vStart (os.pos())
- #define STD_STREAMABLE_SZCHK_END \
- if (os.pos() - vStart != v.stream_size()) \
- throw stream_bounds_exception ("write", typeid(v).name(), vStart, os.pos() - vStart, v.stream_size())
-#endif
-
-/// Declares that T contains read, write, and stream_size methods.
-#define STD_STREAMABLE(T) \
- namespace ustl { \
- inline istream& operator>> (istream& is, T& v) { assert (is.aligned (alignof (v))); v.read (is); return (is); } \
- inline ostream& operator<< (ostream& os, const T& v) { STD_STREAMABLE_SZCHK_BEGIN; v.write (os); STD_STREAMABLE_SZCHK_END; return (os); } \
- inline size_t stream_size_of (const T& v) { return (v.stream_size()); } \
- }
-
-/// Declares that T is to be cast into TSUB for streaming.
-#define CAST_STREAMABLE(T,TSUB) \
- namespace ustl { \
- inline istream& operator>> (istream& is, T& v) { TSUB sv; is >> sv; v = (T)(sv); return (is); } \
- inline ostream& operator<< (ostream& os, const T& v) { os << TSUB(v); return (os); } \
- inline size_t stream_size_of (const T& v) { return (sizeof(TSUB(v))); } \
- }
-
-/// Placed into a class it declares the methods required by STD_STREAMABLE. Syntactic sugar.
-#define DECLARE_STD_STREAMABLE \
- public: \
- void read (istream& is); \
- void write (ostream& os) const; \
- size_t stream_size (void) const
-
-/// Declares \p T to be writable to text streams. Reading is not implemented because you should not do it.
-#define TEXT_STREAMABLE(T) \
- namespace ustl { \
- inline ostringstream& operator<< (ostringstream& os, const T& v) \
- { v.text_write (os); return (os); } \
- }
-
-/// Specifies that \p T is printed by using it as an index into \p Names string array.
-#define LOOKUP_TEXT_STREAMABLE(T,Names,nNames) \
- namespace ustl { \
- inline ostringstream& operator<< (ostringstream& os, const T& v) \
- { \
- if (uoff_t(v) < (nNames)) \
- os << Names[v]; \
- else \
- os << uoff_t(v); \
- return (os); \
- } \
- }
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ualgo.h b/media/libdrm/mobile2/src/util/ustl-1.0/ualgo.h
deleted file mode 100644
index 47b66d0..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ualgo.h
+++ /dev/null
@@ -1,677 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ualgo.h
-//
-// Implementation of STL algorithms.
-//
-// The function prototypes are copied
-// exactly from the SGI version of STL documentation along with comments about
-// their use. The code is NOT the same, though the functionality usually is.
-//
-
-#ifndef UALGO_H_711AB4214D417A51166694D47A662D6E
-#define UALGO_H_711AB4214D417A51166694D47A662D6E
-
-#include "upair.h"
-#include "ualgobase.h"
-#include "ufunction.h"
-#include "upredalgo.h"
-#include "umemory.h"
-#include <stdlib.h> // for rand()
-
-namespace ustl {
-
-/// Swaps corresponding elements of [first, last) and [result,)
-/// \ingroup SwapAlgorithms
-///
-template <typename ForwardIterator1, typename ForwardIterator2>
-inline ForwardIterator2 swap_ranges (ForwardIterator1 first, ForwardIterator2 last, ForwardIterator2 result)
-{
- for (; first != last; ++first, ++result)
- iter_swap (first, result);
- return (result);
-}
-
-/// Returns the first iterator i in the range [first, last) such that
-/// *i == value. Returns last if no such iterator exists.
-/// \ingroup SearchingAlgorithms
-///
-template <typename InputIterator, typename EqualityComparable>
-inline InputIterator find (InputIterator first, InputIterator last, const EqualityComparable& value)
-{
- while (first != last && !(*first == value))
- ++ first;
- return (first);
-}
-
-/// Returns the first iterator such that *i == *(i + 1)
-/// \ingroup SearchingAlgorithms
-///
-template <typename ForwardIterator>
-ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
-{
- if (first != last)
- for (ForwardIterator prev = first; ++first != last; ++ prev)
- if (*prev == *first)
- return (prev);
- return (last);
-}
-
-/// Returns the pointer to the first pair of unequal elements.
-/// \ingroup SearchingAlgorithms
-///
-template <typename InputIterator>
-pair<InputIterator,InputIterator>
-mismatch (InputIterator first1, InputIterator last1, InputIterator first2)
-{
- while (first1 != last1 && *first1 == *first2)
- ++ first1, ++ first2;
- return (make_pair (first1, first2));
-}
-
-/// \brief Returns true if two ranges are equal.
-/// This is an extension, present in uSTL and SGI STL.
-/// \ingroup SearchingAlgorithms
-///
-template <typename InputIterator>
-inline bool equal (InputIterator first1, InputIterator last1, InputIterator first2)
-{
- return (mismatch (first1, last1, first2).first == last1);
-}
-
-/// Count finds the number of elements in [first, last) that are equal
-/// to value. More precisely, the first version of count returns the
-/// number of iterators i in [first, last) such that *i == value.
-/// \ingroup SearchingAlgorithms
-///
-template <typename InputIterator, typename EqualityComparable>
-inline size_t count (InputIterator first, InputIterator last, const EqualityComparable& value)
-{
- size_t total = 0;
- for (; first != last; ++first)
- if (*first == value)
- ++ total;
- return (total);
-}
-
-///
-/// The first version of transform performs the operation op(*i) for each
-/// iterator i in the range [first, last), and assigns the result of that
-/// operation to *o, where o is the corresponding output iterator. That is,
-/// for each n such that 0 <= n < last - first, it performs the assignment
-/// *(result + n) = op(*(first + n)).
-/// The return value is result + (last - first).
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename UnaryFunction>
-inline OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op)
-{
- for (; first != last; ++result, ++first)
- *result = op (*first);
- return (result);
-}
-
-///
-/// The second version of transform is very similar, except that it uses a
-/// Binary Function instead of a Unary Function: it performs the operation
-/// op(*i1, *i2) for each iterator i1 in the range [first1, last1) and assigns
-/// the result to *o, where i2 is the corresponding iterator in the second
-/// input range and where o is the corresponding output iterator. That is,
-/// for each n such that 0 <= n < last1 - first1, it performs the assignment
-/// *(result + n) = op(*(first1 + n), *(first2 + n).
-/// The return value is result + (last1 - first1).
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryFunction>
-inline OutputIterator transform (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction op)
-{
- for (; first1 != last1; ++result, ++first1, ++first2)
- *result = op (*first1, *first2);
- return (result);
-}
-
-/// Replace replaces every element in the range [first, last) equal to
-/// old_value with new_value. That is: for every iterator i,
-/// if *i == old_value then it performs the assignment *i = new_value.
-/// \ingroup MutatingAlgorithms
-///
-template <typename ForwardIterator, typename T>
-inline void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value)
-{
- for (; first != last; ++first)
- if (*first == old_value)
- *first = new_value;
-}
-
-/// Replace_copy copies elements from the range [first, last) to the range
-/// [result, result + (last-first)), except that any element equal to old_value
-/// is not copied; new_value is copied instead. More precisely, for every
-/// integer n such that 0 <= n < last-first, replace_copy performs the
-/// assignment *(result+n) = new_value if *(first+n) == old_value, and
-/// *(result+n) = *(first+n) otherwise.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename T>
-inline OutputIterator replace_copy (InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value)
-{
- for (; first != last; ++result, ++first)
- *result = (*first == old_value) ? new_value : *first;
-}
-
-/// Generate assigns the result of invoking gen, a function object that
-/// takes no arguments, to each element in the range [first, last).
-/// \ingroup GeneratorAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename Generator>
-inline void generate (ForwardIterator first, ForwardIterator last, Generator gen)
-{
- for (; first != last; ++first)
- *first = gen();
-}
-
-/// Generate_n assigns the result of invoking gen, a function object that
-/// takes no arguments, to each element in the range [first, first+n).
-/// The return value is first + n.
-/// \ingroup GeneratorAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename OutputIterator, typename Generator>
-inline OutputIterator generate_n (OutputIterator first, size_t n, Generator gen)
-{
- for (uoff_t i = 0; i != n; ++i, ++first)
- *first = gen();
- return (first);
-}
-
-/// \brief Reverse reverses a range.
-/// That is: for every i such that 0 <= i <= (last - first) / 2),
-/// it exchanges *(first + i) and *(last - (i + 1)).
-/// \ingroup MutatingAlgorithms
-///
-template <typename BidirectionalIterator>
-inline void reverse (BidirectionalIterator first, BidirectionalIterator last)
-{
- for (; distance (first, --last) > 0; ++first)
- iter_swap (first, last);
-}
-
-/// \brief Reverses [first,last) and writes it to \p output.
-/// \ingroup MutatingAlgorithms
-///
-template <typename BidirectionalIterator, typename OutputIterator>
-inline OutputIterator reverse_copy (BidirectionalIterator first, BidirectionalIterator last, OutputIterator result)
-{
- for (; first != last; ++result)
- *result = *--last;
- return (result);
-}
-
-/// \brief Exchanges ranges [first, middle) and [middle, last)
-/// \ingroup MutatingAlgorithms
-///
-template <typename ForwardIterator>
-ForwardIterator rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last)
-{
- if (first == middle || middle == last)
- return (first);
- reverse (first, middle);
- reverse (middle, last);
- for (;first != middle && middle != last; ++first)
- iter_swap (first, --last);
- reverse (first, (first == middle ? last : middle));
- return (first);
-}
-
-/// Specialization for pointers, which can be treated identically.
-template <typename T>
-inline T* rotate (T* first, T* middle, T* last)
-{
- rotate_fast (first, middle, last);
- return (first);
-}
-
-
-/// \brief Exchanges ranges [first, middle) and [middle, last) into \p result.
-/// \ingroup MutatingAlgorithms
-///
-template <typename ForwardIterator, typename OutputIterator>
-inline OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result)
-{
- return (copy (first, middle, copy (middle, last, result)));
-}
-
-/// \brief Combines two sorted ranges.
-/// \ingroup SortingAlgorithms
-///
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
-OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result)
-{
- for (; first1 != last1 && first2 != last2; ++result) {
- if (*first1 < *first2)
- *result = *first1++;
- else
- *result = *first2++;
- }
- if (first1 < last1)
- return (copy (first1, last1, result));
- else
- return (copy (first2, last2, result));
-}
-
-/// Combines two sorted ranges from the same container.
-/// \ingroup SortingAlgorithms
-///
-template <typename InputIterator>
-void inplace_merge (InputIterator first, InputIterator middle, InputIterator last)
-{
- for (; middle != last; ++first) {
- while (*first < *middle)
- ++ first;
- reverse (first, middle);
- reverse (first, ++middle);
- }
-}
-
-/// Remove_copy copies elements that are not equal to value from the range
-/// [first, last) to a range beginning at result. The return value is the
-/// end of the resulting range. This operation is stable, meaning that the
-/// relative order of the elements that are copied is the same as in the
-/// range [first, last).
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename T>
-OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& value)
-{
- for (; first != last; ++first) {
- if (!(*first == value)) {
- *result = *first;
- ++ result;
- }
- }
- return (result);
-}
-
-/// Remove_copy copies elements pointed to by iterators in [rfirst, rlast)
-/// from the range [first, last) to a range beginning at result. The return
-/// value is the end of the resulting range. This operation is stable, meaning
-/// that the relative order of the elements that are copied is the same as in the
-/// range [first, last). Range [rfirst, rlast) is assumed to be sorted.
-/// This algorithm is a uSTL extension.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename RInputIterator>
-OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, RInputIterator rfirst, RInputIterator rlast)
-{
- for (; first != last; ++first) {
- while (rfirst != rlast && *rfirst < first)
- ++ rfirst;
- if (rfirst == rlast || first != *rfirst) {
- *result = *first;
- ++ result;
- }
- }
- return (result);
-}
-
-/// Remove removes from the range [first, last) all elements that are equal to
-/// value. That is, remove returns an iterator new_last such that the range
-/// [first, new_last) contains no elements equal to value. [1] The iterators
-/// in the range [new_last, last) are all still dereferenceable, but the
-/// elements that they point to are unspecified. Remove is stable, meaning
-/// that the relative order of elements that are not equal to value is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename ForwardIterator, typename T>
-inline ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& value)
-{
- return (remove_copy (first, last, first, value));
-}
-
-/// Unique_copy copies elements from the range [first, last) to a range
-/// beginning with result, except that in a consecutive group of duplicate
-/// elements only the first one is copied. The return value is the end of
-/// the range to which the elements are copied. This behavior is similar
-/// to the Unix filter uniq.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator>
-OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result)
-{
- if (first != last) {
- *result = *first;
- while (++first != last)
- if (!(*first == *result))
- *++result = *first;
- ++ result;
- }
- return (result);
-}
-
-/// Every time a consecutive group of duplicate elements appears in the range
-/// [first, last), the algorithm unique removes all but the first element.
-/// That is, unique returns an iterator new_last such that the range [first,
-/// new_last) contains no two consecutive elements that are duplicates.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Unique is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename ForwardIterator>
-inline ForwardIterator unique (ForwardIterator first, ForwardIterator last)
-{
- return (unique_copy (first, last, first));
-}
-
-/// Returns the furthermost iterator i in [first, last) such that,
-/// for every iterator j in [first, i), *j < value
-/// Assumes the range is sorted.
-/// \ingroup SearchingAlgorithms
-///
-template <typename ForwardIterator, typename LessThanComparable>
-ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const LessThanComparable& value)
-{
- ForwardIterator mid;
- while (first != last) {
- mid = advance (first, distance (first,last) / 2);
- if (*mid < value)
- first = mid + 1;
- else
- last = mid;
- }
- return (first);
-}
-
-/// Performs a binary search inside the sorted range.
-/// \ingroup SearchingAlgorithms
-///
-template <typename ForwardIterator, typename LessThanComparable>
-inline ForwardIterator binary_search (ForwardIterator first, ForwardIterator last, const LessThanComparable& value)
-{
- ForwardIterator found = lower_bound (first, last, value);
- return ((found == last || value < *found) ? last : found);
-}
-
-/// Returns the furthermost iterator i in [first,last) such that for
-/// every iterator j in [first,i), value < *j is false.
-/// \ingroup SearchingAlgorithms
-///
-template <typename ForwardIterator, typename LessThanComparable>
-ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const LessThanComparable& value)
-{
- ForwardIterator mid;
- while (first != last) {
- mid = advance (first, distance (first,last) / 2);
- if (value < *mid)
- last = mid;
- else
- first = mid + 1;
- }
- return (last);
-}
-
-/// Returns pair<lower_bound,upper_bound>
-/// \ingroup SearchingAlgorithms
-///
-template <typename ForwardIterator, typename LessThanComparable>
-inline pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const LessThanComparable& value)
-{
- pair<ForwardIterator,ForwardIterator> rv;
- rv.second = rv.first = lower_bound (first, last, value);
- while (rv.second != last && !(value < *(rv.second)))
- ++ rv.second;
- return (rv);
-}
-
-/// Randomly permute the elements of the container.
-/// \ingroup GeneratorAlgorithms
-///
-template <typename RandomAccessIterator>
-void random_shuffle (RandomAccessIterator first, RandomAccessIterator last)
-{
- for (; first != last; ++ first)
- iter_swap (first, first + (rand() % distance (first, last)));
-}
-
-/// \brief Generic compare function adaptor to pass to qsort
-/// \ingroup FunctorObjects
-template <typename ConstPointer, typename Compare>
-int qsort_adapter (const void* p1, const void* p2)
-{
- ConstPointer i1 = reinterpret_cast<ConstPointer>(p1);
- ConstPointer i2 = reinterpret_cast<ConstPointer>(p2);
- Compare comp;
- return (comp (*i1, *i2) ? -1 : (comp (*i2, *i1) ? 1 : 0));
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename RandomAccessIterator, typename Compare>
-void sort (RandomAccessIterator first, RandomAccessIterator last, Compare)
-{
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- typedef typename iterator_traits<RandomAccessIterator>::const_pointer const_pointer;
- qsort (first, distance (first, last), sizeof(value_type),
- &qsort_adapter<const_pointer, Compare>);
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename RandomAccessIterator>
-inline void sort (RandomAccessIterator first, RandomAccessIterator last)
-{
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- sort (first, last, less<value_type>());
-}
-
-/// Sorts the container preserving order of equal elements.
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename RandomAccessIterator, typename Compare>
-void stable_sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- for (RandomAccessIterator j, i = first; ++i < last;) { // Insertion sort
- for (j = i; j-- > first && !comp(*j, *i););
- rotate (++j, i, i + 1);
- }
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename RandomAccessIterator>
-inline void stable_sort (RandomAccessIterator first, RandomAccessIterator last)
-{
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- stable_sort (first, last, less<value_type>());
-}
-
-/// \brief Searches for the first subsequence [first2,last2) in [first1,last1)
-/// \ingroup SearchingAlgorithms
-template <typename ForwardIterator1, typename ForwardIterator2>
-inline ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2)
-{
- typedef typename iterator_traits<ForwardIterator1>::value_type value_type;
- return (search (first1, last1, first2, last2, equal_to<value_type>()));
-}
-
-/// \brief Searches for the last subsequence [first2,last2) in [first1,last1)
-/// \ingroup SearchingAlgorithms
-template <typename ForwardIterator1, typename ForwardIterator2>
-inline ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2)
-{
- typedef typename iterator_traits<ForwardIterator1>::value_type value_type;
- return (find_end (first1, last1, first2, last2, equal_to<value_type>()));
-}
-
-/// \brief Searches for the first occurence of \p count \p values in [first, last)
-/// \ingroup SearchingAlgorithms
-template <typename Iterator, typename T>
-inline Iterator search_n (Iterator first, Iterator last, size_t count, const T& value)
-{
- typedef typename iterator_traits<Iterator>::value_type value_type;
- return (search_n (first, last, count, value, equal_to<value_type>()));
-}
-
-/// \brief Searches [first1,last1) for the first occurrence of an element from [first2,last2)
-/// \ingroup SearchingAlgorithms
-template <typename InputIterator, typename ForwardIterator>
-inline InputIterator find_first_of (InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2)
-{
- typedef typename iterator_traits<InputIterator>::value_type value_type;
- return (find_first_of (first1, last1, first2, last2, equal_to<value_type>()));
-}
-
-/// \brief Returns true if [first2,last2) is a subset of [first1,last1)
-/// \ingroup ConditionAlgorithms
-/// \ingroup SetAlgorithms
-template <typename InputIterator1, typename InputIterator2>
-inline bool includes (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (includes (first1, last1, first2, last2, less<value_type>()));
-}
-
-/// \brief Merges [first1,last1) with [first2,last2)
-///
-/// Result will contain every element that is in either set. If duplicate
-/// elements are present, max(n,m) is placed in the result.
-///
-/// \ingroup SetAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
-inline OutputIterator set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (set_union (first1, last1, first2, last2, result, less<value_type>()));
-}
-
-/// \brief Creates a set containing elements shared by the given ranges.
-/// \ingroup SetAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
-inline OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (set_intersection (first1, last1, first2, last2, result, less<value_type>()));
-}
-
-/// \brief Removes from [first1,last1) elements present in [first2,last2)
-/// \ingroup SetAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
-inline OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (set_difference (first1, last1, first2, last2, result, less<value_type>()));
-}
-
-/// \brief Performs union of sets A-B and B-A.
-/// \ingroup SetAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
-inline OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (set_symmetric_difference (first1, last1, first2, last2, result, less<value_type>()));
-}
-
-/// \brief Returns true if the given range is sorted.
-/// \ingroup ConditionAlgorithms
-template <typename ForwardIterator>
-inline bool is_sorted (ForwardIterator first, ForwardIterator last)
-{
- typedef typename iterator_traits<ForwardIterator>::value_type value_type;
- return (is_sorted (first, last, less<value_type>()));
-}
-
-/// \brief Compares two given containers like strcmp compares strings.
-/// \ingroup ConditionAlgorithms
-template <typename InputIterator1, typename InputIterator2>
-inline bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
-{
- typedef typename iterator_traits<InputIterator1>::value_type value_type;
- return (lexicographical_compare (first1, last1, first2, last2, less<value_type>()));
-}
-
-/// \brief Creates the next lexicographical permutation of [first,last).
-/// Returns false if no further permutations can be created.
-/// \ingroup GeneratorAlgorithms
-template <typename BidirectionalIterator>
-inline bool next_permutation (BidirectionalIterator first, BidirectionalIterator last)
-{
- typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
- return (next_permutation (first, last, less<value_type>()));
-}
-
-/// \brief Creates the previous lexicographical permutation of [first,last).
-/// Returns false if no further permutations can be created.
-/// \ingroup GeneratorAlgorithms
-template <typename BidirectionalIterator>
-inline bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last)
-{
- typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
- return (prev_permutation (first, last, less<value_type>()));
-}
-
-/// \brief Returns iterator to the max element in [first,last)
-/// \ingroup SearchingAlgorithms
-template <typename ForwardIterator>
-inline ForwardIterator max_element (ForwardIterator first, ForwardIterator last)
-{
- typedef typename iterator_traits<ForwardIterator>::value_type value_type;
- return (max_element (first, last, less<value_type>()));
-}
-
-/// \brief Returns iterator to the min element in [first,last)
-/// \ingroup SearchingAlgorithms
-template <typename ForwardIterator>
-inline ForwardIterator min_element (ForwardIterator first, ForwardIterator last)
-{
- typedef typename iterator_traits<ForwardIterator>::value_type value_type;
- return (min_element (first, last, less<value_type>()));
-}
-
-/// \brief Makes [first,middle) a part of the sorted array.
-/// Contents of [middle,last) is undefined. This implementation just calls stable_sort.
-/// \ingroup SortingAlgorithms
-template <typename RandomAccessIterator>
-inline void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
-{
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- partial_sort (first, middle, last, less<value_type>());
-}
-
-/// \brief Puts \p nth element into its sorted position.
-/// In this implementation, the entire array is sorted. I can't think of any
-/// use for it where the time gained would be useful.
-/// \ingroup SortingAlgorithms
-/// \ingroup SearchingAlgorithms
-///
-template <typename RandomAccessIterator>
-inline void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last)
-{
- partial_sort (first, nth, last);
-}
-
-/// \brief Like partial_sort, but outputs to [result_first,result_last)
-/// \ingroup SortingAlgorithms
-template <typename InputIterator, typename RandomAccessIterator>
-inline RandomAccessIterator partial_sort_copy (InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last)
-{
- typedef typename iterator_traits<InputIterator>::value_type value_type;
- return (partial_sort_copy (first, last, result_first, result_last, less<value_type>()));
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.cpp
deleted file mode 100644
index 9764cd1..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ualgobase.cc
-//
-// Copy and fill optimizations are here.
-//
-
-#ifndef NDEBUG // Optimized code here. asserts slow it down, and are checked elsewhere.
-#define NDEBUG
-#endif
-
-#include "ualgo.h"
-
-#undef CPU_HAS_MMX
-
-namespace ustl {
-
-// Generic version for implementing fill_nX_fast on non-i386 architectures.
-template <typename T> inline void stosv (T*& p, size_t n, T v)
- { while (n--) *p++ = v; }
-
-#if defined(__i386__) || defined(__x86_64__)
-
-//----------------------------------------------------------------------
-// Copy functions
-//----------------------------------------------------------------------
-
-#if __GNUC__ >= 3
-static inline void movsb_dir_up (void) __attribute__((always_inline));
-static inline void movsb_dir_down (void) __attribute__((always_inline));
-static inline void movsb (const void*& src, size_t nBytes, void*& dest) __attribute__((always_inline));
-static inline void movsd (const void*& src, size_t nWords, void*& dest) __attribute__((always_inline));
-#endif
-
-static inline void movsb_dir_up (void) { asm volatile ("cld"); }
-static inline void movsb_dir_down (void) { asm volatile ("std"); }
-
-static inline void movsb (const void*& src, size_t nBytes, void*& dest)
-{
- asm volatile ("rep;\n\tmovsb"
- : "=&S"(src), "=&D"(dest), "=&c"(nBytes)
- : "0"(src), "1"(dest), "2"(nBytes)
- : "memory");
-}
-
-static inline void movsd (const void*& src, size_t nWords, void*& dest)
-{
- asm volatile ("rep;\n\tmovsl"
- : "=&S"(src), "=&D"(dest), "=&c"(nWords)
- : "0"(src), "1"(dest), "2"(nWords)
- : "memory");
-}
-
-template <> inline void stosv (uint8_t*& p, size_t n, uint8_t v)
-{ asm volatile ("rep;\n\tstosb" : "=&D"(p), "=c"(n) : "0"(p), "1"(n), "a"(v) : "memory"); }
-template <> inline void stosv (uint16_t*& p, size_t n, uint16_t v)
-{ asm volatile ("rep;\n\tstosw" : "=&D"(p), "=c"(n) : "0"(p), "1"(n), "a"(v) : "memory"); }
-template <> inline void stosv (uint32_t*& p, size_t n, uint32_t v)
-{ asm volatile ("rep;\n\tstosl" : "=&D"(p), "=c"(n) : "0"(p), "1"(n), "a"(v) : "memory"); }
-
-#if CPU_HAS_MMX
-#define MMX_ALIGN 16U // Data must be aligned on this grain
-#define MMX_BS 32U // Assembly routines copy data this many bytes at a time.
-
-static inline void simd_block_copy (const void* src, void* dest) __attribute__((always_inline));
-static inline void simd_block_store (uint8_t* dest) __attribute__((always_inline));
-static inline void simd_block_cleanup (void) __attribute__((always_inline));
-
-static inline void simd_block_copy (const void* src, void* dest)
-{
- const char* csrc ((const char*) src);
- char* cdest ((char*) dest);
- #if CPU_HAS_SSE
- asm (
- "movaps\t%2, %%xmm0 \n\t"
- "movaps\t%3, %%xmm1 \n\t"
- "movntps\t%%xmm0, %0 \n\t"
- "movntps\t%%xmm1, %1"
- : "=m"(cdest[0]), "=m"(cdest[16])
- : "m"(csrc[0]), "m"(csrc[16])
- : "xmm0", "xmm1");
- #else
- asm (
- "movq %4, %%mm0 \n\t"
- "movq %5, %%mm1 \n\t"
- "movq %6, %%mm2 \n\t"
- "movq %7, %%mm3 \n\t"
- "movq %%mm0, %0 \n\t"
- "movq %%mm1, %1 \n\t"
- "movq %%mm2, %2 \n\t"
- "movq %%mm3, %3"
- : "=m"(cdest[0]), "=m"(cdest[8]), "=m"(cdest[16]), "=m"(cdest[24])
- : "m"(csrc[0]), "m"(csrc[8]), "m"(csrc[16]), "m"(csrc[24])
- : "mm0", "mm1", "mm2", "mm3", "st", "st(1)", "st(2)", "st(3)");
- #endif
-}
-
-static inline void simd_block_store (uint8_t* dest)
-{
- #if CPU_HAS_SSE
- asm volatile (
- "movntq %%mm0, %0\n\t"
- "movntq %%mm0, %1\n\t"
- "movntq %%mm0, %2\n\t"
- "movntq %%mm0, %3"
- : "=m"(dest[0]), "=m"(dest[8]), "=m"(dest[16]), "=m"(dest[24]));
- #else
- asm volatile (
- "movq %%mm0, %0 \n\t"
- "movq %%mm0, %1 \n\t"
- "movq %%mm0, %2 \n\t"
- "movq %%mm0, %3"
- : "=m"(dest[0]), "=m"(dest[8]), "=m"(dest[16]), "=m"(dest[24]));
- #endif
-}
-
-static inline void simd_block_cleanup (void)
-{
- #if !CPU_HAS_SSE
- simd::reset_mmx();
- #endif
- asm volatile ("sfence");
-}
-
-/// The fastest optimized raw memory copy.
-void copy_n_fast (const void* src, size_t nBytes, void* dest)
-{
- movsb_dir_up();
- size_t nHeadBytes = Align(uintptr_t(src), MMX_ALIGN) - uintptr_t(src);
- nHeadBytes = min (nHeadBytes, nBytes);
- movsb (src, nHeadBytes, dest);
- nBytes -= nHeadBytes;
- if (!(uintptr_t(dest) % MMX_ALIGN)) {
- const size_t nMiddleBlocks = nBytes / MMX_BS;
- for (uoff_t i = 0; i < nMiddleBlocks; ++ i) {
- prefetch (advance (src, 512), 0, 0);
- simd_block_copy (src, dest);
- src = advance (src, MMX_BS);
- dest = advance (dest, MMX_BS);
- }
- simd_block_cleanup();
- nBytes %= MMX_BS;
- }
- movsb (src, nBytes, dest);
-}
-#endif // CPU_HAS_MMX
-
-/// The fastest optimized backwards raw memory copy.
-void copy_backward_fast (const void* first, const void* last, void* result)
-{
- prefetch (first, 0, 0);
- prefetch (result, 1, 0);
- size_t nBytes (distance (first, last));
- movsb_dir_down();
- size_t nHeadBytes = uintptr_t(last) % 4;
- last = advance (last, -1);
- result = advance (result, -1);
- movsb (last, nHeadBytes, result);
- nBytes -= nHeadBytes;
- if (uintptr_t(result) % 4 == 3) {
- const size_t nMiddleBlocks = nBytes / 4;
- last = advance (last, -3);
- result = advance (result, -3);
- movsd (last, nMiddleBlocks, result);
- nBytes %= 4;
- }
- movsb (last, nBytes, result);
- movsb_dir_up();
-}
-#endif // __i386__
-
-//----------------------------------------------------------------------
-// Fill functions
-//----------------------------------------------------------------------
-
-#if CPU_HAS_MMX
-template <typename T> inline void build_block (T) {}
-template <> inline void build_block (uint8_t v)
-{
- asm volatile (
- "movd %0, %%mm0\n\tpunpcklbw %%mm0, %%mm0\n\tpshufw $0, %%mm0, %%mm0"
- : : "g"(uint32_t(v)) : "mm0");
-}
-template <> inline void build_block (uint16_t v)
-{
- asm volatile (
- "movd %0, %%mm0\n\tpshufw $0, %%mm0, %%mm0"
- : : "g"(uint32_t(v)) : "mm0");
-}
-template <> inline void build_block (uint32_t v)
-{
- asm volatile (
- "movd %0, %%mm0\n\tpunpckldq %%mm0, %%mm0"
- : : "g"(uint32_t(v)) : "mm0");
-}
-
-static inline void simd_block_fill_loop (uint8_t*& dest, size_t count)
-{
- prefetch (advance (dest, 512), 1, 0);
- for (uoff_t i = 0; i < count; ++ i, dest += MMX_BS)
- simd_block_store (dest);
- simd_block_cleanup();
- simd::reset_mmx();
-}
-
-template <typename T>
-inline void fill_n_fast (T* dest, size_t count, T v)
-{
- size_t nHead = Align(uintptr_t(dest), MMX_ALIGN) - uintptr_t(dest) / sizeof(T);
- nHead = min (nHead, count);
- stosv (dest, nHead, v);
- count -= nHead;
- build_block (v);
- simd_block_fill_loop ((uint8_t*&) dest, count * sizeof(T) / MMX_BS);
- count %= MMX_BS;
- stosv (dest, count, v);
-}
-
-void fill_n8_fast (uint8_t* dest, size_t count, uint8_t v)
- { fill_n_fast (dest, count, v); }
-void fill_n16_fast (uint16_t* dest, size_t count, uint16_t v)
- { fill_n_fast (dest, count, v); }
-void fill_n32_fast (uint32_t* dest, size_t count, uint32_t v)
- { fill_n_fast (dest, count, v); }
-#else
-void fill_n8_fast (uint8_t* dest, size_t count, uint8_t v) { memset (dest, v, count); }
-void fill_n16_fast (uint16_t* dest, size_t count, uint16_t v) { stosv (dest, count, v); }
-void fill_n32_fast (uint32_t* dest, size_t count, uint32_t v) { stosv (dest, count, v); }
-#endif // CPU_HAS_MMX
-
-/// Exchanges ranges [first, middle) and [middle, last)
-void rotate_fast (void* first, void* middle, void* last)
-{
-#ifdef HAVE_ALLOCA_H
- const size_t half1 (distance (first, middle)), half2 (distance (middle, last));
- const size_t hmin (min (half1, half2));
- if (!hmin) {
- return;
- }
- void* buf = alloca (hmin);
- if (buf) {
- if (half2 < half1) {
- copy_n_fast (middle, half2, buf);
- copy_backward_fast (first, middle, last);
- copy_n_fast (buf, half2, first);
- } else {
- copy_n_fast (first, half1, buf);
- copy_n_fast (middle, half2, first);
- copy_n_fast (buf, half1, advance (first, half2));
- }
- } else
-#else
- if (first == middle || middle == last) {
- return;
- }
-#endif
- {
- char* f = (char*) first;
- char* m = (char*) middle;
- char* l = (char*) last;
- reverse (f, m);
- reverse (m, l);
- while (f != m && m != l)
- iter_swap (f++, --l);
- reverse (f, (f == m ? l : m));
- }
-}
-
-#if __GNUC__ < 4
-size_t popcount (uint32_t v)
-{
- const uint32_t w = v - ((v >> 1) & 0x55555555); // Algorithm from AMD optimization guide
- const uint32_t x = (w & 0x33333333) + ((w >> 2) & 0x33333333);
- return (((x + (x >> 4) & 0x0F0F0F0F) * 0x01010101) >> 24);
-}
-
-#if HAVE_INT64_T
-/// \brief Returns the number of 1s in \p v in binary.
-size_t popcount (uint64_t v)
-{
- v -= (v >> 1) & UINT64_C(0x5555555555555555); // Algorithm from Wikipedia
- v = (v & UINT64_C(0x3333333333333333)) + ((v >> 2) & UINT64_C(0x3333333333333333));
- v = (v + (v >> 4)) & UINT64_C(0x0F0F0F0F0F0F0F0F);
- return ((v * UINT64_C(0x0101010101010101)) >> 56);
-}
-#endif // HAVE_INT64_T
-#endif // !__GNUC__
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.h b/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.h
deleted file mode 100644
index 38c1a72..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ualgobase.h
+++ /dev/null
@@ -1,334 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ualgobase.h
-//
-// Implementation of STL algorithms.
-//
-// The function prototypes are copied
-// exactly from the SGI version of STL documentation along with comments about
-// their use. The code is NOT the same, though the functionality usually is.
-//
-
-#ifndef UALGOBASE_H_683A0BE77546133C4CE0E3622CFAA2EB
-#define UALGOBASE_H_683A0BE77546133C4CE0E3622CFAA2EB
-
-#include "uutility.h"
-#include <string.h>
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#undef CPU_HAS_MMX
-#endif
-
-namespace ustl {
-
-/// Assigns the contents of a to b and the contents of b to a.
-/// This is used as a primitive operation by many other algorithms.
-/// \ingroup SwapAlgorithms
-///
-template <typename Assignable>
-inline void swap (Assignable& a, Assignable& b)
-{
- Assignable tmp = a;
- a = b;
- b = tmp;
-}
-
-/// Equivalent to swap (*a, *b)
-/// \ingroup SwapAlgorithms
-///
-template <typename Iterator>
-inline void iter_swap (Iterator a, Iterator b)
-{
- swap (*a, *b);
-}
-
-/// Copy copies elements from the range [first, last) to the range
-/// [result, result + (last - first)). That is, it performs the assignments
-/// *result = *first, *(result + 1) = *(first + 1), and so on. [1] Generally,
-/// for every integer n from 0 to last - first, copy performs the assignment
-/// *(result + n) = *(first + n). Assignments are performed in forward order,
-/// i.e. in order of increasing n.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator>
-inline OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
-{
- for (; first != last; ++result, ++first)
- *result = *first;
- return (result);
-}
-
-/// Copy_n copies elements from the range [first, first + n) to the range
-/// [result, result + n). That is, it performs the assignments
-/// *result = *first, *(result + 1) = *(first + 1), and so on. Generally,
-/// for every integer i from 0 up to (but not including) n, copy_n performs
-/// the assignment *(result + i) = *(first + i). Assignments are performed
-/// in forward order, i.e. in order of increasing n.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename OutputIterator>
-inline OutputIterator copy_n (InputIterator first, size_t count, OutputIterator result)
-{
- for (; count; --count, ++result, ++first)
- *result = *first;
- return (result);
-}
-
-/// \brief Copy copies elements from the range (last, first] to result.
-/// \ingroup MutatingAlgorithms
-/// Copies elements starting at last, decrementing both last and result.
-///
-template <typename InputIterator, typename OutputIterator>
-inline OutputIterator copy_backward (InputIterator first, InputIterator last, OutputIterator result)
-{
- while (first != last)
- *--result = *--last;
- return (result);
-}
-
-/// For_each applies the function object f to each element in the range
-/// [first, last); f's return value, if any, is ignored. Applications are
-/// performed in forward order, i.e. from first to last. For_each returns
-/// the function object after it has been applied to each element.
-/// \ingroup MutatingAlgorithms
-///
-template <typename InputIterator, typename UnaryFunction>
-inline UnaryFunction for_each (InputIterator first, InputIterator last, UnaryFunction f)
-{
- for (; first != last; ++first)
- f (*first);
- return (f);
-}
-
-/// Fill assigns the value value to every element in the range [first, last).
-/// That is, for every iterator i in [first, last),
-/// it performs the assignment *i = value.
-/// \ingroup GeneratorAlgorithms
-///
-template <typename ForwardIterator, typename T>
-inline void fill (ForwardIterator first, ForwardIterator last, const T& value)
-{
- for (; first != last; ++first)
- *first = value;
-}
-
-/// Fill_n assigns the value value to every element in the range
-/// [first, first+count). That is, for every iterator i in [first, first+count),
-/// it performs the assignment *i = value. The return value is first + count.
-/// \ingroup GeneratorAlgorithms
-///
-template <typename OutputIterator, typename T>
-inline OutputIterator fill_n (OutputIterator first, size_t count, const T& value)
-{
- for (; count; --count, ++first)
- *first = value;
- return (first);
-}
-
-#if CPU_HAS_MMX
-extern "C" void copy_n_fast (const void* src, size_t count, void* dest);
-#else
-inline void copy_n_fast (const void* src, size_t count, void* dest)
-{ memcpy (dest, src, count); }
-#endif
-#if __i386__ || __x86_64__
-extern "C" void copy_backward_fast (const void* first, const void* last, void* result);
-#else
-inline void copy_backward_fast (const void* first, const void* last, void* result)
-{
- const size_t nBytes (distance (first, last));
- memmove (advance (result, -nBytes), first, nBytes);
-}
-#endif
-extern "C" void fill_n8_fast (uint8_t* dest, size_t count, uint8_t v);
-extern "C" void fill_n16_fast (uint16_t* dest, size_t count, uint16_t v);
-extern "C" void fill_n32_fast (uint32_t* dest, size_t count, uint32_t v);
-extern "C" void rotate_fast (void* first, void* middle, void* last);
-
-#if __GNUC__ >= 4
-/// \brief Computes the number of 1 bits in a number.
-/// \ingroup ConditionAlgorithms
-inline size_t popcount (uint32_t v) { return (__builtin_popcount (v)); }
-#if HAVE_INT64_T
-inline size_t popcount (uint64_t v) { return (__builtin_popcountll (v)); }
-#endif
-#else
-size_t popcount (uint32_t v);
-#if HAVE_INT64_T
-size_t popcount (uint64_t v);
-#endif // HAVE_INT64_T
-#endif // __GNUC__
-
-//----------------------------------------------------------------------
-// Optimized versions for standard types
-//----------------------------------------------------------------------
-
-#if WANT_UNROLLED_COPY
-
-template <typename T>
-inline T* unrolled_copy (const T* first, size_t count, T* result)
-{
- copy_n_fast (first, count * sizeof(T), result);
- return (advance (result, count));
-}
-
-template <>
-inline uint8_t* copy_backward (const uint8_t* first, const uint8_t* last, uint8_t* result)
-{
- copy_backward_fast (first, last, result);
- return (result);
-}
-
-template <typename T>
-inline T* unrolled_fill (T* result, size_t count, T value)
-{
- for (; count; --count, ++result)
- *result = value;
- return (result);
-}
-template <> inline uint8_t* unrolled_fill (uint8_t* result, size_t count, uint8_t value)
- { fill_n8_fast (result, count, value); return (advance (result, count)); }
-template <> inline uint16_t* unrolled_fill (uint16_t* result, size_t count, uint16_t value)
- { fill_n16_fast (result, count, value); return (advance (result, count)); }
-template <> inline uint32_t* unrolled_fill (uint32_t* result, size_t count, uint32_t value)
- { fill_n32_fast (result, count, value); return (advance (result, count)); }
-template <> inline float* unrolled_fill (float* result, size_t count, float value)
- { fill_n32_fast ((uint32_t*) result, count, noalias(uint32_t(),&value)); return (advance (result, count)); }
-
-#if CPU_HAS_MMX
-#define UNROLLED_COPY_SPECIALIZATION(type) \
-template <> inline type* copy (const type* first, const type* last, type* result) \
-{ return (unrolled_copy (first, distance (first, last), result)); } \
-template <> inline type* copy_n (const type* first, size_t count, type* result) \
-{ return (unrolled_copy (first, count, result)); }
-#define UNROLLED_FILL_SPECIALIZATION(type) \
-template <> inline void fill (type* first, type* last, const type& value) \
-{ unrolled_fill (first, distance (first, last), value); } \
-template <> inline type* fill_n (type* first, size_t count, const type& value) \
-{ return (unrolled_fill (first, count, value)); }
-UNROLLED_COPY_SPECIALIZATION(uint8_t)
-UNROLLED_FILL_SPECIALIZATION(uint8_t)
-UNROLLED_COPY_SPECIALIZATION(uint16_t)
-UNROLLED_FILL_SPECIALIZATION(uint16_t)
-UNROLLED_COPY_SPECIALIZATION(uint32_t)
-UNROLLED_FILL_SPECIALIZATION(uint32_t)
-UNROLLED_COPY_SPECIALIZATION(float)
-UNROLLED_FILL_SPECIALIZATION(float)
-#undef UNROLLED_FILL_SPECIALIZATION
-#undef UNROLLED_COPY_SPECIALIZATION
-#endif // WANT_UNROLLED_COPY
-#endif // CPU_HAS_MMX
-
-// Specializations for void* and char*, aliasing the above optimized versions.
-//
-// All these need duplication with const and non-const arguments, since
-// otherwise the compiler will default to the unoptimized version for
-// pointers not const in the caller's context, such as local variables.
-// These are all inline, but they sure slow down compilation... :(
-//
-#define COPY_ALIAS_FUNC(ctype, type, alias_type) \
-template <> inline type* copy (ctype* first, ctype* last, type* result) \
-{ return ((type*) copy ((const alias_type*) first, (const alias_type*) last, (alias_type*) result)); }
-#if WANT_UNROLLED_COPY
-#if HAVE_THREE_CHAR_TYPES
-COPY_ALIAS_FUNC(const char, char, uint8_t)
-COPY_ALIAS_FUNC(char, char, uint8_t)
-#endif
-COPY_ALIAS_FUNC(const int8_t, int8_t, uint8_t)
-COPY_ALIAS_FUNC(int8_t, int8_t, uint8_t)
-COPY_ALIAS_FUNC(uint8_t, uint8_t, uint8_t)
-COPY_ALIAS_FUNC(const int16_t, int16_t, uint16_t)
-COPY_ALIAS_FUNC(int16_t, int16_t, uint16_t)
-COPY_ALIAS_FUNC(uint16_t, uint16_t, uint16_t)
-#if CPU_HAS_MMX || (SIZE_OF_LONG > 4)
-COPY_ALIAS_FUNC(const int32_t, int32_t, uint32_t)
-COPY_ALIAS_FUNC(int32_t, int32_t, uint32_t)
-COPY_ALIAS_FUNC(uint32_t, uint32_t, uint32_t)
-#endif
-#endif
-COPY_ALIAS_FUNC(const void, void, uint8_t)
-COPY_ALIAS_FUNC(void, void, uint8_t)
-#undef COPY_ALIAS_FUNC
-#define COPY_BACKWARD_ALIAS_FUNC(ctype, type, alias_type) \
-template <> inline type* copy_backward (ctype* first, ctype* last, type* result) \
-{ return ((type*) copy_backward ((const alias_type*) first, (const alias_type*) last, (alias_type*) result)); }
-#if WANT_UNROLLED_COPY
-#if HAVE_THREE_CHAR_TYPES
-COPY_BACKWARD_ALIAS_FUNC(char, char, uint8_t)
-#endif
-COPY_BACKWARD_ALIAS_FUNC(uint8_t, uint8_t, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(int8_t, int8_t, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(uint16_t, uint16_t, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(const uint16_t, uint16_t, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(int16_t, int16_t, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(const int16_t, int16_t, uint8_t)
-#endif
-COPY_BACKWARD_ALIAS_FUNC(void, void, uint8_t)
-COPY_BACKWARD_ALIAS_FUNC(const void, void, uint8_t)
-#undef COPY_BACKWARD_ALIAS_FUNC
-#define FILL_ALIAS_FUNC(type, alias_type, v_type) \
-template <> inline void fill (type* first, type* last, const v_type& value) \
-{ fill ((alias_type*) first, (alias_type*) last, (const alias_type&) value); }
-FILL_ALIAS_FUNC(void, uint8_t, char)
-FILL_ALIAS_FUNC(void, uint8_t, uint8_t)
-#if WANT_UNROLLED_COPY
-#if HAVE_THREE_CHAR_TYPES
-FILL_ALIAS_FUNC(char, uint8_t, char)
-FILL_ALIAS_FUNC(char, uint8_t, uint8_t)
-#endif
-FILL_ALIAS_FUNC(int8_t, uint8_t, int8_t)
-FILL_ALIAS_FUNC(int16_t, uint16_t, int16_t)
-#if CPU_HAS_MMX || (SIZE_OF_LONG > 4)
-FILL_ALIAS_FUNC(int32_t, uint32_t, int32_t)
-#endif
-#endif
-#undef FILL_ALIAS_FUNC
-#define COPY_N_ALIAS_FUNC(ctype, type, alias_type) \
-template <> inline type* copy_n (ctype* first, size_t count, type* result) \
-{ return ((type*) copy_n ((const alias_type*) first, count, (alias_type*) result)); }
-COPY_N_ALIAS_FUNC(const void, void, uint8_t)
-COPY_N_ALIAS_FUNC(void, void, uint8_t)
-#if WANT_UNROLLED_COPY
-#if HAVE_THREE_CHAR_TYPES
-COPY_N_ALIAS_FUNC(const char, char, uint8_t)
-COPY_N_ALIAS_FUNC(char, char, uint8_t)
-#endif
-COPY_N_ALIAS_FUNC(int8_t, int8_t, uint8_t)
-COPY_N_ALIAS_FUNC(uint8_t, uint8_t, uint8_t)
-COPY_N_ALIAS_FUNC(const int8_t, int8_t, uint8_t)
-COPY_N_ALIAS_FUNC(int16_t, int16_t, uint16_t)
-COPY_N_ALIAS_FUNC(uint16_t, uint16_t, uint16_t)
-COPY_N_ALIAS_FUNC(const int16_t, int16_t, uint16_t)
-#if CPU_HAS_MMX || (SIZE_OF_LONG > 4)
-COPY_N_ALIAS_FUNC(int32_t, int32_t, uint32_t)
-COPY_N_ALIAS_FUNC(uint32_t, uint32_t, uint32_t)
-COPY_N_ALIAS_FUNC(const int32_t, int32_t, uint32_t)
-#endif
-#endif
-#undef COPY_N_ALIAS_FUNC
-#define FILL_N_ALIAS_FUNC(type, alias_type, v_type) \
-template <> inline type* fill_n (type* first, size_t n, const v_type& value) \
-{ return ((type*) fill_n ((alias_type*) first, n, (const alias_type&) value)); }
-FILL_N_ALIAS_FUNC(void, uint8_t, char)
-FILL_N_ALIAS_FUNC(void, uint8_t, uint8_t)
-#if WANT_UNROLLED_COPY
-#if HAVE_THREE_CHAR_TYPES
-FILL_N_ALIAS_FUNC(char, uint8_t, char)
-FILL_N_ALIAS_FUNC(char, uint8_t, uint8_t)
-#endif
-FILL_N_ALIAS_FUNC(int8_t, uint8_t, int8_t)
-FILL_N_ALIAS_FUNC(int16_t, uint16_t, int16_t)
-#if CPU_HAS_MMX || (SIZE_OF_LONG > 4)
-FILL_N_ALIAS_FUNC(int32_t, uint32_t, int32_t)
-#endif
-#endif
-#undef FILL_N_ALIAS_FUNC
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uassert.h b/media/libdrm/mobile2/src/util/ustl-1.0/uassert.h
deleted file mode 100644
index a9fde46..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uassert.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// uassert.h
-
-#ifndef UASSERT_H
-#define UASSERT_H
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-
-#undef assert
-#define assert(x) _uassert((x), #x, __FILE__, __LINE__)
-
-static void _uassert(int x, const char *xstr, const char *file, int line) {
- if (!x) {
- printf("assert %s failed at %s:%d\n", xstr, file, line);
- }
-}
-#else
-#include <assert.h>
-#endif
-
-#endif
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.cpp
deleted file mode 100644
index 21b5a7a..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ubitset.cc
-//
-
-#include "ubitset.h"
-
-namespace ustl {
-
-/// Copies bits from \p v of size \p n into \p buf as MSB "1011001..." LSB
-/// If \p buf is too small, MSB bits will be truncated.
-void convert_to_bitstring (const bitset_value_type* v, size_t n, string& buf)
-{
- string::iterator stri = buf.end();
- for (size_t i = 0; i < n && stri > buf.begin(); ++ i)
- for (bitset_value_type b = 1; b && stri > buf.begin(); b <<= 1)
- *--stri = (v[i] & b) ? '1' : '0';
-}
-
-/// Copies bits from \p buf as MSB "1011001..." LSB into \p v of size \p n.
-void convert_from_bitstring (const string& buf, bitset_value_type* v, size_t n)
-{
- string::const_iterator stri = buf.end();
- for (size_t i = 0; i < n; ++ i) {
- for (bitset_value_type b = 1; b; b <<= 1) {
- if (stri == buf.begin() || *--stri == '0')
- v[i] &= ~b;
- else
- v[i] |= b;
- }
- }
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.h b/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.h
deleted file mode 100644
index 4f53a95..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ubitset.h
+++ /dev/null
@@ -1,131 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ubitset.h
-//
-#ifndef UBITSET_H_7B6450EC1400CBA45DCE0127739F82EE
-#define UBITSET_H_7B6450EC1400CBA45DCE0127739F82EE
-
-#include "uassert.h"
-#include "ustring.h"
-#include "ufunction.h"
-
-namespace ustl {
-
-typedef uint32_t bitset_value_type;
-
-void convert_to_bitstring (const bitset_value_type* v, size_t n, string& buf);
-void convert_from_bitstring (const string& buf, bitset_value_type* v, size_t n);
-
-/// \class bitset ubitset.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief bitset is a fixed-size block of memory with addressable bits.
-///
-/// Normally used for state flags; allows setting and unsetting of individual
-/// bits as well as bitwise operations on the entire set. The interface is
-/// most like that of unsigned integers, and is intended to be used as such.
-/// If you were using begin() and end() functions in STL's bitset, you would
-/// not be able to do the same thing here, because those functions return
-/// host type iterators, not bits.
-///
-template <size_t Size>
-class bitset {
-public:
- typedef bitset_value_type value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef size_t difference_type;
- typedef size_t size_type;
-private:
- static const size_t s_WordBits = BitsInType (value_type);
- static const size_t s_nWords = Size / s_WordBits + ((Size % s_WordBits) != 0);
- static const size_t s_nBits = s_nWords * s_WordBits;
-private:
- inline value_type& BitRef (uoff_t n) { assert (n < Size); return (m_Bits [n / s_WordBits]); }
- inline const value_type BitRef (uoff_t n) const { assert (n < Size); return (m_Bits [n / s_WordBits]); }
- inline const value_type Mask (uoff_t n) const { assert (n < Size); return (1 << (n % s_WordBits)); }
-public:
- inline bitset (value_type v = 0) { fill_n (m_Bits, s_nWords, 0); m_Bits[0] = v; }
- inline bitset (const string& buf) { convert_from_bitstring (buf, m_Bits, s_nWords); }
- inline void flip (uoff_t n) { BitRef(n) ^= Mask(n); }
- inline void reset (void) { fill_n (m_Bits, s_nWords, 0); }
- inline void clear (void) { fill_n (m_Bits, s_nWords, 0); }
- inline void set (void) { fill_n (m_Bits, s_nWords, -1); }
- inline bitset operator~ (void) const { bitset rv (*this); rv.flip(); return (rv); }
- inline size_type size (void) const { return (Size); }
- inline size_type capacity (void) const { return (s_nBits); }
- inline const bool test (uoff_t n) const { return (BitRef(n) & Mask(n)); }
- inline const bool operator[] (uoff_t n) const { return (test(n)); }
- inline const_iterator begin (void) const { return (m_Bits); }
- inline iterator begin (void) { return (m_Bits); }
- inline const_iterator end (void) const { return (m_Bits + s_nWords); }
- inline iterator end (void) { return (m_Bits + s_nWords); }
- /// Returns the value_type with the equivalent bits. If size() > 1, you'll get only the first BitsInType(value_type) bits.
- inline const value_type to_value (void) const { return (m_Bits[0]); }
- /// Flips all the bits in the set.
- inline void flip (void) { transform (begin(), end(), begin(), bitwise_not<value_type>()); }
- /// Sets or clears bit \p n.
- inline void set (uoff_t n, bool val = true)
- {
- value_type& br (BitRef (n));
- const value_type mask (Mask (n));
- const value_type bOn (br | mask), bOff (br & ~mask);
- br = val ? bOn : bOff;
- }
- // Sets the value of the bitrange \p first through \p last to the equivalent number of bits from \p v.
- inline void set (uoff_t first, uoff_t DebugArg(last), value_type v)
- {
-#if !PLATFORM_ANDROID
- assert (size_t (distance (first, last)) <= s_WordBits && "Bit ranges must be 32 bits or smaller");
- assert (first / s_WordBits == last / s_WordBits && "Bit ranges can not cross dword (4 byte) boundary");
- assert ((v & BitMask(value_type,distance(first,last))) == v && "The value is too large to fit in the given bit range");
-#endif
- BitRef(first) |= v << (first % s_WordBits);
- }
- /// Clears the bit \p n.
- inline void reset (uoff_t n) { set (n, false); }
- /// Returns a string with bits MSB "001101001..." LSB.
- inline string to_string (void) const
- {
- string rv (Size, '0');
- convert_to_bitstring (m_Bits, s_nWords, rv);
- return (rv);
- }
- inline value_type at (uoff_t n) const { return (test(n)); }
- /// Returns the value in bits \p first through \p last.
- inline value_type at (uoff_t first, uoff_t last) const
- {
- assert (size_t (distance (first, last)) <= s_WordBits && "Bit ranges must be 32 bits or smaller");
- assert (first / s_WordBits == last / s_WordBits && "Bit ranges can not cross dword (4 byte) boundary");
- return ((BitRef(first) >> (first % s_WordBits)) & BitMask(value_type,distance(first, last)));
- }
- inline bool any (void) const { value_type sum = 0; foreach (const_iterator, i, *this) sum |= *i; return (sum); }
- inline bool none (void) const { return (!any()); }
- inline size_t count (void) const { size_t sum = 0; foreach (const_iterator, i, *this) sum += popcount(*i); return (sum); }
- inline bool operator== (const bitset<Size>& v) const
- { return (s_nWords == 1 ? (m_Bits[0] == v.m_Bits[0]) : equal (begin(), end(), v.begin())); }
- inline const bitset operator& (const bitset<Size>& v)
- { bitset<Size> result; transform (begin(), end(), v.begin(), result.begin(), bitwise_and<value_type>()); return (result); }
- inline const bitset operator| (const bitset<Size>& v)
- { bitset<Size> result; transform (begin(), end(), v.begin(), result.begin(), bitwise_or<value_type>()); return (result); }
- inline const bitset operator^ (const bitset<Size>& v)
- { bitset<Size> result; transform (begin(), end(), v.begin(), result.begin(), bitwise_xor<value_type>()); return (result); }
- inline const bitset& operator&= (const bitset<Size>& v)
- { transform (begin(), end(), v.begin(), begin(), bitwise_and<value_type>()); return (*this); }
- inline const bitset& operator|= (const bitset<Size>& v)
- { transform (begin(), end(), v.begin(), begin(), bitwise_or<value_type>()); return (*this); }
- inline const bitset& operator^= (const bitset<Size>& v)
- { transform (begin(), end(), v.begin(), begin(), bitwise_xor<value_type>()); return (*this); }
-private:
- value_type m_Bits [s_nWords];
-};
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uctralgo.h b/media/libdrm/mobile2/src/util/ustl-1.0/uctralgo.h
deleted file mode 100644
index 57f637d..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uctralgo.h
+++ /dev/null
@@ -1,482 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// \file uctralgo.h
-//
-// \brief Implementation of STL algorithms with container shortcuts.
-//
-// The function prototypes are copied
-// exactly from the SGI version of STL documentation along with comments about
-// their use. The code is NOT the same, though the functionality usually is.
-//
-
-#ifndef UCTRALGO_H_0D1AEDFA74B09791489FE25B1EC644B0
-#define UCTRALGO_H_0D1AEDFA74B09791489FE25B1EC644B0
-
-#include "uassert.h"
-
-namespace ustl {
-
-/// Copy copies elements from the range [first, last) to the range
-/// [result, result + (last - first)). That is, it performs the assignments
-/// *result = *first, *(result + 1) = *(first + 1), and so on. [1] Generally,
-/// for every integer n from 0 to last - first, copy performs the assignment
-/// *(result + n) = *(first + n). Assignments are performed in forward order,
-/// i.e. in order of increasing n.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator>
-inline OutputIterator copy (const Container& ctr, OutputIterator result)
-{
- return (copy (ctr.begin(), ctr.end(), result));
-}
-
-/// Copy_if copies elements from the range [first, last) to the range
-/// [result, result + (last - first)) if pred(*i) returns true.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename Predicate>
-inline OutputIterator copy_if (Container& ctr, OutputIterator result, Predicate pred)
-{
- return (copy_if (ctr.begin(), ctr.end(), result, pred));
-}
-
-/// For_each applies the function object f to each element in the range
-/// [first, last); f's return value, if any, is ignored. Applications are
-/// performed in forward order, i.e. from first to last. For_each returns
-/// the function object after it has been applied to each element.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename UnaryFunction>
-inline UnaryFunction for_each (Container& ctr, UnaryFunction f)
-{
- return (for_each (ctr.begin(), ctr.end(), f));
-}
-
-/// For_each applies the function object f to each element in the range
-/// [first, last); f's return value, if any, is ignored. Applications are
-/// performed in forward order, i.e. from first to last. For_each returns
-/// the function object after it has been applied to each element.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename UnaryFunction>
-inline UnaryFunction for_each (const Container& ctr, UnaryFunction f)
-{
- return (for_each (ctr.begin(), ctr.end(), f));
-}
-
-/// Returns the first iterator i in the range [first, last) such that
-/// *i == value. Returns last if no such iterator exists.
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container, typename EqualityComparable>
-inline typename Container::const_iterator find (const Container& ctr, const EqualityComparable& value)
-{
- return (find (ctr.begin(), ctr.end(), value));
-}
-template <typename Container, typename EqualityComparable>
-inline typename Container::iterator find (Container& ctr, const EqualityComparable& value)
-{
- return (find (ctr.begin(), ctr.end(), value));
-}
-
-/// Returns the first iterator i in the range [first, last) such that
-/// pred(*i) is true. Returns last if no such iterator exists.
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container, typename Predicate>
-inline typename Container::const_iterator find_if (const Container& ctr, Predicate pred)
-{
- return (find_if (ctr.begin(), ctr.end(), pred));
-}
-template <typename Container, typename Predicate>
-inline typename Container::iterator find_if (Container& ctr, Predicate pred)
-{
- return (find_if (ctr.begin(), ctr.end(), pred));
-}
-
-/// Count finds the number of elements in [first, last) that are equal
-/// to value. More precisely, the first version of count returns the
-/// number of iterators i in [first, last) such that *i == value.
-/// \ingroup ConditionAlgorithms
-///
-template <typename Container, typename EqualityComparable>
-inline size_t count (const Container& ctr, const EqualityComparable& value)
-{
- return (count (ctr.begin(), ctr.end(), value));
-}
-
-/// Count_if finds the number of elements in [first, last) that satisfy the
-/// predicate pred. More precisely, the first version of count_if returns the
-/// number of iterators i in [first, last) such that pred(*i) is true.
-/// \ingroup ConditionAlgorithms
-///
-template <typename Container, typename Predicate>
-inline size_t count_if (const Container& ctr, Predicate pred)
-{
- return (count_if (ctr.begin(), ctr.end(), pred));
-}
-
-/// The first version of transform performs the operation op(*i) for each
-/// iterator i in the range [first, last), and assigns the result of that
-/// operation to *o, where o is the corresponding output iterator. That is,
-/// for each n such that 0 <= n < last - first, it performs the assignment
-/// *(result + n) = op(*(first + n)).
-/// The return value is result + (last - first).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename UnaryFunction>
-inline void transform (Container& ctr, UnaryFunction op)
-{
- transform (ctr.begin(), ctr.end(), ctr.begin(), op);
-}
-
-/// The first version of transform performs the operation op(*i) for each
-/// iterator i in the range [first, last), and assigns the result of that
-/// operation to *o, where o is the corresponding output iterator. That is,
-/// for each n such that 0 <= n < last - first, it performs the assignment
-/// *(result + n) = op(*(first + n)).
-/// The return value is result + (last - first).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename UnaryFunction>
-inline OutputIterator transform (Container& ctr, OutputIterator result, UnaryFunction op)
-{
- return (transform (ctr.begin(), ctr.end(), result, op));
-}
-
-/// The second version of transform is very similar, except that it uses a
-/// Binary Function instead of a Unary Function: it performs the operation
-/// op(*i1, *i2) for each iterator i1 in the range [first1, last1) and assigns
-/// the result to *o, where i2 is the corresponding iterator in the second
-/// input range and where o is the corresponding output iterator. That is,
-/// for each n such that 0 <= n < last1 - first1, it performs the assignment
-/// *(result + n) = op(*(first1 + n), *(first2 + n).
-/// The return value is result + (last1 - first1).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename InputIterator, typename OutputIterator, typename BinaryFunction>
-inline OutputIterator transform (Container& ctr, InputIterator first, OutputIterator result, BinaryFunction op)
-{
- return (transform (ctr.begin(), ctr.end(), first, result, op));
-}
-
-/// Replace replaces every element in the range [first, last) equal to
-/// old_value with new_value. That is: for every iterator i,
-/// if *i == old_value then it performs the assignment *i = new_value.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename T>
-inline void replace (Container& ctr, const T& old_value, const T& new_value)
-{
- replace (ctr.begin(), ctr.end(), old_value, new_value);
-}
-
-/// Replace_if replaces every element in the range [first, last) for which
-/// pred returns true with new_value. That is: for every iterator i, if
-/// pred(*i) is true then it performs the assignment *i = new_value.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename Predicate, typename T>
-inline void replace_if (Container& ctr, Predicate pred, const T& new_value)
-{
- replace_if (ctr.begin(), ctr.end(), pred, new_value);
-}
-
-/// Replace_copy copies elements from the range [first, last) to the range
-/// [result, result + (last-first)), except that any element equal to old_value
-/// is not copied; new_value is copied instead. More precisely, for every
-/// integer n such that 0 <= n < last-first, replace_copy performs the
-/// assignment *(result+n) = new_value if *(first+n) == old_value, and
-/// *(result+n) = *(first+n) otherwise.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename T>
-inline OutputIterator replace_copy (const Container& ctr, OutputIterator result, const T& old_value, const T& new_value)
-{
- return (replace_copy (ctr.begin(), ctr.end(), result, old_value, new_value));
-}
-
-/// Replace_copy_if copies elements from the range [first, last) to the range
-/// [result, result + (last-first)), except that any element for which pred is
-/// true is not copied; new_value is copied instead. More precisely, for every
-/// integer n such that 0 <= n < last-first, replace_copy_if performs the
-/// assignment *(result+n) = new_value if pred(*(first+n)),
-/// and *(result+n) = *(first+n) otherwise.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename Predicate, typename T>
-inline OutputIterator replace_copy_if (const Container& ctr, OutputIterator result, Predicate pred, const T& new_value)
-{
- return (replace_copy_if (ctr.begin(), ctr.end(), result, pred, new_value));
-}
-
-/// Fill assigns the value value to every element in the range [first, last).
-/// That is, for every iterator i in [first, last),
-/// it performs the assignment *i = value.
-/// \ingroup GeneratorAlgorithms
-///
-template <typename Container, typename T>
-inline void fill (Container& ctr, const T& value)
-{
- fill (ctr.begin(), ctr.end(), value);
-}
-
-/// Generate assigns the result of invoking gen, a function object that
-/// takes no arguments, to each element in the range [first, last).
-/// \ingroup GeneratorAlgorithms
-///
-template <typename Container, typename Generator>
-inline void generate (Container& ctr, Generator gen)
-{
- generate (ctr.begin(), ctr.end(), gen);
-}
-
-/// Randomly permute the elements of the container.
-/// \ingroup GeneratorAlgorithms
-///
-template <typename Container>
-inline void random_shuffle (Container& ctr)
-{
- random_shuffle (ctr.begin(), ctr.end());
-}
-
-/// Remove_copy copies elements that are not equal to value from the range
-/// [first, last) to a range beginning at result. The return value is the
-/// end of the resulting range. This operation is stable, meaning that the
-/// relative order of the elements that are copied is the same as in the
-/// range [first, last).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename T>
-inline OutputIterator remove_copy (const Container& ctr, OutputIterator result, const T& value)
-{
- return (remove_copy (ctr.begin(), ctr.end(), result, value));
-}
-
-/// Remove_copy_if copies elements from the range [first, last) to a range
-/// beginning at result, except that elements for which pred is true are not
-/// copied. The return value is the end of the resulting range. This operation
-/// is stable, meaning that the relative order of the elements that are copied
-/// is the same as in the range [first, last).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator, typename Predicate>
-inline OutputIterator remove_copy_if (const Container& ctr, OutputIterator result, Predicate pred)
-{
- return (remove_copy_if (ctr.begin(), ctr.end(), result, pred));
-}
-
-/// Remove removes from the range [first, last) all elements that are equal to
-/// value. That is, remove returns an iterator new_last such that the range
-/// [first, new_last) contains no elements equal to value. Remove is stable,
-/// meaning that the relative order of elements that are not equal to value is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename T>
-inline void remove (Container& ctr, const T& value)
-{
- ctr.erase (remove_copy (ctr.begin(), ctr.end(), ctr.begin(), value), ctr.end());
-}
-
-/// Remove removes from the range [first, last) all elements that have an iterator
-/// in range [rfirst, rlast). The range is assumed to be sorted. That is, remove
-/// returns an iterator new_last such that the range [first, new_last) contains
-/// no elements whose iterators are in [rfirst, rlast). Remove is stable,
-/// meaning that the relative order of elements that are not equal to value is
-/// unchanged. This version of the algorithm is a uSTL extension.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename ForwardIterator>
-inline void remove (Container& ctr, ForwardIterator rfirst, ForwardIterator rlast)
-{
- ctr.erase (remove_copy (ctr.begin(), ctr.end(), ctr.begin(), rfirst, rlast), ctr.end());
-}
-
-/// Remove_if removes from the range [first, last) every element x such that
-/// pred(x) is true. That is, remove_if returns an iterator new_last such that
-/// the range [first, new_last) contains no elements for which pred is true.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Remove_if is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename Predicate>
-inline void remove_if (Container& ctr, Predicate pred)
-{
- ctr.erase (remove_copy_if (ctr.begin(), ctr.end(), ctr.begin(), pred), ctr.end());
-}
-
-/// Unique_copy copies elements from the range [first, last) to a range
-/// beginning with result, except that in a consecutive group of duplicate
-/// elements only the first one is copied. The return value is the end of
-/// the range to which the elements are copied. This behavior is similar
-/// to the Unix filter uniq.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename OutputIterator>
-inline OutputIterator unique_copy (const Container& ctr, OutputIterator result)
-{
- return (unique_copy (ctr.begin(), ctr.end(), result));
-}
-
-/// Every time a consecutive group of duplicate elements appears in the range
-/// [first, last), the algorithm unique removes all but the first element.
-/// That is, unique returns an iterator new_last such that the range [first,
-/// new_last) contains no two consecutive elements that are duplicates.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Unique is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container>
-inline void unique (Container& ctr)
-{
- ctr.erase (unique_copy (ctr.begin(), ctr.end(), ctr.begin()), ctr.end());
-}
-
-/// Every time a consecutive group of duplicate elements appears in the range
-/// [first, last), the algorithm unique removes all but the first element.
-/// That is, unique returns an iterator new_last such that the range [first,
-/// new_last) contains no two consecutive elements that are duplicates.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Unique is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container, typename BinaryPredicate>
-inline void unique (Container& ctr, BinaryPredicate binary_pred)
-{
- ctr.erase (unique_copy (ctr.begin(), ctr.end(), ctr.begin(), binary_pred), ctr.end());
-}
-
-/// Reverse reverses a range.
-/// That is: for every i such that 0 <= i <= (last - first) / 2),
-/// it exchanges *(first + i) and *(last - (i + 1)).
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container>
-inline void reverse (Container& ctr)
-{
- reverse (ctr.begin(), ctr.end());
-}
-
-/// Exchanges ranges [first, middle) and [middle, last)
-/// \ingroup MutatingAlgorithms
-///
-template <typename Container>
-inline void rotate (Container& ctr, off_t offset)
-{
- assert (size_t(offset > 0 ? offset : -offset) < ctr.size());
- if (offset > 0)
- rotate (ctr.begin(), ctr.end() - offset, ctr.end());
- else
- rotate (ctr.begin(), ctr.begin() - offset, ctr.end());
-}
-
-/// Returns the furthermost iterator i in [first, last) such that,
-/// for every iterator j in [first, i), *j < value
-/// Assumes the range is sorted.
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container, typename LessThanComparable>
-inline typename Container::const_iterator lower_bound (const Container& ctr, const LessThanComparable& value)
-{
- return (lower_bound (ctr.begin(), ctr.end(), value));
-}
-template <typename Container, typename LessThanComparable>
-inline typename Container::iterator lower_bound (Container& ctr, const LessThanComparable& value)
-{
- return (lower_bound (ctr.begin(), ctr.end(), value));
-}
-
-/// Returns the furthermost iterator i in [first,last) such that for
-/// every iterator j in [first,i), value < *j is false.
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container, typename LessThanComparable>
-inline typename Container::const_iterator upper_bound (const Container& ctr, const LessThanComparable& value)
-{
- return (upper_bound (ctr.begin(), ctr.end(), value));
-}
-template <typename Container, typename LessThanComparable>
-inline typename Container::iterator upper_bound (Container& ctr, const LessThanComparable& value)
-{
- return (upper_bound (ctr.begin(), ctr.end(), value));
-}
-
-/// Performs a binary search for \p value.
-/// Assumes the range is sorted.
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container>
-inline typename Container::const_iterator binary_search (const Container& ctr, const typename Container::value_type& value)
-{
- return (binary_search (ctr.begin(), ctr.end(), value));
-}
-template <typename Container>
-inline typename Container::iterator binary_search (Container& ctr, const typename Container::value_type& value)
-{
- return (binary_search (ctr.begin(), ctr.end(), value));
-}
-
-/// Returns pair<lower_bound,upper_bound>
-/// \ingroup SearchingAlgorithms
-///
-template <typename Container, typename LessThanComparable>
-inline pair<typename Container::const_iterator,typename Container::const_iterator> equal_range (const Container& ctr, const LessThanComparable& value)
-{
- return (equal_range (ctr.begin(), ctr.end(), value));
-}
-template <typename Container, typename LessThanComparable>
-inline pair<typename Container::iterator,typename Container::iterator> equal_range (Container& ctr, const LessThanComparable& value)
-{
- return (equal_range (ctr.begin(), ctr.end(), value));
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename Container>
-inline void sort (Container& ctr)
-{
- sort (ctr.begin(), ctr.end());
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename Container, typename Compare>
-inline void sort (Container& ctr, Compare comp)
-{
- sort (ctr.begin(), ctr.end(), comp);
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename Container>
-inline void stable_sort (Container& ctr)
-{
- stable_sort (ctr.begin(), ctr.end());
-}
-
-/// Sorts the container
-/// \ingroup SortingAlgorithms
-///
-template <typename Container, typename Compare>
-inline void stable_sort (Container& ctr, Compare comp)
-{
- stable_sort (ctr.begin(), ctr.end(), comp);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uctrstrm.h b/media/libdrm/mobile2/src/util/ustl-1.0/uctrstrm.h
deleted file mode 100644
index 39ddcdd..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uctrstrm.h
+++ /dev/null
@@ -1,177 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file uctrstrm.h
-///
-/// \brief Serialization templates for standard containers.
-/// Because containers are templates, a single operator>> is impossible.
-/// Making virtual read/write is also impossible because not all containers
-/// contain serializable elements. Therefore, use the macros in this file.
-///
-
-#ifndef UCTRSTRM_H_75B2C3EA4980DDDC6B6DFFF767A3B7AC
-#define UCTRSTRM_H_75B2C3EA4980DDDC6B6DFFF767A3B7AC
-
-#include "mistream.h"
-#include "sostream.h"
-#include "uiosfunc.h"
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-// Macros for easily declaring a container streamable.
-//----------------------------------------------------------------------
-
-/// \brief Declares container template \p type streamable.
-///
-/// Use TEMPLATE_TYPE and TEMPLATE_DECL macros to pass in templated
-/// type with commas and the template declaration.
-///
-#define STD_TEMPLATE_CTR_STREAMABLE(type, template_decl) \
- template_decl \
- inline istream& operator>> (istream& is, type& v) \
- { return (container_read (is, v)); } \
- template_decl \
- inline ostream& operator<< (ostream& os, const type& v) \
- { return (container_write (os, v)); } \
- template_decl \
- inline ostringstream& operator<< (ostringstream& os, const type& v) \
- { return (container_text_write (os, v)); } \
- template_decl \
- inline size_t stream_size_of (const type& v) \
- { return (container_stream_size (v)); }
-
-/// \brief Declares non-resizable container template \p type streamable.
-#define STD_TEMPLATE_NR_CTR_STREAMABLE(type, template_decl) \
- template_decl \
- inline istream& operator>> (istream& is, type& v) \
- { return (nr_container_read (is, v)); } \
- template_decl \
- inline ostream& operator<< (ostream& os, const type& v) \
- { return (nr_container_write (os, v)); } \
- template_decl \
- inline ostringstream& operator<< (ostringstream& os, const type& v) \
- { return (container_text_write (os, v)); } \
- template_decl \
- inline size_t stream_size_of (const type& v) \
- { return (nr_container_stream_size (v)); }
-
-//----------------------------------------------------------------------
-// Fixed size container serialization.
-//----------------------------------------------------------------------
-
-/// Reads fixed size container \p v from stream \p is.
-template <typename Container>
-inline istream& nr_container_read (istream& is, Container& v)
-{
- foreach (typename Container::iterator, i, v)
- is >> *i;
- return (is);
-}
-
-/// Writes fixed size container \p v into stream \p os.
-template <typename Container>
-inline ostream& nr_container_write (ostream& os, const Container& v)
-{
- foreach (typename Container::const_iterator, i, v)
- os << *i;
- return (os);
-}
-
-/// Computes the stream size of a fixed size standard container.
-template <typename Container>
-size_t nr_container_stream_size (const Container& v)
-{
- typedef typename Container::const_iterator vciter_t;
- typedef typename iterator_traits<vciter_t>::value_type value_type;
- size_t s = 0;
- if (numeric_limits<value_type>::is_integral)
- s += v.size() * stream_size_of(value_type());
- else
- foreach (vciter_t, i, v)
- s += stream_size_of(*i);
- return (s);
-}
-
-//----------------------------------------------------------------------
-// Resizable container serialization.
-//----------------------------------------------------------------------
-
-/// Reads container \p v from stream \p is.
-template <typename Container>
-istream& container_read (istream& is, Container& v)
-{
- typedef typename Container::value_type value_type;
- typedef typename Container::iterator iterator;
- typedef typename Container::written_size_type written_size_type;
- written_size_type n;
- is >> n;
- const size_t expectedSize = n * stream_size_of(value_type());
-#if !PLATFORM_ANDROID
- is.verify_remaining ("read", typeid(v).name(), expectedSize);
-#endif
- if (alignof(value_type()) > alignof(n))
- is >> ios::talign<value_type>();
- v.resize (n);
- nr_container_read (is, v);
- is >> ios::talign<written_size_type>();
- return (is);
-}
-
-/// Writes the vector to stream \p os.
-template <typename Container>
-ostream& container_write (ostream& os, const Container& v)
-{
- typedef typename Container::value_type value_type;
- typedef typename Container::written_size_type written_size_type;
- const written_size_type sz (v.size());
- os << sz;
- if (alignof(value_type()) > alignof(sz))
- os << ios::talign<value_type>();
- nr_container_write (os, v);
- os << ios::talign<written_size_type>();
- return (os);
-}
-
-/// Computes the stream size of a standard container.
-template <typename Container>
-size_t container_stream_size (const Container& v)
-{
- typedef typename Container::value_type value_type;
- typedef typename Container::written_size_type written_size_type;
- const written_size_type sz (v.size());
- size_t sizeSize = stream_size_of (sz);
- if (alignof(value_type()) > alignof(sz))
- sizeSize = Align (sizeSize, alignof(value_type()));
- return (Align (sizeSize + nr_container_stream_size (v), alignof(sz)));
-}
-
-/// \brief Writes element \p v into stream \p os as text.
-/// Specialize to custom print elements.
-template <typename T>
-inline ostringstream& container_element_text_write (ostringstream& os, const T& v)
-{ return (os << v); }
-
-/// Writes container \p v into stream \p os as text.
-template <typename Container>
-ostringstream& container_text_write (ostringstream& os, const Container& v)
-{
- typename Container::const_iterator i = v.begin();
- os << '(';
- while (i < v.end()) {
- container_element_text_write (os, *i);
- if (++i >= v.end()) break;
- os << ',';
- }
- os << ')';
- return (os);
-}
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uexception.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/uexception.cpp
deleted file mode 100644
index d00f219..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uexception.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uexception.cc
-//
-
-#include "uassert.h"
-#include "uexception.h"
-#include "ustring.h"
-#include "mistream.h"
-#include "sostream.h"
-#include "strmsize.h"
-#include "uspecial.h"
-#include <errno.h>
-#if __GNUC__ >= 3 && !PLATFORM_ANDROID
- #include <cxxabi.h>
-#endif
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-/// \brief Returns a descriptive error message. fmt="%s"
-/// Overloads of this functions must set NULL as the default fmt
-/// argument and handle that case to provide a default format string
-/// in case the user does not have a localized one. The format
-/// string should be shown in the documentation to not require
-/// translators to look through code. Also, this function must
-/// not throw anything, so you must wrap memory allocation routines
-/// (like string::format, for instance) in a try{}catch(...){} block.
-///
-void exception::info (string& msgbuf, const char*) const throw()
-{
-#if PLATFORM_ANDROID
- msgbuf.format ("%s", what());
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format ("%s", what()); } catch (...) { /* Ignore all exceptions */ }
-#endif
-}
-
-/// Reads the exception from stream \p is.
-void exception::read (istream& is)
-{
- uint32_t stmSize;
- xfmt_t fmt;
- is >> fmt >> stmSize >> m_Backtrace;
- assert (fmt == m_Format && "The saved exception is of a different type.");
- assert (stmSize - exception::stream_size() <= is.remaining() && "The saved exception data is corrupt.");
- m_Format = fmt;
-}
-
-/// Writes the exception into stream \p os as an IFF chunk.
-void exception::write (ostream& os) const
-{
- os << m_Format << uint32_t(stream_size()) << m_Backtrace;
-}
-
-/// Writes the exception as text into stream \p os.
-void exception::text_write (ostringstream& os) const
-{
-#if !PLATFORM_ANDROID
- try {
-#endif
- string buf;
- info (buf);
- os << buf;
-#if !PLATFORM_ANDROID
- } catch (...) {}
-#endif
-}
-
-//----------------------------------------------------------------------
-
-/// Initializes the empty object. \p nBytes is the size of the attempted allocation.
-bad_alloc::bad_alloc (size_t nBytes) throw()
-: ustl::exception(),
- m_nBytesRequested (nBytes)
-{
- set_format (xfmt_BadAlloc);
-}
-
-/// Returns a descriptive error message. fmt="failed to allocate %d bytes"
-void bad_alloc::info (string& msgbuf, const char* fmt) const throw()
-{
- if (!fmt) fmt = "failed to allocate %d bytes";
-#if PLATFORM_ANDROID
- msgbuf.format (fmt, m_nBytesRequested);
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format (fmt, m_nBytesRequested); } catch (...) {}
-#endif
-}
-
-/// Reads the exception from stream \p is.
-void bad_alloc::read (istream& is)
-{
- ustl::exception::read (is);
- is >> m_nBytesRequested;
-}
-
-/// Writes the exception into stream \p os.
-void bad_alloc::write (ostream& os) const
-{
- ustl::exception::write (os);
- os << m_nBytesRequested;
-}
-
-/// Returns the size of the written exception.
-size_t bad_alloc::stream_size (void) const
-{
- return (ustl::exception::stream_size() + stream_size_of(m_nBytesRequested));
-}
-
-//----------------------------------------------------------------------
-
-/// Initializes the empty object. \p operation is the function that returned the error code.
-libc_exception::libc_exception (const char* operation) throw()
-: exception(),
- m_Errno (errno),
- m_Operation (operation)
-{
- set_format (xfmt_LibcException);
-}
-
-/// Copies object \p v.
-libc_exception::libc_exception (const libc_exception& v) throw()
-: exception (v),
- m_Errno (v.m_Errno),
- m_Operation (v.m_Operation)
-{
-}
-
-/// Copies object \p v.
-const libc_exception& libc_exception::operator= (const libc_exception& v)
-{
- m_Errno = v.m_Errno;
- m_Operation = v.m_Operation;
- return (*this);
-}
-
-/// Returns a descriptive error message. fmt="%s: %m"
-void libc_exception::info (string& msgbuf, const char* fmt) const throw()
-{
- if (!fmt) fmt = "%s: %m";
-#if PLATFORM_ANDROID
- msgbuf.format (fmt, m_Operation, m_Errno, m_Errno);
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format (fmt, m_Operation, m_Errno, m_Errno); } catch (...) {}
-#endif
-}
-
-/// Reads the exception from stream \p is.
-void libc_exception::read (istream& is)
-{
- exception::read (is);
- is >> m_Errno >> m_Operation;
-}
-
-/// Writes the exception into stream \p os.
-void libc_exception::write (ostream& os) const
-{
- exception::write (os);
- os << m_Errno << m_Operation;
-}
-
-/// Returns the size of the written exception.
-size_t libc_exception::stream_size (void) const
-{
- return (exception::stream_size() +
- stream_size_of(m_Errno) +
- stream_size_of(m_Operation));
-}
-
-//----------------------------------------------------------------------
-
-/// Initializes the empty object. \p operation is the function that returned the error code.
-file_exception::file_exception (const char* operation, const char* filename) throw()
-: libc_exception (operation)
-{
- memset (m_Filename, 0, VectorSize(m_Filename));
- set_format (xfmt_FileException);
- if (filename) {
- strncpy (m_Filename, filename, VectorSize(m_Filename));
- m_Filename [VectorSize(m_Filename) - 1] = 0;
- }
-}
-
-/// Returns a descriptive error message. fmt="%s %s: %m"
-void file_exception::info (string& msgbuf, const char* fmt) const throw()
-{
- if (!fmt) fmt = "%s %s: %m";
-#if PLATFORM_ANDROID
- msgbuf.format (fmt, m_Operation, m_Filename, m_Errno, m_Errno);
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format (fmt, m_Operation, m_Filename, m_Errno, m_Errno); } catch (...) {}
-#endif
-}
-
-/// Reads the exception from stream \p is.
-void file_exception::read (istream& is)
-{
- libc_exception::read (is);
- string filename;
- is >> filename;
- is.align (8);
- filename.copyto (filename, VectorSize(m_Filename));
-}
-
-/// Writes the exception into stream \p os.
-void file_exception::write (ostream& os) const
-{
- libc_exception::write (os);
- os << string (m_Filename);
- os.align (8);
-}
-
-/// Returns the size of the written exception.
-size_t file_exception::stream_size (void) const
-{
- return (libc_exception::stream_size() +
- Align (stream_size_of (string (m_Filename)), 8));
-}
-
-//----------------------------------------------------------------------
-
-/// \brief Uses C++ ABI call, if available to demangle the contents of \p buf.
-///
-/// The result is written to \p buf, with the maximum size of \p bufSize, and
-/// is zero-terminated. The return value is \p buf.
-///
-const char* demangle_type_name (char* buf, size_t bufSize, size_t* pdmSize)
-{
- size_t bl = strlen (buf);
-#if __GNUC__ >= 3 && !PLATFORM_ANDROID
- char dmname [256];
- size_t sz = VectorSize(dmname);
- int bFailed;
- abi::__cxa_demangle (buf, dmname, &sz, &bFailed);
- if (!bFailed) {
- bl = min (strlen (dmname), bufSize - 1);
- memcpy (buf, dmname, bl);
- buf[bl] = 0;
- }
-#else
- bl = min (bl, bufSize);
-#endif
- if (pdmSize)
- *pdmSize = bl;
- return (buf);
-}
-
-//----------------------------------------------------------------------
-
-/// Initializes the empty object. \p operation is the function that returned the error code.
-stream_bounds_exception::stream_bounds_exception (const char* operation, const char* type, uoff_t offset, size_t expected, size_t remaining) throw()
-: libc_exception (operation),
- m_TypeName (type),
- m_Offset (offset),
- m_Expected (expected),
- m_Remaining (remaining)
-{
- set_format (xfmt_StreamBoundsException);
-}
-
-/// Returns a descriptive error message. fmt="%s stream %s: @%u: expected %u, available %u";
-void stream_bounds_exception::info (string& msgbuf, const char* fmt) const throw()
-{
- char typeName [256];
- strncpy (typeName, m_TypeName, VectorSize(typeName));
- typeName[VectorSize(typeName)-1] = 0;
- if (!fmt) fmt = "%s stream %s: @0x%X: need %u bytes, have %u";
-#if PLATFORM_ANDROID
- msgbuf.format (fmt, demangle_type_name (VectorBlock(typeName)), m_Operation, m_Offset, m_Expected, m_Remaining);
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format (fmt, demangle_type_name (VectorBlock(typeName)), m_Operation, m_Offset, m_Expected, m_Remaining); } catch (...) {}
-#endif
-}
-
-/// Reads the exception from stream \p is.
-void stream_bounds_exception::read (istream& is)
-{
- libc_exception::read (is);
- is >> m_TypeName >> m_Offset >> m_Expected >> m_Remaining;
-}
-
-/// Writes the exception into stream \p os.
-void stream_bounds_exception::write (ostream& os) const
-{
- libc_exception::write (os);
- os << m_TypeName << m_Offset << m_Expected << m_Remaining;
-}
-
-/// Returns the size of the written exception.
-size_t stream_bounds_exception::stream_size (void) const
-{
- return (libc_exception::stream_size() +
- stream_size_of(m_TypeName) +
- stream_size_of(m_Offset) +
- stream_size_of(m_Expected) +
- stream_size_of(m_Remaining));
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uexception.h b/media/libdrm/mobile2/src/util/ustl-1.0/uexception.h
deleted file mode 100644
index 3e9a179..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uexception.h
+++ /dev/null
@@ -1,194 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uexception.h
-//
-// This file contains stuff from \<exception\>.
-// The standard C++ headers are duplicated because uSTL is intended
-// to completely replace all C++ standard library functions.
-//
-
-#ifndef UEXCEPTION_H_18DE3EF55C4F00673268F0D66546AF5D
-#define UEXCEPTION_H_18DE3EF55C4F00673268F0D66546AF5D
-
-#include "utypes.h"
-#ifndef WITHOUT_LIBSTDCPP
- #include <exception>
- #include <new>
-#endif
-#include "bktrace.h"
-
-#ifdef WITHOUT_LIBSTDCPP // This code is copied from <exception>
-namespace std {
-/// If you write a replacement terminate handler, it must be of this type.
-typedef void (*terminate_handler) (void);
-/// If you write a replacement unexpected handler, it must be of this type.
-typedef void (*unexpected_handler) (void);
-/// Takes a new handler function as an argument, returns the old function.
-terminate_handler set_terminate (terminate_handler pHandler) throw();
-/// The runtime will call this function if exception handling must be
-/// abandoned for any reason. It can also be called by the user.
-void terminate (void) __attribute__ ((__noreturn__));
-/// Takes a new handler function as an argument, returns the old function.
-unexpected_handler set_unexpected (unexpected_handler pHandler) throw();
-/// The runtime will call this function if an exception is thrown which
-/// violates the function's exception specification.
-void unexpected (void) __attribute__ ((__noreturn__));
-/// Returns true when the caught exception violates the throw specification.
-bool uncaught_exception() throw();
-} // namespace std
-#endif
-
-namespace ustl {
-
-class string;
-
-typedef uint32_t xfmt_t;
-
-enum {
- xfmt_Exception,
- xfmt_BadAlloc,
- xfmt_LibcException = 12,
- xfmt_FileException = 13,
- xfmt_StreamBoundsException = 14
-};
-
-/// \class exception uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Base class for exceptions, equivalent to std::exception.
-///
-#ifdef WITHOUT_LIBSTDCPP
-class exception {
-#else
-class exception : public std::exception {
-#endif
-public:
- typedef const CBacktrace& rcbktrace_t;
-public:
- inline exception (void) throw() : m_Format (xfmt_Exception) {}
- inline virtual ~exception (void) throw() {}
- inline virtual const char* what (void) const throw() { return ("error"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- void text_write (ostringstream& os) const;
- inline virtual size_t stream_size (void) const { return (sizeof(m_Format) + sizeof(uint32_t) + m_Backtrace.stream_size()); }
- /// Format of the exception is used to lookup exception::info format string.
- /// Another common use is the instantiation of serialized exceptions, used
- /// by the error handler node chain to troubleshoot specific errors.
- inline xfmt_t format (void) const { return (m_Format); }
- inline rcbktrace_t backtrace (void) const { return (m_Backtrace); }
-protected:
- inline void set_format (xfmt_t fmt) { m_Format = fmt; }
-private:
- CBacktrace m_Backtrace; ///< Backtrace of the throw point.
- xfmt_t m_Format; ///< Format of the exception's data.
-};
-
-/// \class bad_cast uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Thrown to indicate a bad dynamic_cast usage.
-///
-class bad_cast : public exception {
-public:
- inline explicit bad_cast (void) throw() : exception() {}
- inline virtual const char* what (void) const throw() { return ("bad cast"); }
-};
-
-//----------------------------------------------------------------------
-
-/// \class bad_alloc uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Exception thrown on memory allocation failure by memblock::reserve.
-///
-#ifdef WITHOUT_LIBSTDCPP
-class bad_alloc : public exception {
-#else
-class bad_alloc : public std::bad_alloc, public exception {
-#endif
-public:
- explicit bad_alloc (size_t nBytes = 0) throw();
- inline virtual const char* what (void) const throw() { return ("memory allocation failed"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- virtual size_t stream_size (void) const;
-protected:
- size_t m_nBytesRequested; ///< Number of bytes requested by the failed allocation.
-};
-
-/// \class libc_exception uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Thrown when a libc function returns an error.
-///
-/// Contains an errno and description. This is a uSTL extension.
-///
-class libc_exception : public exception {
-public:
- explicit libc_exception (const char* operation) throw();
- libc_exception (const libc_exception& v) throw();
- const libc_exception& operator= (const libc_exception& v);
- inline virtual const char* what (void) const throw() { return ("libc function failed"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- virtual size_t stream_size (void) const;
-protected:
- intptr_t m_Errno; ///< Error code returned by the failed operation.
- const char* m_Operation; ///< Name of the failed operation.
-};
-
-/// \class file_exception uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief File-related exceptions.
-///
-/// Contains the file name. This is a uSTL extension.
-///
-class file_exception : public libc_exception {
-public:
- file_exception (const char* operation, const char* filename) throw();
- inline virtual const char* what (void) const throw() { return ("file error"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- virtual size_t stream_size (void) const;
-protected:
- char m_Filename [PATH_MAX]; ///< Name of the file causing the error.
-};
-
-/// \class stream_bounds_exception uexception.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Stream bounds checking.
-///
-/// Only thrown in debug builds unless you say otherwise in config.h
-/// This is a uSTL extension.
-///
-class stream_bounds_exception : public libc_exception {
-public:
- stream_bounds_exception (const char* operation, const char* type, uoff_t offset, size_t expected, size_t remaining) throw();
- inline virtual const char* what (void) const throw() { return ("stream bounds exception"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- virtual size_t stream_size (void) const;
-protected:
- const char* m_TypeName;
- uoff_t m_Offset;
- size_t m_Expected;
- size_t m_Remaining;
-};
-
-const char* demangle_type_name (char* buf, size_t bufSize, size_t* pdmSize = NULL);
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ufunction.h b/media/libdrm/mobile2/src/util/ustl-1.0/ufunction.h
deleted file mode 100644
index 53dc5e2..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ufunction.h
+++ /dev/null
@@ -1,480 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// \file ufunction.h
-//
-// \brief Implements STL standard functors.
-//
-// See STL specification and bvts for usage of these. The only
-// extension is the mem_var functors for member variable access:
-// \code
-// f = find_if (ctr, mem_var_equal_to(&MyClass::m_Var, matchVar));
-// f = find_if (ctr, mem_var_less(&MyClass::m_Var, matchVar));
-// \endcode
-// There are a couple of others but the syntax is much harder to grasp.
-// See bvt10.cc for more examples.
-//
-
-#ifndef UFUNCTION_H_221ABA8551801799263C927234C085F3
-#define UFUNCTION_H_221ABA8551801799263C927234C085F3
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-// Standard functors
-//----------------------------------------------------------------------
-
-/// \brief void-returning function abstract interface.
-/// \ingroup FunctorObjects
-template <typename Result>
-struct void_function {
- typedef Result result_type;
-};
-
-/// \brief \p Result f (\p Arg) function abstract interface.
-/// \ingroup FunctorObjects
-template <typename Arg, typename Result>
-struct unary_function {
- typedef Arg argument_type;
- typedef Result result_type;
-};
-
-/// \brief \p Result f (\p Arg1, \p Arg2) function abstract interface.
-/// \ingroup FunctorObjects
-template <typename Arg1, typename Arg2, typename Result>
-struct binary_function {
- typedef Arg1 first_argument_type;
- typedef Arg2 second_argument_type;
- typedef Result result_type;
-};
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-#define STD_BINARY_FUNCTOR(name, rv, func) \
-template <class T> struct name : public binary_function<T,T,rv> \
-{ inline rv operator()(const T& a, const T& b) const { return func; } };
-#define STD_UNARY_FUNCTOR(name, rv, func) \
-template <class T> struct name : public unary_function<T,rv> \
-{ inline rv operator()(const T& a) const { return func; } };
-#define STD_CONVERSION_FUNCTOR(name, func) \
-template <class S, class D> struct name : public unary_function<S,D> \
-{ inline D operator()(const S& a) const { return func; } };
-
-STD_BINARY_FUNCTOR (plus, T, (a + b))
-STD_BINARY_FUNCTOR (minus, T, (a - b))
-STD_BINARY_FUNCTOR (divides, T, (a / b))
-STD_BINARY_FUNCTOR (modulus, T, (a % b))
-STD_BINARY_FUNCTOR (multiplies, T, (a * b))
-STD_BINARY_FUNCTOR (logical_and, T, (a && b))
-STD_BINARY_FUNCTOR (logical_or, T, (a || b))
-STD_UNARY_FUNCTOR (logical_not, T, (!a))
-STD_BINARY_FUNCTOR (bitwise_or, T, (a | b))
-STD_BINARY_FUNCTOR (bitwise_and, T, (a & b))
-STD_BINARY_FUNCTOR (bitwise_xor, T, (a ^ b))
-STD_UNARY_FUNCTOR (bitwise_not, T, (~a))
-STD_UNARY_FUNCTOR (negate, T, (-a))
-STD_BINARY_FUNCTOR (equal_to, bool, (a == b))
-STD_BINARY_FUNCTOR (not_equal_to, bool, (!(a == b)))
-STD_BINARY_FUNCTOR (greater, bool, (b < a))
-STD_BINARY_FUNCTOR (less, bool, (a < b))
-STD_BINARY_FUNCTOR (greater_equal, bool, (!(a < b)))
-STD_BINARY_FUNCTOR (less_equal, bool, (!(b < a)))
-STD_BINARY_FUNCTOR (compare, int, (a < b ? -1 : (b < a)))
-STD_UNARY_FUNCTOR (identity, T, (a))
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
-
-/// \brief Selects and returns the first argument.
-/// \ingroup FunctorObjects
-template <class T1, class T2> struct project1st : public binary_function<T1,T2,T1> { inline const T1& operator()(const T1& a, const T2&) const { return (a); } };
-/// \brief Selects and returns the second argument.
-/// \ingroup FunctorObjects
-template <class T1, class T2> struct project2nd : public binary_function<T1,T2,T2> { inline const T2& operator()(const T1&, const T2& a) const { return (a); } };
-
-//----------------------------------------------------------------------
-// Generic function to functor converters.
-//----------------------------------------------------------------------
-
-/// \brief Wrapper object for unary function pointers.
-/// Use the \ref ptr_fun accessor to create this object.
-/// \ingroup FunctorObjects
-template <typename Arg, typename Result>
-class pointer_to_unary_function : public unary_function<Arg,Result> {
-public:
- typedef Arg argument_type;
- typedef Result result_type;
- typedef Result (*pfunc_t)(Arg);
-public:
- explicit inline pointer_to_unary_function (pfunc_t pfn) : m_pfn (pfn) {}
- inline result_type operator() (argument_type v) const { return (m_pfn(v)); }
-private:
- pfunc_t m_pfn; ///< Pointer to the wrapped function.
-};
-
-/// \brief Wrapper object for binary function pointers.
-/// Use the \ref ptr_fun accessor to create this object.
-/// \ingroup FunctorObjects
-template <typename Arg1, typename Arg2, typename Result>
-class pointer_to_binary_function : public binary_function<Arg1,Arg2,Result> {
-public:
- typedef Arg1 first_argument_type;
- typedef Arg2 second_argument_type;
- typedef Result result_type;
- typedef Result (*pfunc_t)(Arg1, Arg2);
-public:
- explicit inline pointer_to_binary_function (pfunc_t pfn) : m_pfn (pfn) {}
- inline result_type operator() (first_argument_type v1, second_argument_type v2) const { return (m_pfn(v1, v2)); }
-private:
- pfunc_t m_pfn; ///< Pointer to the wrapped function.
-};
-
-/// ptr_fun(pfn) wraps function pointer pfn into a functor class that calls it.
-/// \ingroup FunctorAccessors
-template <typename Arg, typename Result>
-inline pointer_to_unary_function<Arg,Result> ptr_fun (Result (*pfn)(Arg))
-{
- return (pointer_to_unary_function<Arg,Result> (pfn));
-}
-
-/// ptr_fun(pfn) wraps function pointer pfn into a functor class that calls it.
-/// \ingroup FunctorAccessors
-template <typename Arg1, typename Arg2, typename Result>
-inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun (Result (*pfn)(Arg1,Arg2))
-{
- return (pointer_to_binary_function<Arg1,Arg2,Result> (pfn));
-}
-
-//----------------------------------------------------------------------
-// Negators.
-//----------------------------------------------------------------------
-
-/// \brief Wraps a unary function to return its logical negative.
-/// Use the \ref unary_negator accessor to create this object.
-/// \ingroup FunctorObjects
-template <class UnaryFunction>
-class unary_negate : public unary_function<typename UnaryFunction::argument_type,
- typename UnaryFunction::result_type> {
-public:
- typedef typename UnaryFunction::argument_type argument_type;
- typedef typename UnaryFunction::result_type result_type;
-public:
- explicit inline unary_negate (UnaryFunction pfn) : m_pfn (pfn) {}
- inline result_type operator() (argument_type v) const { return (!m_pfn(v)); }
-private:
- UnaryFunction m_pfn;
-};
-
-/// Returns the functor that negates the result of *pfn().
-/// \ingroup FunctorAccessors
-template <class UnaryFunction>
-inline unary_negate<UnaryFunction> unary_negator (UnaryFunction pfn)
-{
- return (unary_negate<UnaryFunction>(pfn));
-}
-
-//----------------------------------------------------------------------
-// Argument binders
-//----------------------------------------------------------------------
-
-/// \brief Converts a binary function to a unary function
-/// by binding a constant value to the first argument.
-/// Use the \ref bind1st accessor to create this object.
-/// \ingroup FunctorObjects
-template <class BinaryFunction>
-class binder1st : public unary_function<typename BinaryFunction::second_argument_type,
- typename BinaryFunction::result_type> {
-public:
- typedef typename BinaryFunction::first_argument_type arg1_t;
- typedef typename BinaryFunction::second_argument_type arg2_t;
- typedef typename BinaryFunction::result_type result_t;
-public:
- inline binder1st (const BinaryFunction& pfn, const arg1_t& v) : m_pfn (pfn), m_Value(v) {}
- inline result_t operator()(arg2_t v2) const { return (m_pfn (m_Value, v2)); }
-protected:
- BinaryFunction m_pfn;
- arg1_t m_Value;
-};
-
-/// \brief Converts a binary function to a unary function
-/// by binding a constant value to the second argument.
-/// Use the \ref bind2nd accessor to create this object.
-/// \ingroup FunctorObjects
-template <class BinaryFunction>
-class binder2nd : public unary_function<typename BinaryFunction::first_argument_type,
- typename BinaryFunction::result_type> {
-public:
- typedef typename BinaryFunction::first_argument_type arg1_t;
- typedef typename BinaryFunction::second_argument_type arg2_t;
- typedef typename BinaryFunction::result_type result_t;
-public:
- inline binder2nd (const BinaryFunction& pfn, const arg2_t& v) : m_pfn (pfn), m_Value(v) {}
- inline result_t operator()(arg1_t v1) const { return (m_pfn (v1, m_Value)); }
-protected:
- BinaryFunction m_pfn;
- arg2_t m_Value;
-};
-
-/// Converts \p pfn into a unary function by binding the first argument to \p v.
-/// \ingroup FunctorAccessors
-template <typename BinaryFunction>
-inline binder1st<BinaryFunction>
-bind1st (BinaryFunction pfn, typename BinaryFunction::first_argument_type v)
-{
- return (binder1st<BinaryFunction> (pfn, v));
-}
-
-/// Converts \p pfn into a unary function by binding the second argument to \p v.
-/// \ingroup FunctorAccessors
-template <typename BinaryFunction>
-inline binder2nd<BinaryFunction>
-bind2nd (BinaryFunction pfn, typename BinaryFunction::second_argument_type v)
-{
- return (binder2nd<BinaryFunction> (pfn, v));
-}
-
-//----------------------------------------------------------------------
-// Composition adapters
-//----------------------------------------------------------------------
-
-/// \brief Chains two unary functions together.
-///
-/// When f(x) and g(x) are composed, the result is function c(x)=f(g(x)).
-/// Use the \ref compose1 accessor to create this object.
-/// This template is an extension, implemented by SGI STL and uSTL.
-/// \ingroup FunctorObjects
-///
-template <typename Operation1, typename Operation2>
-class unary_compose : public unary_function<typename Operation2::argument_type,
- typename Operation1::result_type> {
-public:
- typedef typename Operation2::argument_type arg_t;
- typedef const arg_t& rcarg_t;
- typedef typename Operation1::result_type result_t;
-public:
- inline unary_compose (const Operation1& f, const Operation2& g) : m_f(f), m_g(g) {}
- inline result_t operator() (rcarg_t x) const { return m_f(m_g(x)); }
-protected:
- Operation1 m_f; ///< f(x), if c(x) = f(g(x))
- Operation2 m_g; ///< g(x), if c(x) = f(g(x))
-};
-
-/// Creates a \ref unary_compose object whose function c(x)=f(g(x))
-/// \ingroup FunctorAccessors
-template <typename Operation1, typename Operation2>
-inline unary_compose<Operation1, Operation2>
-compose1 (const Operation1& f, const Operation2& g)
-{ return unary_compose<Operation1,Operation2>(f, g); }
-
-/// \brief Chains two unary functions through a binary function.
-///
-/// When f(x,y), g(x), and h(x) are composed, the result is function
-/// c(x)=f(g(x),h(x)). Use the \ref compose2 accessor to create this
-/// object. This template is an extension, implemented by SGI STL and uSTL.
-/// \ingroup FunctorObjects
-///
-template <typename Operation1, typename Operation2, typename Operation3>
-class binary_compose : public unary_function<typename Operation2::argument_type,
- typename Operation1::result_type> {
-public:
- typedef typename Operation2::argument_type arg_t;
- typedef const arg_t& rcarg_t;
- typedef typename Operation1::result_type result_t;
-public:
- inline binary_compose (const Operation1& f, const Operation2& g, const Operation3& h) : m_f(f), m_g(g), m_h(h) {}
- inline result_t operator() (rcarg_t x) const { return m_f(m_g(x), m_h(x)); }
-protected:
- Operation1 m_f; ///< f(x,y), if c(x) = f(g(x),h(x))
- Operation2 m_g; ///< g(x), if c(x) = f(g(x),h(x))
- Operation3 m_h; ///< h(x), if c(x) = f(g(x),h(x))
-};
-
-/// Creates a \ref binary_compose object whose function c(x)=f(g(x),h(x))
-/// \ingroup FunctorAccessors
-template <typename Operation1, typename Operation2, typename Operation3>
-inline binary_compose<Operation1, Operation2, Operation3>
-compose2 (const Operation1& f, const Operation2& g, const Operation3& h)
-{ return binary_compose<Operation1, Operation2, Operation3> (f, g, h); }
-
-//----------------------------------------------------------------------
-// Member function adaptors
-//----------------------------------------------------------------------
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-#define MEM_FUN_T(WrapperName, ClassName, ArgType, FuncType, CallType) \
- template <typename Ret, class T> \
- class ClassName : public unary_function<ArgType,Ret> { \
- public: \
- typedef Ret (T::*func_t) FuncType; \
- public: \
- explicit inline ClassName (func_t pf) : m_pf (pf) {} \
- inline Ret operator() (ArgType p) const { return ((p CallType m_pf)()); } \
- private: \
- func_t m_pf; \
- }; \
- \
- template <class Ret, typename T> \
- inline ClassName<Ret,T> WrapperName (Ret (T::*pf) FuncType) \
- { \
- return (ClassName<Ret,T> (pf)); \
- }
-
-MEM_FUN_T(mem_fun, mem_fun_t, T*, (void), ->*)
-MEM_FUN_T(mem_fun, const_mem_fun_t, const T*, (void) const, ->*)
-MEM_FUN_T(mem_fun_ref, mem_fun_ref_t, T&, (void), .*)
-MEM_FUN_T(mem_fun_ref, const_mem_fun_ref_t, const T&, (void) const, .*)
-
-#define EXT_MEM_FUN_T(ClassName, HostType, FuncType) \
- template <class T, typename Ret, typename V> \
- class ClassName : public unary_function<V,void> { \
- public: \
- typedef Ret (T::*func_t)(V) FuncType; \
- public: \
- inline ClassName (HostType t, func_t pf) : m_t (t), m_pf (pf) {} \
- inline Ret operator() (V v) const { return ((m_t->*m_pf)(v)); } \
- private: \
- HostType m_t; \
- func_t m_pf; \
- }; \
- \
- template <class T, typename Ret, typename V> \
- inline ClassName<T,Ret,V> mem_fun (HostType p, Ret (T::*pf)(V) FuncType) \
- { \
- return (ClassName<T,Ret,V> (p, pf)); \
- }
-
-EXT_MEM_FUN_T(ext_mem_fun_t, T*, )
-EXT_MEM_FUN_T(const_ext_mem_fun_t, const T*, const)
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
-
-//----------------------------------------------------------------------
-// Member variable adaptors (uSTL extension)
-//----------------------------------------------------------------------
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-#define MEM_VAR_T(FunctorName, ArgType, VarType, BaseClass, CallImpl) \
- template <typename Function, class T, typename VT> \
- class FunctorName##_t : public BaseClass { \
- public: \
- typedef ArgType argument_type; \
- typedef typename Function::result_type result_type; \
- typedef VarType mem_var_ptr_t; \
- public: \
- inline FunctorName##_t (mem_var_ptr_t pv, Function pfn) : m_pv(pv), m_pfn(pfn) {} \
- inline result_type operator() CallImpl \
- private: \
- mem_var_ptr_t m_pv; \
- Function m_pfn; \
- }; \
- \
- template <typename Function, class T, typename VT> \
- inline FunctorName##_t<Function, T, VT> \
- FunctorName (VT T::*mvp, Function pfn) \
- { \
- return (FunctorName##_t<Function,T,VT> (mvp, pfn)); \
- }
-
-#define FUNCTOR_UNARY_BASE(ArgType) unary_function<ArgType, typename Function::result_type>
-#define FUNCTOR_BINARY_BASE(ArgType) binary_function<ArgType, ArgType, typename Function::result_type>
-
-#define MEM_VAR_UNARY_ARGS (argument_type p) const \
- { return (m_pfn(p.*m_pv)); }
-#define MEM_VAR_BINARY_ARGS (argument_type p1, argument_type p2) const \
- { return (m_pfn(p1.*m_pv, p2.*m_pv)); }
-
-MEM_VAR_T(mem_var1, T&, VT T::*, FUNCTOR_UNARY_BASE(T&), MEM_VAR_UNARY_ARGS)
-MEM_VAR_T(const_mem_var1, const T&, const VT T::*, FUNCTOR_UNARY_BASE(T&), MEM_VAR_UNARY_ARGS)
-MEM_VAR_T(mem_var2, T&, VT T::*, FUNCTOR_BINARY_BASE(T&), MEM_VAR_BINARY_ARGS)
-MEM_VAR_T(const_mem_var2, const T&, const VT T::*, FUNCTOR_BINARY_BASE(T&), MEM_VAR_BINARY_ARGS)
-
-#undef MEM_VAR_UNARY_ARGS
-#undef MEM_VAR_BINARY_ARGS
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
-
-/// Returned functor passes member variable \p mvp reference of given object to equal\<VT\>.
-/// \ingroup FunctorAccessors
-template <class T, typename VT>
-inline const_mem_var1_t<binder2nd<equal_to<VT> >, T, VT>
-mem_var_equal_to (const VT T::*mvp, const VT& v)
-{
- return (const_mem_var1_t<binder2nd<equal_to<VT> >,T,VT> (mvp, bind2nd(equal_to<VT>(), v)));
-}
-
-/// Returned functor passes member variable \p mvp reference of given object to less\<VT\>.
-/// \ingroup FunctorAccessors
-template <class T, typename VT>
-inline const_mem_var1_t<binder2nd<less<VT> >, T, VT>
-mem_var_less (const VT T::*mvp, const VT& v)
-{
- return (const_mem_var1_t<binder2nd<less<VT> >,T,VT> (mvp, bind2nd(less<VT>(), v)));
-}
-
-/// Returned functor passes member variable \p mvp reference of given object to equal\<VT\>.
-/// \ingroup FunctorAccessors
-template <class T, typename VT>
-inline const_mem_var2_t<equal_to<VT>, T, VT>
-mem_var_equal_to (const VT T::*mvp)
-{
- return (const_mem_var2_t<equal_to<VT>,T,VT> (mvp, equal_to<VT>()));
-}
-
-/// Returned functor passes member variable \p mvp reference of given object to less\<VT\>.
-/// \ingroup FunctorAccessors
-template <class T, typename VT>
-inline const_mem_var2_t<less<VT>, T, VT>
-mem_var_less (const VT T::*mvp)
-{
- return (const_mem_var2_t<less<VT>,T,VT> (mvp, less<VT>()));
-}
-
-//----------------------------------------------------------------------
-// Dereference adaptors (uSTL extension)
-//----------------------------------------------------------------------
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-#define DEREFERENCER_T(ClassName, ArgType, BaseClass, CallImpl, FunctorKey) \
- template <typename T, typename Function> \
- class ClassName : public BaseClass { \
- public: \
- typedef ArgType* argument_type; \
- typedef typename Function::result_type result_type; \
- public: \
- inline ClassName (Function pfn) : m_pfn (pfn) {} \
- inline result_type operator() CallImpl \
- private: \
- Function m_pfn; \
- }; \
- \
- template <typename T, typename Function> \
- inline ClassName<T,Function> _dereference (Function pfn, FunctorKey) \
- { \
- return (ClassName<T,Function> (pfn)); \
- }
-
-#define DEREF_UNARY_ARGS (argument_type p) const \
- { return (m_pfn(*p)); }
-#define DEREF_BINARY_ARGS (argument_type p1, argument_type p2) const \
- { return (m_pfn(*p1, *p2)); }
-
-DEREFERENCER_T(deref1_t, T, FUNCTOR_UNARY_BASE(T*), DEREF_UNARY_ARGS, FUNCTOR_UNARY_BASE(T))
-DEREFERENCER_T(const_deref1_t, const T, FUNCTOR_UNARY_BASE(const T*), DEREF_UNARY_ARGS, FUNCTOR_UNARY_BASE(const T))
-DEREFERENCER_T(deref2_t, T, FUNCTOR_BINARY_BASE(T*), DEREF_BINARY_ARGS, FUNCTOR_BINARY_BASE(T))
-DEREFERENCER_T(const_deref2_t, const T, FUNCTOR_BINARY_BASE(const T*), DEREF_BINARY_ARGS, FUNCTOR_BINARY_BASE(const T))
-
-#define dereference(f) _dereference(f,f)
-
-#undef DEREF_UNARY_ARGS
-#undef DEREF_BINARY_ARGS
-
-#endif
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uheap.h b/media/libdrm/mobile2/src/util/ustl-1.0/uheap.h
deleted file mode 100644
index 9dfddaf..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uheap.h
+++ /dev/null
@@ -1,153 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uheap.h
-//
-// Implementation of STL heap algorithms.
-//
-// The function prototypes are copied
-// exactly from the SGI version of STL documentation along with comments about
-// their use. The code is NOT the same, though the functionality is.
-//
-
-#ifndef UHEAP_H_574B9EAF271A1C107190B4D575A356C5
-#define UHEAP_H_574B9EAF271A1C107190B4D575A356C5
-
-#include "uvector.h"
-#include "ualgobase.h"
-
-namespace ustl {
-
-/// \brief Returns true if the given range is a heap under \p comp.
-/// A heap is a sequentially encoded binary tree where for every node
-/// comp(node,child1) is false and comp(node,child2) is false.
-/// \ingroup HeapAlgorithms
-/// \ingroup ConditionAlgorithms
-///
-template <typename RandomAccessIterator, typename Compare>
-bool is_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- RandomAccessIterator iChild (first);
- for (; ++iChild < last; ++first)
- if (comp (*first, *iChild) || (++iChild < last && comp (*first, *iChild)))
- return (false);
- return (true);
-}
-
-/// \brief make_heap turns the range [first, last) into a heap
-/// At completion, is_heap (first, last, comp) is true.
-/// The algorithm is adapted from "Classic Data Structures in C++" by Timothy Budd.
-/// \ingroup HeapAlgorithms
-/// \ingroup SortingAlgorithms
-///
-template <typename RandomAccessIterator, typename Compare>
-void make_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- const value_type v (*first);
- uoff_t iChild, iHole = 0, iEnd (distance (first, last));
- while ((iChild = 2 * iHole + 1) < iEnd) {
- if (iChild + 1 < iEnd) // Pick the greater child
- iChild += comp (first[iChild], first[iChild + 1]);
- if (comp (first[iChild], v))
- break; // Done when parent is greater than both children.
- first[iHole] = first[iChild];
- iHole = iChild;
- }
- if (iHole < iEnd)
- first[iHole] = v;
-}
-
-/// \brief Inserts the *--last into the preceeding range assumed to be a heap.
-/// \ingroup HeapAlgorithms
-/// \ingroup MutatingAlgorithms
-template <typename RandomAccessIterator, typename Compare>
-void push_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- if (last <= first)
- return;
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
- const value_type v (*--last);
- while (first < last) {
- RandomAccessIterator iParent = first + (distance(first, last) - 1) / 2;
- if (comp (v, *iParent))
- break;
- *last = *iParent;
- last = iParent;
- }
- *last = v;
-}
-
-/// Removes the largest element from the heap (*first) and places it at *(last-1)
-/// [first, last-1) is a heap after this operation.
-/// \ingroup HeapAlgorithms
-/// \ingroup MutatingAlgorithms
-template <typename RandomAccessIterator, typename Compare>
-void pop_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- if (--last <= first)
- return;
- iter_swap (first, last);
- make_heap (first, last, comp);
-}
-
-/// Sorts heap [first, last) in descending order according to comp.
-/// \ingroup HeapAlgorithms
-/// \ingroup SortingAlgorithms
-template <typename RandomAccessIterator, typename Compare>
-void sort_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
-{
- for (; first < last; --last)
- pop_heap (first, last, comp);
-}
-
-#define HEAP_FN_WITH_LESS(rtype, name) \
-template <typename RandomAccessIterator>\
-inline rtype name (RandomAccessIterator first, RandomAccessIterator last) \
-{ \
- typedef typename iterator_traits<RandomAccessIterator>::value_type value_type; \
- return (name (first, last, less<value_type>())); \
-}
-HEAP_FN_WITH_LESS (bool, is_heap)
-HEAP_FN_WITH_LESS (void, make_heap)
-HEAP_FN_WITH_LESS (void, push_heap)
-HEAP_FN_WITH_LESS (void, pop_heap)
-HEAP_FN_WITH_LESS (void, sort_heap)
-#undef HEAP_FN_WITH_LESS
-
-/// \class priority_queue uheap.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief Sorted queue adapter to uSTL containers.
-///
-/// Acts just like the queue adapter, but keeps the elements sorted by priority
-/// specified by the given comparison operator.
-///
-template <typename T, typename Ctr = vector<T>, typename Comp = less<typename Ctr::value_type> >
-class priority_queue {
-public:
- typedef Ctr base_ctr;
- typedef typename base_ctr::value_type value_type;
- typedef typename base_ctr::size_type size_type;
- typedef typename base_ctr::const_pointer const_pointer;
- typedef typename base_ctr::const_reference reference;
-public:
- priority_queue (const Comp& c = Comp()) : m_v(), m_c (c) {}
- priority_queue (const_pointer f, const_pointer l, const Comp& c = Comp())
- : m_v (f, l), m_c (c) { make_heap (m_v.begin(), m_v.end(), m_c); }
- inline size_type size (void) const { return (m_v.size()); }
- inline bool empty (void) const { return (m_v.empty()); }
- inline reference top (void) const { return (m_v.at(0)); }
- inline void push (reference v) { m_v.push_back (v); make_heap (m_v.begin(), m_v.end(), m_c); }
- inline void pop (void) { pop_heap (m_v.begin(), m_v.end()); m_v.pop_back(); }
-private:
- base_ctr m_v; ///< Element container.
- Comp m_c; ///< Comparison functor by value.
-};
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uios.h b/media/libdrm/mobile2/src/util/ustl-1.0/uios.h
deleted file mode 100644
index 6153be5..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uios.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uios.h
-//
-// Types used by the streams for option setting.
-//
-
-#ifndef UIOS_H_630C16E316F7650E3A02E1C6611B789A
-#define UIOS_H_630C16E316F7650E3A02E1C6611B789A
-
-#include "utypes.h"
-
-namespace ustl {
-
-class file_exception;
-
-const char endl = '\n'; ///< End of line character.
-const char ends = '\0'; ///< End of string character.
-
-/// Defines types and constants used by all stream classes.
-class ios_base {
-public:
- /// Used to set parameters for stringstreams
- enum fmtflags {
- boolalpha = (1 << 0), ///< Boolean values printed as text.
- dec = (1 << 1), ///< Decimal number output.
- fixed = (1 << 2), ///< Fixed-point float output.
- hex = (1 << 3), ///< Hexadecimal number output.
- internal = (1 << 4),
- left = (1 << 5), ///< Left alignment.
- oct = (1 << 6), ///< Octal number output.
- right = (1 << 7), ///< Right alignment.
- scientific = (1 << 8), ///< Scientific float format.
- showbase = (1 << 9), ///< Add 0x or 0 prefixes on hex and octal numbers.
- showpoint = (1 << 10), ///< Print decimal point.
- showpos = (1 << 11),
- skipws = (1 << 12), ///< Skip whitespace when reading.
- unitbuf = (1 << 13),
- uppercase = (1 << 14),
- adjustfield = (1 << 15),
- basefield = (1 << 16),
- floatfield = (1 << 17)
- };
- /// For file-based streams, specifies fd mode.
- enum openmode_bits {
- in = (1 << 0),
- out = (1 << 1),
- app = (1 << 2),
- ate = (1 << 3),
- binary = (1 << 4),
- trunc = (1 << 5),
- #ifndef DOXYGEN_SHOULD_SKIP_THIS
- nonblock= (1 << 6),
- nocreate= (1 << 7),
- noctty = (1 << 8),
- nombits = 9
- #endif
- };
- /// Seek directions, equivalent to SEEK_SET, SEEK_CUR, and SEEK_END.
- enum seekdir {
- beg,
- cur,
- end
- };
- /// I/O state bitmasks.
- enum iostate_bits {
- goodbit = 0,
- badbit = (1 << 0),
- eofbit = (1 << 1),
- failbit = (1 << 2),
- #ifndef DOXYGEN_SHOULD_SKIP_THIS
- nbadbits = 3,
- allbadbits = 0x7
- #endif
- };
-
- typedef uint32_t openmode; ///< Holds openmode_bits.
- typedef uint32_t iostate; ///< Holds iostate_bits for a file stream.
- typedef file_exception failure; ///< Thrown by fstream on errors.
-
- static const char c_DefaultDelimiters [16]; ///< Default word delimiters for stringstreams.
-public:
- inline ios_base (void) : m_State (goodbit), m_Exceptions (goodbit) {}
- inline iostate rdstate (void) const { return (m_State); }
- inline bool bad (void) const { return (rdstate() & badbit); }
- inline bool good (void) const { return (rdstate() == goodbit); }
- inline bool fail (void) const { return (rdstate() & (badbit | failbit)); }
- inline bool eof (void) const { return (rdstate() & eofbit); }
- inline bool operator! (void) const { return (fail()); }
- inline void clear (iostate v = goodbit) { m_State = v; }
- inline void setstate (iostate v) { m_State |= v; }
- inline iostate exceptions (void) const { return (m_Exceptions); }
- inline iostate exceptions (iostate v) { return (m_Exceptions = v); }
-protected:
- inline bool set_and_throw (iostate v) { setstate(v); return (exceptions() & v); }
-private:
- uint16_t m_State; ///< Open state, using ios::iostate_bits.
- uint16_t m_Exceptions; ///< Exception flags, using ios::iostate_bits.
-};
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uiosfunc.h b/media/libdrm/mobile2/src/util/ustl-1.0/uiosfunc.h
deleted file mode 100644
index fe26ed1..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uiosfunc.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uiosfunc.h
-//
-
-#ifndef UIOSFUNC_H_730C16E316F7650E3A02E1C6611B789A
-#define UIOSFUNC_H_730C16E316F7650E3A02E1C6611B789A
-
-#include "sostream.h"
-
-namespace ustl {
-
-class ios : public ios_base {
-public:
- /// \class align uiosfunc.h ustl.h
- /// \ingroup StreamFunctors
- /// \brief Stream functor to allow inline align() calls.
- ///
- /// Example: os << ios::align(sizeof(uint16_t));
- ///
- class align {
- public:
- inline explicit align (size_t grain = c_DefaultAlignment) : m_Grain(grain) {}
- inline istream& apply (istream& is) const { is.align (m_Grain); return (is); }
- inline ostream& apply (ostream& os) const { os.align (m_Grain); return (os); }
- inline size_t stream_size (void) const { return (m_Grain - 1); }
- private:
- const size_t m_Grain;
- };
-
- /// \class talign uiosfunc.h ustl.h
- /// \ingroup StreamFunctors
- /// \brief Stream functor to allow type-based alignment.
- template <typename T>
- class talign : public align {
- public:
- inline explicit talign (void) : align (alignof (T())) {}
- };
-
- /// \class skip uiosfunc.h ustl.h
- /// \ingroup StreamFunctors
- /// \brief Stream functor to allow inline skip() calls.
- ///
- /// Example: os << ios::skip(sizeof(uint16_t));
- ///
- class skip {
- public:
- inline explicit skip (size_t nBytes) : m_nBytes(nBytes) {}
- inline istream& apply (istream& is) const { is.skip (m_nBytes); return (is); }
- inline ostream& apply (ostream& os) const { os.skip (m_nBytes); return (os); }
- inline size_t stream_size (void) const { return (m_nBytes); }
- private:
- const size_t m_nBytes;
- };
-
- /// \class width uiosfunc.h ustl.h
- /// \ingroup StreamFunctors
- /// \brief Stream functor to allow inline set_width() calls.
- ///
- /// Example: os << ios::width(15);
- ///
- class width {
- public:
- inline explicit width (size_t nBytes) : m_nBytes(nBytes) {}
- inline ostringstream& apply (ostringstream& os) const { os.set_width (m_nBytes); return (os); }
- private:
- const size_t m_nBytes;
- };
-
- /// \class base uiosfunc.h ustl.h
- /// \ingroup StreamFunctors
- /// \brief Stream functor to allow inline set_base() calls.
- ///
- /// Example: os << ios::base(15);
- ///
- class base {
- public:
- inline explicit base (size_t n) : m_Base(n) {}
- inline ostringstream& apply (ostringstream& os) const { os.set_base (m_Base); return (os); }
- private:
- const size_t m_Base;
- };
-};
-
-inline istream& operator>> (istream& is, const ios::skip& op) { return (op.apply (is)); }
-inline ostream& operator<< (ostream& os, const ios::skip& op) { return (op.apply (os)); }
-inline size_t stream_size_of (const ios::skip& op) { return (op.stream_size()); }
-inline istream& operator>> (istream& is, const ios::align& op) { return (op.apply (is)); }
-inline ostream& operator<< (ostream& os, const ios::align& op) { return (op.apply (os)); }
-inline size_t stream_size_of (const ios::align& op) { return (op.stream_size()); }
-inline ostringstream& operator<< (ostringstream& os, const ios::width& op) { return (op.apply (os)); }
-inline ostringstream& operator<< (ostringstream& os, const ios::base& op) { return (op.apply (os)); }
-
-} // namespace ustl
-
-CAST_STREAMABLE(ustl::ios::fmtflags, uint32_t)
-CAST_STREAMABLE(ustl::ios::seekdir, uint32_t)
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uiterator.h b/media/libdrm/mobile2/src/util/ustl-1.0/uiterator.h
deleted file mode 100644
index 48c0d2d..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uiterator.h
+++ /dev/null
@@ -1,268 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file uiterator.h
-/// \brief Contains various iterator adapters.
-//
-
-#ifndef UITERATOR_H_5BCA176C7214A30F2069E2614D2DC226
-#define UITERATOR_H_5BCA176C7214A30F2069E2614D2DC226
-
-#include "uassert.h"
-#include "utypes.h"
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-/// \struct iterator_traits uiterator.h ustl.h
-/// \brief Contains the type traits of \p Iterator
-///
-template <typename Iterator>
-struct iterator_traits {
- typedef typename Iterator::value_type value_type;
- typedef typename Iterator::difference_type difference_type;
- typedef typename Iterator::pointer pointer;
- typedef typename Iterator::reference reference;
-};
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-template <typename T>
-struct iterator_traits<T*> {
- typedef T value_type;
- typedef ptrdiff_t difference_type;
- typedef const T* const_pointer;
- typedef T* pointer;
- typedef T& reference;
-};
-
-template <typename T>
-struct iterator_traits<const T*> {
- typedef T value_type;
- typedef ptrdiff_t difference_type;
- typedef const T* const_pointer;
- typedef const T* pointer;
- typedef const T& reference;
-};
-
-template <>
-struct iterator_traits<void*> {
- typedef uint8_t value_type;
- typedef ptrdiff_t difference_type;
- typedef const void* const_pointer;
- typedef void* pointer;
- typedef value_type& reference;
-};
-
-template <>
-struct iterator_traits<const void*> {
- typedef uint8_t value_type;
- typedef ptrdiff_t difference_type;
- typedef const void* const_pointer;
- typedef const void* pointer;
- typedef const value_type& reference;
-};
-
-#endif
-
-//----------------------------------------------------------------------
-
-/// \class reverse_iterator uiterator.h ustl.h
-/// \ingroup IteratorAdaptors
-/// \brief Wraps \p Iterator to behave in an exactly opposite manner.
-///
-template <class Iterator>
-class reverse_iterator {
-public:
- typedef typename iterator_traits<Iterator>::value_type value_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
- typedef typename iterator_traits<Iterator>::pointer pointer;
- typedef typename iterator_traits<Iterator>::reference reference;
-public:
- reverse_iterator (void) : m_i() {}
- explicit reverse_iterator (Iterator iter) : m_i (iter) {}
- inline bool operator== (const reverse_iterator& iter) const { return (m_i == iter.m_i); }
- inline bool operator< (const reverse_iterator& iter) const { return (iter.m_i < m_i); }
- inline Iterator base (void) const { return (m_i); }
- inline reference operator* (void) const { Iterator prev (m_i); --prev; return (*prev); }
- inline pointer operator-> (void) const { return (&(operator*())); }
- inline reverse_iterator& operator++ (void) { -- m_i; return (*this); }
- inline reverse_iterator& operator-- (void) { ++ m_i; return (*this); }
- inline reverse_iterator operator++ (int) { reverse_iterator prev (*this); -- m_i; return (prev); }
- inline reverse_iterator operator-- (int) { reverse_iterator prev (*this); ++ m_i; return (prev); }
- inline reverse_iterator& operator+= (size_t n) { m_i -= n; return (*this); }
- inline reverse_iterator& operator-= (size_t n) { m_i += n; return (*this); }
- inline reverse_iterator operator+ (size_t n) const { return (reverse_iterator (m_i - n)); }
- inline reverse_iterator operator- (size_t n) const { return (reverse_iterator (m_i + n)); }
- inline reference operator[] (uoff_t n) const { return (*(*this + n)); }
- inline difference_type operator- (const reverse_iterator& i) const { return (distance (m_i, i.m_i)); }
-protected:
- Iterator m_i;
-};
-
-//----------------------------------------------------------------------
-
-/// \class insert_iterator uiterator.h ustl.h
-/// \ingroup IteratorAdaptors
-/// \brief Calls insert on bound container for each assignment.
-///
-template <class Container>
-class insert_iterator {
-public:
- typedef typename Container::value_type value_type;
- typedef typename Container::difference_type difference_type;
- typedef typename Container::pointer pointer;
- typedef typename Container::reference reference;
- typedef typename Container::iterator iterator;
-public:
- explicit insert_iterator (Container& ctr, iterator ip) : m_rCtr (ctr), m_ip (ip) {}
- inline insert_iterator& operator= (typename Container::const_reference v)
- { m_ip = m_rCtr.insert (m_ip, v); return (*this); }
- inline insert_iterator& operator* (void) { return (*this); }
- inline insert_iterator& operator++ (void) { ++ m_ip; return (*this); }
- inline insert_iterator operator++ (int) { insert_iterator prev (*this); ++ m_ip; return (*this); }
-protected:
- Container& m_rCtr;
- iterator m_ip;
-};
-
-/// Returns the insert_iterator for \p ctr.
-template <class Container>
-inline insert_iterator<Container> inserter (Container& ctr, typename Container::iterator ip)
-{
- return (insert_iterator<Container> (ctr, ip));
-}
-
-//----------------------------------------------------------------------
-
-/// \class back_insert_iterator uiterator.h ustl.h
-/// \ingroup IteratorAdaptors
-/// \brief Calls push_back on bound container for each assignment.
-///
-template <class Container>
-class back_insert_iterator {
-public:
- typedef typename Container::value_type value_type;
- typedef typename Container::difference_type difference_type;
- typedef typename Container::pointer pointer;
- typedef typename Container::reference reference;
-public:
- explicit back_insert_iterator (Container& ctr) : m_rCtr (ctr) {}
- inline back_insert_iterator& operator= (typename Container::const_reference v)
- { m_rCtr.push_back (v); return (*this); }
- inline back_insert_iterator& operator* (void) { return (*this); }
- inline back_insert_iterator& operator++ (void) { return (*this); }
- inline back_insert_iterator operator++ (int) { return (*this); }
-protected:
- Container& m_rCtr;
-};
-
-/// Returns the back_insert_iterator for \p ctr.
-template <class Container>
-inline back_insert_iterator<Container> back_inserter (Container& ctr)
-{
- return (back_insert_iterator<Container> (ctr));
-}
-
-//----------------------------------------------------------------------
-
-/// \class index_iterate uiterator.h ustl.h
-/// \ingroup IteratorAdaptors
-///
-/// \brief Allows iteration through an index container.
-///
-/// Converts an iterator into a container of uoff_t indexes to an
-/// iterator of iterators into another container.
-///
-template <typename RandomAccessIterator, typename IndexIterator>
-class index_iterate {
-public:
- typedef RandomAccessIterator value_type;
- typedef ptrdiff_t difference_type;
- typedef RandomAccessIterator* pointer;
- typedef RandomAccessIterator reference;
-public:
- index_iterate (void) : m_Base(), m_i() {}
- index_iterate (RandomAccessIterator ibase, IndexIterator iindex) : m_Base (ibase), m_i (iindex) {}
- inline bool operator== (const index_iterate& i) const { return (m_i == i.m_i); }
- inline bool operator< (const index_iterate& i) const { return (m_i < i.m_i); }
- inline bool operator== (const RandomAccessIterator& i) const { return (m_Base == i); }
- inline bool operator< (const RandomAccessIterator& i) const { return (m_Base < i); }
- inline IndexIterator base (void) const { return (m_i); }
- inline reference operator* (void) const { return (advance(m_Base, *m_i)); }
- inline pointer operator-> (void) const { return (&(operator*())); }
- inline index_iterate& operator++ (void) { ++ m_i; return (*this); }
- inline index_iterate& operator-- (void) { -- m_i; return (*this); }
- inline index_iterate operator++ (int) { index_iterate prev (*this); ++ m_i; return (prev); }
- inline index_iterate operator-- (int) { index_iterate prev (*this); -- m_i; return (prev); }
- inline index_iterate& operator+= (size_t n) { m_i += n; return (*this); }
- inline index_iterate& operator-= (size_t n) { m_i -= n; return (*this); }
- inline index_iterate operator+ (size_t n) const { return (index_iterate (m_Base, m_i + n)); }
- inline index_iterate operator- (size_t n) const { return (index_iterate (m_Base, m_i - n)); }
- inline reference operator[] (uoff_t n) const { return (*(*this + n)); }
- inline difference_type operator- (const index_iterate& i) const { return (distance (m_i, i.m_i)); }
-private:
- RandomAccessIterator m_Base;
- IndexIterator m_i;
-};
-
-/// Returns an index_iterate for \p ibase over \p iindex.
-template <typename RandomAccessIterator, typename IndexIterator>
-inline index_iterate<RandomAccessIterator, IndexIterator> index_iterator (RandomAccessIterator ibase, IndexIterator iindex)
-{
- return (index_iterate<RandomAccessIterator, IndexIterator> (ibase, iindex));
-}
-
-/// Converts the indexes in \p xc to iterators in \p ic of base \p ibase.
-template <typename IndexContainer, typename IteratorContainer>
-inline void indexv_to_iteratorv (typename IteratorContainer::value_type ibase, const IndexContainer& xc, IteratorContainer& ic)
-{
- ic.resize (xc.size());
- copy_n (index_iterator (ibase, xc.begin()), xc.size(), ic.begin());
-}
-
-//----------------------------------------------------------------------
-
-/// Converts the given const_iterator into an iterator.
-///
-template <typename Container>
-inline typename Container::iterator unconst (typename Container::const_iterator i, Container& ctr)
-{
- const Container& cctr = ctr;
- return (ctr.begin() + (i - cctr.begin()));
-}
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-#define IBYI(Iter1, Iter2, Ctr1, Ctr2) \
-template <typename Container1, typename Container2> \
-inline typename Container2::Iter2 ibyi (typename Container1::Iter1 idx, Ctr1& ctr1, Ctr2& ctr2) \
-{ \
- assert (ctr1.size() == ctr2.size()); \
- return (ctr2.begin() + (idx - ctr1.begin())); \
-}
-
-IBYI(const_iterator, const_iterator, const Container1, const Container2)
-IBYI(iterator, iterator, Container1, Container2)
-IBYI(const_iterator, iterator, const Container1, Container2)
-IBYI(iterator, const_iterator, Container1, const Container2)
-
-#else // DOXYGEN
-
-#error This declaration is for doxygen only; it is not compiled.
-
-/// Converts a const_iterator in one container into a const_iterator in another container.
-template <typename Container1, typename Container2>
-inline typename Container2::iterator ibyi (typename Container1::iterator idx, Container1& ctr1, Container2& ctr2) {}
-
-#endif // DOXYGEN
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ulaalgo.h b/media/libdrm/mobile2/src/util/ustl-1.0/ulaalgo.h
deleted file mode 100644
index 1efc977..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ulaalgo.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ulaalgo.h
-//
-
-#ifndef ULAALGO_H_2E403D182E83FB596AFB800E68B255A1
-#define ULAALGO_H_2E403D182E83FB596AFB800E68B255A1
-
-#include "umatrix.h"
-#include "simd.h"
-
-namespace ustl {
-
-/// \brief Creates an identity matrix in \p m
-/// \ingroup NumericAlgorithms
-template <size_t NX, size_t NY, typename T>
-void load_identity (matrix<NX,NY,T>& m)
-{
- fill_n (m.begin(), NX * NY, 0);
- for (typename matrix<NX,NY,T>::iterator i = m.begin(); i < m.end(); i += NX + 1)
- *i = 1;
-}
-
-/// \brief Multiplies two matrices
-/// \ingroup NumericAlgorithms
-template <size_t NX, size_t NY, typename T>
-matrix<NY,NY,T> operator* (const matrix<NX,NY,T>& m1, const matrix<NY,NX,T>& m2)
-{
- matrix<NY,NY,T> mr;
- for (uoff_t ry = 0; ry < NY; ++ ry) {
- for (uoff_t rx = 0; rx < NY; ++ rx) {
- T dpv (0);
- for (uoff_t x = 0; x < NX; ++ x)
- dpv += m1[ry][x] * m2[x][rx];
- mr[ry][rx] = dpv;
- }
- }
- return (mr);
-}
-
-/// \brief Transforms vector \p t with matrix \p m
-/// \ingroup NumericAlgorithms
-template <size_t NX, size_t NY, typename T>
-tuple<NX,T> operator* (const tuple<NY,T>& t, const matrix<NX,NY,T>& m)
-{
- tuple<NX,T> tr;
- for (uoff_t x = 0; x < NX; ++ x) {
- T dpv (0);
- for (uoff_t y = 0; y < NY; ++ y)
- dpv += t[y] * m[y][x];
- tr[x] = dpv;
- }
- return (tr);
-}
-
-/// \brief Transposes (exchanges rows and columns) matrix \p m.
-/// \ingroup NumericAlgorithms
-template <size_t N, typename T>
-void transpose (matrix<N,N,T>& m)
-{
- for (uoff_t x = 0; x < N; ++ x)
- for (uoff_t y = x; y < N; ++ y)
- swap (m[x][y], m[y][x]);
-}
-
-#if WANT_UNROLLED_COPY
-
-#if CPU_HAS_SSE
-
-#if linux // Non-linux gcc versions (BSD, Solaris) can't handle "x" constraint and provide no alternative.
-template <>
-inline void load_identity (matrix<4,4,float>& m)
-{
- asm (
- "movaps %4, %%xmm1 \n\t" // 1 0 0 0
- "movups %4, %0 \n\t" // 1 0 0 0
- "shufps $0xB1,%%xmm1,%%xmm1 \n\t" // 0 1 0 0
- "movups %%xmm1, %1 \n\t" // 0 1 0 0
- "shufps $0x4F,%4,%%xmm1 \n\t" // 0 0 1 0
- "shufps $0x1B,%4,%4 \n\t" // 0 0 0 1
- "movups %%xmm1, %2 \n\t" // 0 0 1 0
- "movups %4, %3" // 0 0 0 1
- : "=m"(m[0][0]), "=m"(m[1][0]), "=m"(m[2][0]), "=m"(m[3][0])
- : "x"(1.0f)
- : "xmm1"
- );
-}
-#endif
-
-inline void _sse_load_matrix (const float* m)
-{
- asm (
- "movups %0, %%xmm4 \n\t" // xmm4 = m[1 2 3 4]
- "movups %1, %%xmm5 \n\t" // xmm5 = m[1 2 3 4]
- "movups %2, %%xmm6 \n\t" // xmm6 = m[1 2 3 4]
- "movups %3, %%xmm7" // xmm7 = m[1 2 3 4]
- : : "m"(m[0]), "m"(m[4]), "m"(m[8]), "m"(m[12])
- : "xmm4", "xmm5", "xmm6", "xmm7"
- );
-}
-
-inline void _sse_transform_to_vector (float* result)
-{
- asm (
- "movaps %%xmm0, %%xmm1 \n\t" // xmm1 = t[0 1 2 3]
- "movaps %%xmm0, %%xmm2 \n\t" // xmm1 = t[0 1 2 3]
- "movaps %%xmm0, %%xmm3 \n\t" // xmm1 = t[0 1 2 3]
- "shufps $0x00, %%xmm0, %%xmm0 \n\t" // xmm0 = t[0 0 0 0]
- "shufps $0x66, %%xmm1, %%xmm1 \n\t" // xmm1 = t[1 1 1 1]
- "shufps $0xAA, %%xmm2, %%xmm2 \n\t" // xmm2 = t[2 2 2 2]
- "shufps $0xFF, %%xmm3, %%xmm3 \n\t" // xmm3 = t[3 3 3 3]
- "mulps %%xmm4, %%xmm0 \n\t" // xmm0 = t[0 0 0 0] * m[0 1 2 3]
- "mulps %%xmm5, %%xmm1 \n\t" // xmm1 = t[1 1 1 1] * m[0 1 2 3]
- "addps %%xmm1, %%xmm0 \n\t" // xmm0 = xmm0 + xmm1
- "mulps %%xmm6, %%xmm2 \n\t" // xmm2 = t[2 2 2 2] * m[0 1 2 3]
- "mulps %%xmm7, %%xmm3 \n\t" // xmm3 = t[3 3 3 3] * m[0 1 2 3]
- "addps %%xmm3, %%xmm2 \n\t" // xmm2 = xmm2 + xmm3
- "addps %%xmm2, %%xmm0 \n\t" // xmm0 = result
- "movups %%xmm0, %0"
- : "=m"(result[0]) :
- : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
- );
-}
-
-template <>
-tuple<4,float> operator* (const tuple<4,float>& t, const matrix<4,4,float>& m)
-{
- tuple<4,float> result;
- _sse_load_matrix (m.begin());
- asm ("movups %0, %%xmm0" : : "m"(t[0]) : "xmm0");
- _sse_transform_to_vector (result.begin());
- return (result);
-}
-
-template <>
-matrix<4,4,float> operator* (const matrix<4,4,float>& m1, const matrix<4,4,float>& m2)
-{
- matrix<4,4,float> result;
- _sse_load_matrix (m2.begin());
- for (uoff_t r = 0; r < 4; ++ r) {
- asm ("movups %0, %%xmm0" : : "m"(m1[r][0]) : "xmm0");
- _sse_transform_to_vector (result[r]);
- }
- return (result);
-}
-
-#elif CPU_HAS_3DNOW
-
-/// Specialization for 4-component vector transform, the slow part of 3D graphics.
-template <>
-tuple<4,float> operator* (const tuple<4,float>& t, const matrix<4,4,float>& m)
-{
- tuple<4,float> result;
- // This is taken from "AMD Athlon Code Optimization Guide" from AMD. 18 cycles!
- // If you are writing a 3D engine, you may want to copy it instead of calling it
- // because of the femms instruction at the end, which takes 2 cycles.
- asm (
- "movq %2, %%mm0 \n\t" // y | x
- "movq %3, %%mm1 \n\t" // w | z
- "movq %%mm0, %%mm2 \n\t" // y | x
- "movq %4, %%mm3 \n\t" // m[0][1] | m[0][0]
- "punpckldq %%mm0, %%mm0 \n\t" // x | x
- "movq %6, %%mm4 \n\t" // m[1][1] | m[1][0]
- "pfmul %%mm0, %%mm3 \n\t" // x*m[0][1] | x*m[0][0]
- "punpckhdq %%mm2, %%mm2 \n\t" // y | y
- "pfmul %%mm2, %%mm4 \n\t" // y*m[1][1] | y*m[1][0]
- "movq %5, %%mm5 \n\t" // m[0][3] | m[0][2]
- "movq %7, %%mm7 \n\t" // m[1][3] | m[1][2]
- "movq %%mm1, %%mm6 \n\t" // w | z
- "pfmul %%mm0, %%mm5 \n\t" // x*m[0][3] | v0>x*m[0][2]
- "movq %8, %%mm0 \n\t" // m[2][1] | m[2][0]
- "punpckldq %%mm1, %%mm1 \n\t" // z | z
- "pfmul %%mm2, %%mm7 \n\t" // y*m[1][3] | y*m[1][2]
- "movq %9, %%mm2 \n\t" // m[2][3] | m[2][2]
- "pfmul %%mm1, %%mm0 \n\t" // z*m[2][1] | z*m[2][0]
- "pfadd %%mm4, %%mm3 \n\t" // x*m[0][1]+y*m[1][1] | x*m[0][0]+y*m[1][0]
- "movq %10, %%mm4 \n\t" // m[3][1] | m[3][0]
- "pfmul %%mm1, %%mm2 \n\t" // z*m[2][3] | z*m[2][2]
- "pfadd %%mm7, %%mm5 \n\t" // x*m[0][3]+y*m[1][3] | x*m[0][2]+y*m[1][2]
- "movq %11, %%mm1 \n\t" // m[3][3] | m[3][2]
- "punpckhdq %%mm6, %%mm6 \n\t" // w | w
- "pfadd %%mm0, %%mm3 \n\t" // x*m[0][1]+y*m[1][1]+z*m[2][1] | x*m[0][0]+y*m[1][0]+z*m[2][0]
- "pfmul %%mm6, %%mm4 \n\t" // w*m[3][1] | w*m[3][0]
- "pfmul %%mm6, %%mm1 \n\t" // w*m[3][3] | w*m[3][2]
- "pfadd %%mm2, %%mm5 \n\t" // x*m[0][3]+y*m[1][3]+z*m[2][3] | x*m[0][2]+y*m[1][2]+z*m[2][2]
- "pfadd %%mm4, %%mm3 \n\t" // x*m[0][1]+y*m[1][1]+z*m[2][1]+w*m[3][1] | x*m[0][0]+y*m[1][0]+z*m[2][0]+w*m[3][0]
- "movq %%mm3, %0 \n\t" // store result->y | result->x
- "pfadd %%mm1, %%mm5 \n\t" // x*m[0][3]+y*m[1][3]+z*m[2][3]+w*m[3][3] | x*m[0][2]+y*m[1][2]+z*m[2][2]+w*m[3][2]
- "movq %%mm5, %1" // store result->w | result->z
- : "=m"(result[0]), "=m"(result[2])
- : "m"(t[0]), "m"(t[2]),
- "m"(m[0][0]), "m"(m[0][2]),
- "m"(m[1][0]), "m"(m[1][2]),
- "m"(m[2][0]), "m"(m[2][2]),
- "m"(m[3][0]), "m"(m[3][2])
- : "mm0","mm1","mm2","mm3","mm4","mm5","mm6","mm7"
- );
- simd::reset_mmx();
- return (result);
-}
-
-#else // If no processor extensions, just unroll the multiplication
-
-/// Specialization for 4-component vector transform, the slow part of 3D graphics.
-template <>
-tuple<4,float> operator* (const tuple<4,float>& t, const matrix<4,4,float>& m)
-{
- tuple<4,float> tr;
- for (uoff_t i = 0; i < 4; ++ i)
- tr[i] = t[0] * m[0][i] + t[1] * m[1][i] + t[2] * m[2][i] + t[3] * m[3][i];
- return (tr);
-}
-
-#endif // CPU_HAS_3DNOW
-#endif // WANT_UNROLLED_COPY
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ulimits.h b/media/libdrm/mobile2/src/util/ustl-1.0/ulimits.h
deleted file mode 100644
index 85f1db1..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ulimits.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ulimits.h
-//
-
-#ifndef ULIMITS_H_1C2192EA3821E0811BBAF86B0F048364
-#define ULIMITS_H_1C2192EA3821E0811BBAF86B0F048364
-
-#include "utypes.h"
-#include <stdint.h>
-
-namespace ustl {
-
-// Android
-#ifndef UINTPTR_MAX
-#define UINTPTR_MAX UINT32_MAX
-#endif
-
-#ifndef UINT32_MAX
-#define UINT32_MAX (0xffffffff)
-#endif
-
-/// \class numeric_limits ulimits.h ustl.h
-/// \brief Defines numeric limits for a type.
-///
-template <typename T>
-struct numeric_limits {
- /// Returns the minimum value for type T.
- static inline T min (void) { return (T(0)); }
- /// Returns the minimum value for type T.
- static inline T max (void) { return (T(0)); }
- static const bool is_signed = false; ///< True if the type is signed.
- static const bool is_integer = false; ///< True if stores an exact value.
- static const bool is_integral = false; ///< True if fixed size and cast-copyable.
-};
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-template <typename T>
-struct numeric_limits<T*> {
- static inline T* min (void) { return (NULL); }
- static inline T* max (void) { return (UINTPTR_MAX); }
- static const bool is_signed = false;
- static const bool is_integer = true;
- static const bool is_integral = true;
-};
-
-#define _NUMERIC_LIMITS(type, minVal, maxVal, bSigned, bInteger, bIntegral) \
-template <> \
-struct numeric_limits<type> { \
- static inline type min (void) { return (minVal); } \
- static inline type max (void) { return (maxVal); } \
- static const bool is_signed = bSigned; \
- static const bool is_integer = bInteger; \
- static const bool is_integral = bIntegral; \
-}
-
-//--------------------------------------------------------------------------------------
-// type min max signed integer integral
-//--------------------------------------------------------------------------------------
-_NUMERIC_LIMITS (bool, false, true, false, true, true);
-_NUMERIC_LIMITS (char, SCHAR_MIN, SCHAR_MAX, true, true, true);
-_NUMERIC_LIMITS (int, INT_MIN, INT_MAX, true, true, true);
-_NUMERIC_LIMITS (short, SHRT_MIN, SHRT_MAX, true, true, true);
-_NUMERIC_LIMITS (long, LONG_MIN, LONG_MAX, true, true, true);
-#if HAVE_THREE_CHAR_TYPES
-_NUMERIC_LIMITS (signed char, SCHAR_MIN, SCHAR_MAX, true, true, true);
-#endif
-_NUMERIC_LIMITS (unsigned char, 0, UCHAR_MAX, false, true, true);
-_NUMERIC_LIMITS (unsigned int, 0, UINT_MAX, false, true, true);
-_NUMERIC_LIMITS (unsigned short,0, USHRT_MAX, false, true, true);
-_NUMERIC_LIMITS (unsigned long, 0, ULONG_MAX, false, true, true);
-_NUMERIC_LIMITS (wchar_t, 0, WCHAR_MAX, false, true, true);
-_NUMERIC_LIMITS (float, FLT_MIN, FLT_MAX, true, false, true);
-_NUMERIC_LIMITS (double, DBL_MIN, DBL_MAX, true, false, true);
-_NUMERIC_LIMITS (long double, LDBL_MIN, LDBL_MAX, true, false, true);
-#ifdef HAVE_LONG_LONG
-_NUMERIC_LIMITS (long long, LLONG_MIN, LLONG_MAX, true, true, true);
-_NUMERIC_LIMITS (unsigned long long, 0, ULLONG_MAX, false, true, true);
-#endif
-//--------------------------------------------------------------------------------------
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
-
-/// Macro for defining numeric_limits specializations
-#define NUMERIC_LIMITS(type, minVal, maxVal, bSigned, bInteger, bIntegral) \
-namespace ustl { _NUMERIC_LIMITS (type, minVal, maxVal, bSigned, bInteger, bIntegral); }
-
-/// Returns the recommended stream alignment for type \p T. Override with ALIGNOF.
-template <typename T>
-inline size_t alignof (const T&)
-{
- if (numeric_limits<T>::is_integral)
- return (__alignof__(T));
- return (4);
-}
-
-#define ALIGNOF(type,grain) \
-namespace ustl { \
- template <> inline size_t alignof (const type&) { return (grain); } }
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ulist.h b/media/libdrm/mobile2/src/util/ustl-1.0/ulist.h
deleted file mode 100644
index 842bbde..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ulist.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ulist.h
-//
-
-#ifndef ULIST_H_54E3B510498982C87A0A1E1932E6729D
-#define ULIST_H_54E3B510498982C87A0A1E1932E6729D
-
-#include "uvector.h"
-#include "uctralgo.h"
-
-namespace ustl {
-
-/// \class list ulist.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief Linked list, defined as an alias to \ref vector.
-///
-template <typename T>
-class list : public vector<T> {
-public:
- typedef typename vector<T>::size_type size_type;
- typedef typename vector<T>::iterator iterator;
- typedef typename vector<T>::const_iterator const_iterator;
- typedef typename vector<T>::reference reference;
- typedef typename vector<T>::const_reference const_reference;
-public:
- inline list (void) : vector<T> () {}
- inline explicit list (size_type n) : vector<T> (n) {}
- inline list (size_type n, const T& v) : vector<T> (n, v) {}
- inline list (const list<T>& v) : vector<T> (v) {}
- inline list (const_iterator i1, const_iterator i2) : vector<T> (i1, i2) {}
- inline size_type size (void) const { return (vector<T>::size()); }
- inline iterator begin (void) { return (vector<T>::begin()); }
- inline const_iterator begin (void) const { return (vector<T>::begin()); }
- inline iterator end (void) { return (vector<T>::end()); }
- inline const_iterator end (void) const { return (vector<T>::end()); }
- inline void push_front (const T& v) { insert (begin(), v); }
- inline void pop_front (void) { erase (begin()); }
- inline const_reference front (void) const { return (*begin()); }
- inline reference front (void) { return (*begin()); }
- inline void remove (const T& v) { ::ustl::remove (*this, v); }
- inline void unique (void) { ::ustl::unique (*this); }
- inline void sort (void) { ::ustl::sort (*this); }
- void merge (list<T>& l);
- void splice (iterator ip, list<T>& l, iterator first = NULL, iterator last = NULL);
-};
-
-/// Merges the contents with \p l. Assumes both lists are sorted.
-template <typename T>
-void list<T>::merge (list& l)
-{
- list<T>::resize (size() + l.size());
- iterator me = merge (begin(), end(), l.begin(), l.end(), begin());
- list<T>::resize (distance (begin(), me));
-}
-
-/// Moves the range [first, last) from \p l to this list at \p ip.
-template <typename T>
-void list<T>::splice (iterator ip, list<T>& l, iterator first, iterator last)
-{
- if (!first)
- first = l.begin();
- if (!last)
- last = l.end();
- insert (ip, first, last);
- l.erase (first, last);
-}
-
-#define deque list ///< list has all the functionality provided by deque
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/umap.h b/media/libdrm/mobile2/src/util/ustl-1.0/umap.h
deleted file mode 100644
index 938c507..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/umap.h
+++ /dev/null
@@ -1,165 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// umap.h
-//
-
-#ifndef UMAP_H_45643F516E02A87A3DCEA5024052A6F5
-#define UMAP_H_45643F516E02A87A3DCEA5024052A6F5
-
-#include "uassert.h"
-#include "ufunction.h"
-#include "uvector.h"
-
-namespace ustl {
-
-/// \class map umap.h ustl.h
-/// \ingroup AssociativeContainers
-///
-/// \brief A sorted associative container of pair<K,V>
-///
-template <typename K, typename V>
-class map : public vector<pair<K,V> > {
-public:
- typedef K key_type;
- typedef V data_type;
- typedef const K& const_key_ref;
- typedef const V& const_data_ref;
- typedef const map<K,V>& rcself_t;
- typedef vector<pair<K,V> > base_class;
- typedef typename base_class::value_type value_type;
- typedef typename base_class::size_type size_type;
- typedef typename base_class::pointer pointer;
- typedef typename base_class::const_pointer const_pointer;
- typedef typename base_class::reference reference;
- typedef typename base_class::const_reference const_reference;
- typedef typename base_class::const_iterator const_iterator;
- typedef typename base_class::iterator iterator;
- typedef typename base_class::reverse_iterator reverse_iterator;
- typedef typename base_class::const_reverse_iterator const_reverse_iterator;
- typedef pair<const_iterator,const_iterator> const_range_t;
- typedef pair<iterator,iterator> range_t;
-public:
- inline map (void) : vector<pair<K,V> > () {}
- explicit inline map (size_type n) : vector<pair<K,V> > (n) {}
- inline map (rcself_t v) : vector<pair<K,V> > (v) {}
- inline map (const_iterator i1, const_iterator i2) : vector<pair<K,V> >() { insert (i1, i2); }
- inline rcself_t operator= (rcself_t v) { base_class::operator= (v); return (*this); }
- inline const_data_ref operator[] (const_key_ref i) const;
- data_type& operator[] (const_key_ref i);
- inline size_type size (void) const { return (base_class::size()); }
- inline iterator begin (void) { return (base_class::begin()); }
- inline const_iterator begin (void) const { return (base_class::begin()); }
- inline iterator end (void) { return (base_class::end()); }
- inline const_iterator end (void) const { return (base_class::end()); }
- inline void assign (const_iterator i1, const_iterator i2) { clear(); insert (i1, i2); }
- inline void push_back (const_reference v) { insert (v); }
- inline const_iterator find (const_key_ref k) const;
- inline iterator find (const_key_ref k) { return (const_cast<iterator> (const_cast<rcself_t>(*this).find (k))); }
- inline const_iterator find_data (const_data_ref v, const_iterator first = NULL, const_iterator last = NULL) const;
- inline iterator find_data (const_data_ref v, iterator first = NULL, iterator last = NULL);
- iterator insert (const_reference v);
- void insert (const_iterator i1, const_iterator i2);
- inline void erase (const_key_ref k);
- inline iterator erase (iterator ep) { return (base_class::erase (ep)); }
- inline iterator erase (iterator ep1, iterator ep2) { return (base_class::erase (ep1, ep2)); }
- inline void clear (void) { base_class::clear(); }
-private:
- const_iterator lower_bound (const_key_ref k) const;
- inline iterator lower_bound (const_key_ref k) { return (const_cast<iterator>(const_cast<rcself_t>(*this).lower_bound (k))); }
-};
-
-template <typename K, typename V>
-typename map<K,V>::const_iterator map<K,V>::lower_bound (const_key_ref k) const
-{
- const_iterator first (begin()), last (end());
- while (first != last) {
- const_iterator mid = advance (first, distance (first,last) / 2);
- if (mid->first < k)
- first = advance (mid, 1);
- else
- last = mid;
- }
- return (first);
-}
-
-/// Returns the pair<K,V> where K = \p k.
-template <typename K, typename V>
-inline typename map<K,V>::const_iterator map<K,V>::find (const_key_ref k) const
-{
- const_iterator i = lower_bound (k);
- return ((i < end() && k < i->first) ? end() : i);
-}
-
-/// Returns the pair<K,V> where V = \p v, occuring in range [first,last).
-template <typename K, typename V>
-inline typename map<K,V>::const_iterator map<K,V>::find_data (const_data_ref v, const_iterator first, const_iterator last) const
-{
- if (!first) first = begin();
- if (!last) last = end();
- for (; first != last && first->second != v; ++first);
- return (first);
-}
-
-/// Returns the pair<K,V> where V = \p v, occuring in range [first,last).
-template <typename K, typename V>
-inline typename map<K,V>::iterator map<K,V>::find_data (const_data_ref v, iterator first, iterator last)
-{
- return (const_cast<iterator> (find_data (v, const_cast<const_iterator>(first), const_cast<const_iterator>(last))));
-}
-
-/// Returns data associated with key \p k.
-template <typename K, typename V>
-inline const typename map<K,V>::data_type& map<K,V>::operator[] (const_key_ref k) const
-{
- assert (find(k) != end() && "operator[] const can not insert non-existent keys");
- return (find(k)->second);
-}
-
-/// Returns data associated with key \p k.
-template <typename K, typename V>
-typename map<K,V>::data_type& map<K,V>::operator[] (const_key_ref k)
-{
- iterator ip = lower_bound (k);
- if (ip == end() || k < ip->first)
- ip = base_class::insert (ip, make_pair (k, V()));
- return (ip->second);
-}
-
-/// Inserts the pair into the container.
-template <typename K, typename V>
-typename map<K,V>::iterator map<K,V>::insert (const_reference v)
-{
- iterator ip = lower_bound (v.first);
- if (ip == end() || v.first < ip->first)
- ip = base_class::insert (ip, v);
- else
- *ip = v;
- return (ip);
-}
-
-/// Inserts elements from range [i1,i2) into the container.
-template <typename K, typename V>
-void map<K,V>::insert (const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- reserve (size() + distance (i1, i2));
- for (; i1 != i2; ++i1)
- insert (*i1);
-}
-
-/// Erases the element with key value \p k.
-template <typename K, typename V>
-inline void map<K,V>::erase (const_key_ref k)
-{
- iterator ip = find (k);
- if (ip != end())
- erase (ip);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/umatrix.h b/media/libdrm/mobile2/src/util/ustl-1.0/umatrix.h
deleted file mode 100644
index e6810f1..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/umatrix.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// umatrix.h
-//
-
-#ifndef UMATRIX_H_740EBFEF554E833645E0FD72419A8185
-#define UMATRIX_H_740EBFEF554E833645E0FD72419A8185
-
-#include "utuple.h"
-
-namespace ustl {
-
-/// \class matrix umatrix.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief A two-dimensional array of NX*NY elements of type T.
-///
-template <size_t NX, size_t NY, typename T>
-class matrix : public tuple<NX*NY,T> {
-public:
- typedef tuple<NX,T> row_type;
- typedef tuple<NY,T> column_type;
- typedef tuple<NX*NY,T> tuple_type;
- typedef typename tuple_type::value_type value_type;
- typedef typename tuple_type::size_type size_type;
- typedef typename tuple_type::pointer pointer;
- typedef typename tuple_type::const_pointer const_pointer;
- typedef typename tuple_type::reference reference;
- typedef typename tuple_type::const_reference const_reference;
- typedef typename tuple_type::iterator iterator;
- typedef typename tuple_type::const_iterator const_iterator;
- typedef typename tuple_type::range_t range_t;
- typedef typename tuple_type::const_range_t const_range_t;
- typedef typename tuple_type::reverse_iterator reverse_iterator;
- typedef typename tuple_type::const_reverse_iterator const_reverse_iterator;
-public:
- inline matrix (void) { fill_n (matrix::begin(), NX*NY, T()); }
- inline size_type columns (void) const { return (NX); }
- inline size_type rows (void) const { return (NY); }
- inline const_iterator at (size_type i) const { return (matrix::begin() + i * NX); }
- inline iterator at (size_type i) { return (matrix::begin() + i * NX); }
- inline const_iterator operator[] (size_type i) const { return (at (i)); }
- inline iterator operator[] (size_type i) { return (at (i)); }
- inline row_type row (size_type r) const { return (row_type (at (r))); }
- inline column_type column (size_type c) const;
- template <typename T2>
- inline const matrix& operator= (const matrix<NX,NY,T2>& src) { tuple_type::operator= (src); return (*this); }
- inline const matrix& operator= (const matrix<NX,NY,T>& src) { tuple_type::operator= (src); return (*this); }
- inline const matrix& operator+= (const_reference v) { tuple_type::operator+= (v); return (*this); }
- inline const matrix& operator-= (const_reference v) { tuple_type::operator-= (v); return (*this); }
- inline const matrix& operator*= (const_reference v) { tuple_type::operator*= (v); return (*this); }
- inline const matrix& operator/= (const_reference v) { tuple_type::operator/= (v); return (*this); }
- inline const matrix operator+ (const_reference v) const
- { matrix result (*this); result += v; return (result); }
- inline const matrix operator- (const_reference v) const
- { matrix result (*this); result -= v; return (result); }
- inline const matrix operator* (const_reference v) const
- { matrix result (*this); result *= v; return (result); }
- inline const matrix operator/ (const_reference v) const
- { matrix result (*this); result /= v; return (result); }
-};
-
-template <size_t NX, size_t NY, typename T>
-inline typename matrix<NX,NY,T>::column_type matrix<NX,NY,T>::column (size_type c) const
-{
- column_type result;
- const_iterator src (matrix::begin() + c);
- iterator dest (result.begin());
- for (uoff_t i = 0; i < NY; ++ i, ++ dest, src += NX)
- *dest = *src;
- return (result);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/umemory.h b/media/libdrm/mobile2/src/util/ustl-1.0/umemory.h
deleted file mode 100644
index 75a9005..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/umemory.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// umemory.h
-//
-
-#ifndef UMEMORY_H_4AB5B0DB5BF09140541409CC47BCD17A
-#define UMEMORY_H_4AB5B0DB5BF09140541409CC47BCD17A
-
-#include "unew.h"
-#ifdef HAVE_ALLOCA_H
- #include <alloca.h>
-#else
- #include <stdlib.h>
-#endif
-#include "upair.h"
-#include "uiterator.h"
-#include "ulimits.h"
-
-namespace ustl {
-
-/// \class auto_ptr umemory.h ustl.h
-/// \ingroup MemoryManagement
-///
-/// \brief A smart pointer.
-///
-/// Calls delete in the destructor; assignment transfers ownership.
-/// This class does not work with void pointers due to the absence
-/// of the required dereference operator.
-///
-template <typename T>
-class auto_ptr {
-public:
- typedef T value_type;
- typedef T* pointer;
- typedef T& reference;
-public:
- /// Takes ownership of \p p.
- inline explicit auto_ptr (pointer p = NULL) : m_p (p) {}
- /// Takes ownership of pointer in \p p. \p p relinquishes ownership.
- inline auto_ptr (auto_ptr<T>& p) : m_p (p.release()) {}
- /// Deletes the owned pointer.
- inline ~auto_ptr (void) { delete m_p; }
- /// Returns the pointer without relinquishing ownership.
- inline pointer get (void) const { return (m_p); }
- /// Returns the pointer and gives up ownership.
- inline pointer release (void) { pointer rv (m_p); m_p = NULL; return (rv); }
- /// Deletes the pointer and sets it equal to \p p.
- inline void reset (pointer p) { if (p != m_p) { delete m_p; m_p = p; } }
- /// Takes ownership of \p p.
- inline auto_ptr<T>& operator= (pointer p) { reset (p); return (*this); }
- /// Takes ownership of pointer in \p p. \p p relinquishes ownership.
- inline auto_ptr<T>& operator= (auto_ptr<T>& p) { reset (p.release()); return (*this); }
- inline reference operator* (void) const { return (*m_p); }
- inline pointer operator-> (void) const { return (m_p); }
- inline bool operator== (const pointer p) const { return (m_p == p); }
- inline bool operator== (const auto_ptr<T>& p) const { return (m_p == p.m_p); }
- inline bool operator< (const auto_ptr<T>& p) const { return (p.m_p < m_p); }
-private:
- pointer m_p;
-};
-
-/// Calls the placement new on \p p.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename T>
-inline void construct (T* p)
-{
- new (p) T;
-}
-
-/// Calls the placement new on \p p.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename ForwardIterator>
-inline void construct (ForwardIterator first, ForwardIterator last)
-{
- typedef typename iterator_traits<ForwardIterator>::value_type value_type;
- if (!numeric_limits<value_type>::is_integral) {
- while (first < last) {
- construct (&*first);
- ++ first;
- }
- }
-}
-
-/// Calls the placement new on \p p.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename T>
-inline void construct (T* p, const T& value)
-{
- new (p) T (value);
-}
-
-/// Calls the destructor of \p p without calling delete.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename T>
-inline void destroy (T* p) throw()
-{
- p->~T();
-}
-
-/// Calls the destructor on elements in range [first, last) without calling delete.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename ForwardIterator>
-inline void destroy (ForwardIterator first, ForwardIterator last) throw()
-{
- typedef typename iterator_traits<ForwardIterator>::value_type value_type;
- if (!numeric_limits<value_type>::is_integral)
- for (; first < last; ++ first)
- destroy (&*first);
-}
-
-/// Casts \p p to the type of the second pointer argument.
-template <typename T> inline T* cast_to_type (void* p, const T*) { return ((T*) p); }
-
-/// \brief Creates a temporary buffer pair from \p p and \p n
-/// This is intended to be used with alloca to create temporary buffers.
-/// The size in the returned pair is set to 0 if the allocation is unsuccessful.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename T>
-inline pair<T*, ptrdiff_t> make_temporary_buffer (void* p, size_t n, const T* ptype)
-{
- return (make_pair (cast_to_type(p,ptype), ptrdiff_t(p ? n : 0)));
-}
-
-#ifdef HAVE_ALLOCA_H
- /// \brief Allocates a temporary buffer, if possible.
- /// \ingroup RawStorageAlgorithms
- #define get_temporary_buffer(size, ptype) make_temporary_buffer (alloca(size_of_elements(size, ptype)), size, ptype)
- #define return_temporary_buffer(p)
-#else
- #define get_temporary_buffer(size, ptype) make_temporary_buffer (malloc(size_of_elements(size, ptype)), size, ptype)
- #define return_temporary_buffer(p) if (p) free (p), p = NULL
-#endif
-
-/// Copies [first, last) into result by calling copy constructors in result.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename InputIterator, typename ForwardIterator>
-ForwardIterator uninitialized_copy (InputIterator first, InputIterator last, ForwardIterator result)
-{
- while (first < last) {
- construct (&*result, *first);
- ++ result;
- ++ first;
- }
- return (result);
-}
-
-/// Copies [first, first + n) into result by calling copy constructors in result.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename InputIterator, typename ForwardIterator>
-ForwardIterator uninitialized_copy_n (InputIterator first, size_t n, ForwardIterator result)
-{
- while (n--) {
- construct (&*result, *first);
- ++ result;
- ++ first;
- }
- return (result);
-}
-
-/// Calls construct on all elements in [first, last) with value \p v.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename ForwardIterator, typename T>
-void uninitialized_fill (ForwardIterator first, ForwardIterator last, const T& v)
-{
- while (first < last) {
- construct (&*first, v);
- ++ first;
- }
-}
-
-/// Calls construct on all elements in [first, first + n) with value \p v.
-/// \ingroup RawStorageAlgorithms
-///
-template <typename ForwardIterator, typename T>
-ForwardIterator uninitialized_fill_n (ForwardIterator first, size_t n, const T& v)
-{
- while (n--) {
- construct (&*first, v);
- ++ first;
- }
- return (first);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/umultimap.h b/media/libdrm/mobile2/src/util/ustl-1.0/umultimap.h
deleted file mode 100644
index dd6ca48..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/umultimap.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// umultimap.h
-//
-
-#ifndef UMULTIMAP_H_45743F516E02A87A3FCEA5024052A6F5
-#define UMULTIMAP_H_45743F516E02A87A3FCEA5024052A6F5
-
-#include "uassert.h"
-#include "ufunction.h"
-#include "uvector.h"
-
-namespace ustl {
-
-/// \class multimap umultimap.h ustl.h
-/// \ingroup AssociativeContainers
-///
-/// \brief A sorted associative container that may container multiple entries for each key.
-///
-template <typename K, typename V>
-class multimap : public vector<pair<K,V> > {
-public:
- typedef K key_type;
- typedef V data_type;
- typedef const K& const_key_ref;
- typedef const V& const_data_ref;
- typedef const multimap<K,V>& rcself_t;
- typedef vector<pair<K,V> > base_class;
- typedef typename base_class::value_type value_type;
- typedef typename base_class::size_type size_type;
- typedef typename base_class::pointer pointer;
- typedef typename base_class::const_pointer const_pointer;
- typedef typename base_class::reference reference;
- typedef typename base_class::const_reference const_reference;
- typedef typename base_class::const_iterator const_iterator;
- typedef typename base_class::iterator iterator;
- typedef typename base_class::reverse_iterator reverse_iterator;
- typedef typename base_class::const_reverse_iterator const_reverse_iterator;
- typedef pair<const_iterator,const_iterator> const_range_t;
- typedef pair<iterator,iterator> range_t;
-public:
- inline multimap (void) : vector<pair<K,V> > () {}
- explicit inline multimap (size_type n) : vector<pair<K,V> > (n) {}
- inline multimap (rcself_t v) : vector<pair<K,V> > (v) {}
- inline multimap (const_iterator i1, const_iterator i2) : vector<pair<K,V> > () { insert (i1, i2); }
- inline rcself_t operator= (rcself_t v) { base_class::operator= (v); return (*this); }
- inline size_type size (void) const { return (base_class::size()); }
- inline iterator begin (void) { return (base_class::begin()); }
- inline const_iterator begin (void) const { return (base_class::begin()); }
- inline iterator end (void) { return (base_class::end()); }
- inline const_iterator end (void) const { return (base_class::end()); }
- inline void assign (const_iterator i1, const_iterator i2) { clear(); insert (i1, i2); }
- inline size_type count (const_key_ref k) const { return (upper_bound(k) - lower_bound(k)); }
- inline void push_back (const_reference v) { insert (v); }
- inline const_range_t equal_range (const_key_ref k) const { return (make_pair (lower_bound(k), upper_bound(k))); }
- inline range_t equal_range (const_key_ref k) { return (make_pair (const_cast<iterator>(lower_bound(k)), const_cast<iterator>(upper_bound(k)))); }
- const_iterator lower_bound (const_key_ref k) const;
- const_iterator upper_bound (const_key_ref k) const;
- inline iterator insert (const_reference v);
- void insert (const_iterator i1, const_iterator i2);
- inline void erase (const_key_ref k) { erase (const_cast<iterator>(lower_bound(k)), const_cast<iterator>(upper_bound(k))); }
- inline iterator erase (iterator ep) { return (base_class::erase (ep)); }
- inline iterator erase (iterator ep1, iterator ep2) { return (base_class::erase (ep1, ep2)); }
- inline void clear (void) { base_class::clear(); }
-};
-
-/// Returns an iterator to the first element with key value \p k.
-template <typename K, typename V>
-typename multimap<K,V>::const_iterator multimap<K,V>::lower_bound (const_key_ref k) const
-{
- const_iterator first (begin()), last (end());
- while (first != last) {
- const_iterator mid = advance (first, distance (first,last) / 2);
- if (mid->first < k)
- first = advance (mid, 1);
- else
- last = mid;
- }
- return (first);
-}
-
-/// Returns an iterator to the first element with key value \p k.
-template <typename K, typename V>
-typename multimap<K,V>::const_iterator multimap<K,V>::upper_bound (const_key_ref k) const
-{
- const_iterator first (begin()), last (end());
- while (first != last) {
- const_iterator mid = advance (first, distance (first,last) / 2);
- if (k < mid->first)
- last = mid;
- else
- first = advance (mid, 1);
- }
- return (last);
-}
-
-/// Inserts the pair into the container.
-template <typename K, typename V>
-inline typename multimap<K,V>::iterator multimap<K,V>::insert (const_reference v)
-{
- iterator ip = const_cast<iterator> (upper_bound (v.first));
- return (base_class::insert (ip, v));
-}
-
-/// Inserts elements from range [i1,i2) into the container.
-template <typename K, typename V>
-void multimap<K,V>::insert (const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- reserve (size() + distance (i1, i2));
- for (; i1 != i2; ++i1)
- insert (*i1);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/umultiset.h b/media/libdrm/mobile2/src/util/ustl-1.0/umultiset.h
deleted file mode 100644
index 404b877..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/umultiset.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// umultiset.h
-//
-
-#ifndef UMULTISET_H_446AEDBB7F61C6994DC228C25D5FA3A1
-#define UMULTISET_H_446AEDBB7F61C6994DC228C25D5FA3A1
-
-#include "uassert.h"
-#include "ualgo.h"
-#include "uvector.h"
-
-namespace ustl {
-
-/// \class multiset umultiset.h ustl.h
-/// \ingroup AssociativeContainers
-///
-/// \brief Multiple sorted container.
-/// Unlike set, it may contain multiple copies of each element.
-///
-template <typename T>
-class multiset : public vector<T> {
-public:
- typedef const multiset<T>& rcself_t;
- typedef vector<T> base_class;
- typedef typename base_class::value_type value_type;
- typedef typename base_class::size_type size_type;
- typedef typename base_class::pointer pointer;
- typedef typename base_class::const_pointer const_pointer;
- typedef typename base_class::reference reference;
- typedef typename base_class::const_reference const_reference;
- typedef typename base_class::const_iterator const_iterator;
- typedef typename base_class::iterator iterator;
- typedef typename base_class::reverse_iterator reverse_iterator;
- typedef typename base_class::const_reverse_iterator const_reverse_iterator;
-public:
- inline multiset (void) : vector<T> () {}
- explicit inline multiset (size_type n) : vector<T> (n) {}
- inline multiset (rcself_t v) : vector<T> (v) {}
- inline multiset (const_iterator i1, const_iterator i2) : vector<T> () { insert (i1, i2); }
- inline rcself_t operator= (rcself_t v) { base_class::operator= (v); return (*this); }
- inline size_type size (void) const { return (base_class::size()); }
- inline iterator begin (void) { return (base_class::begin()); }
- inline const_iterator begin (void) const { return (base_class::begin()); }
- inline iterator end (void) { return (base_class::end()); }
- inline const_iterator end (void) const { return (base_class::end()); }
- inline void assign (const_iterator i1, const_iterator i2);
- size_type count (const_reference v) const;
- inline void push_back (const_reference v) { insert (v); }
- inline iterator insert (const_reference v);
- void insert (const_iterator i1, const_iterator i2);
- void erase (const_reference v);
- inline iterator erase (iterator ep) { return (base_class::erase (ep)); }
- inline iterator erase (iterator ep1, iterator ep2) { return (base_class::erase (ep1, ep2)); }
- inline void clear (void) { base_class::clear(); }
-};
-
-/// Copies contents of range [i1,i2)
-template <typename T>
-inline void multiset<T>::assign (const_iterator i1, const_iterator i2)
-{
- base_class::clear();
- insert (i1, i2);
-}
-
-/// Returns the number of elements of value \p v.
-template <typename T>
-typename multiset<T>::size_type multiset<T>::count (const_reference v) const
-{
- const pair<const_iterator,const_iterator> fr = equal_range (begin(), end(), v);
- return (distance (fr.first, fr.second));
-}
-
-/// Inserts \p v.
-template <typename T>
-inline typename multiset<T>::iterator multiset<T>::insert (const_reference v)
-{
- iterator ip = upper_bound (begin(), end(), v);
- return (base_class::insert (ip, v));
-}
-
-/// Inserts all elements from range [i1,i2).
-template <typename T>
-void multiset<T>::insert (const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- reserve (size() + distance (i1, i2));
- for (; i1 < i2; ++i1)
- push_back (*i1);
-}
-
-/// Erases all elements with value \p v.
-template <typename T>
-void multiset<T>::erase (const_reference v)
-{
- pair<iterator,iterator> epr = equal_range (begin(), end(), v);
- erase (epr.first, epr.second);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/unew.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/unew.cpp
deleted file mode 100644
index 084e053..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/unew.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// unew.cc
-//
-
-#include "unew.h"
-#include <stdlib.h>
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#endif
-
-void* throwing_malloc (size_t n) throw (ustl::bad_alloc)
-{
- void* p = malloc (n);
- if (!p)
-#if PLATFORM_ANDROID
- printf("bad alloc\n");
-#else
- throw ustl::bad_alloc (n);
-#endif
- return (p);
-}
-
-void free_nullok (void* p) throw()
-{
- if (p)
- free (p);
-}
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/unew.h b/media/libdrm/mobile2/src/util/ustl-1.0/unew.h
deleted file mode 100644
index c4ffb62..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/unew.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file unew.h
-///
-/// \brief Same as \<new\>, but throws ustl:: exceptions.
-//
-
-#ifndef UNEW_H_11D237512B324C9C05A55DAF1BF086F1
-#define UNEW_H_11D237512B324C9C05A55DAF1BF086F1
-
-#include "uexception.h"
-
-/// Just like malloc, but throws on failure.
-void* throwing_malloc (size_t n) throw (ustl::bad_alloc);
-/// Just like free, but doesn't crash when given a NULL.
-void free_nullok (void* p) throw();
-
-#ifdef WITHOUT_LIBSTDCPP
-
-//
-// These are replaceable signatures:
-// - normal single new and delete (no arguments, throw @c bad_alloc on error)
-// - normal array new and delete (same)
-// - @c nothrow single new and delete (take a @c nothrow argument, return
-// @c NULL on error)
-// - @c nothrow array new and delete (same)
-//
-// Placement new and delete signatures (take a memory address argument,
-// does nothing) may not be replaced by a user's program.
-//
-inline void* operator new (size_t n) throw (ustl::bad_alloc) { return (throwing_malloc (n)); }
-inline void* operator new[] (size_t n) throw (ustl::bad_alloc) { return (throwing_malloc (n)); }
-inline void operator delete (void* p) throw() { free_nullok (p); }
-inline void operator delete[] (void* p) throw() { free_nullok (p); }
-
-// Default placement versions of operator new.
-inline void* operator new (size_t, void* p) throw() { return (p); }
-inline void* operator new[] (size_t, void* p) throw() { return (p); }
-
-// Default placement versions of operator delete.
-inline void operator delete (void*, void*) throw() { }
-inline void operator delete[](void*, void*) throw() { }
-
-#else
-#include <new>
-#endif // WITHOUT_LIBSTDCPP
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/unumeric.h b/media/libdrm/mobile2/src/util/ustl-1.0/unumeric.h
deleted file mode 100644
index 4883eb4..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/unumeric.h
+++ /dev/null
@@ -1,160 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// unumeric.h
-//
-// This file contains numeric algorithm templates.
-//
-
-#ifndef UNUMERIC_H_6C99D6F6363832C644A6FFF336E84E18
-#define UNUMERIC_H_6C99D6F6363832C644A6FFF336E84E18
-
-namespace ustl {
-
-/// Returns the sum of all elements in [first, last) added to \p init.
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename T>
-inline T accumulate (InputIterator first, InputIterator last, T init)
-{
- while (first < last)
- init += *first++;
- return (init);
-}
-
-/// Returns the sum of all elements in [first, last) via \p op, added to \p init.
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename T, typename BinaryFunction>
-inline T accumulate (InputIterator first, InputIterator last, T init, BinaryFunction binary_op)
-{
- while (first < last)
- init = binary_op (init, *first++);
- return (init);
-}
-
-/// Assigns range [value, value + (last - first)) to [first, last)
-/// \ingroup NumericAlgorithms
-///
-template <typename ForwardIterator, typename T>
-inline void iota (ForwardIterator first, ForwardIterator last, T value)
-{
- while (first < last)
- *first++ = value++;
-}
-
-/// Returns the sum of products of respective elements in the given ranges.
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator1, typename InputIterator2, typename T>
-inline T inner_product (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init)
-{
- while (first1 < last1)
- init += *first1++ * *first2++;
- return (init);
-}
-
-/// Returns the sum of products of respective elements in the given ranges.
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator1, typename InputIterator2, typename T,
- typename BinaryOperation1, typename BinaryOperation2>
-inline T inner_product
-(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init,
- BinaryOperation1 sumOp, BinaryOperation2 productOp)
-{
- while (first1 < last1)
- init = sumOp (init, productOp (*first1++, *first2++));
- return (init);
-}
-
-/// Writes result such that result[i] = sum (first...first+i)
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename OutputIterator>
-inline OutputIterator partial_sum (InputIterator first, InputIterator last, OutputIterator result)
-{
- if (first < last)
- *result = *first++;
- while (first < last)
- *++result = *first++ + *result;
- return (result);
-}
-
-/// Writes result such that result[i] = sumOp (first...first+i)
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename BinaryOperation>
-inline OutputIterator partial_sum (InputIterator first, InputIterator last, OutputIterator result, BinaryOperation sumOp)
-{
- if (first < last)
- *result = *first++;
- while (first < last)
- *++result = sumOp (*first++, *result);
- return (result);
-}
-
-/// Writes result such that result[i] = first[i] - first[i - 1]
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename OutputIterator>
-inline OutputIterator adjacent_difference (InputIterator first, InputIterator last, OutputIterator result)
-{
- if (first < last)
- *result++ = *first++;
- while (first < last)
- *result++ = *first - *(first - 1);
- return (result);
-}
-
-/// Writes result such that result[i] = differenceOp (first[i], first[i - 1])
-/// \ingroup NumericAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename BinaryOperation>
-inline OutputIterator adjacent_difference (InputIterator first, InputIterator last, OutputIterator result, BinaryOperation differenceOp)
-{
- if (first < last)
- *result++ = *first++;
- while (first < last)
- *result++ = differenceOp (*first, *(first - 1));
- return (result);
-}
-
-/// \brief Returns x^n.
-/// Donald Knuth's Russian Peasant algorithm.
-/// \ingroup NumericAlgorithms
-///
-template <typename T>
-inline T power (T x, unsigned n)
-{
- T result (n % 2 ? x : 1);
- while (n /= 2) {
- x *= x;
- if (n % 2)
- result *= x;
- }
- return (result);
-}
-
-/// \brief Returns x^n, using \p op instead of multiplication.
-/// Donald Knuth's Russian Peasant algorithm.
-/// \ingroup NumericAlgorithms
-///
-template <typename T, typename BinaryOperation>
-inline T power (T x, unsigned n, BinaryOperation op)
-{
- T result (n % 2 ? x : 1);
- while (n /= 2) {
- x = op (x, x);
- if (n % 2)
- result = op (result, x);
- }
- return (result);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/upair.h b/media/libdrm/mobile2/src/util/ustl-1.0/upair.h
deleted file mode 100644
index b4cc3b7..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/upair.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file upair.h
-/// \brief Pair-related functionality.
-
-#ifndef UPAIR_H_7DC08F1B7FECF8AE6856D84C3B617A75
-#define UPAIR_H_7DC08F1B7FECF8AE6856D84C3B617A75
-
-#include "utypes.h"
-
-namespace ustl {
-
-/// \class pair upair.h ustl.h
-/// \ingroup AssociativeContainers
-///
-/// \brief Container for two values.
-///
-template <typename T1, typename T2>
-class pair {
-public:
- typedef T1 first_type;
- typedef T2 second_type;
-public:
- /// Default constructor.
- inline pair (void) : first (T1()), second (T2()) {}
- /// Initializes members with \p a, and \p b.
- inline pair (const T1& a, const T2& b) : first (a), second (b) {}
- inline pair& operator= (const pair<T1, T2>& p2) { first = p2.first; second = p2.second; return (*this); }
- template <typename T3, typename T4>
- inline pair& operator= (const pair<T3, T4>& p2) { first = p2.first; second = p2.second; return (*this); }
-public:
- first_type first;
- second_type second;
-};
-
-/// Compares both values of \p p1 to those of \p p2.
-template <typename T1, typename T2>
-inline bool operator== (const pair<T1,T2>& p1, const pair<T1,T2>& p2)
-{
- return (p1.first == p2.first && p1.second == p2.second);
-}
-
-/// Compares both values of \p p1 to those of \p p2.
-template <typename T1, typename T2>
-bool operator< (const pair<T1,T2>& p1, const pair<T1,T2>& p2)
-{
- return (p1.first < p2.first || (p1.first == p2.first && p1.second < p2.second));
-}
-
-/// Returns a pair object with (a,b)
-template <typename T1, typename T2>
-inline pair<T1,T2> make_pair (const T1& a, const T2& b)
-{
- return (pair<T1,T2> (a, b));
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/upredalgo.h b/media/libdrm/mobile2/src/util/ustl-1.0/upredalgo.h
deleted file mode 100644
index 562a3d6..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/upredalgo.h
+++ /dev/null
@@ -1,597 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ualgo.h
-//
-// Implementation of STL algorithms with custom predicates.
-//
-// The function prototypes are copied
-// exactly from the SGI version of STL documentation along with comments about
-// their use. The code is NOT the same, though the functionality usually is.
-//
-
-#ifndef UPREDALGO_H_2CB058AE0807A01A2F6A51BA5D5820A5
-#define UPREDALGO_H_2CB058AE0807A01A2F6A51BA5D5820A5
-
-namespace ustl {
-
-/// Copy_if copies elements from the range [first, last) to the range
-/// [result, result + (last - first)) if pred(*i) returns true.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename Predicate>
-inline OutputIterator copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred)
-{
- for (; first != last; ++first) {
- if (pred(*first)) {
- *result = *first;
- ++ result;
- }
- }
- return (result);
-}
-
-/// Returns the first iterator i in the range [first, last) such that
-/// pred(*i) is true. Returns last if no such iterator exists.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename Predicate>
-inline InputIterator find_if (InputIterator first, InputIterator last, Predicate pred)
-{
- while (first != last && !pred (*first))
- ++ first;
- return (first);
-}
-
-/// Returns the first iterator such that p(*i, *(i + 1)) == true.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename BinaryPredicate>
-inline ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last, BinaryPredicate p)
-{
- if (first != last)
- for (ForwardIterator prev = first; ++first != last; ++ prev)
- if (p (*prev, *first))
- return (prev);
- return (last);
-}
-
-/// Returns the pointer to the first pair of unequal elements.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename BinaryPredicate>
-inline pair<InputIterator,InputIterator>
-mismatch (InputIterator first1, InputIterator last1, InputIterator first2, BinaryPredicate comp)
-{
- while (first1 != last1 && comp(*first1, *first2))
- ++ first1, ++ first2;
- return (make_pair (first1, first2));
-}
-
-/// Returns true if two ranges are equal.
-/// This is an extension, present in uSTL and SGI STL.
-/// \ingroup ConditionAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename BinaryPredicate>
-inline bool equal (InputIterator first1, InputIterator last1, InputIterator first2, BinaryPredicate comp)
-{
- return (mismatch (first1, last1, first2, comp).first == last1);
-}
-
-/// Count_if finds the number of elements in [first, last) that satisfy the
-/// predicate pred. More precisely, the first version of count_if returns the
-/// number of iterators i in [first, last) such that pred(*i) is true.
-/// \ingroup ConditionAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename Predicate>
-inline size_t count_if (InputIterator first, InputIterator last, Predicate pred)
-{
- size_t total = 0;
- for (; first != last; ++first)
- if (pred (*first))
- ++ total;
- return (total);
-}
-
-/// Replace_if replaces every element in the range [first, last) for which
-/// pred returns true with new_value. That is: for every iterator i, if
-/// pred(*i) is true then it performs the assignment *i = new_value.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename Predicate, typename T>
-inline void replace_if (ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value)
-{
- for (; first != last; ++first)
- if (pred (*first))
- *first = new_value;
-}
-
-/// Replace_copy_if copies elements from the range [first, last) to the range
-/// [result, result + (last-first)), except that any element for which pred is
-/// true is not copied; new_value is copied instead. More precisely, for every
-/// integer n such that 0 <= n < last-first, replace_copy_if performs the
-/// assignment *(result+n) = new_value if pred(*(first+n)),
-/// and *(result+n) = *(first+n) otherwise.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename Predicate, typename T>
-inline OutputIterator replace_copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value)
-{
- for (; first != last; ++result, ++first)
- *result = pred(*first) ? new_value : *first;
-}
-
-/// Remove_copy_if copies elements from the range [first, last) to a range
-/// beginning at result, except that elements for which pred is true are not
-/// copied. The return value is the end of the resulting range. This operation
-/// is stable, meaning that the relative order of the elements that are copied
-/// is the same as in the range [first, last).
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename Predicate>
-inline OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred)
-{
- for (; first != last; ++first)
- if (pred (*first))
- *result++ = *first;
- return (result);
-}
-
-/// Remove_if removes from the range [first, last) every element x such that
-/// pred(x) is true. That is, remove_if returns an iterator new_last such that
-/// the range [first, new_last) contains no elements for which pred is true.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Remove_if is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename Predicate>
-inline ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, Predicate pred)
-{
- return (remove_copy_if (first, last, first, pred));
-}
-
-/// The reason there are two different versions of unique_copy is that there
-/// are two different definitions of what it means for a consecutive group of
-/// elements to be duplicates. In the first version, the test is simple
-/// equality: the elements in a range [f, l) are duplicates if, for every
-/// iterator i in the range, either i == f or else *i == *(i-1). In the second,
-/// the test is an arbitrary Binary Predicate binary_pred: the elements in
-/// [f, l) are duplicates if, for every iterator i in the range, either
-/// i == f or else binary_pred(*i, *(i-1)) is true.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename InputIterator, typename OutputIterator, typename BinaryPredicate>
-OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred)
-{
- if (first != last) {
- *result = *first;
- while (++first != last)
- if (!binary_pred (*first, *result))
- *++result = *first;
- ++ result;
- }
- return (result);
-}
-
-/// Every time a consecutive group of duplicate elements appears in the range
-/// [first, last), the algorithm unique removes all but the first element.
-/// That is, unique returns an iterator new_last such that the range [first,
-/// new_last) contains no two consecutive elements that are duplicates.
-/// The iterators in the range [new_last, last) are all still dereferenceable,
-/// but the elements that they point to are unspecified. Unique is stable,
-/// meaning that the relative order of elements that are not removed is
-/// unchanged.
-/// \ingroup MutatingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename BinaryPredicate>
-inline ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred)
-{
- return (unique_copy (first, last, first, binary_pred));
-}
-
-/// Returns the furthermost iterator i in [first, last) such that,
-/// for every iterator j in [first, i), comp(*j, value) is true.
-/// Assumes the range is sorted.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename T, typename StrictWeakOrdering>
-ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp)
-{
- ForwardIterator mid;
- while (first != last) {
- mid = advance (first, distance (first,last) / 2);
- if (comp (*mid, value))
- first = mid + 1;
- else
- last = mid;
- }
- return (first);
-}
-
-/// Performs a binary search inside the sorted range.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename T, typename StrictWeakOrdering>
-inline ForwardIterator binary_search (ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp)
-{
- ForwardIterator found = lower_bound (first, last, value, comp);
- return ((found == last || comp(value, *found)) ? last : found);
-}
-
-/// Returns the furthermost iterator i in [first,last) such that for
-/// every iterator j in [first,i), comp(value,*j) is false.
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename T, typename StrictWeakOrdering>
-ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp)
-{
- ForwardIterator mid;
- while (first != last) {
- mid = advance (first, distance (first,last) / 2);
- if (comp (value, *mid))
- last = mid;
- else
- first = mid + 1;
- }
- return (last);
-}
-
-/// Returns pair<lower_bound,upper_bound>
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename ForwardIterator, typename T, typename StrictWeakOrdering>
-inline pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp)
-{
- pair<ForwardIterator,ForwardIterator> rv;
- rv.second = rv.first = lower_bound (first, last, value, comp);
- while (rv.second != last && !comp(value, *(rv.second)))
- ++ rv.second;
- return (rv);
-}
-
-/// \brief Puts \p nth element into its sorted position.
-/// In this implementation, the entire array is sorted. The performance difference is
-/// so small and the function use is so rare, there is no need to have code for it.
-/// \ingroup SortingAlgorithms
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-///
-template <typename RandomAccessIterator, typename Compare>
-inline void nth_element (RandomAccessIterator first, RandomAccessIterator, RandomAccessIterator last, Compare comp)
-{
- sort (first, last, comp);
-}
-
-/// \brief Searches for the first subsequence [first2,last2) in [first1,last1)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator1, typename ForwardIterator2, typename BinaryPredicate>
-ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate comp)
-{
- const ForwardIterator1 slast = last1 - distance(first2, last2) + 1;
- for (; first1 < slast; ++first1) {
- ForwardIterator2 i = first2;
- ForwardIterator1 j = first1;
- for (; i != last2 && comp(*j, *i); ++i, ++j);
- if (i == last2)
- return (first1);
- }
- return (last1);
-}
-
-/// \brief Searches for the last subsequence [first2,last2) in [first1,last1)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator1, typename ForwardIterator2, typename BinaryPredicate>
-ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate comp)
-{
- ForwardIterator1 s = last1 - distance(first2, last2);
- for (; first1 < s; --s) {
- ForwardIterator2 i = first2, j = s;
- for (; i != last2 && comp(*j, *i); ++i, ++j);
- if (i == last2)
- return (s);
- }
- return (last1);
-}
-
-/// \brief Searches for the first occurence of \p count \p values in [first, last)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename Iterator, typename T, typename BinaryPredicate>
-Iterator search_n (Iterator first, Iterator last, size_t count, const T& value, BinaryPredicate comp)
-{
- size_t n = 0;
- for (; first != last; ++first) {
- if (!comp (*first, value))
- n = 0;
- else if (++n == count)
- return (first - --n);
- }
- return (last);
-}
-
-/// \brief Searches [first1,last1) for the first occurrence of an element from [first2,last2)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator, typename ForwardIterator, typename BinaryPredicate>
-InputIterator find_first_of (InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp)
-{
- for (; first1 != last1; ++first1)
- for (ForwardIterator i = first2; i != last2; ++i)
- if (comp (*first1, *i))
- return (first1);
- return (first1);
-}
-
-/// \brief Returns true if [first2,last2) is a subset of [first1,last1)
-/// \ingroup ConditionAlgorithms
-/// \ingroup SetAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename StrictWeakOrdering>
-bool includes (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp)
-{
- for (; (first1 != last1) & (first2 != last2); ++first1) {
- if (comp (*first2, *first1))
- return (false);
- first2 += !comp (*first1, *first2);
- }
- return (first2 == last2);
-}
-
-/// \brief Merges [first1,last1) with [first2,last2)
-///
-/// Result will contain every element that is in either set. If duplicate
-/// elements are present, max(n,m) is placed in the result.
-///
-/// \ingroup SetAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakOrdering>
-OutputIterator set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp)
-{
- for (; (first1 != last1) & (first2 != last2); ++result) {
- if (comp (*first2, *first1))
- *result = *first2++;
- else {
- first2 += !comp (*first1, *first2);
- *result = *first1++;
- }
- }
- return (copy (first2, last2, copy (first1, last1, result)));
-}
-
-/// \brief Creates a set containing elements shared by the given ranges.
-/// \ingroup SetAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakOrdering>
-OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp)
-{
- while ((first1 != last1) & (first2 != last2)) {
- bool b1ge2 = !comp (*first1, *first2), b2ge1 = !comp (*first2, *first1);
- if (b1ge2 & b2ge1)
- *result++ = *first1;
- first1 += b2ge1;
- first2 += b1ge2;
- }
- return (result);
-}
-
-/// \brief Removes from [first1,last1) elements present in [first2,last2)
-/// \ingroup SetAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakOrdering>
-OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp)
-{
- while ((first1 != last1) & (first2 != last2)) {
- bool b1ge2 = !comp (*first1, *first2), b2ge1 = !comp (*first2, *first1);
- if (!b1ge2)
- *result++ = *first1;
- first1 += b2ge1;
- first2 += b1ge2;
- }
- return (copy (first1, last1, result));
-}
-
-/// \brief Performs union of sets A-B and B-A.
-/// \ingroup SetAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakOrdering>
-OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp)
-{
- while ((first1 != last1) & (first2 != last2)) {
- bool b1l2 = comp (*first1, *first2), b2l1 = comp (*first2, *first1);
- if (b1l2)
- *result++ = *first1;
- else if (b2l1)
- *result++ = *first2;
- first1 += !b2l1;
- first2 += !b1l2;
- }
- return (copy (first2, last2, copy (first1, last1, result)));
-}
-
-/// \brief Returns true if the given range is sorted.
-/// \ingroup ConditionAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator, typename StrictWeakOrdering>
-bool is_sorted (ForwardIterator first, ForwardIterator last, StrictWeakOrdering comp)
-{
- for (ForwardIterator i = first; ++i < last; ++first)
- if (comp (*i, *first))
- return (false);
- return (true);
-}
-
-/// \brief Compares two given containers like strcmp compares strings.
-/// \ingroup ConditionAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator1, typename InputIterator2, typename BinaryPredicate>
-bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate comp)
-{
- for (; (first1 != last1) & (first2 != last2); ++first1, ++first2) {
- if (comp (*first1, *first2))
- return (true);
- if (comp (*first2, *first1))
- return (false);
- }
- return ((first1 == last1) & (first2 != last2));
-}
-
-/// \brief Creates the next lexicographical permutation of [first,last).
-/// Returns false if no further permutations can be created.
-/// \ingroup GeneratorAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename BidirectionalIterator, typename StrictWeakOrdering>
-bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp)
-{
- if (distance (first, last) < 2)
- return (false);
- BidirectionalIterator i = last;
- for (--i; i != first; ) {
- --i;
- if (comp (i[0], i[1])) {
- BidirectionalIterator j = last;
- while (!comp (*i, *--j));
- iter_swap (i, j);
- reverse (i + 1, last);
- return (true);
- }
- }
- reverse (first, last);
- return (false);
-}
-
-/// \brief Creates the previous lexicographical permutation of [first,last).
-/// Returns false if no further permutations can be created.
-/// \ingroup GeneratorAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename BidirectionalIterator, typename StrictWeakOrdering>
-bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp)
-{
- if (distance (first, last) < 2)
- return (false);
- BidirectionalIterator i = last;
- for (--i; i != first; ) {
- --i;
- if (comp(i[1], i[0])) {
- BidirectionalIterator j = last;
- while (!comp (*--j, *i));
- iter_swap (i, j);
- reverse (i + 1, last);
- return (true);
- }
- }
- reverse (first, last);
- return (false);
-}
-
-/// \brief Returns iterator to the max element in [first,last)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator, typename BinaryPredicate>
-inline ForwardIterator max_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp)
-{
- ForwardIterator result = first;
- for (; first != last; ++first)
- if (comp (*result, *first))
- result = first;
- return (result);
-}
-
-/// \brief Returns iterator to the min element in [first,last)
-/// \ingroup SearchingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator, typename BinaryPredicate>
-inline ForwardIterator min_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp)
-{
- ForwardIterator result = first;
- for (; first != last; ++first)
- if (comp (*first, *result))
- result = first;
- return (result);
-}
-
-/// \brief Makes [first,middle) a part of the sorted array.
-/// Contents of [middle,last) is undefined. This implementation just calls stable_sort.
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename RandomAccessIterator, typename StrictWeakOrdering>
-inline void partial_sort (RandomAccessIterator first, RandomAccessIterator, RandomAccessIterator last, StrictWeakOrdering comp)
-{
- stable_sort (first, last, comp);
-}
-
-/// \brief Like partial_sort, but outputs to [result_first,result_last)
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename InputIterator, typename RandomAccessIterator, typename StrictWeakOrdering>
-RandomAccessIterator partial_sort_copy (InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, StrictWeakOrdering comp)
-{
- RandomAccessIterator rend = result_first;
- for (; first != last; ++first) {
- RandomAccessIterator i = result_first;
- for (; i != rend && comp (*i, *first); ++i);
- if (i == result_last)
- continue;
- rend += (rend < result_last);
- copy_backward (i, rend - 1, rend);
- *i = *first;
- }
- return (rend);
-}
-
-/// \brief Like \ref partition, but preserves equal element order.
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator, typename Predicate>
-ForwardIterator stable_partition (ForwardIterator first, ForwardIterator last, Predicate pred)
-{
- if (first == last)
- return (first);
- ForwardIterator l, r, m = advance (first, distance (first, last) / 2);
- if (first == m)
- return (pred(*first) ? last : first);
- l = stable_partition (first, m, pred);
- r = stable_partition (m, last, pred);
- rotate (l, m, r);
- return (advance (l, distance (m, r)));
-}
-
-/// \brief Splits [first,last) in two by \p pred.
-///
-/// Creates two ranges [first,middle) and [middle,last), where every element
-/// in the former is less than every element in the latter.
-/// The return value is middle.
-///
-/// \ingroup SortingAlgorithms
-/// \ingroup PredicateAlgorithms
-template <typename ForwardIterator, typename Predicate>
-inline ForwardIterator partition (ForwardIterator first, ForwardIterator last, Predicate pred)
-{
- return (stable_partition (first, last, pred));
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uqueue.h b/media/libdrm/mobile2/src/util/ustl-1.0/uqueue.h
deleted file mode 100644
index 99eef80..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uqueue.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uqueue.h
-//
-
-#ifndef UQUEUE_H_27F01FDB0D59B75277E0E5C41ABC6B5B
-#define UQUEUE_H_27F01FDB0D59B75277E0E5C41ABC6B5B
-
-namespace ustl {
-
-/// \class queue uqueue.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief Queue adapter to uSTL containers.
-///
-/// The most efficient way to use this implementation is to fill the queue
-/// and the completely empty it before filling again.
-///
-template <typename Sequence>
-class queue {
-public:
- typedef typename Sequence::value_type value_type;
- typedef typename Sequence::size_type size_type;
- typedef typename Sequence::difference_type difference_type;
- typedef typename Sequence::reference reference;
- typedef typename Sequence::const_reference const_reference;
- typedef typename Sequence::pointer pointer;
-public:
- inline queue (void) : m_Storage (), m_Front (0) { }
- explicit inline queue (const Sequence& s) : m_Storage (s), m_Front (0) { }
- inline size_type size (void) const { return (m_Storage.size() - m_Front); }
- inline bool empty (void) const { return (!size()); }
- inline reference front (void) { return (m_Storage [m_Front]); }
- inline const_reference front (void) const { return (m_Storage [m_Front]); }
- inline reference back (void) { return (m_Storage.back()); }
- inline const_reference back (void) const { return (m_Storage.back()); }
- inline void push (const value_type& v);
- inline void pop (void);
- inline bool operator== (const queue& s) { return (m_Storage == s.m_Storage && m_Front == s.m_Front); }
- inline bool operator< (const queue& s) { return (size() < s.size()); }
-private:
- Sequence m_Storage; ///< Where the data actually is.
- size_type m_Front; ///< Index of the element returned by next pop.
-};
-
-/// Pushes \p v on the queue.
-template <class Sequence>
-inline void queue<Sequence>::push (const value_type& v)
-{
- if (m_Front) {
- m_Storage.erase (m_Storage.begin(), m_Front);
- m_Front = 0;
- }
- m_Storage.push_back (v);
-}
-
-/// Pops the topmost element from the queue.
-template <class Sequence>
-inline void queue<Sequence>::pop (void)
-{
- if (++m_Front >= m_Storage.size())
- m_Storage.resize (m_Front = 0);
-}
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uset.h b/media/libdrm/mobile2/src/util/ustl-1.0/uset.h
deleted file mode 100644
index 958d4b0..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uset.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uset.h
-//
-
-#ifndef USET_H_45543F516E02A87A3FCEA5024052A6F5
-#define USET_H_45543F516E02A87A3FCEA5024052A6F5
-
-#include "uassert.h"
-#include "uvector.h"
-
-namespace ustl {
-
-/// \class set uset.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief Unique sorted container. Sorted vector with all values unique.
-///
-template <typename T>
-class set : public vector<T> {
-public:
- typedef const set<T>& rcself_t;
- typedef vector<T> base_class;
- typedef typename base_class::value_type key_type;
- typedef typename base_class::value_type data_type;
- typedef typename base_class::value_type value_type;
- typedef typename base_class::size_type size_type;
- typedef typename base_class::pointer pointer;
- typedef typename base_class::const_pointer const_pointer;
- typedef typename base_class::reference reference;
- typedef typename base_class::const_reference const_reference;
- typedef typename base_class::const_iterator const_iterator;
- typedef typename base_class::iterator iterator;
- typedef typename base_class::reverse_iterator reverse_iterator;
- typedef typename base_class::const_reverse_iterator const_reverse_iterator;
-public:
- inline set (void) : vector<T> () { }
- explicit inline set (size_type n) : vector<T> (n) { }
- inline set (rcself_t v) : vector<T> (v) { }
- inline set (const_iterator i1, const_iterator i2) : vector<T> () { insert (i1, i2); }
- inline rcself_t operator= (rcself_t v) { base_class::operator= (v); return (*this); }
- inline size_type size (void) const { return (base_class::size()); }
- inline iterator begin (void) { return (base_class::begin()); }
- inline const_iterator begin (void) const { return (base_class::begin()); }
- inline iterator end (void) { return (base_class::end()); }
- inline const_iterator end (void) const { return (base_class::end()); }
- inline void assign (const_iterator i1, const_iterator i2) { clear(); insert (i1, i2); }
- inline void push_back (const_reference v) { insert (v); }
- inline const_iterator find (const_reference v) const { return (binary_search (begin(), end(), v)); }
- inline iterator find (const_reference v) { return (const_cast<iterator>(const_cast<rcself_t>(*this).find (v))); }
- iterator insert (const_reference v);
- inline void insert (const_iterator i1, const_iterator i2);
- inline void erase (const_reference v);
- inline iterator erase (iterator ep) { return (base_class::erase (ep)); }
- inline iterator erase (iterator ep1, iterator ep2) { return (base_class::erase (ep1, ep2)); }
- inline void clear (void) { base_class::clear(); }
-};
-
-/// Inserts \p v into the container, maintaining the sort order.
-template <typename T>
-typename set<T>::iterator set<T>::insert (const_reference v)
-{
- iterator ip = lower_bound (begin(), end(), v);
- if (ip == end() || v < *ip)
- ip = base_class::insert (ip, v);
- else
- *ip = v;
- return (ip);
-}
-
-/// Inserts the contents of range [i1,i2)
-template <typename T>
-void set<T>::insert (const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- reserve (size() + distance (i1, i2));
- for (; i1 < i2; ++i1)
- push_back (*i1);
-}
-
-/// Erases the element with value \p v.
-template <typename T>
-inline void set<T>::erase (const_reference v)
-{
- iterator ip = find (v);
- if (ip != end())
- erase (ip);
-}
-
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uspecial.h b/media/libdrm/mobile2/src/util/ustl-1.0/uspecial.h
deleted file mode 100644
index 0b87a54..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uspecial.h
+++ /dev/null
@@ -1,267 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uspecial.h
-//
-// Template specializations for uSTL classes.
-//
-
-#ifndef USPECIAL_H_947ADYOU0ARE3YOU2REALLY8ARE44CE0
-#define USPECIAL_H_947ADYOU0ARE3YOU2REALLY8ARE44CE0
-
-#include "uassert.h"
-#include "uvector.h"
-#include "ustring.h"
-#include "uset.h"
-#include "umultiset.h"
-#include "ubitset.h"
-#include "ulaalgo.h"
-#include "uctralgo.h"
-#include "ufunction.h"
-#include "uctrstrm.h"
-#include "sistream.h"
-#include <ctype.h>
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-// Alogrithm specializations not in use by the library code.
-//----------------------------------------------------------------------
-
-template <> inline void swap (cmemlink& a, cmemlink& b) { a.swap (b); }
-template <> inline void swap (memlink& a, memlink& b) { a.swap (b); }
-template <> inline void swap (memblock& a, memblock& b) { a.swap (b); }
-template <> inline void swap (string& a, string& b) { a.swap (b); }
-#define TEMPLATE_SWAP_PSPEC(type, template_decl) \
-template_decl inline void swap (type& a, type& b) { a.swap (b); }
-TEMPLATE_SWAP_PSPEC (TEMPLATE_TYPE1 (vector,T), TEMPLATE_DECL1 (T))
-TEMPLATE_SWAP_PSPEC (TEMPLATE_TYPE1 (set,T), TEMPLATE_DECL1 (T))
-TEMPLATE_SWAP_PSPEC (TEMPLATE_TYPE1 (multiset,T), TEMPLATE_DECL1 (T))
-TEMPLATE_SWAP_PSPEC (TEMPLATE_TYPE2 (tuple,N,T), TEMPLATE_FULL_DECL2 (size_t,N,typename,T))
-
-//----------------------------------------------------------------------
-// Streamable definitions. Not used in the library and require streams.
-//----------------------------------------------------------------------
-
-//----{ pair }----------------------------------------------------------
-
-/// \brief Reads pair \p p from stream \p is.
-template <typename T1, typename T2>
-istream& operator>> (istream& is, pair<T1,T2>& p)
-{
- is >> p.first;
- is.align (alignof(T2()));
- is >> p.second;
- is.align (alignof(T1()));
- return (is);
-}
-
-/// Writes pair \p p to stream \p os.
-template <typename T1, typename T2>
-ostream& operator<< (ostream& os, const pair<T1,T2>& p)
-{
- os << p.first;
- os.align (alignof(T2()));
- os << p.second;
- os.align (alignof(T1()));
- return (os);
-}
-
-/// Writes pair \p p to stream \p os.
-template <typename T1, typename T2>
-ostringstream& operator<< (ostringstream& os, const pair<T1,T2>& p)
-{
- os << '(' << p.first << ',' << p.second << ')';
- return (os);
-}
-
-/// Returns the written size of the object.
-template <typename T1, typename T2>
-inline size_t stream_size_of (const pair<T1,T2>& v)
-{
- return (Align (stream_size_of(v.first), alignof(T2())) +
- Align (stream_size_of(v.second), alignof(T1())));
-}
-
-/// \brief Takes a pair and returns pair.first
-/// This is an extension, available in uSTL and the SGI STL.
-template <typename Pair> struct select1st : public unary_function<Pair,typename Pair::first_type> {
- typedef typename Pair::first_type result_type;
- inline const result_type& operator()(const Pair& a) const { return (a.first); }
- inline result_type& operator()(Pair& a) const { return (a.first); }
-};
-
-/// \brief Takes a pair and returns pair.second
-/// This is an extension, available in uSTL and the SGI STL.
-template <typename Pair> struct select2nd : public unary_function<Pair,typename Pair::second_type> {
- typedef typename Pair::second_type result_type;
- inline const result_type& operator()(const Pair& a) const { return (a.second); }
- inline result_type& operator()(Pair& a) const { return (a.second); }
-};
-
-/// \brief Converts a const_iterator pair into an iterator pair
-/// Useful for converting pair ranges returned by equal_range, for instance.
-/// This is an extension, available in uSTL.
-template <typename Container>
-inline pair<typename Container::iterator, typename Container::iterator>
-unconst (const pair<typename Container::const_iterator, typename Container::const_iterator>& i, Container& ctr)
-{
- assert (i.first >= ctr.begin() && i.first <= ctr.end() && "unconst algorithm must be given iterators from the argument container");
- pair<typename Container::iterator, typename Container::iterator> result;
- result.first = ctr.begin() + (i.first - ctr.begin());
- result.second = ctr.begin() + (i.second - ctr.begin());
- return (result);
-}
-
-//----{ vector }--------------------------------------------------------
-
-STD_TEMPLATE_CTR_STREAMABLE (TEMPLATE_TYPE1 (vector,T), TEMPLATE_DECL1 (T))
-
-template <typename T>
-inline size_t alignof (const vector<T>&)
-{
- typedef typename vector<T>::written_size_type written_size_type;
- return (alignof (written_size_type()));
-}
-
-//----{ bitset }--------------------------------------------------------
-
-/// Reads bitset \p v from stream \p is.
-template <size_t Size>
-inline istream& operator>> (istream& is, bitset<Size>& v)
-{
- return (nr_container_read (is, v));
-}
-
-/// Writes bitset \p v into stream \p os.
-template <size_t Size>
-inline ostream& operator<< (ostream& os, const bitset<Size>& v)
-{
- return (nr_container_write (os, v));
-}
-
-/// Writes bitset \p v into stream \p os.
-template <size_t Size>
-inline ostringstream& operator<< (ostringstream& os, const bitset<Size>& v)
-{
- return (os << v.to_string());
-}
-
-/// Writes bitset \p v into stream \p os.
-template <size_t Size>
-istringstream& operator>> (istringstream& is, bitset<Size>& v)
-{
- char c;
- for (int i = Size; --i >= 0 && (is >> c).good();)
- v.set (i, c == '1');
- return (is);
-}
-
-/// Returns the number of bytes necessary to write this object to a stream
-template <size_t Size>
-inline size_t stream_size_of (const bitset<Size>& v)
-{
- return (v.capacity() / CHAR_BIT);
-}
-
-//----{ tuple }---------------------------------------------------------
-
-STD_TEMPLATE_NR_CTR_STREAMABLE (
- TEMPLATE_TYPE2 (tuple,N,T),
- TEMPLATE_FULL_DECL2 (size_t,N,typename,T)
-)
-
-template <size_t N, typename T>
-struct numeric_limits<tuple<N,T> > {
- typedef numeric_limits<T> value_limits;
- static inline tuple<N,T> min (void) { tuple<N,T> v; fill (v, value_limits::min()); return (v); }
- static inline tuple<N,T> max (void) { tuple<N,T> v; fill (v, value_limits::max()); return (v); }
- static const bool is_signed = value_limits::is_signed;
- static const bool is_integer = value_limits::is_integer;
- static const bool is_integral = value_limits::is_integral;
-};
-
-template <size_t N, typename T>
-inline size_t alignof (const tuple<N,T>&) { return (alignof (T())); }
-
-template <typename T, typename IntT>
-inline ostringstream& chartype_text_write (ostringstream& os, const T& v)
-{
- if (isprint(v))
- os << '\'' << v << '\'';
- else
- os << (IntT)(v);
- return (os);
-}
-
-template <>
-inline ostringstream& container_element_text_write (ostringstream& os, const uint8_t& v)
-{ return (chartype_text_write<uint8_t, unsigned int> (os, v)); }
-template <>
-inline ostringstream& container_element_text_write (ostringstream& os, const int8_t& v)
-{ return (chartype_text_write<int8_t, int> (os, v)); }
-
-//----{ matrix }--------------------------------------------------------
-
-/// Writes tuple \p v into stream \p os.
-template <size_t NX, size_t NY, typename T>
-ostringstream& operator<< (ostringstream& os, const matrix<NX,NY,T>& v)
-{
- os << '(';
- for (uoff_t row = 0; row < NY; ++ row) {
- os << '(';
- for (uoff_t column = 0; column < NX; ++ column) {
- os << v[row][column];
- if (column < NX - 1)
- os << ',';
- }
- os << ')';
- }
- os << ')';
- return (os);
-}
-
-//----------------------------------------------------------------------
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-#ifndef WITHOUT_LIBSTDCPP
-
-/// \todo Need a better solution to getting the hash value.
-inline hashvalue_t hash_value (const string::const_pointer& v)
-{
- string::const_pointer first (v), last (v + strlen(v));
- hashvalue_t h = 0;
- // This has the bits flowing into each other from both sides of the number
- for (; first < last; ++ first)
- h = *first + ((h << 7) | (h >> BitsInType(hashvalue_t) - 7));
- return (h);
-}
-
-#endif
-#endif
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-// This is here because there really is no other place to put it.
-#if SIZE_OF_BOOL != SIZE_OF_CHAR
-// bool is a big type on some machines (like DEC Alpha), so it's written as a byte.
-ALIGNOF(bool, sizeof(uint8_t))
-#endif
-STD_STREAMABLE(cmemlink)
-STD_STREAMABLE(istream)
-STD_STREAMABLE(ostream)
-STD_STREAMABLE(string)
-STD_STREAMABLE(exception)
-STD_STREAMABLE(CBacktrace)
-TEXT_STREAMABLE(cmemlink)
-TEXT_STREAMABLE(istream)
-TEXT_STREAMABLE(ostream)
-TEXT_STREAMABLE(exception)
-TEXT_STREAMABLE(CBacktrace)
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustack.h b/media/libdrm/mobile2/src/util/ustl-1.0/ustack.h
deleted file mode 100644
index c48e3b3..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustack.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ustack.h
-//
-
-#ifndef USTACK_H_5242F5635322B2EC44A9AEE73022C6E9
-#define USTACK_H_5242F5635322B2EC44A9AEE73022C6E9
-
-namespace ustl {
-
-/// \class stack ustack.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief Stack adapter to uSTL containers.
-///
-template <typename Sequence>
-class stack {
-public:
- typedef typename Sequence::value_type value_type;
- typedef typename Sequence::size_type size_type;
- typedef typename Sequence::difference_type difference_type;
- typedef typename Sequence::reference reference;
- typedef typename Sequence::const_reference const_reference;
- typedef typename Sequence::pointer pointer;
-public:
- inline stack (void) : m_Storage () { }
- explicit inline stack (const Sequence& s) : m_Storage (s) { }
- inline bool empty (void) const { return (m_Storage.empty()); }
- inline size_type size (void) const { return (m_Storage.size()); }
- inline reference top (void) { return (m_Storage.back()); }
- inline const_reference top (void) const { return (m_Storage.back()); }
- inline void push (const value_type& v) { m_Storage.push_back (v); }
- inline void pop (void) { m_Storage.pop_back(); }
- inline bool operator== (const stack& s) { return (m_Storage == s.m_Storage); }
- inline bool operator< (const stack& s) { return (m_Storage.size() < s.m_Storage.size()); }
-private:
- Sequence m_Storage; ///< Where the data actually is.
-};
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.cpp
deleted file mode 100644
index ce731f7..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ustdxept.cc
-//
-
-#include "ustdxept.h"
-#include "mistream.h"
-#include "mostream.h"
-#include "strmsize.h"
-#include "uiosfunc.h"
-#include "uspecial.h"
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-/// \p arg contains a description of the error.
-error_message::error_message (const char* arg) throw()
-: m_Arg ()
-{
-#if PLATFORM_ANDROID
- m_Arg = arg;
-#else /* !PLATFORM_ANDROID */
- try { m_Arg = arg; } catch (...) {}
-#endif
- set_format (xfmt_ErrorMessage);
-}
-
-/// Virtual destructor
-error_message::~error_message (void) throw()
-{
-}
-
-/// Returns a descriptive error message. fmt="%s: %s"
-void error_message::info (string& msgbuf, const char* fmt) const throw()
-{
- if (!fmt) fmt = "%s: %s";
-#if PLATFORM_ANDROID
- msgbuf.format (fmt, what(), m_Arg.cdata());
-#else /* !PLATFORM_ANDROID */
- try { msgbuf.format (fmt, what(), m_Arg.cdata()); } catch (...) {}
-#endif
-}
-
-/// Reads the object from stream \p is.
-void error_message::read (istream& is)
-{
- exception::read (is);
- is >> m_Arg >> ios::align();
-}
-
-/// Writes the object to stream \p os.
-void error_message::write (ostream& os) const
-{
- exception::write (os);
- os << m_Arg << ios::align();
-}
-
-/// Returns the size of the written object.
-size_t error_message::stream_size (void) const
-{
- return (exception::stream_size() + Align (stream_size_of (m_Arg)));
-}
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.h b/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.h
deleted file mode 100644
index 4f50953..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustdxept.h
+++ /dev/null
@@ -1,143 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ustdxept.h
-//
-
-#ifndef USTDXEPT_H_46F7AE967738B588038F95E41158D7FF
-#define USTDXEPT_H_46F7AE967738B588038F95E41158D7FF
-
-#include "uexception.h"
-#include "ustring.h"
-
-namespace ustl {
-
-enum {
- xfmt_ErrorMessage = 2,
- xfmt_LogicError = xfmt_ErrorMessage,
- xfmt_RuntimeError = xfmt_ErrorMessage
-};
-
-/// \class logic_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Logic errors represent problems in the internal logic of the program.
-///
-class error_message : public exception {
-public:
- explicit error_message (const char* arg) throw();
- virtual ~error_message (void) throw();
- inline virtual const char* what (void) const throw() { return ("error"); }
- virtual void info (string& msgbuf, const char* fmt = NULL) const throw();
- virtual void read (istream& is);
- virtual void write (ostream& os) const;
- virtual size_t stream_size (void) const;
-protected:
- string m_Arg;
-};
-
-/// \class logic_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Logic errors represent problems in the internal logic of the program.
-///
-class logic_error : public error_message {
-public:
- inline explicit logic_error (const char* arg) throw() : error_message (arg) {}
- inline virtual const char* what (void) const throw() { return ("logic error"); }
-};
-
-/// \class domain_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports domain errors ("domain" is in the mathematical sense)
-///
-class domain_error : public logic_error {
-public:
- inline explicit domain_error (const char* arg) throw() : logic_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("domain error"); }
-};
-
-/// \class invalid_argument ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports an invalid argument to a function.
-///
-class invalid_argument : public logic_error {
-public:
- inline explicit invalid_argument (const char* arg) throw() : logic_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("invalid argument"); }
-};
-
-/// \class length_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports when an object exceeds its allowed size.
-///
-class length_error : public logic_error {
-public:
- inline explicit length_error (const char* arg) throw() : logic_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("length error"); }
-};
-
-/// \class out_of_range ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports arguments with values out of allowed range.
-///
-class out_of_range : public logic_error {
-public:
- inline explicit out_of_range (const char* arg) throw() : logic_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("out of range"); }
-};
-
-/// \class runtime_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports errors that are dependent on the data being processed.
-///
-class runtime_error : public error_message {
-public:
- inline explicit runtime_error (const char* arg) throw() : error_message (arg) {}
- inline virtual const char* what (void) const throw() { return ("runtime error"); }
-};
-
-/// \class range_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports data that does not fall within the permitted range.
-///
-class range_error : public runtime_error {
-public:
- inline explicit range_error (const char* arg) throw() : runtime_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("range error"); }
-};
-
-/// \class overflow_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports arithmetic overflow.
-///
-class overflow_error : public runtime_error {
-public:
- inline explicit overflow_error (const char* arg) throw() : runtime_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("overflow error"); }
-};
-
-/// \class underflow_error ustdxept.h ustl.h
-/// \ingroup Exceptions
-///
-/// \brief Reports arithmetic underflow.
-///
-class underflow_error : public runtime_error {
-public:
- inline explicit underflow_error (const char* arg) throw() : runtime_error (arg) {}
- inline virtual const char* what (void) const throw() { return ("underflow error"); }
-};
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustl.tbff b/media/libdrm/mobile2/src/util/ustl-1.0/ustl.tbff
deleted file mode 100644
index b8ad374..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustl.tbff
+++ /dev/null
@@ -1,84 +0,0 @@
-<!-- ANSI Standard fixed size types -->
-<type name=int8_t format=signedIntegral size=int8_t/>
-<type name=int16_t format=signedIntegral size=int16_t/>
-<type name=int32_t format=signedIntegral size=int32_t/>
-<type name=int64_t format=signedIntegral size=int64_t/>
-<type name=uint8_t format=integral size=int8_t/>
-<type name=uint16_t format=integral size=int16_t/>
-<type name=uint32_t format=integral size=int32_t/>
-<type name=uint64_t format=integral size=int64_t/>
-<type name=float format=float size=float/>
-<type name=double format=float size=double/>
-
-<!-- Standard types of variable size, these are machine specific -->
-<type name=int_least8_t format=signedIntegral size=int8_t/>
-<type name=int_least16_t format=signedIntegral size=int16_t/>
-<type name=int_least32_t format=signedIntegral size=int32_t/>
-<type name=int_least64_t format=signedIntegral size=int64_t/>
-<type name=uint_least8_t format=integral size=int8_t/>
-<type name=uint_least16_t format=integral size=int16_t/>
-<type name=uint_least32_t format=integral size=int32_t/>
-<type name=uint_least64_t format=integral size=int64_t/>
-<type name=int_fast8_t format=signedIntegral size=int8_t/>
-<type name=int_fast16_t format=signedIntegral size=int16_t/>
-<type name=int_fast32_t format=signedIntegral size=int32_t/>
-<type name=int_fast64_t format=signedIntegral size=int64_t/>
-<type name=uint_fast8_t format=integral size=int8_t/>
-<type name=uint_fast16_t format=integral size=int16_t/>
-<type name=uint_fast32_t format=integral size=int32_t/>
-<type name=uint_fast64_t format=integral size=int64_t/>
-<type name=intptr_t format=integral size=intptr_t/>
-<type name=uintptr_t format=integral size=intptr_t/>
-<type name=intmax_t format=integral size=intmax_t/>
-<type name=uintmax_t format=integral size=intmax_t/>
-
-<!-- Standard C++ variable size types, also machine specific -->
-<type name=wchar_t format=signedIntegral size=wchar_t/>
-<type name=size_t format=integral size=size_t/>
-<type name=char format=signedIntegral size=char/>
-<type name=short format=signedIntegral size=short/>
-<type name=int format=signedIntegral size=int/>
-<type name=long format=signedIntegral size=long/>
-<type name=longlong format=signedIntegral size=longlong/>
-<type name=u_char format=signedIntegral size=char/>
-<type name=u_short format=signedIntegral size=short/>
-<type name=u_int format=signedIntegral size=int/>
-<type name=u_long format=signedIntegral size=long/>
-<type name=u_longlong format=signedIntegral size=longlong/>
-
-<!-- libc types -->
-<type name=time_t format=signedIntegral size=time_t/>
-<type name=off_t format=signedIntegral size=off_t/>
-<type name=ptrdiff_t format=signedIntegral size=ptrdiff_t/>
-<type name=dev_t format=integral size=dev_t/>
-<type name=uid_t format=integral size=uid_t/>
-<type name=gid_t format=integral size=gid_t/>
-<type name=mode_t format=integral size=mode_t/>
-<type name=nlink_t format=integral size=nlink_t/>
-<type name=pid_t format=integral size=pid_t/>
-<type name=fsid_t format=integral size=fsid_t/>
-<type name=clock_t format=integral size=clock_t/>
-<type name=id_t format=integral size=id_t/>
-<type name=key_t format=integral size=key_t/>
-<type name=blksize_t format=integral size=blksize_t/>
-
-<!-- Types within the ustl library -->
-<type name=utf8 format=integral minSize="1" maxSize="8"/>
-<type name=auto format=unstructured id="AUTO"/>
-<namespace name=ustl>
- <type name=uoff_t extends=size_t/>
- <type name=cmemlink_ptr_t format=pointer/>
- <type name=memlink_ptr_t extends=cmemlink_ptr_t/>
- <type name=memblock_ptr_t extends=memlink_ptr_t/>
- <type name=cmemlink format=struct>
- <var name=data_size type=size_t />
- <var name=data format=unstructured size=data_size />
- </type>
- <type name=memlink extends=cmemlink />
- <type name=memblock extends=cmemlink />
- <type name=string extends=memblock>
- <var name=data_size type=utf8 />
- <var name=data format=array type=utf8 size=data_size />
- </type>
-</namespace>
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustring.cpp b/media/libdrm/mobile2/src/util/ustl-1.0/ustring.cpp
deleted file mode 100644
index db87d34..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustring.cpp
+++ /dev/null
@@ -1,425 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ustring.cpp
-//
-// STL basic_string equivalent functionality.
-//
-
-#include "uassert.h"
-#include "ustring.h"
-#include "mistream.h"
-#include "mostream.h"
-#include "ualgo.h"
-#include <stdio.h> // for vsnprintf (in string::format)
-
-#include "uassert.h"
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-const uoff_t string::npos;
-const string::size_type string::size_Terminator;
-const string::value_type string::c_Terminator;
-const char string::empty_string[string::size_Terminator] = "";
-
-typedef utf8in_iterator<string::const_iterator> utf8icstring_iterator;
-typedef utf8in_iterator<string::iterator> utf8istring_iterator;
-typedef utf8out_iterator<string::iterator> utf8ostring_iterator;
-
-//----------------------------------------------------------------------
-
-/// Creates an empty string.
-string::string (void)
-: memblock ()
-{
- link (empty_string, 0U);
-}
-
-/// Assigns itself the value of string \p s
-string::string (const string& s)
-: memblock()
-{
- if (s.is_linked())
- link (s.c_str(), s.size());
- else
- assign (s);
-}
-
-/// Links to \p s
-string::string (const_pointer s)
-: memblock ()
-{
- if (!s)
- s = empty_string;
- link (s, strlen(s));
-}
-
-/// Creates a string of length \p n filled with character \p c.
-string::string (size_type n, value_type c)
-: memblock ()
-{
- resize (n);
- fill_n (begin(), n, c);
-}
-
-/// Resize the string to \p n characters. New space contents is undefined.
-void string::resize (size_type n)
-{
- memblock::resize (n);
- at(n) = c_Terminator;
-}
-
-/// Assigns itself the value of string \p s
-void string::assign (const_pointer s)
-{
- if (!s)
- s = empty_string;
- assign (s, strlen (s));
-}
-
-/// Assigns itself the value of string \p s of length \p len.
-void string::assign (const_pointer s, size_type len)
-{
- while (len && s[len - 1] == c_Terminator)
- -- len;
- resize (len);
- copy (s, len);
-}
-
-/// Appends to itself the value of string \p s of length \p len.
-void string::append (const_pointer s)
-{
- if (!s)
- s = empty_string;
- append (s, strlen (s));
-}
-
-/// Appends to itself the value of string \p s of length \p len.
-void string::append (const_pointer s, size_type len)
-{
- while (len && s[len - 1] == c_Terminator)
- -- len;
- resize (size() + len);
- copy_n (s, len, end() - len);
-}
-
-/// Appends to itself \p n characters of value \p c.
-void string::append (size_type n, value_type c)
-{
- resize (size() + n);
- fill_n (end() - n, n, c);
-}
-
-/// Copies into itself at offset \p start, the value of string \p p of length \p n.
-string::size_type string::copyto (pointer p, size_type n, const_iterator start) const
-{
- assert (p && n);
- if (!start)
- start = begin();
- const size_type btc = min(n - size_Terminator, size());
- copy_n (start, btc, p);
- p[btc] = c_Terminator;
- return (btc + size_Terminator);
-}
-
-/// Returns comparison value regarding string \p s.
-/// The return value is:
-/// \li 1 if this string is greater (by value, not length) than string \p s
-/// \li 0 if this string is equal to string \p s
-/// \li -1 if this string is less than string \p s
-///
-/*static*/ int string::compare (const_iterator first1, const_iterator last1, const_iterator first2, const_iterator last2)
-{
- assert (first1 <= last1 && (first2 <= last2 || !last2) && "Negative ranges result in memory allocation errors.");
- const size_type len1 = distance (first1, last1), len2 = distance (first2, last2);
- const int rvbylen = sign (int(len1 - len2));
- int rv = memcmp (first1, first2, min (len1, len2));
- return (rv ? rv : rvbylen);
-}
-
-/// Returns true if this string is equal to string \p s.
-bool string::operator== (const_pointer s) const
-{
- if (!s)
- s = empty_string;
- return (size() == strlen(s) && 0 == memcmp (c_str(), s, size()));
-}
-
-/// Returns the beginning of character \p i.
-string::iterator string::utf8_iat (uoff_t i)
-{
- utf8istring_iterator cfinder (begin());
- cfinder += i;
- return (cfinder.base());
-}
-
-/// Inserts wide character \p c at \p ip \p n times as a UTF-8 string.
-///
-/// \p ip is a character position, not a byte position, and must fall in
-/// the 0 through length() range.
-/// The first argument is not an iterator because it is rather difficult
-/// to get one. You'd have to use ((utf8begin() + n).base()) as the first
-/// argument, which is rather ugly. Besides, then this insert would be
-/// ambiguous with the regular character insert.
-///
-void string::insert (const uoff_t ip, wchar_t c, size_type n)
-{
- iterator ipp (utf8_iat (ip));
- ipp = iterator (memblock::insert (memblock::iterator(ipp), n * Utf8Bytes(c)));
- fill_n (utf8out (ipp), n, c);
- *end() = c_Terminator;
-}
-
-/// Inserts sequence of wide characters at \p ip.
-void string::insert (const uoff_t ip, const wchar_t* first, const wchar_t* last, const size_type n)
-{
- iterator ipp (utf8_iat (ip));
- size_type nti = distance (first, last), bti = 0;
- for (uoff_t i = 0; i < nti; ++ i)
- bti += Utf8Bytes(first[i]);
- ipp = iterator (memblock::insert (memblock::iterator(ipp), n * bti));
- utf8ostring_iterator uout (utf8out (ipp));
- for (uoff_t j = 0; j < n; ++ j)
- for (uoff_t k = 0; k < nti; ++ k, ++ uout)
- *uout = first[k];
- *end() = c_Terminator;
-}
-
-/// Inserts character \p c into this string at \p start.
-string::iterator string::insert (iterator start, const_reference c, size_type n)
-{
- start = iterator (memblock::insert (memblock::iterator(start), n));
- fill_n (start, n, c);
- *end() = c_Terminator;
- return (start);
-}
-
-/// Inserts \p count instances of string \p s at offset \p start.
-string::iterator string::insert (iterator start, const_pointer s, size_type n)
-{
- if (!s)
- s = empty_string;
- return (insert (start, s, s + strlen(s), n));
-}
-
-/// Inserts [first,last] \p n times.
-string::iterator string::insert (iterator start, const_pointer first, const_pointer last, size_type n)
-{
- assert (first <= last);
- assert (begin() <= start && end() >= start);
- assert ((first < begin() || first >= end() || size() + abs_distance(first,last) < capacity()) && "Insertion of self with autoresize is not supported");
- start = iterator (memblock::insert (memblock::iterator(start), distance(first, last) * n));
- fill (memblock::iterator(start), first, distance(first, last), n);
- *end() = c_Terminator;
- return (start);
-}
-
-/// Erases \p size bytes at \p start.
-string::iterator string::erase (iterator ep, size_type n)
-{
- string::iterator rv = memblock::erase (memblock::iterator(ep), n);
- *end() = c_Terminator;
- return (rv);
-}
-
-/// Erases \p size characters at \p start.
-/// \p start is a character position, not a byte position, and must be
-/// in the 0..length() range.
-///
-void string::erase (uoff_t ep, size_type n)
-{
- iterator first (utf8_iat(ep));
- size_t nbytes (utf8_iat(ep + n) - first);
- memblock::erase (first, nbytes);
- *end() = c_Terminator;
-}
-
-/// Replaces range [\p start, \p start + \p len] with string \p s.
-void string::replace (iterator first, iterator last, const_pointer s)
-{
- if (!s)
- s = empty_string;
- replace (first, last, s, s + strlen(s));
-}
-
-/// Replaces range [\p start, \p start + \p len] with \p count instances of string \p s.
-void string::replace (iterator first, iterator last, const_pointer i1, const_pointer i2, size_type n)
-{
- assert (first <= last);
- assert (n || distance(first, last));
- assert (first >= begin() && first <= end() && last >= first && last <= end());
- assert ((i1 < begin() || i1 >= end() || abs_distance(i1,i2) * n + size() < capacity()) && "Replacement by self can not autoresize");
- const size_type bte = distance(first, last), bti = distance(i1, i2) * n;
- if (bti < bte)
- first = iterator (memblock::erase (memblock::iterator(first), bte - bti));
- else if (bte < bti)
- first = iterator (memblock::insert (memblock::iterator(first), bti - bte));
- fill (memblock::iterator(first), i1, distance(i1, i2), n);
- *end() = c_Terminator;
-}
-
-/// Returns the offset of the first occurence of \p c after \p pos.
-uoff_t string::find (const_reference c, uoff_t pos) const
-{
- const_iterator found = ::ustl::find (iat(pos), end(), c);
- return (found < end() ? distance(begin(),found) : npos);
-}
-
-/// Returns the offset of the first occurence of substring \p s of length \p n after \p pos.
-uoff_t string::find (const string& s, uoff_t pos) const
-{
- if (s.empty() || s.size() > size() - pos)
- return (npos);
- const uoff_t endi = s.size() - 1;
- const_reference endchar = s[endi];
- uoff_t lastPos = endi;
- while (lastPos-- && s[lastPos] != endchar);
- const size_type skip = endi - lastPos;
- const_iterator i = iat(pos) + endi;
- for (; i < end() && (i = ::ustl::find (i, end(), endchar)) < end(); i += skip)
- if (memcmp (i - endi, s.c_str(), s.size()) == 0)
- return (distance (begin(), i) - endi);
- return (npos);
-}
-
-/// Returns the offset of the last occurence of character \p c before \p pos.
-uoff_t string::rfind (const_reference c, uoff_t pos) const
-{
- for (int i = min(pos,size()-1); i >= 0; --i)
- if (at(i) == c)
- return (i);
- return (npos);
-}
-
-/// Returns the offset of the last occurence of substring \p s of size \p n before \p pos.
-uoff_t string::rfind (const string& s, uoff_t pos) const
-{
- const_iterator d = iat(pos) - 1;
- const_iterator sp = begin() + s.size() - 1;
- const_iterator m = s.end() - 1;
- for (uoff_t i = 0; d > sp && i < s.size(); -- d)
- for (i = 0; i < s.size(); ++ i)
- if (m[-i] != d[-i])
- break;
- return (d > sp ? distance (begin(), d + 2 - s.size()) : npos);
-}
-
-/// Returns the offset of the first occurence of one of characters in \p s of size \p n after \p pos.
-uoff_t string::find_first_of (const string& s, uoff_t pos) const
-{
- for (uoff_t i = min(pos,size()); i < size(); ++ i)
- if (s.find (at(i)) != npos)
- return (i);
- return (npos);
-}
-
-/// Returns the offset of the first occurence of one of characters not in \p s of size \p n after \p pos.
-uoff_t string::find_first_not_of (const string& s, uoff_t pos) const
-{
- for (uoff_t i = min(pos,size()); i < size(); ++ i)
- if (s.find (at(i)) == npos)
- return (i);
- return (npos);
-}
-
-/// Returns the offset of the last occurence of one of characters in \p s of size \p n before \p pos.
-uoff_t string::find_last_of (const string& s, uoff_t pos) const
-{
- for (int i = min(pos,size()-1); i >= 0; -- i)
- if (s.find (at(i)) != npos)
- return (i);
- return (npos);
-}
-
-/// Returns the offset of the last occurence of one of characters not in \p s of size \p n before \p pos.
-uoff_t string::find_last_not_of (const string& s, uoff_t pos) const
-{
- for (int i = min(pos,size()-1); i >= 0; -- i)
- if (s.find (at(i)) == npos)
- return (i);
- return (npos);
-}
-
-/// Equivalent to a vsprintf on the string.
-int string::vformat (const char* fmt, va_list args)
-{
-#if HAVE_VA_COPY
- va_list args2;
-#else
- #define args2 args
- #undef __va_copy
- #define __va_copy(x,y)
-#endif
- size_t rv = size();
- do {
- reserve (rv);
- __va_copy (args2, args);
- rv = vsnprintf (data(), memblock::capacity(), fmt, args2);
- rv = min (rv, memblock::capacity());
- } while (rv > capacity());
- resize (min (rv, capacity()));
- return (rv);
-}
-
-/// Equivalent to a sprintf on the string.
-int string::format (const char* fmt, ...)
-{
- va_list args;
- va_start (args, fmt);
- const int rv = vformat (fmt, args);
- va_end (args);
- return (rv);
-}
-
-/// Returns the number of bytes required to write this object to a stream.
-size_t string::stream_size (void) const
-{
- return (Utf8Bytes(size()) + size());
-}
-
-/// Reads the object from stream \p os
-void string::read (istream& is)
-{
- char szbuf [8];
- is >> szbuf[0];
- size_t szsz (Utf8SequenceBytes (szbuf[0]) - 1), n = 0;
- is.verify_remaining ("read", "ustl::string", szsz);
- is.read (szbuf + 1, szsz);
- n = *utf8in(szbuf);
- is.verify_remaining ("read", "ustl::string", n);
- resize (n);
- is.read (data(), size());
-}
-
-/// Writes the object to stream \p os
-void string::write (ostream& os) const
-{
- const written_size_type sz (size());
- assert (sz == size() && "No support for writing strings larger than 4G");
-
- char szbuf [8];
- utf8out_iterator<char*> szout (szbuf);
- *szout = sz;
- size_t szsz = distance (szbuf, szout.base());
-
- os.verify_remaining ("write", "ustl::string", szsz + sz);
- os.write (szbuf, szsz);
- os.write (cdata(), sz);
-}
-
-/// Returns a hash value for [first, last)
-/*static*/ hashvalue_t string::hash (const char* first, const char* last)
-{
- hashvalue_t h = 0;
- // This has the bits flowing into each other from both sides of the number
- for (; first < last; ++ first)
- h = *first + ((h << 7) | (h >> BitsInType(hashvalue_t) - 7));
- return (h);
-}
-
-} // namespace ustl
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/ustring.h b/media/libdrm/mobile2/src/util/ustl-1.0/ustring.h
deleted file mode 100644
index 9ecf6e7..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/ustring.h
+++ /dev/null
@@ -1,263 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// ustring.h
-//
-
-#ifndef USTRING_H_1249CB7A098A9010763AAC6D37B133CF
-#define USTRING_H_1249CB7A098A9010763AAC6D37B133CF
-
-#include "memblock.h"
-#include "utf8.h"
-#include <stdarg.h> // for va_list, va_start, and va_end (in string::format)
-
-namespace ustl {
-
-/// \class string ustring.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief STL basic_string<char> equivalent.
-///
-/// An STL container for text string manipulation.
-/// Differences from C++ standard:
-/// - string is a class, not a template. Wide characters are assumed to be
-/// encoded with utf8 at all times except when rendering or editing,
-/// where you would use a utf8 iterator.
-/// - format member function - you can, of course use an \ref ostringstream,
-/// which also have format functions, but most of the time this way
-/// is more convenient. Because uSTL does not implement locales,
-/// format is the only way to create localized strings.
-/// - const char* cast operator. It is much clearer to use this than having
-/// to type .c_str() every time.
-/// - length returns the number of _characters_, not bytes.
-/// This function is O(N), so use wisely.
-///
-class string : public memblock {
-public:
- typedef char value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef wchar_t wvalue_type;
- typedef wvalue_type* wpointer;
- typedef const wvalue_type* const_wpointer;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef value_type& reference;
- typedef value_type const_reference;
- typedef ::ustl::reverse_iterator<iterator> reverse_iterator;
- typedef ::ustl::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef utf8in_iterator<const_iterator> utf8_iterator;
-public:
- static const uoff_t npos = static_cast<uoff_t>(-1); ///< Value that means the end of string.
- static const value_type c_Terminator = 0; ///< String terminator
- static const size_type size_Terminator = sizeof(c_Terminator); ///< Most systems terminate strings with '\\0'
- static const char empty_string [size_Terminator]; ///< An empty string.
-public:
- string (void);
- string (const string& s);
- inline string (const string& s, uoff_t o, size_type n);
- inline explicit string (const cmemlink& l);
- string (const_pointer s);
- inline string (const_pointer s, size_type len);
- inline string (const_pointer s1, const_pointer s2);
- explicit string (size_type n, value_type c = c_Terminator);
- inline pointer data (void) { return (string::pointer (memblock::data())); }
- inline const_pointer c_str (void) const { return (string::const_pointer (memblock::cdata())); }
- inline size_type max_size (void) const { size_type s (memblock::max_size()); return (s - !!s); }
- inline size_type capacity (void) const { size_type c (memblock::capacity()); return (c - !!c); }
- void resize (size_type n);
- inline void clear (void) { resize (0); }
- inline const_iterator begin (void) const { return (const_iterator (memblock::begin())); }
- inline iterator begin (void) { return (iterator (memblock::begin())); }
- inline const_iterator end (void) const { return (const_iterator (memblock::end())); }
- inline iterator end (void) { return (iterator (memblock::end())); }
- inline const_reverse_iterator rbegin (void) const { return (const_reverse_iterator (end())); }
- inline reverse_iterator rbegin (void) { return (reverse_iterator (end())); }
- inline const_reverse_iterator rend (void) const { return (const_reverse_iterator (begin())); }
- inline reverse_iterator rend (void) { return (reverse_iterator (begin())); }
- inline utf8_iterator utf8_begin (void) const { return (utf8_iterator (begin())); }
- inline utf8_iterator utf8_end (void) const { return (utf8_iterator (end())); }
- inline const_reference at (uoff_t pos) const { assert (pos <= size() && begin()); return (begin()[pos]); }
- inline reference at (uoff_t pos) { assert (pos <= size() && begin()); return (begin()[pos]); }
- inline const_iterator iat (uoff_t pos) const { return (begin() + min (pos, size())); }
- inline iterator iat (uoff_t pos) { return (begin() + min (pos, size())); }
- inline size_type length (void) const { return (distance (utf8_begin(), utf8_end())); }
- inline void append (const_iterator i1, const_iterator i2) { append (i1, distance (i1, i2)); }
- void append (const_pointer s, size_type len);
- void append (const_pointer s);
- void append (size_type n, const_reference c);
- inline void append (size_type n, wvalue_type c) { insert (size(), c, n); }
- inline void append (const_wpointer s1, const_wpointer s2) { insert (size(), s1, s2); }
- inline void append (const_wpointer s) { const_wpointer se (s); for (;se&&*se;++se); append (s, se); }
- inline void append (const string& s) { append (s.begin(), s.end()); }
- inline void append (const string& s, uoff_t o, size_type n) { append (s.iat(o), s.iat(o+n)); }
- inline void assign (const_iterator i1, const_iterator i2) { assign (i1, distance (i1, i2)); }
- void assign (const_pointer s, size_type len);
- void assign (const_pointer s);
- inline void assign (const_wpointer s1, const_wpointer s2) { clear(); append (s1, s2); }
- inline void assign (const_wpointer s1) { clear(); append (s1); }
- inline void assign (const string& s) { assign (s.begin(), s.end()); }
- inline void assign (const string& s, uoff_t o, size_type n) { assign (s.iat(o), s.iat(o+n)); }
- size_type copyto (pointer p, size_type n, const_iterator start = NULL) const;
- inline int compare (const string& s) const { return (compare (begin(), end(), s.begin(), s.end())); }
- inline int compare (const_pointer s) const { return (compare (begin(), end(), s, s + strlen(s))); }
- static int compare (const_iterator first1, const_iterator last1, const_iterator first2, const_iterator last2);
- inline operator const value_type* (void) const;
- inline operator value_type* (void);
- inline const string& operator= (const string& s) { assign (s.begin(), s.end()); return (*this); }
- inline const string& operator= (const_reference c) { assign (&c, 1); return (*this); }
- inline const string& operator= (const_pointer s) { assign (s); return (*this); }
- inline const string& operator= (const_wpointer s) { assign (s); return (*this); }
- inline const string& operator+= (const string& s) { append (s.begin(), s.size()); return (*this); }
- inline const string& operator+= (const_reference c) { append (1, c); return (*this); }
- inline const string& operator+= (const_pointer s) { append (s); return (*this); }
- inline const string& operator+= (wvalue_type c) { append (1, c); return (*this); }
- inline const string& operator+= (const_wpointer s) { append (s); return (*this); }
- inline string operator+ (const string& s) const;
- inline bool operator== (const string& s) const { return (memblock::operator== (s)); }
- bool operator== (const_pointer s) const;
- inline bool operator== (const_reference c) const { return (size() == 1 && c == at(0)); }
- inline bool operator!= (const string& s) const { return (!operator== (s)); }
- inline bool operator!= (const_pointer s) const { return (!operator== (s)); }
- inline bool operator!= (const_reference c) const { return (!operator== (c)); }
- inline bool operator< (const string& s) const { return (0 > compare (s)); }
- inline bool operator< (const_pointer s) const { return (0 > compare (s)); }
- inline bool operator< (const_reference c) const { return (0 > compare (begin(), end(), &c, &c + 1)); }
- inline bool operator> (const_pointer s) const { return (0 < compare (s)); }
- void insert (const uoff_t ip, wvalue_type c, size_type n = 1);
- void insert (const uoff_t ip, const_wpointer first, const_wpointer last, const size_type n = 1);
- iterator insert (iterator start, const_reference c, size_type n = 1);
- iterator insert (iterator start, const_pointer s, size_type n = 1);
- iterator insert (iterator start, const_pointer first, const_iterator last, size_type n = 1);
- inline void insert (uoff_t ip, const_pointer s, size_type nlen) { insert (iat(ip), s, s + nlen); }
- inline void insert (uoff_t ip, size_type n, value_type c) { insert (iat(ip), c, n); }
- inline void insert (uoff_t ip, const string& s, uoff_t sp, size_type slen) { insert (iat(ip), s.iat(sp), s.iat(sp + slen)); }
- iterator erase (iterator start, size_type size = 1);
- void erase (uoff_t start, size_type size = 1);
- inline iterator erase (iterator first, const_iterator last) { return (erase (first, size_type(distance(first,last)))); }
- OVERLOAD_POINTER_AND_SIZE_T_V2(erase, iterator)
- inline void push_back (const_reference c) { append (1, c); }
- inline void push_back (wvalue_type c) { append (1, c); }
- inline void pop_back (void) { resize (size() - 1); }
- void replace (iterator first, iterator last, const_pointer s);
- void replace (iterator first, iterator last, const_pointer i1, const_pointer i2, size_type n = 1);
- inline void replace (iterator first, iterator last, const string& s) { replace (first, last, s.begin(), s.end()); }
- inline void replace (iterator first, iterator last, const_pointer s, size_type slen) { replace (first, last, s, s + slen); }
- inline void replace (iterator first, iterator last, size_type n, value_type c) { replace (first, last, &c, &c + 1, n); }
- inline void replace (uoff_t rp, size_type n, const string& s) { replace (iat(rp), iat(rp + n), s); }
- inline void replace (uoff_t rp, size_type n, const string& s, uoff_t sp, size_type slen) { replace (iat(rp), iat(rp + n), s.iat(sp), s.iat(sp + slen)); }
- inline void replace (uoff_t rp, size_type n, const_pointer s, size_type slen) { replace (iat(rp), iat(rp + n), s, s + slen); }
- inline void replace (uoff_t rp, size_type n, const_pointer s) { replace (iat(rp), iat(rp + n), string(s)); }
- inline void replace (uoff_t rp, size_type n, size_type count, value_type c) { replace (iat(rp), iat(rp + n), count, c); }
- inline string substr (uoff_t o, size_type n) const { return (string (*this, o, n)); }
- uoff_t find (const_reference c, uoff_t pos = 0) const;
- uoff_t find (const string& s, uoff_t pos = 0) const;
- uoff_t rfind (const_reference c, uoff_t pos = npos) const;
- uoff_t rfind (const string& s, uoff_t pos = npos) const;
- uoff_t find_first_of (const string& s, uoff_t pos = 0) const;
- uoff_t find_first_not_of (const string& s, uoff_t pos = 0) const;
- uoff_t find_last_of (const string& s, uoff_t pos = npos) const;
- uoff_t find_last_not_of (const string& s, uoff_t pos = npos) const;
- int vformat (const char* fmt, va_list args);
- int format (const char* fmt, ...) __attribute__((__format__(__printf__, 2, 3)));
- void read (istream&);
- void write (ostream& os) const;
- size_t stream_size (void) const;
- static hashvalue_t hash (const char* f1, const char* l1);
-private:
- DLL_LOCAL iterator utf8_iat (uoff_t i);
-protected:
- inline virtual size_type minimumFreeCapacity (void) const { return (size_Terminator); }
-};
-
-//----------------------------------------------------------------------
-
-/// Assigns itself the value of string \p s
-inline string::string (const cmemlink& s)
-: memblock ()
-{
- assign (const_iterator (s.begin()), s.size());
-}
-
-/// Assigns itself a [o,o+n) substring of \p s.
-inline string::string (const string& s, uoff_t o, size_type n)
-: memblock()
-{
- assign (s, o, n);
-}
-
-/// Copies the value of \p s of length \p len into itself.
-inline string::string (const_pointer s, size_type len)
-: memblock ()
-{
- assign (s, len);
-}
-
-/// Copies into itself the string data between \p s1 and \p s2
-inline string::string (const_pointer s1, const_pointer s2)
-: memblock ()
-{
- assert (s1 <= s2 && "Negative ranges result in memory allocation errors.");
- assign (s1, s2);
-}
-
-/// Returns the pointer to the first character.
-inline string::operator const string::value_type* (void) const
-{
- assert ((!end() || *end() == c_Terminator) && "This string is linked to data that is not 0-terminated. This may cause serious security problems. Please assign the data instead of linking.");
- return (begin());
-}
-
-/// Returns the pointer to the first character.
-inline string::operator string::value_type* (void)
-{
- assert ((end() && *end() == c_Terminator) && "This string is linked to data that is not 0-terminated. This may cause serious security problems. Please assign the data instead of linking.");
- return (begin());
-}
-
-/// Concatenates itself with \p s
-inline string string::operator+ (const string& s) const
-{
- string result (*this);
- result += s;
- return (result);
-}
-
-//----------------------------------------------------------------------
-// Operators needed to avoid comparing pointer to pointer
-
-#define PTR_STRING_CMP(op, impl) \
-inline bool op (const char* s1, const string& s2) { return impl; }
-PTR_STRING_CMP (operator==, (s2 == s1))
-PTR_STRING_CMP (operator!=, (s2 != s1))
-PTR_STRING_CMP (operator<, (s2 > s1))
-PTR_STRING_CMP (operator<=, (s2 >= s1))
-PTR_STRING_CMP (operator>, (s2 < s1))
-PTR_STRING_CMP (operator>=, (s2 <= s1))
-#undef PTR_STRING_CMP
-
-//----------------------------------------------------------------------
-
-template <typename T>
-inline hashvalue_t hash_value (const T& v)
-{ return (string::hash (v.begin(), v.end())); }
-
-template <>
-inline hashvalue_t hash_value (const string::const_pointer& v)
-{ return (string::hash (v, v + strlen(v))); }
-
-template <>
-inline hashvalue_t hash_value (const string::pointer& v)
-{ return (string::hash (v, v + strlen(v))); }
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-// Specialization for stream alignment
-ALIGNOF (ustl::string, alignof (string::value_type()))
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/utf8.h b/media/libdrm/mobile2/src/util/ustl-1.0/utf8.h
deleted file mode 100644
index f829e7d..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/utf8.h
+++ /dev/null
@@ -1,200 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// utf8.h
-//
-// This file contains stream iterators that read and write UTF-8 encoded
-// characters. The encoding is defined as follows:
-//
-// U-00000000 - U-0000007F: 0xxxxxxx
-// U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
-// U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
-// U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-// U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
-// U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
-// U-80000000 - U-FFFFFFFF: 11111110 100000xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
-//
-// The last range in not in the UTF-8 standard because Unicode forbids
-// characters of those values. However, since ustl::string uses this code
-// to write its length, the support is here. The reason it was put here
-// in the first place, is that extra code would have been necessary to
-// flag that range as invalid.
-//
-#ifndef UTF8_H_3D7AEEEB3A88928D4D280B785F78B6F4
-#define UTF8_H_3D7AEEEB3A88928D4D280B785F78B6F4
-
-#include "uiterator.h"
-
-namespace ustl {
-
-//----------------------------------------------------------------------
-
-typedef uint8_t utf8subchar_t; ///< Type for the encoding subcharacters.
-
-//----------------------------------------------------------------------
-
-/// Returns the number of bytes required to UTF-8 encode \p v.
-inline size_t Utf8Bytes (wchar_t v)
-{
- static const uint32_t c_Bounds[] = { 0x0000007F, 0x000007FF, 0x0000FFFF, 0x001FFFFF, 0x03FFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, };
- size_t bi = 0;
- while (c_Bounds[bi++] < uint32_t(v));
- return (bi);
-}
-
-/// Returns the number of bytes in a UTF-8 sequence that starts with \p c.
-inline size_t Utf8SequenceBytes (wchar_t c) // a wchar_t to keep c in a full register
-{
- // Count the leading bits. Header bits are 1 * nBytes followed by a 0.
- // 0 - single byte character. Take 7 bits (0xFF >> 1)
- // 1 - error, in the middle of the character. Take 6 bits (0xFF >> 2)
- // so you will keep reading invalid entries until you hit the next character.
- // >2 - multibyte character. Take remaining bits, and get the next bytes.
- // All errors are ignored, since the user can not correct them.
- //
- wchar_t mask = 0x80;
- size_t nBytes = 0;
- for (; c & mask; ++nBytes)
- mask >>= 1;
- return (nBytes ? nBytes : 1); // A sequence is always at least 1 byte.
-}
-
-//----------------------------------------------------------------------
-
-/// \class utf8in_iterator utf8.h ustl.h
-/// \ingroup IteratorAdaptors
-///
-/// \brief An iterator adaptor to character containers for reading UTF-8 encoded text.
-///
-/// For example, you can copy from ustl::string to ustl::vector<wchar_t> with
-/// copy (utf8in (str.begin()), utf8in (str.end()), back_inserter(wvect));
-/// There is no error handling; if the reading frame slips you'll get extra
-/// characters, one for every misaligned byte. Although it is possible to skip
-/// to the start of the next character, that would result in omitting the
-/// misformatted character and the one after it, making it very difficult to
-/// detect by the user. It is better to write some strange characters and let
-/// the user know his file is corrupted. Another problem is overflow on bad
-/// encodings (like a 0xFF on the end of a string). This is checked through
-/// the end-of-string nul character, which will always be there as long as
-/// you are using the string class.
-///
-template <typename Iterator, typename WChar = wchar_t>
-class utf8in_iterator {
-public:
- typedef typename iterator_traits<Iterator>::value_type value_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
- typedef typename iterator_traits<Iterator>::pointer pointer;
- typedef typename iterator_traits<Iterator>::reference reference;
-public:
- explicit utf8in_iterator (const Iterator& is) : m_i (is), m_v (0) { Read(); }
- utf8in_iterator (const utf8in_iterator& i) : m_i (i.m_i), m_v (i.m_v) {}
- inline const utf8in_iterator& operator= (const utf8in_iterator& i) { m_i = i.m_i; m_v = i.m_v; return (*this); }
- inline Iterator base (void) const { return (m_i - (Utf8Bytes(m_v) - 1)); }
- /// Reads and returns the next value.
- inline WChar operator* (void) const { return (m_v); }
- inline utf8in_iterator& operator++ (void) { ++m_i; Read(); return (*this); }
- inline utf8in_iterator operator++ (int) { utf8in_iterator old (*this); operator++(); return (old); }
- inline utf8in_iterator& operator+= (uoff_t n) { while (n--) operator++(); return (*this); }
- inline utf8in_iterator operator+ (uoff_t n) { utf8in_iterator v (*this); return (v += n); }
- inline bool operator== (const utf8in_iterator& i) const { return (m_i == i.m_i); }
- inline bool operator< (const utf8in_iterator& i) const { return (m_i < i.m_i); }
- difference_type operator- (const utf8in_iterator& i) const;
-private:
- void Read (void);
-private:
- Iterator m_i;
- WChar m_v;
-};
-
-/// Steps to the next character and updates current returnable value.
-template <typename Iterator, typename WChar>
-void utf8in_iterator<Iterator,WChar>::Read (void)
-{
- const utf8subchar_t c = *m_i;
- size_t nBytes = Utf8SequenceBytes (c);
- m_v = c & (0xFF >> nBytes); // First byte contains bits after the header.
- while (--nBytes && *++m_i) // Each subsequent byte has 6 bits.
- m_v = (m_v << 6) | (*m_i & 0x3F);
-}
-
-/// Returns the distance in characters (as opposed to the distance in bytes).
-template <typename Iterator, typename WChar>
-typename utf8in_iterator<Iterator,WChar>::difference_type
-utf8in_iterator<Iterator,WChar>::operator- (const utf8in_iterator<Iterator,WChar>& last) const
-{
- difference_type dist = 0;
- for (Iterator first (last.m_i); first < m_i; ++dist)
- first = advance (first, Utf8SequenceBytes (*first));
- return (dist);
-}
-
-//----------------------------------------------------------------------
-
-/// \class utf8out_iterator utf8.h ustl.h
-/// \ingroup IteratorAdaptors
-///
-/// \brief An iterator adaptor to character containers for writing UTF-8 encoded text.
-///
-template <typename Iterator, typename WChar = wchar_t>
-class utf8out_iterator {
-public:
- typedef typename iterator_traits<Iterator>::value_type value_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
- typedef typename iterator_traits<Iterator>::pointer pointer;
- typedef typename iterator_traits<Iterator>::reference reference;
-public:
- explicit utf8out_iterator (const Iterator& os) : m_i (os) {}
- utf8out_iterator (const utf8out_iterator& i) : m_i (i.m_i) {}
- inline const Iterator& base (void) const { return (m_i); }
- /// Writes \p v into the stream.
- utf8out_iterator& operator= (WChar v);
- inline utf8out_iterator& operator* (void) { return (*this); }
- inline utf8out_iterator& operator++ (void) { return (*this); }
- inline utf8out_iterator operator++ (int) { return (*this); }
- inline bool operator== (const utf8out_iterator& i) const { return (m_i == i.m_i); }
- inline bool operator< (const utf8out_iterator& i) const { return (m_i < i.m_i); }
-private:
- Iterator m_i;
-};
-
-/// Writes \p v into the stream.
-template <typename Iterator, typename WChar>
-utf8out_iterator<Iterator,WChar>& utf8out_iterator<Iterator,WChar>::operator= (WChar v)
-{
- const size_t nBytes = Utf8Bytes (v);
- if (nBytes > 1) {
- // Write the bits 6 bits at a time, except for the first one,
- // which may be less than 6 bits.
- register wchar_t shift = nBytes * 6;
- *m_i++ = ((v >> (shift -= 6)) & 0x3F) | (0xFF << (8 - nBytes));
- while (shift)
- *m_i++ = ((v >> (shift -= 6)) & 0x3F) | 0x80;
- } else // If only one byte, there is no header.
- *m_i++ = v;
- return (*this);
-}
-
-//----------------------------------------------------------------------
-
-/// Returns a UTF-8 adaptor writing to \p i. Useful in conjuction with back_insert_iterator.
-template <typename Iterator>
-inline utf8out_iterator<Iterator> utf8out (Iterator i)
-{
- return (utf8out_iterator<Iterator> (i));
-}
-
-/// Returns a UTF-8 adaptor reading from \p i.
-template <typename Iterator>
-inline utf8in_iterator<Iterator> utf8in (Iterator i)
-{
- return (utf8in_iterator<Iterator> (i));
-}
-
-//----------------------------------------------------------------------
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/utuple.h b/media/libdrm/mobile2/src/util/ustl-1.0/utuple.h
deleted file mode 100644
index 8a003ab..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/utuple.h
+++ /dev/null
@@ -1,247 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// utuple.h
-//
-
-#ifndef UTUPLE_H_7324ADEC49B397CA74A56F6050FD5A6B
-#define UTUPLE_H_7324ADEC49B397CA74A56F6050FD5A6B
-
-#include "ualgo.h"
-
-#if PLATFORM_ANDROID
-#undef CPU_HAS_MMX
-#endif
-
-namespace ustl {
-
-/// \class tuple utuple.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief A fixed-size array of \p N \p Ts.
-///
-template <size_t N, typename T>
-class tuple {
-public:
- typedef T value_type;
- typedef size_t size_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef ::ustl::reverse_iterator<iterator> reverse_iterator;
- typedef ::ustl::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef pair<iterator,iterator> range_t;
- typedef pair<const_iterator,const_iterator> const_range_t;
-public:
- template <typename T2>
- inline tuple (const tuple<N,T2>& t);
- inline tuple (const tuple<N,T>& t);
- inline tuple (const_pointer v);
- inline tuple (void) { for (uoff_t i = 0; i < N; ++ i) m_v[i] = T(); }
- explicit inline tuple (const_reference v0, const_reference v1 = T(), const_reference v2 = T(), const_reference v3 = T());
- inline iterator begin (void) { return (m_v); }
- inline const_iterator begin (void) const { return (m_v); }
- inline iterator end (void) { return (begin() + N); }
- inline const_iterator end (void) const { return (begin() + N); }
- inline size_type size (void) const { return (N); }
- inline size_type max_size (void) const { return (N); }
- inline bool empty (void) const { return (N == 0); }
- inline const_reference at (size_type i) const { return (m_v[i]); }
- inline reference at (size_type i) { return (m_v[i]); }
- inline const_reference operator[] (size_type i) const { return (m_v[i]); }
- inline reference operator[] (size_type i) { return (m_v[i]); }
- template <typename T2>
- inline const tuple& operator= (const tuple<N,T2>& src);
- inline const tuple& operator= (const tuple<N,T>& src);
- inline const tuple& operator+= (const_reference v)
- { for (uoff_t i = 0; i < N; ++ i) m_v[i] += v; return (*this); }
- inline const tuple& operator-= (const_reference v)
- { for (uoff_t i = 0; i < N; ++ i) m_v[i] -= v; return (*this); }
- inline const tuple& operator*= (const_reference v)
- { for (uoff_t i = 0; i < N; ++ i) m_v[i] *= v; return (*this); }
- inline const tuple& operator/= (const_reference v)
- { for (uoff_t i = 0; i < N; ++ i) m_v[i] /= v; return (*this); }
- inline const tuple operator+ (const_reference v) const
- { tuple result; for (uoff_t i = 0; i < N; ++ i) result[i] = m_v[i] + v; return (result); }
- inline const tuple operator- (const_reference v) const
- { tuple result; for (uoff_t i = 0; i < N; ++ i) result[i] = m_v[i] - v; return (result); }
- inline const tuple operator* (const_reference v) const
- { tuple result; for (uoff_t i = 0; i < N; ++ i) result[i] = m_v[i] * v; return (result); }
- inline const tuple operator/ (const_reference v) const
- { tuple result; for (uoff_t i = 0; i < N; ++ i) result[i] = m_v[i] / v; return (result); }
- inline void swap (tuple<N,T>& v)
- { for (uoff_t i = 0; i < N; ++ i) ::ustl::swap (m_v[i], v.m_v[i]); }
-private:
- T m_v [N];
-};
-
-} // namespace ustl
-
-#include "simd.h"
-
-namespace ustl {
-
-template <size_t N, typename T>
-template <typename T2>
-inline tuple<N,T>::tuple (const tuple<N,T2>& t)
-{ simd::pconvert (t, *this, simd::fcast<T2,T>()); }
-
-template <size_t N, typename T>
-inline tuple<N,T>::tuple (const tuple<N,T>& t)
-{ simd::passign (t, *this); }
-
-template <size_t N, typename T>
-inline tuple<N,T>::tuple (const_pointer v)
-{ simd::ipassign (v, *this); }
-
-template <size_t N, typename T>
-inline tuple<N,T>::tuple (const_reference v0, const_reference v1, const_reference v2, const_reference v3)
-{
- m_v[0] = v0;
- if (N > 1) m_v[1] = v1;
- if (N > 2) m_v[2] = v2;
- if (N > 3) m_v[3] = v3;
- if (N > 4) fill_n (m_v + 4, N - 4, T());
-}
-
-template <size_t N, typename T>
-template <typename T2>
-inline const tuple<N,T>& tuple<N,T>::operator= (const tuple<N,T2>& src)
-{ simd::pconvert (src, *this, simd::fcast<T2,T>()); return (*this); }
-
-template <size_t N, typename T>
-inline const tuple<N,T>& tuple<N,T>::operator= (const tuple<N,T>& src)
-{ simd::passign (src, *this); return (*this); }
-
-template <size_t N, typename T1, typename T2>
-inline bool operator== (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- for (uoff_t i = 0; i < N; ++ i)
- if (t1[i] != t2[i])
- return (false);
- return (true);
-}
-
-template <size_t N, typename T1, typename T2>
-inline bool operator< (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- for (uoff_t i = 0; i < N && t1[i] <= t2[i]; ++ i)
- if (t1[i] < t2[i])
- return (true);
- return (false);
-}
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1>& operator+= (tuple<N,T1>& t1, const tuple<N,T2>& t2)
- { for (uoff_t i = 0; i < N; ++ i) t1[i] = T1(t1[i] + t2[i]); return (t1); }
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1>& operator-= (tuple<N,T1>& t1, const tuple<N,T2>& t2)
- { for (uoff_t i = 0; i < N; ++ i) t1[i] = T1(t1[i] - t2[i]); return (t1); }
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1>& operator*= (tuple<N,T1>& t1, const tuple<N,T2>& t2)
- { for (uoff_t i = 0; i < N; ++ i) t1[i] = T1(t1[i] * t2[i]); return (t1); }
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1>& operator/= (tuple<N,T1>& t1, const tuple<N,T2>& t2)
- { for (uoff_t i = 0; i < N; ++ i) t1[i] = T1(t1[i] / t2[i]); return (t1); }
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1> operator+ (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- tuple<N,T1> result;
- for (uoff_t i = 0; i < N; ++ i) result[i] = T1(t1[i] + t2[i]);
- return (result);
-}
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1> operator- (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- tuple<N,T1> result;
- for (uoff_t i = 0; i < N; ++ i) result[i] = T1(t1[i] - t2[i]);
- return (result);
-}
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1> operator* (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- tuple<N,T1> result;
- for (uoff_t i = 0; i < N; ++ i) result[i] = T1(t1[i] * t2[i]);
- return (result);
-}
-
-template <size_t N, typename T1, typename T2>
-inline const tuple<N,T1> operator/ (const tuple<N,T1>& t1, const tuple<N,T2>& t2)
-{
- tuple<N,T1> result;
- for (uoff_t i = 0; i < N; ++ i) result[i] = T1(t1[i] / t2[i]);
- return (result);
-}
-
-#if CPU_HAS_SSE
-#define SSE_TUPLE_SPECS(n,type) \
-template <> inline tuple<n,type>::tuple (void) \
-{ asm ("xorps %%xmm0, %%xmm0\n\tmovups %%xmm0, %0"::"m"(m_v[0]):"xmm0","memory"); } \
-template<> inline void tuple<n,type>::swap (tuple<n,type>& v) \
-{ asm ("movups %0,%%xmm0\n\tmovups %1,%%xmm1\n\tmovups %%xmm0,%1\n\tmovups %%xmm1,%0"::"m"(m_v[0]),"m"(v.m_v[0]):"xmm0","xmm1","memory"); }
-SSE_TUPLE_SPECS(4,float)
-SSE_TUPLE_SPECS(4,int32_t)
-SSE_TUPLE_SPECS(4,uint32_t)
-#undef SSE_TUPLE_SPECS
-#endif
-#if CPU_HAS_MMX
-#define MMX_TUPLE_SPECS(n,type) \
-template <> inline tuple<n,type>::tuple (void) \
-{ asm ("pxor %%mm0, %%mm0\n\tmovq %%mm0, %0"::"m"(m_v[0]):"mm0","memory"); simd::reset_mmx(); } \
-template<> inline void tuple<n,type>::swap (tuple<n,type>& v) \
-{ asm ("movq %0,%%mm0\n\tmovq %1,%%mm1\n\tmovq %%mm0,%1\n\tmovq %%mm1,%0"::"m"(m_v[0]),"m"(v.m_v[0]):"mm0","mm1","memory"); simd::reset_mmx(); }
-MMX_TUPLE_SPECS(2,float)
-MMX_TUPLE_SPECS(4,int16_t)
-MMX_TUPLE_SPECS(4,uint16_t)
-MMX_TUPLE_SPECS(2,int32_t)
-MMX_TUPLE_SPECS(2,uint32_t)
-MMX_TUPLE_SPECS(8,int8_t)
-MMX_TUPLE_SPECS(8,uint8_t)
-#undef MMX_TUPLE_SPECS
-#endif
-
-#define SIMD_TUPLE_PACKOP(N,T) \
-template <> inline const tuple<N,T>& operator+= (tuple<N,T>& t1, const tuple<N,T>& t2) \
- { simd::padd (t2, t1); return (t1); } \
-template <> inline const tuple<N,T>& operator-= (tuple<N,T>& t1, const tuple<N,T>& t2) \
- { simd::psub (t2, t1); return (t1); } \
-template <> inline const tuple<N,T>& operator*= (tuple<N,T>& t1, const tuple<N,T>& t2) \
- { simd::pmul (t2, t1); return (t1); } \
-template <> inline const tuple<N,T>& operator/= (tuple<N,T>& t1, const tuple<N,T>& t2) \
- { simd::pdiv (t2, t1); return (t1); } \
-template <> inline const tuple<N,T> operator+ (const tuple<N,T>& t1, const tuple<N,T>& t2) \
- { tuple<N,T> result (t1); simd::padd (t2, result); return (result); } \
-template <> inline const tuple<N,T> operator- (const tuple<N,T>& t1, const tuple<N,T>& t2) \
- { tuple<N,T> result (t1); simd::psub (t2, result); return (result); } \
-template <> inline const tuple<N,T> operator* (const tuple<N,T>& t1, const tuple<N,T>& t2) \
- { tuple<N,T> result (t1); simd::pmul (t2, result); return (result); } \
-template <> inline const tuple<N,T> operator/ (const tuple<N,T>& t1, const tuple<N,T>& t2) \
- { tuple<N,T> result (t1); simd::pdiv (t2, result); return (result); }
-SIMD_TUPLE_PACKOP(4,float)
-SIMD_TUPLE_PACKOP(2,float)
-SIMD_TUPLE_PACKOP(2,double)
-SIMD_TUPLE_PACKOP(4,int32_t)
-SIMD_TUPLE_PACKOP(4,uint32_t)
-SIMD_TUPLE_PACKOP(4,int16_t)
-SIMD_TUPLE_PACKOP(4,uint16_t)
-SIMD_TUPLE_PACKOP(2,int32_t)
-SIMD_TUPLE_PACKOP(2,uint32_t)
-SIMD_TUPLE_PACKOP(8,int8_t)
-SIMD_TUPLE_PACKOP(8,uint8_t)
-#undef SIMD_TUPLE_PACKOP
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/utypes.h b/media/libdrm/mobile2/src/util/ustl-1.0/utypes.h
deleted file mode 100644
index f0b0265..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/utypes.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// utypes.h
-//
-// Types used by this library.
-//
-
-#ifndef UTYPES_H_118BBB3B50B7DBF22F5460C52E515C83
-#define UTYPES_H_118BBB3B50B7DBF22F5460C52E515C83
-
-#include "config.h"
-#ifndef STDC_HEADERS
- #error This library requires standard C and C++ headers to compile.
-#endif
-#ifndef STDUNIX_HEADERS
- #error This library compiles only on UNIX systems.
-#endif
-#define __STDC_LIMIT_MACROS // For WCHAR_MIN and WCHAR_MAX in stdint.
-#define __STDC_CONSTANT_MACROS // For UINT??_C macros to avoid using L and UL suffixes on constants.
-#ifdef HAVE_STDINT_H
- #include <stdint.h>
-#elif HAVE_INTTYPES_H
- #include <inttypes.h>
-#else
- #error Need standard integer types definitions, usually in stdint.h
-#endif
-#include <stddef.h> // For ptrdiff_t, size_t
-#include <limits.h>
-#include <float.h>
-#ifdef HAVE_SYS_TYPES_H
- #include <sys/types.h>
-#endif
-#ifndef SIZE_MAX
- #define SIZE_MAX UINT_MAX
-#endif
-#if sun || __sun // Solaris defines UINTPTR_MAX as empty.
- #undef UINTPTR_MAX
- #define UINTPTR_MAX ULONG_MAX
-#endif
-#ifndef WCHAR_MAX
- #ifdef __WCHAR_MAX__
- #define WCHAR_MAX __WCHAR_MAX__
- #else
- #define WCHAR_MAX CHAR_MAX
- #endif
-#endif
-#ifdef HAVE_LONG_LONG
- #ifndef LLONG_MAX
- #define ULLONG_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
- #define LLONG_MAX INT64_C(0x7FFFFFFFFFFFFFFF)
- #define LLONG_MIN ULLONG_MAX
- #endif
-#endif
-#if !PLATFORM_ANDROID
-#ifndef BYTE_ORDER
- #define LITTLE_ENDIAN USTL_LITTLE_ENDIAN
- #define BIG_ENDIAN USTL_BIG_ENDIAN
- #define BYTE_ORDER USTL_BYTE_ORDER
-#endif
-#endif
-
-typedef size_t uoff_t; ///< A type for storing offsets into blocks measured by size_t.
-typedef uint32_t hashvalue_t; ///< Value type returned by the hash functions.
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uutility.h b/media/libdrm/mobile2/src/util/ustl-1.0/uutility.h
deleted file mode 100644
index 7b5ae64..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uutility.h
+++ /dev/null
@@ -1,387 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-/// \file uutility.h
-///
-/// \brief Utility templates.
-///
-/// Everything in here except min(), max(), distance(), and advance()
-/// are uSTL extensions and are absent from other STL implementations.
-///
-
-#ifndef UUTILITY_H_6A58BD296269A82A4AAAA4FD19FDB3AC
-#define UUTILITY_H_6A58BD296269A82A4AAAA4FD19FDB3AC
-
-#include "uassert.h"
-#include "utypes.h"
-
-#if PLATFORM_ANDROID
-#include <stdio.h>
-#undef CPU_HAS_MMX
-#endif
-
-namespace ustl {
-
-#ifdef __GNUC__
- /// Returns the number of elements in a static vector
- #define VectorSize(v) (sizeof(v) / sizeof(*v))
-#else
- // Old compilers will not be able to evaluate *v on an empty vector.
- // The tradeoff here is that VectorSize will not be able to measure arrays of local structs.
- #define VectorSize(v) (sizeof(v) / ustl::size_of_elements(1, v))
-#endif
-
-/// Expands into a ptr,size expression for the given static vector; useful as link arguments.
-#define VectorBlock(v) (v)+0, VectorSize(v) // +0 makes it work under gcc 2.95
-/// Expands into a begin,end expression for the given static vector; useful for algorithm arguments.
-#define VectorRange(v) VectorBlock(v)+(v)
-
-/// Returns the number of bits in the given type
-#define BitsInType(t) (sizeof(t) * CHAR_BIT)
-
-/// Returns the mask of type \p t with the lowest \p n bits set.
-#define BitMask(t,n) (t(~t(0)) >> ((sizeof(t) * CHAR_BIT) - (n)))
-
-/// Argument that is used only in debug builds (as in an assert)
-#ifndef NDEBUG
- #define DebugArg(x) x
-#else
- #define DebugArg(x)
-#endif
-
-/// Shorthand for container iteration.
-#define foreach(type,i,ctr) for (type i = (ctr).begin(); i != (ctr).end(); ++ i)
-/// Shorthand for container reverse iteration.
-#define eachfor(type,i,ctr) for (type i = (ctr).rbegin(); i != (ctr).rend(); ++ i)
-
-/// Macro for passing template types as macro arguments.
-/// \@{
-#define TEMPLATE_FULL_DECL1(d1,t1) template <d1 t1>
-#define TEMPLATE_FULL_DECL2(d1,t1,d2,t2) template <d1 t1, d2 t2>
-#define TEMPLATE_FULL_DECL3(d1,t1,d2,t2,d3,t3) template <d1 t1, d2 t2, d3 t3>
-#define TEMPLATE_DECL1(t1) TEMPLATE_FULL_DECL1(typename,t1)
-#define TEMPLATE_DECL2(t1,t2) TEMPLATE_FULL_DECL2(typename,t1,typename,t2)
-#define TEMPLATE_DECL3(t1,t2,t3) TEMPLATE_FULL_DECL3(typename,t1,typename,t2,typename,t3)
-#define TEMPLATE_TYPE1(type,a1) type<a1>
-#define TEMPLATE_TYPE2(type,a1,a2) type<a1,a2>
-#define TEMPLATE_TYPE3(type,a1,a2,a3) type<a1,a2,a3>
-/// \@}
-
-/// Returns the minimum of \p a and \p b
-template <typename T1, typename T2>
-inline const T1 min (const T1& a, const T2& b)
-{
- return (a < b ? a : b);
-}
-
-/// Returns the maximum of \p a and \p b
-template <typename T1, typename T2>
-inline const T1 max (const T1& a, const T2& b)
-{
- return (b < a ? a : b);
-}
-
-/// \brief Divides \p n1 by \p n2 and rounds the result up.
-/// This is in contrast to regular division, which rounds down.
-/// Negative numbers are rounded down because they are an unusual case, supporting
-/// which would require a branch. Since this is frequently used in graphics, the
-/// speed is important.
-///
-template <typename T1, typename T2>
-inline T1 DivRU (T1 n1, T2 n2)
-{
- return (n1 / n2 + (n1 % n2 > 0));
-}
-
-/// The alignment performed by default.
-const size_t c_DefaultAlignment = __alignof__(void*);
-
-/// \brief Rounds \p n up to be divisible by \p grain
-template <typename T>
-inline T Align (T n, size_t grain = c_DefaultAlignment)
-{
- T a, r = n % grain;
- if (grain == 2) return (n + r);
- switch (grain) {
- case 4: case 8: case 16: a = (n & ~(grain - 1)) + grain; break;
- default: a = n + (grain - r);
- };
- return (r ? a : n);
-}
-
-/// Offsets an iterator
-template <typename T>
-inline T advance (T i, ssize_t offset)
-{
- return (i + offset);
-}
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-/// Offsets a void pointer
-template <>
-inline const void* advance (const void* p, ssize_t offset)
-{
- assert (p || !offset);
- return (reinterpret_cast<const uint8_t*>(p) + offset);
-}
-
-/// Offsets a void pointer
-template <>
-inline void* advance (void* p, ssize_t offset)
-{
- assert (p || !offset);
- return (reinterpret_cast<uint8_t*>(p) + offset);
-}
-#endif
-
-/// Returns the difference \p p1 - \p p2
-template <typename T1, typename T2>
-inline ptrdiff_t distance (T1 i1, T2 i2)
-{
- return (i2 - i1);
-}
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-#define UNVOID_DISTANCE(T1const,T2const) \
-template <> inline ptrdiff_t distance (T1const void* p1, T2const void* p2) \
-{ return ((T2const uint8_t*)(p2) - (T1const uint8_t*)(p1)); }
-UNVOID_DISTANCE(,)
-UNVOID_DISTANCE(const,const)
-UNVOID_DISTANCE(,const)
-UNVOID_DISTANCE(const,)
-#undef UNVOID_DISTANCE
-#endif
-
-/// \brief Returns the absolute value of \p v
-/// Unlike the stdlib functions, this is inline and works with all types.
-template <typename T>
-inline T absv (T v)
-{
- return (v < 0 ? -v : v);
-}
-
-/// \brief Returns -1 for negative values, 1 for positive, and 0 for 0
-template <typename T>
-inline T sign (T v)
-{
- return ((0 < v) - (v < 0));
-}
-
-/// Returns the absolute value of the distance i1 and i2
-template <typename T1, typename T2>
-inline size_t abs_distance (T1 i1, T2 i2)
-{
- return (absv (distance(i1, i2)));
-}
-
-/// Returns the size of \p n elements of size \p T
-template <typename T>
-inline size_t size_of_elements (size_t n, const T*)
-{
- return (n * sizeof(T));
-}
-
-// Defined in byteswap.h, which is usually unusable.
-#undef bswap_16
-#undef bswap_32
-#undef bswap_64
-
-#if CPU_HAS_CMPXCHG8 // If it has that, it has bswap.
-inline uint16_t bswap_16 (uint16_t v) { asm ("rorw $8, %w0" : "=r"(v) : "0"(v) : "cc"); return (v); }
-inline uint32_t bswap_32 (uint32_t v) { asm ("bswap %0" : "=r"(v) : "0"(v)); return (v); }
-#else
-inline uint16_t bswap_16 (uint16_t v) { return (v << 8 | v >> 8); }
-inline uint32_t bswap_32 (uint32_t v) { return (v << 24 | (v & 0xFF00) << 8 | (v >> 8) & 0xFF00 | v >> 24); }
-#endif
-#if HAVE_INT64_T
-inline uint64_t bswap_64 (uint64_t v) { return ((uint64_t(bswap_32(v)) << 32) | bswap_32(v >> 32)); }
-#endif
-
-/// \brief Swaps the byteorder of \p v.
-template <typename T>
-inline T bswap (const T& v)
-{
- switch (BitsInType(T)) {
- default: return (v);
- case 16: return (T (bswap_16 (uint16_t (v))));
- case 32: return (T (bswap_32 (uint32_t (v))));
-#if HAVE_INT64_T
- case 64: return (T (bswap_64 (uint64_t (v))));
-#endif
- };
-}
-
-#if USTL_BYTE_ORDER == USTL_BIG_ENDIAN
-template <typename T> inline T le_to_native (const T& v) { return (bswap (v)); }
-template <typename T> inline T be_to_native (const T& v) { return (v); }
-template <typename T> inline T native_to_le (const T& v) { return (bswap (v)); }
-template <typename T> inline T native_to_be (const T& v) { return (v); }
-#elif USTL_BYTE_ORDER == USTL_LITTLE_ENDIAN
-template <typename T> inline T le_to_native (const T& v) { return (v); }
-template <typename T> inline T be_to_native (const T& v) { return (bswap (v)); }
-template <typename T> inline T native_to_le (const T& v) { return (v); }
-template <typename T> inline T native_to_be (const T& v) { return (bswap (v)); }
-#endif // USTL_BYTE_ORDER
-
-/// Deletes \p p and sets it to NULL
-template <typename T>
-inline void Delete (T*& p)
-{
- delete p;
- p = NULL;
-}
-
-/// Deletes \p p as an array and sets it to NULL
-template <typename T>
-inline void DeleteVector (T*& p)
-{
- delete [] p;
- p = NULL;
-}
-
-/// Template of making != from ! and ==
-template <typename T>
-inline bool operator!= (const T& x, const T& y)
-{
- return (!(x == y));
-}
-
-/// Template of making > from <
-template <typename T>
-inline bool operator> (const T& x, const T& y)
-{
- return (y < x);
-}
-
-/// Template of making <= from < and ==
-template <typename T>
-inline bool operator<= (const T& x, const T& y)
-{
- return (!(y < x));
-}
-
-/// Template of making >= from < and ==
-template <typename T>
-inline bool operator>= (const T& x, const T& y)
-{
- return (!(x < y));
-}
-
-/// Packs \p s multiple times into \p b. Useful for loop unrolling.
-template <typename TSmall, typename TBig>
-inline void pack_type (TSmall s, TBig& b)
-{
- const size_t n = sizeof(TBig) / sizeof(TSmall);
- b = s;
- // Calls to min are here to avoid warnings for shifts bigger than the type. min will be gone when optimized.
- if (n < 2) return;
- b = (b << min (BitsInType(TSmall), BitsInType(TBig))) | b;
- if (n < 4) return;
- b = (b << min (BitsInType(TSmall) * 2, BitsInType(TBig))) | b;
- if (n < 8) return;
- b = (b << min (BitsInType(TSmall) * 4, BitsInType(TBig))) | b;
-}
-
-#if __GNUC__ >= 3
-inline bool TestAndSet (int* pm) __attribute__((always_inline));
-#endif
-/// Sets the contents of \p pm to 1 and returns true if the previous value was 0.
-inline bool TestAndSet (int* pm)
-{
-#if CPU_HAS_CMPXCHG8
- bool rv;
- int oldVal (1);
- asm volatile ( // cmpxchg compares to %eax and swaps if equal
- "cmpxchgl %3, %1\n\t"
- "sete %0"
- : "=a" (rv), "=m" (*pm), "=r" (oldVal)
- : "2" (oldVal), "a" (0)
- : "memory");
- return (rv);
-#elif __i386__ || __x86_64__
- int oldVal (1);
- asm volatile ("xchgl %0, %1" : "=r"(oldVal), "=m"(*pm) : "0"(oldVal), "m"(*pm) : "memory");
- return (!oldVal);
-#elif __sparc32__ // This has not been tested
- int rv;
- asm volatile ("ldstub %1, %0" : "=r"(rv), "=m"(*pm) : "m"(pm));
- return (!rv);
-#else
- const int oldVal (*pm);
- *pm = 1;
- return (!oldVal);
-#endif
-}
-
-/// \brief This template is to be used for dereferencing a type-punned pointer without a warning.
-///
-/// When casting a local variable to an unrelated type through a pointer (for
-/// example, casting a float to a uint32_t without conversion), the resulting
-/// memory location can be accessed through either pointer, which violates the
-/// strict aliasing rule. While -fno-strict-aliasing option can be given to
-/// the compiler, eliminating this warning, inefficient code may result in
-/// some instances, because aliasing inhibits some optimizations. By using
-/// this template, and by ensuring the memory is accessed in one way only,
-/// efficient code can be produced without the warning. For gcc 4.1.0+.
-///
-template <typename DEST, typename SRC>
-inline DEST noalias (DEST, SRC* s)
-{
- union UPun { SRC s; DEST d; };
- return (((UPun*)(s))->d);
-}
-
-namespace simd {
- /// Call after you are done using SIMD algorithms for 64 bit tuples.
-#if CPU_HAS_MMX
- inline void reset_mmx (void) __attribute__((always_inline));
- #define ALL_MMX_REGS_CHANGELIST "mm0","mm1","mm2","mm3","mm4","mm5","mm6","mm7","st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"
- #if CPU_HAS_3DNOW
- inline void reset_mmx (void) { asm ("femms":::ALL_MMX_REGS_CHANGELIST); }
- #else
- inline void reset_mmx (void) { asm ("emms":::ALL_MMX_REGS_CHANGELIST); }
- #endif
-#else
- inline void reset_mmx (void) {}
-#endif
-} // namespace simd
-
-/// \brief Type that is not size_t
-///
-/// Because size_t may be declared as unsigned long or unsigned int on
-/// different machines, this macro is convenient when defining overloads
-/// of size_t to use other types.
-///
-#if defined(SIZE_T_IS_LONG) && !defined(__ARM_EABI__)
- #define NOT_SIZE_T_I_OR_L unsigned int
-#else
- #define NOT_SIZE_T_I_OR_L unsigned long
-#endif
-
-/// \brief Required when you want to overload size_t and a pointer.
-///
-/// The compiler will happily cast a number to a pointer and declare
-/// that the overload is ambiguous unless you define overloads for all
-/// possible integral types that a number may represent. This behaviour,
-/// although braindead, is in the ANSI standard, and thus not a bug. If
-/// you want to change the standard, the best solution is to disallow any
-/// implicit casts to pointer from an integral type. Ironically, such an
-/// implicit cast is already detected by gcc.
-///
-#if defined(USTL_ANDROID_X86)
-#define OVERLOAD_POINTER_AND_SIZE_T_V2(name, arg1type)
-#else
-#define OVERLOAD_POINTER_AND_SIZE_T_V2(name, arg1type) \
- inline void name (arg1type a1, short a2) { name (a1, size_t(a2)); } \
- inline void name (arg1type a1, unsigned short a2) { name (a1, size_t(a2)); } \
- inline void name (arg1type a1, int a2) { name (a1, size_t(a2)); } \
- inline void name (arg1type a1, long a2) { name (a1, size_t(a2)); } \
- inline void name (arg1type a1, NOT_SIZE_T_I_OR_L a2) { name (a1, size_t(a2)); }
-#endif
-} // namespace ustl
-
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/ustl-1.0/uvector.h b/media/libdrm/mobile2/src/util/ustl-1.0/uvector.h
deleted file mode 100644
index ccbc45b..0000000
--- a/media/libdrm/mobile2/src/util/ustl-1.0/uvector.h
+++ /dev/null
@@ -1,277 +0,0 @@
-// This file is part of the ustl library, an STL implementation.
-//
-// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
-// This file is free software, distributed under the MIT License.
-//
-// uvector.h
-//
-
-#ifndef UVECTOR_H_00BB13AF082BEB7829C031B265518169
-#define UVECTOR_H_00BB13AF082BEB7829C031B265518169
-
-#include "uassert.h"
-#include "memblock.h"
-#include "umemory.h"
-
-namespace ustl {
-
-/// \class vector uvector.h ustl.h
-/// \ingroup Sequences
-///
-/// \brief STL vector equivalent.
-///
-/// Provides a typed array-like interface to a managed memory block, including
-/// element access, iteration, modification, resizing, and serialization. In
-/// this design elements frequently undergo bitwise move, so don't put it in
-/// here if it doesn't support it. This mostly means having no self-pointers.
-///
-template <typename T>
-class vector {
-public:
- typedef T value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef memblock::size_type size_type;
- typedef memblock::written_size_type written_size_type;
- typedef memblock::difference_type difference_type;
- typedef ::ustl::reverse_iterator<iterator> reverse_iterator;
- typedef ::ustl::reverse_iterator<const_iterator> const_reverse_iterator;
-public:
- inline vector (void);
- inline explicit vector (size_type n);
- vector (size_type n, const T& v);
- vector (const vector<T>& v);
- vector (const_iterator i1, const_iterator i2);
- ~vector (void) throw();
- inline const vector<T>& operator= (const vector<T>& v);
- inline bool operator== (const vector<T>& v) { return (m_Data == v.m_Data); }
- inline operator cmemlink (void) const { return (cmemlink (m_Data)); }
- inline operator cmemlink (void) { return (cmemlink (m_Data)); }
- inline operator memlink (void) { return (memlink (m_Data)); }
- inline void reserve (size_type n, bool bExact = true);
- inline void resize (size_type n, bool bExact = true);
- inline size_type capacity (void) const { return (m_Data.capacity() / sizeof(T)); }
- inline size_type size (void) const { return (m_Data.size() / sizeof(T)); }
- inline size_type max_size (void) const { return (m_Data.max_size() / sizeof(T)); }
- inline bool empty (void) const { return (m_Data.empty()); }
- inline iterator begin (void) { return (iterator (m_Data.begin())); }
- inline const_iterator begin (void) const { return (const_iterator (m_Data.begin())); }
- inline iterator end (void) { return (iterator (m_Data.end())); }
- inline const_iterator end (void) const { return (const_iterator (m_Data.end())); }
- inline reverse_iterator rbegin (void) { return (reverse_iterator (end())); }
- inline const_reverse_iterator rbegin (void) const { return (const_reverse_iterator (end())); }
- inline reverse_iterator rend (void) { return (reverse_iterator (begin())); }
- inline const_reverse_iterator rend (void) const { return (const_reverse_iterator (begin())); }
- inline iterator iat (size_type i) { assert (i <= size()); return (begin() + i); }
- inline const_iterator iat (size_type i) const { assert (i <= size()); return (begin() + i); }
- inline reference at (size_type i) { assert (i < size()); return (begin()[i]); }
- inline const_reference at (size_type i) const { assert (i < size()); return (begin()[i]); }
- inline reference operator[] (size_type i) { return (at (i)); }
- inline const_reference operator[] (size_type i) const { return (at (i)); }
- inline reference front (void) { return (at(0)); }
- inline const_reference front (void) const { return (at(0)); }
- inline reference back (void) { assert (!empty()); return (end()[-1]); }
- inline const_reference back (void) const { assert (!empty()); return (end()[-1]); }
- inline void push_back (const T& v = T());
- inline void pop_back (void) { m_Data.memlink::resize (m_Data.size() - sizeof(T)); }
- inline void clear (void) { m_Data.clear(); }
- void deallocate (void) throw();
- inline void assign (const_iterator i1, const_iterator i2);
- inline void assign (size_type n, const T& v);
- inline void swap (vector<T>& v) { m_Data.swap (v.m_Data); }
- inline iterator insert (iterator ip, const T& v = T());
- inline iterator insert (iterator ip, size_type n, const T& v);
- inline iterator insert (iterator ip, const_iterator i1, const_iterator i2);
- inline iterator erase (iterator ep, size_type n = 1);
- inline iterator erase (iterator ep1, iterator ep2);
- inline void manage (pointer p, size_type n) { m_Data.manage (p, n * sizeof(T)); }
- inline bool is_linked (void) const { return (m_Data.is_linked()); }
- inline void unlink (void) { m_Data.unlink(); }
- inline void copy_link (void) { m_Data.copy_link(); }
- inline void link (const_pointer p, size_type n) { m_Data.link (p, n * sizeof(T)); }
- inline void link (pointer p, size_type n) { m_Data.link (p, n * sizeof(T)); }
- inline void link (const vector<T>& v) { m_Data.link (v); }
- inline void link (vector<T>& v) { m_Data.link (v); }
- inline void link (const_pointer first, const_pointer last) { m_Data.link (first, last); }
- inline void link (pointer first, pointer last) { m_Data.link (first, last); }
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, pointer)
- OVERLOAD_POINTER_AND_SIZE_T_V2(link, const_pointer)
-private:
- inline iterator insert_space (iterator ip, size_type n);
-private:
- memblock m_Data; ///< Raw element data, consecutively stored.
-};
-
-/// Allocates space for at least \p n elements.
-template <typename T>
-void vector<T>::reserve (size_type n, bool bExact)
-{
- const size_type oldCapacity = capacity();
- m_Data.reserve (n * sizeof(T), bExact);
- if (capacity() > oldCapacity)
- construct (begin() + oldCapacity, begin() + capacity());
-}
-
-/// Resizes the vector to contain \p n elements.
-template <typename T>
-void vector<T>::resize (size_type n, bool bExact)
-{
- if (m_Data.capacity() < n * sizeof(T))
- reserve (n, bExact);
- m_Data.memlink::resize (n * sizeof(T));
-}
-
-/// Calls element destructors and frees storage.
-template <typename T>
-void vector<T>::deallocate (void) throw()
-{
- if (!is_linked())
- destroy (begin(), begin() + capacity());
- m_Data.deallocate();
-}
-
-/// Initializes empty vector.
-template <typename T>
-inline vector<T>::vector (void)
-: m_Data ()
-{
-}
-
-/// Initializes a vector of size \p n.
-template <typename T>
-inline vector<T>::vector (size_type n)
-: m_Data ()
-{
- resize (n);
-}
-
-/// Copies \p n elements from \p v.
-template <typename T>
-vector<T>::vector (size_type n, const T& v)
-: m_Data ()
-{
- resize (n);
- ::ustl::fill (begin(), end(), v);
-}
-
-/// Copies \p v.
-template <typename T>
-vector<T>::vector (const vector<T>& v)
-: m_Data ()
-{
- resize (v.size());
- ::ustl::copy (v.begin(), v.end(), begin());
-}
-
-/// Copies range [\p i1, \p i2]
-template <typename T>
-vector<T>::vector (const_iterator i1, const_iterator i2)
-: m_Data ()
-{
- resize (distance (i1, i2));
- ::ustl::copy (i1, i2, begin());
-}
-
-/// Destructor
-template <typename T>
-inline vector<T>::~vector (void) throw()
-{
- if (!numeric_limits<value_type>::is_integral)
- deallocate();
-}
-
-/// Copies the range [\p i1, \p i2]
-template <typename T>
-inline void vector<T>::assign (const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- resize (distance (i1, i2));
- ::ustl::copy (i1, i2, begin());
-}
-
-/// Copies \p n elements with value \p v.
-template <typename T>
-inline void vector<T>::assign (size_type n, const T& v)
-{
- resize (n);
- ::ustl::fill (begin(), end(), v);
-}
-
-/// Copies contents of \p v.
-template <typename T>
-inline const vector<T>& vector<T>::operator= (const vector<T>& v)
-{
- assign (v.begin(), v.end());
- return (*this);
-}
-
-/// Inserts \p n uninitialized elements at \p ip.
-template <typename T>
-typename vector<T>::iterator vector<T>::insert_space (iterator ip, size_type n)
-{
- const uoff_t ipmi = distance (m_Data.begin(), memblock::iterator(ip));
- reserve (size() + n, false);
- return (iterator (m_Data.insert (m_Data.iat(ipmi), n * sizeof(T))));
-}
-
-/// Inserts \p n elements with value \p v at offsets \p ip.
-template <typename T>
-typename vector<T>::iterator vector<T>::insert (iterator ip, size_type n, const T& v)
-{
- ip = insert_space (ip, n);
- ::ustl::fill (ip, ip + n, v);
- return (ip);
-}
-
-/// Inserts value \p v at offset \p ip.
-template <typename T>
-typename vector<T>::iterator vector<T>::insert (iterator ip, const T& v)
-{
- *(ip = insert_space (ip, 1)) = v;
- return (ip);
-}
-
-/// Inserts range [\p i1, \p i2] at offset \p ip.
-template <typename T>
-typename vector<T>::iterator vector<T>::insert (iterator ip, const_iterator i1, const_iterator i2)
-{
- assert (i1 <= i2);
- ip = insert_space (ip, distance (i1, i2));
- ::ustl::copy (i1, i2, ip);
- return (ip);
-}
-
-/// Removes \p count elements at offset \p ep.
-template <typename T>
-inline typename vector<T>::iterator vector<T>::erase (iterator ep, size_type n)
-{
- return (iterator (m_Data.erase (memblock::iterator(ep), n * sizeof(T))));
-}
-
-/// Removes elements from \p ep1 to \p ep2.
-template <typename T>
-inline typename vector<T>::iterator vector<T>::erase (iterator ep1, iterator ep2)
-{
- assert (ep1 <= ep2);
- return (erase (ep1, distance(ep1, ep2)));
-}
-
-/// Inserts value \p v at the end of the vector.
-template <typename T>
-void vector<T>::push_back (const T& v)
-{
- resize (size() + 1, false);
- back() = v;
-}
-
-/// Use with vector classes to allocate and link to stack space. \p n is in elements.
-#define typed_alloca_link(m,T,n) (m).link ((T*) alloca ((n) * sizeof(T)), (n))
-
-} // namespace ustl
-
-#endif
-
diff --git a/media/libdrm/mobile2/src/util/xml/DomExpatAgent.cpp b/media/libdrm/mobile2/src/util/xml/DomExpatAgent.cpp
deleted file mode 100644
index 4cde706..0000000
--- a/media/libdrm/mobile2/src/util/xml/DomExpatAgent.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/xml/DomExpatAgent.h>
-#include <util/xml/XMLElementImpl.h>
-#include <ustring.h>
-#include <uios.h>
-using namespace ustl;
-
-/** see DomExpatAgent.h */
-DomExpatAgent::DomExpatAgent(XMLDocumentImpl* xmlDocPtr)
-{
- mXMLDocumentPtr = xmlDocPtr;
- mTopElementPtr = NULL;
-}
-
-/** see DomExpatAgent.h */
-DomExpatAgent::~DomExpatAgent()
-{
-
-}
-
-/** see DomExpatAgent.h */
-bool DomExpatAgent::generateDocumentFromXML(istringstream *xmlStream)
-{
- char ch;
- string content;
-
- if (NULL == mXMLDocumentPtr || NULL == xmlStream)
- {
- return false;
- }
-
- while ((ch = xmlStream->get()) != '\0')
- {
- content += ch;
- }
-
- if (ExpatWrapper::decode(content.c_str(), content.length(), 1) == 0)
-
- {
- return false;
- }
- return true;
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::pushTag(const DOMString *name, const XML_Char **atts)
-{
- ElementImpl *elementNode = mXMLDocumentPtr->createElement(name);
-
- if (NULL == elementNode)
- {
- return;
- }
-
- if (NULL != atts)
- {
- while (NULL != *atts)
- {
- //set attributes into element node.
- DOMString key(atts[0]), value(atts[1]);
- elementNode->setAttribute(&key, &value);
- atts += 2;
- }
- }
-
- if (!mStack.empty())
- {
- mTopElementPtr->appendChild(elementNode);
- }
- else
- {
- mXMLDocumentPtr->setFirstChild(elementNode);
- }
-
- mTopElementPtr = (XMLElementImpl *)elementNode;
- mStack.push_back(elementNode);
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::popTag(const DOMString *name)
-{
- if (NULL == name)
- {
- return;
- }
-
- if (mTopElementPtr != NULL)
- {
- if (!name->compare(mTopElementPtr->getTagName()->c_str()))
- {
- mStack.pop_back();
- if (!mStack.empty())
- {
- mTopElementPtr =(XMLElementImpl *) mStack.back();
- }
- else
- {
- mTopElementPtr = NULL;
- }
- }
- }
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::appendText(const DOMString *text)
-{
- if ((mTopElementPtr != NULL) && (text != NULL))
- {
- TextImpl *textNode = mXMLDocumentPtr->createTextNode(text);
-
- if (NULL == textNode)
- {
- return;
- }
-
- mTopElementPtr->appendChild(textNode);
- }
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::startElement(const XML_Char *name, const XML_Char **atts)
-{
- if (name)
- {
- DOMString tagName(name);
-
- pushTag(&tagName, atts);
- }
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::dataHandler(const XML_Char *s, int len)
-{
- if (s != NULL && len >= 1 && *s != '\n')
- {
- DOMString text;
- text.assign((char*)s, len);
- appendText(&text);
- }
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::endElement(const XML_Char *name)
-{
- if (name)
- {
- DOMString tagName(name);
- popTag(&tagName);
- }
-}
-
-/** see DomExpatAgent.h */
-ostringstream* DomExpatAgent::generateXMLFromDocument()
-{
- if (NULL == mXMLDocumentPtr)
- {
- return NULL;
- }
-
- ElementImpl *root = mXMLDocumentPtr->getDocumentElement();
-
- traverse(root);
-
- return &mXMLostream;
-}
-
-/** see DomExpatAgent.h */
-void DomExpatAgent::traverse(ElementImpl *root)
-{
- if (NULL == root)
- {
- return;
- }
-
- mXMLostream << "<" << *(root->getNodeName());
-
- if (root->hasAttributes())
- {
- mXMLostream << endl;
- const DOMStringMap* attrMapPtr = (static_cast<XMLElementImpl*>(root))->getAttributeMap();
- DOMStringMap::const_reverse_iterator pos;
-
- for (pos=attrMapPtr->rbegin(); pos != attrMapPtr->rend(); pos++)
- {
- mXMLostream << pos->first << "=" << "\"" << pos->second << "\"";
-
- if (pos + 1 != attrMapPtr->rend())
- {
- mXMLostream << endl;
- }
- }
- }
-
- mXMLostream << ">" << endl;
-
- NodeImpl *child = root->getFirstChild();
-
- while (child != NULL)
- {
- NodeType what = child->getNodeType();
-
- if (what == ELEMENT_NODE)
- {
- traverse(static_cast<ElementImpl*>(child));
- } else if (what == TEXT_NODE)
- {
- mXMLostream << *(static_cast<TextImpl*>(child)->getData()) << endl;
- }
-
- child = child->getNextSibling();
- }
-
- mXMLostream << "</" << *(root->getNodeName()) << ">" << endl;
-}
diff --git a/media/libdrm/mobile2/src/util/xml/ExpatWrapper.cpp b/media/libdrm/mobile2/src/util/xml/ExpatWrapper.cpp
deleted file mode 100644
index fe99a88..0000000
--- a/media/libdrm/mobile2/src/util/xml/ExpatWrapper.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/xml/ExpatWrapper.h>
-#include <ustring.h>
-using namespace ustl;
-
-/** see ExpatWrapper.h */
-ExpatWrapper::ExpatWrapper()
-{
- mParser = XML_ParserCreate(NULL);
- ::XML_SetUserData(mParser, this);
- ::XML_SetElementHandler(mParser, startElementCallback, endElementCallback);
- ::XML_SetCharacterDataHandler(mParser, dataHandlerCallback);
-
-}
-
-/** see ExpatWrapper.h */
-ExpatWrapper::~ExpatWrapper()
-{
- if (mParser)
- {
- ::XML_ParserFree(mParser);
- }
-}
-
-/** see ExpatWrapper.h */
-int ExpatWrapper::decode(const char* buf, int len, int isFinal)
-{
- return ::XML_Parse(mParser, buf, len, isFinal);
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::startElementCallback(void *userData, const XML_Char *name,
- const XML_Char **atts)
-{
- ((ExpatWrapper *)userData)->startElement(name, atts);
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::endElementCallback(void *userData, const XML_Char *name)
-{
- ((ExpatWrapper *)userData)->endElement(name);
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::dataHandlerCallback(void *userData, const XML_Char *s, int len)
-{
- ((ExpatWrapper *)userData)->dataHandler(s, len);
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::startElement(const XML_Char *name, const XML_Char **atts)
-{
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::endElement(const XML_Char *name)
-{
-}
-
-/** see ExpatWrapper.h */
-void ExpatWrapper::dataHandler(const XML_Char *s, int len)
-{
-}
diff --git a/media/libdrm/mobile2/src/util/xml/XMLDocumentImpl.cpp b/media/libdrm/mobile2/src/util/xml/XMLDocumentImpl.cpp
deleted file mode 100644
index c1fbc79..0000000
--- a/media/libdrm/mobile2/src/util/xml/XMLDocumentImpl.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/xml/XMLDocumentImpl.h>
-#include <util/xml/XMLElementImpl.h>
-
-/** see XMLDocumentImpl.h */
-XMLDocumentImpl::XMLDocumentImpl()
-{}
-
-/** see XMLDocumentImpl.h */
-XMLDocumentImpl::~XMLDocumentImpl()
-{}
-
-/** see XMLDocumentImpl.h */
-ElementImpl* XMLDocumentImpl::getDocumentElement() const
-{
- XMLElementImpl *element = (XMLElementImpl *)(this->getFirstChild());
- return element;
-}
-
-/** see XMLDocumentImpl.h */
-ElementImpl* XMLDocumentImpl::createElement(const DOMString* tagName) const throw (DOMException)
-{
- if (tagName)
- {
- XMLElementImpl *element = new XMLElementImpl(tagName);
- return element;
- }
- return NULL;
-}
-
-/** see XMLDocumentImpl.h */
-TextImpl* XMLDocumentImpl::createTextNode(const DOMString* data) const
-{
- if (data)
- {
- TextImpl *text = new TextImpl(data);
- return text;
- }
- return NULL;
-}
-
diff --git a/media/libdrm/mobile2/src/util/xml/XMLElementImpl.cpp b/media/libdrm/mobile2/src/util/xml/XMLElementImpl.cpp
deleted file mode 100644
index 5453902..0000000
--- a/media/libdrm/mobile2/src/util/xml/XMLElementImpl.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <util/xml/XMLElementImpl.h>
-#include <util/domcore/TextImpl.h>
-
-/** see XMLElementImpl.h */
-XMLElementImpl::XMLElementImpl(const DOMString *tag)
-{
- if (tag)
- {
- mTagName = *tag;
- }
-}
-
-/** see XMLElementImpl.h */
-XMLElementImpl::~XMLElementImpl()
-{
-}
-
-/** see XMLElementImpl.h */
-const DOMString* XMLElementImpl::getTagName() const
-{
- return &mTagName;
-}
-
-/** see XMLElementImpl.h */
-void XMLElementImpl::setAttribute(const DOMString* name, const DOMString* value)
- throw (DOMException)
-{
- if (name && value)
- {
- mAttributeMap[*name] = *value;
- }
-}
-
-/** see XMLElementImpl.h */
-void XMLElementImpl::removeAttribute(const DOMString* name) throw (DOMException)
-{
- if (name)
- {
- mAttributeMap.erase(*name);
- }
-}
-
-/** see XMLElementImpl.h */
-const DOMString* XMLElementImpl::getAttribute(const DOMString* name) const
-{
- if (name)
- {
- DOMStringMap::const_iterator pos = mAttributeMap.find(*name);
-
- if (pos != mAttributeMap.end())
- {
- return &(pos->second);
- }
-
- }
- return NULL;
-}
-
-/** see XMLElementImpl.h */
-bool XMLElementImpl::hasAttributes() const
-{
- return !mAttributeMap.empty();
-}
-
-/** see XMLElementImpl.h */
-const DOMStringMap* XMLElementImpl::getAttributeMap() const
-{
- return &mAttributeMap;
-}
-
-/** see XMLElementImpl.h */
-const NodeImpl* XMLElementImpl::findSoloChildNode(const char* tag) const
-{
- if (NULL == tag)
- {
- return NULL;
- }
-
- string token;
- NodeListImpl *nodeList = NULL;
- const NodeImpl *childNode = NULL;
-
- token.assign(tag);
- nodeList = getElementsByTagName(&token);
-
- if (nodeList->getLength() > 0)
- {
- childNode = nodeList->item(0);
- }
-
- return childNode;
-}
-
-/** see XMLElementImpl.h */
-const string* XMLElementImpl::getSoloText(const char* tag) const
-{
- const NodeImpl *textNode = this->findSoloChildNode(tag);
-
- if (textNode)
- {
- textNode = textNode->getFirstChild();
- if (textNode)
- {
- return static_cast<const TextImpl*>(textNode)->getData();
- }
- }
-
- return NULL;
-}
-
-/** see XMLElementImpl.h */
-const XMLElementImpl* XMLElementImpl::getSoloElement(const char* tag) const
-{
- const NodeImpl *node = findSoloChildNode(tag);
- if (node)
- {
- return static_cast<const XMLElementImpl*>(node);
- }
-
- return NULL;
-}
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index ad037d6..fd2b1ce 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -430,7 +430,7 @@
mCblkMemory = cblk;
mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());
mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
- mCblk->out = 0;
+ mCblk->flags &= ~CBLK_DIRECTION_MSK;
mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
mCblk->waitTimeMs = 0;
return NO_ERROR;
@@ -644,10 +644,10 @@
// Manage overrun callback
if (mActive && (mCblk->framesAvailable_l() == 0)) {
- LOGV("Overrun user: %x, server: %x, flowControlFlag %d", mCblk->user, mCblk->server, mCblk->flowControlFlag);
- if (mCblk->flowControlFlag == 0) {
+ LOGV("Overrun user: %x, server: %x, flags %04x", mCblk->user, mCblk->server, mCblk->flags);
+ if ((mCblk->flags & CBLK_UNDERRUN_MSK) == CBLK_UNDERRUN_OFF) {
mCbf(EVENT_OVERRUN, mUserData, 0);
- mCblk->flowControlFlag = 1;
+ mCblk->flags |= CBLK_UNDERRUN_ON;
}
}
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index cd7bcd5..c350532 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -124,10 +124,6 @@
if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) {
return NO_INIT;
}
- int afFrameCount;
- if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) {
- return NO_INIT;
- }
uint32_t afLatency;
if (AudioSystem::getOutputLatency(&afLatency, streamType) != NO_ERROR) {
return NO_INIT;
@@ -173,48 +169,13 @@
return BAD_VALUE;
}
- if (!AudioSystem::isLinearPCM(format)) {
- if (sharedBuffer != 0) {
- frameCount = sharedBuffer->size();
- }
- } else {
- // Ensure that buffer depth covers at least audio hardware latency
- uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
- if (minBufCount < 2) minBufCount = 2;
-
- int minFrameCount = (afFrameCount*sampleRate*minBufCount)/afSampleRate;
-
- if (sharedBuffer == 0) {
- if (frameCount == 0) {
- frameCount = minFrameCount;
- }
- if (notificationFrames == 0) {
- notificationFrames = frameCount/2;
- }
- // Make sure that application is notified with sufficient margin
- // before underrun
- if (notificationFrames > frameCount/2) {
- notificationFrames = frameCount/2;
- }
- if (frameCount < minFrameCount) {
- LOGE("Invalid buffer size: minFrameCount %d, frameCount %d", minFrameCount, frameCount);
- return BAD_VALUE;
- }
- } else {
- // Ensure that buffer alignment matches channelcount
- if (((uint32_t)sharedBuffer->pointer() & (channelCount | 1)) != 0) {
- LOGE("Invalid buffer alignement: address %p, channelCount %d", sharedBuffer->pointer(), channelCount);
- return BAD_VALUE;
- }
- frameCount = sharedBuffer->size()/channelCount/sizeof(int16_t);
- }
- }
-
mVolume[LEFT] = 1.0f;
mVolume[RIGHT] = 1.0f;
+ mFrameCount = frameCount;
+ mNotificationFramesReq = notificationFrames;
// create the IAudioTrack
status_t status = createTrack(streamType, sampleRate, format, channelCount,
- frameCount, flags, sharedBuffer, output);
+ frameCount, flags, sharedBuffer, output, true);
if (status != NO_ERROR) {
return status;
@@ -238,10 +199,7 @@
mMuted = false;
mActive = 0;
mCbf = cbf;
- mNotificationFrames = notificationFrames;
- mRemainingFrames = notificationFrames;
mUserData = user;
- mLatency = afLatency + (1000*mFrameCount) / sampleRate;
mLoopCount = 0;
mMarkerPosition = 0;
mMarkerReached = false;
@@ -281,7 +239,7 @@
uint32_t AudioTrack::frameCount() const
{
- return mFrameCount;
+ return mCblk->frameCount;
}
int AudioTrack::frameSize() const
@@ -303,6 +261,7 @@
void AudioTrack::start()
{
sp<AudioTrackThread> t = mAudioTrackThread;
+ status_t status;
LOGV("start %p", this);
if (t != 0) {
@@ -325,11 +284,18 @@
setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT);
}
- status_t status = mAudioTrack->start();
+ if (mCblk->flags & CBLK_INVALID_MSK) {
+ LOGW("start() track %p invalidated, creating a new one", this);
+ // no need to clear the invalid flag as this cblk will not be used anymore
+ // force new track creation
+ status = DEAD_OBJECT;
+ } else {
+ status = mAudioTrack->start();
+ }
if (status == DEAD_OBJECT) {
LOGV("start() dead IAudioTrack: creating a new one");
status = createTrack(mStreamType, mCblk->sampleRate, mFormat, mChannelCount,
- mFrameCount, mFlags, mSharedBuffer, getOutput());
+ mFrameCount, mFlags, mSharedBuffer, getOutput(), false);
if (status == NO_ERROR) {
status = mAudioTrack->start();
if (status == NO_ERROR) {
@@ -479,14 +445,14 @@
}
if (loopStart >= loopEnd ||
- loopEnd - loopStart > mFrameCount) {
- LOGE("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, mFrameCount, cblk->user);
+ loopEnd - loopStart > cblk->frameCount) {
+ LOGE("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, cblk->frameCount, cblk->user);
return BAD_VALUE;
}
- if ((mSharedBuffer != 0) && (loopEnd > mFrameCount)) {
+ if ((mSharedBuffer != 0) && (loopEnd > cblk->frameCount)) {
LOGE("setLoop invalid value: loop markers beyond data: loopStart %d, loopEnd %d, framecount %d",
- loopStart, loopEnd, mFrameCount);
+ loopStart, loopEnd, cblk->frameCount);
return BAD_VALUE;
}
@@ -566,7 +532,7 @@
if (position > mCblk->user) return BAD_VALUE;
mCblk->server = position;
- mCblk->forceReady = 1;
+ mCblk->flags |= CBLK_FORCEREADY_ON;
return NO_ERROR;
}
@@ -586,7 +552,7 @@
flush();
- mCblk->stepUser(mFrameCount);
+ mCblk->stepUser(mCblk->frameCount);
return NO_ERROR;
}
@@ -607,7 +573,8 @@
int frameCount,
uint32_t flags,
const sp<IMemory>& sharedBuffer,
- audio_io_handle_t output)
+ audio_io_handle_t output,
+ bool enforceFrameCount)
{
status_t status;
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
@@ -616,6 +583,61 @@
return NO_INIT;
}
+ int afSampleRate;
+ if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) {
+ return NO_INIT;
+ }
+ int afFrameCount;
+ if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) {
+ return NO_INIT;
+ }
+ uint32_t afLatency;
+ if (AudioSystem::getOutputLatency(&afLatency, streamType) != NO_ERROR) {
+ return NO_INIT;
+ }
+
+ mNotificationFramesAct = mNotificationFramesReq;
+ if (!AudioSystem::isLinearPCM(format)) {
+ if (sharedBuffer != 0) {
+ frameCount = sharedBuffer->size();
+ }
+ } else {
+ // Ensure that buffer depth covers at least audio hardware latency
+ uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
+ if (minBufCount < 2) minBufCount = 2;
+
+ int minFrameCount = (afFrameCount*sampleRate*minBufCount)/afSampleRate;
+
+ if (sharedBuffer == 0) {
+ if (frameCount == 0) {
+ frameCount = minFrameCount;
+ }
+ if (mNotificationFramesAct == 0) {
+ mNotificationFramesAct = frameCount/2;
+ }
+ // Make sure that application is notified with sufficient margin
+ // before underrun
+ if (mNotificationFramesAct > (uint32_t)frameCount/2) {
+ mNotificationFramesAct = frameCount/2;
+ }
+ if (frameCount < minFrameCount) {
+ if (enforceFrameCount) {
+ LOGE("Invalid buffer size: minFrameCount %d, frameCount %d", minFrameCount, frameCount);
+ return BAD_VALUE;
+ } else {
+ frameCount = minFrameCount;
+ }
+ }
+ } else {
+ // Ensure that buffer alignment matches channelcount
+ if (((uint32_t)sharedBuffer->pointer() & (channelCount | 1)) != 0) {
+ LOGE("Invalid buffer alignement: address %p, channelCount %d", sharedBuffer->pointer(), channelCount);
+ return BAD_VALUE;
+ }
+ frameCount = sharedBuffer->size()/channelCount/sizeof(int16_t);
+ }
+ }
+
sp<IAudioTrack> track = audioFlinger->createTrack(getpid(),
streamType,
sampleRate,
@@ -641,20 +663,20 @@
mCblkMemory.clear();
mCblkMemory = cblk;
mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());
- mCblk->out = 1;
- // Update buffer size in case it has been limited by AudioFlinger during track creation
- mFrameCount = mCblk->frameCount;
+ mCblk->flags |= CBLK_DIRECTION_OUT;
if (sharedBuffer == 0) {
mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
} else {
mCblk->buffers = sharedBuffer->pointer();
// Force buffer full condition as data is already present in shared memory
- mCblk->stepUser(mFrameCount);
+ mCblk->stepUser(mCblk->frameCount);
}
mCblk->volumeLR = (int32_t(int16_t(mVolume[LEFT] * 0x1000)) << 16) | int16_t(mVolume[RIGHT] * 0x1000);
mCblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS;
mCblk->waitTimeMs = 0;
+ mRemainingFrames = mNotificationFramesAct;
+ mLatency = afLatency + (1000*mCblk->frameCount) / sampleRate;
return NO_ERROR;
}
@@ -685,8 +707,15 @@
cblk->lock.unlock();
return WOULD_BLOCK;
}
-
- result = cblk->cv.waitRelative(cblk->lock, milliseconds(waitTimeMs));
+ if (!(cblk->flags & CBLK_INVALID_MSK)) {
+ result = cblk->cv.waitRelative(cblk->lock, milliseconds(waitTimeMs));
+ }
+ if (cblk->flags & CBLK_INVALID_MSK) {
+ LOGW("obtainBuffer() track %p invalidated, creating a new one", this);
+ // no need to clear the invalid flag as this cblk will not be used anymore
+ cblk->lock.unlock();
+ goto create_new_track;
+ }
if (__builtin_expect(result!=NO_ERROR, false)) {
cblk->waitTimeMs += waitTimeMs;
if (cblk->waitTimeMs >= cblk->bufferTimeoutMs) {
@@ -700,8 +729,9 @@
result = mAudioTrack->start();
if (result == DEAD_OBJECT) {
LOGW("obtainBuffer() dead IAudioTrack: creating a new one");
+create_new_track:
result = createTrack(mStreamType, cblk->sampleRate, mFormat, mChannelCount,
- mFrameCount, mFlags, mSharedBuffer, getOutput());
+ mFrameCount, mFlags, mSharedBuffer, getOutput(), false);
if (result == NO_ERROR) {
cblk = mCblk;
cblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
@@ -826,13 +856,13 @@
// Manage underrun callback
if (mActive && (mCblk->framesReady() == 0)) {
- LOGV("Underrun user: %x, server: %x, flowControlFlag %d", mCblk->user, mCblk->server, mCblk->flowControlFlag);
- if (mCblk->flowControlFlag == 0) {
+ LOGV("Underrun user: %x, server: %x, flags %04x", mCblk->user, mCblk->server, mCblk->flags);
+ if ((mCblk->flags & CBLK_UNDERRUN_MSK) == CBLK_UNDERRUN_OFF) {
mCbf(EVENT_UNDERRUN, mUserData, 0);
if (mCblk->server == mCblk->frameCount) {
mCbf(EVENT_BUFFER_END, mUserData, 0);
}
- mCblk->flowControlFlag = 1;
+ mCblk->flags |= CBLK_UNDERRUN_ON;
if (mSharedBuffer != 0) return false;
}
}
@@ -932,7 +962,7 @@
while (frames);
if (frames == 0) {
- mRemainingFrames = mNotificationFrames;
+ mRemainingFrames = mNotificationFramesAct;
} else {
mRemainingFrames = frames;
}
@@ -949,7 +979,7 @@
result.append(" AudioTrack::dump\n");
snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", mStreamType, mVolume[0], mVolume[1]);
result.append(buffer);
- snprintf(buffer, 255, " format(%d), channel count(%d), frame count(%d)\n", mFormat, mChannelCount, mFrameCount);
+ snprintf(buffer, 255, " format(%d), channel count(%d), frame count(%d)\n", mFormat, mChannelCount, mCblk->frameCount);
result.append(buffer);
snprintf(buffer, 255, " sample rate(%d), status(%d), muted(%d)\n", (mCblk == 0) ? 0 : mCblk->sampleRate, mStatus, mMuted);
result.append(buffer);
@@ -986,7 +1016,7 @@
: 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),
- flowControlFlag(1), forceReady(0)
+ flags(0)
{
}
@@ -996,7 +1026,7 @@
u += frameCount;
// Ensure that user is never ahead of server for AudioRecord
- if (out) {
+ if (flags & CBLK_DIRECTION_MSK) {
// If stepServer() has been called once, switch to normal obtainBuffer() timeout period
if (bufferTimeoutMs == MAX_STARTUP_TIMEOUT_MS-1) {
bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
@@ -1013,7 +1043,7 @@
this->user = u;
// Clear flow control error condition as new data has been written/read to/from buffer.
- flowControlFlag = 0;
+ flags &= ~CBLK_UNDERRUN_MSK;
return u;
}
@@ -1038,7 +1068,7 @@
uint32_t s = this->server;
s += frameCount;
- if (out) {
+ if (flags & CBLK_DIRECTION_MSK) {
// Mark that we have read the first buffer so that next time stepUser() is called
// we switch to normal obtainBuffer() timeout period
if (bufferTimeoutMs == MAX_STARTUP_TIMEOUT_MS) {
@@ -1089,7 +1119,7 @@
uint32_t u = this->user;
uint32_t s = this->server;
- if (out) {
+ if (flags & CBLK_DIRECTION_MSK) {
uint32_t limit = (s < loopStart) ? s : loopStart;
return limit + frameCount - u;
} else {
@@ -1102,7 +1132,7 @@
uint32_t u = this->user;
uint32_t s = this->server;
- if (out) {
+ if (flags & CBLK_DIRECTION_MSK) {
if (u < loopEnd) {
return u - s;
} else {
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 3100f6e..11f3016 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -754,7 +754,7 @@
int len = strlen(FILE_EXTS[i].extension);
int start = lenURL - len;
if (start > 0) {
- if (!strncmp(url + start, FILE_EXTS[i].extension, len)) {
+ if (!strncasecmp(url + start, FILE_EXTS[i].extension, len)) {
if (FILE_EXTS[i].playertype == VORBIS_PLAYER
&& !strncasecmp(url, "http://", 7)
&& useStagefrightForHTTP) {
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 12e8fe6..8404779 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -269,7 +269,7 @@
status_t StagefrightRecorder::setParamMaxDurationOrFileSize(int64_t limit,
bool limit_is_duration) {
- LOGV("setParamMaxDurationOrFileSize: limit (%d) for %s",
+ LOGV("setParamMaxDurationOrFileSize: limit (%lld) for %s",
limit, limit_is_duration?"duration":"size");
if (limit_is_duration) { // limit is in ms
if (limit <= 1000) { // XXX: 1 second
@@ -523,6 +523,14 @@
CHECK(mOutputFd >= 0);
mWriter = new AMRWriter(dup(mOutputFd));
mWriter->addSource(audioEncoder);
+
+ if (mMaxFileDurationUs != 0) {
+ mWriter->setMaxFileDuration(mMaxFileDurationUs);
+ }
+ if (mMaxFileSizeBytes != 0) {
+ mWriter->setMaxFileSize(mMaxFileSizeBytes);
+ }
+ mWriter->setListener(mListener);
mWriter->start();
return OK;
@@ -555,11 +563,6 @@
|| mVideoSource == VIDEO_SOURCE_CAMERA) {
CHECK(mCamera != NULL);
- if (mCamera == 0) {
- mCamera = Camera::connect(0);
- }
- CHECK(mCamera != NULL);
-
// Set the actual video recording frame size
CameraParameters params(mCamera->getParameters());
params.setPreviewSize(mVideoWidth, mVideoHeight);
@@ -585,13 +588,13 @@
return UNKNOWN_ERROR;
}
+ CHECK_EQ(OK, mCamera->setPreviewDisplay(mPreviewSurface));
+
sp<CameraSource> cameraSource =
CameraSource::CreateFromCamera(mCamera);
CHECK(cameraSource != NULL);
- cameraSource->setPreviewSurface(mPreviewSurface);
-
sp<MetaData> enc_meta = new MetaData;
enc_meta->setInt32(kKeyBitRate, mVideoBitRate);
enc_meta->setInt32(kKeySampleRate, mFrameRate); // XXX: kKeySampleRate?
@@ -641,6 +644,13 @@
writer->setInterleaveDuration(mInterleaveDurationUs);
}
+ if (mMaxFileDurationUs != 0) {
+ mWriter->setMaxFileDuration(mMaxFileDurationUs);
+ }
+ if (mMaxFileSizeBytes != 0) {
+ mWriter->setMaxFileSize(mMaxFileSizeBytes);
+ }
+ mWriter->setListener(mListener);
mWriter->start();
return OK;
}
diff --git a/media/libstagefright/AMRWriter.cpp b/media/libstagefright/AMRWriter.cpp
index 73ea56d..aec7394 100644
--- a/media/libstagefright/AMRWriter.cpp
+++ b/media/libstagefright/AMRWriter.cpp
@@ -22,6 +22,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h>
+#include <media/mediarecorder.h>
namespace android {
@@ -137,6 +138,20 @@
mStarted = false;
}
+bool AMRWriter::exceedsFileSizeLimit() {
+ if (mMaxFileSizeLimitBytes == 0) {
+ return false;
+ }
+ return mEstimatedSizeBytes >= mMaxFileSizeLimitBytes;
+}
+
+bool AMRWriter::exceedsFileDurationLimit() {
+ if (mMaxFileDurationLimitUs == 0) {
+ return false;
+ }
+ return mEstimatedDurationUs >= mMaxFileDurationLimitUs;
+}
+
// static
void *AMRWriter::ThreadWrapper(void *me) {
static_cast<AMRWriter *>(me)->threadFunc();
@@ -145,6 +160,9 @@
}
void AMRWriter::threadFunc() {
+ mEstimatedDurationUs = 0;
+ mEstimatedSizeBytes = 0;
+ bool stoppedPrematurely = true;
while (!mDone) {
MediaBuffer *buffer;
status_t err = mSource->read(&buffer);
@@ -153,6 +171,25 @@
break;
}
+ mEstimatedSizeBytes += buffer->range_length();
+ if (exceedsFileSizeLimit()) {
+ buffer->release();
+ buffer = NULL;
+ notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0);
+ break;
+ }
+
+ int64_t timestampUs;
+ CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs));
+ if (timestampUs > mEstimatedDurationUs) {
+ mEstimatedDurationUs = timestampUs;
+ }
+ if (exceedsFileDurationLimit()) {
+ buffer->release();
+ buffer = NULL;
+ notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0);
+ break;
+ }
ssize_t n = fwrite(
(const uint8_t *)buffer->data() + buffer->range_offset(),
1,
@@ -166,10 +203,22 @@
break;
}
+ // XXX: How to tell it is stopped prematurely?
+ if (stoppedPrematurely) {
+ stoppedPrematurely = false;
+ }
+
buffer->release();
buffer = NULL;
}
+ if (stoppedPrematurely) {
+ notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_STOP_PREMATURELY, 0);
+ }
+
+ fflush(mFile);
+ fclose(mFile);
+ mFile = NULL;
mReachedEOS = true;
}
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 81f995b..e54fb67 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -1,6 +1,8 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+include frameworks/base/media/libstagefright/codecs/common/Config.mk
+
LOCAL_SRC_FILES:= \
ESDS.cpp \
MediaBuffer.cpp \
@@ -65,9 +67,11 @@
LOCAL_STATIC_LIBRARIES := \
libstagefright_aacdec \
+ libstagefright_aacenc \
libstagefright_amrnbdec \
libstagefright_amrnbenc \
libstagefright_amrwbdec \
+ libstagefright_amrwbenc \
libstagefright_avcdec \
libstagefright_m4vh263dec \
libstagefright_mp3dec \
@@ -75,10 +79,12 @@
LOCAL_SHARED_LIBRARIES += \
libstagefright_amrnb_common \
+ libstagefright_enc_common \
libstagefright_avc_common
ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
+
LOCAL_STATIC_LIBRARIES += \
libstagefright_id3
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 3a1e3bc..cd26e6b 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -27,42 +27,10 @@
#include <media/stagefright/MetaData.h>
#include <camera/Camera.h>
#include <camera/CameraParameters.h>
-#include <ui/GraphicBuffer.h>
-#include <ui/Overlay.h>
-#include <surfaceflinger/ISurface.h>
#include <utils/String8.h>
namespace android {
-struct DummySurface : public BnSurface {
- DummySurface() {}
-
- virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage) {
- return NULL;
- }
- virtual status_t setBufferCount(int bufferCount) {
- return INVALID_OPERATION;
- }
-
- virtual status_t registerBuffers(const BufferHeap &buffers) {
- return OK;
- }
-
- virtual void postBuffer(ssize_t offset) {}
- virtual void unregisterBuffers() {}
-
- virtual sp<OverlayRef> createOverlay(
- uint32_t w, uint32_t h, int32_t format, int32_t orientation) {
- return NULL;
- }
-
-protected:
- virtual ~DummySurface() {}
-
- DummySurface(const DummySurface &);
- DummySurface &operator=(const DummySurface &);
-};
-
struct CameraSourceListener : public CameraListener {
CameraSourceListener(const sp<CameraSource> &source);
@@ -150,23 +118,12 @@
}
}
-void CameraSource::setPreviewSurface(const sp<ISurface> &surface) {
- mPreviewSurface = surface;
-}
-
status_t CameraSource::start(MetaData *) {
LOGV("start");
CHECK(!mStarted);
mCamera->setListener(new CameraSourceListener(this));
-
- status_t err =
- mCamera->setPreviewDisplay(
- mPreviewSurface != NULL ? mPreviewSurface : new DummySurface);
- CHECK_EQ(err, OK);
-
- err = mCamera->startRecording();
- CHECK_EQ(err, OK);
+ CHECK_EQ(OK, mCamera->startRecording());
mStarted = true;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 323f145..a41b2f4 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -499,6 +499,8 @@
mDataSource = cachedSource;
}
}
+
+ mLastTrack->sampleTable = new SampleTable(mDataSource);
}
bool isTrack = false;
@@ -518,7 +520,6 @@
track->includes_expensive_metadata = false;
track->skipTrack = false;
track->timescale = 0;
- track->sampleTable = new SampleTable(mDataSource);
track->meta->setCString(kKeyMIMEType, "application/octet-stream");
}
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 19cccf7..094059d 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -31,6 +31,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/Utils.h>
+#include <media/mediarecorder.h>
namespace android {
@@ -44,6 +45,7 @@
bool reachedEOS();
int64_t getDurationUs() const;
+ int64_t getEstimatedTrackSizeBytes() const;
void writeTrackHeader(int32_t trackID);
private:
@@ -52,6 +54,7 @@
sp<MediaSource> mSource;
volatile bool mDone;
int64_t mMaxTimeStampUs;
+ int64_t mEstimatedTrackSizeBytes;
pthread_t mThread;
@@ -95,6 +98,7 @@
bool mGotAllCodecSpecificData;
bool mReachedEOS;
+ int64_t mStartTimestampUs;
static void *ThreadWrapper(void *me);
void threadEntry();
@@ -149,6 +153,7 @@
return UNKNOWN_ERROR;
}
+ mStartTimestampUs = 0;
mStreamableFile = true;
mWriteMoovBoxToMemory = false;
mMoovBoxBuffer = NULL;
@@ -455,6 +460,35 @@
write(data, 1, size, mFile);
}
+bool MPEG4Writer::exceedsFileSizeLimit() {
+ // No limit
+ if (mMaxFileSizeLimitBytes == 0) {
+ return false;
+ }
+
+ int64_t nTotalBytesEstimate = static_cast<int64_t>(mEstimatedMoovBoxSize);
+ for (List<Track *>::iterator it = mTracks.begin();
+ it != mTracks.end(); ++it) {
+ nTotalBytesEstimate += (*it)->getEstimatedTrackSizeBytes();
+ }
+ return (nTotalBytesEstimate >= mMaxFileSizeLimitBytes);
+}
+
+bool MPEG4Writer::exceedsFileDurationLimit() {
+ // No limit
+ if (mMaxFileDurationLimitUs == 0) {
+ return false;
+ }
+
+ for (List<Track *>::iterator it = mTracks.begin();
+ it != mTracks.end(); ++it) {
+ if ((*it)->getDurationUs() >= mMaxFileDurationLimitUs) {
+ return true;
+ }
+ }
+ return false;
+}
+
bool MPEG4Writer::reachedEOS() {
bool allDone = true;
for (List<Track *>::iterator it = mTracks.begin();
@@ -468,6 +502,21 @@
return allDone;
}
+void MPEG4Writer::setStartTimestamp(int64_t timeUs) {
+ LOGI("setStartTimestamp: %lld", timeUs);
+ Mutex::Autolock autoLock(mLock);
+ if (mStartTimestampUs != 0) {
+ return; // Sorry, too late
+ }
+ mStartTimestampUs = timeUs;
+}
+
+int64_t MPEG4Writer::getStartTimestamp() {
+ LOGI("getStartTimestamp: %lld", mStartTimestampUs);
+ Mutex::Autolock autoLock(mLock);
+ return mStartTimestampUs;
+}
+
////////////////////////////////////////////////////////////////////////////////
MPEG4Writer::Track::Track(
@@ -477,6 +526,7 @@
mSource(source),
mDone(false),
mMaxTimeStampUs(0),
+ mEstimatedTrackSizeBytes(0),
mSamplesHaveSameSize(true),
mCodecSpecificData(NULL),
mCodecSpecificDataSize(0),
@@ -508,6 +558,7 @@
mDone = false;
mMaxTimeStampUs = 0;
mReachedEOS = false;
+ mEstimatedTrackSizeBytes = 0;
pthread_create(&mThread, &attr, ThreadWrapper, this);
pthread_attr_destroy(&attr);
@@ -646,6 +697,7 @@
bool is_mpeg4 = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4) ||
!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC);
bool is_avc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC);
+ bool is_audio = !strncasecmp(mime, "audio/", 6);
int32_t count = 0;
const int64_t interleaveDurationUs = mOwner->interleaveDuration();
int64_t chunkTimestampUs = 0;
@@ -784,10 +836,28 @@
#endif
: buffer->range_length();
- bool is_audio = !strncasecmp(mime, "audio/", 6);
+ // Max file size or duration handling
+ mEstimatedTrackSizeBytes += info.size;
+ if (mOwner->exceedsFileSizeLimit()) {
+ buffer->release();
+ buffer = NULL;
+ mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0);
+ break;
+ }
+ if (mOwner->exceedsFileDurationLimit()) {
+ buffer->release();
+ buffer = NULL;
+ mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0);
+ break;
+ }
+
int64_t timestampUs;
CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs));
+ if (mSampleInfos.empty()) {
+ mOwner->setStartTimestamp(timestampUs);
+ mStartTimestampUs = (timestampUs - mOwner->getStartTimestamp());
+ }
if (timestampUs > mMaxTimeStampUs) {
mMaxTimeStampUs = timestampUs;
@@ -855,7 +925,9 @@
buffer = NULL;
}
- CHECK(!mSampleInfos.empty());
+ if (mSampleInfos.empty()) {
+ mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_STOP_PREMATURELY, 0);
+ }
// Last chunk
if (!mChunkSamples.empty()) {
@@ -876,8 +948,8 @@
SttsTableEntry sttsEntry(sampleCount, lastDuration);
mSttsTableEntries.push_back(sttsEntry);
mReachedEOS = true;
- LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames",
- count, nZeroLengthFrames, mSampleInfos.size());
+ LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames - %s",
+ count, nZeroLengthFrames, mSampleInfos.size(), is_audio? "audio": "video");
}
void MPEG4Writer::Track::writeOneChunk(bool isAvc) {
@@ -904,6 +976,10 @@
return mMaxTimeStampUs;
}
+int64_t MPEG4Writer::Track::getEstimatedTrackSizeBytes() const {
+ return mEstimatedTrackSizeBytes;
+}
+
void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) {
const char *mime;
bool success = mMeta->findCString(kKeyMIMEType, &mime);
@@ -953,6 +1029,19 @@
}
mOwner->endBox(); // tkhd
+ if (mStartTimestampUs != 0) {
+ mOwner->beginBox("edts");
+ mOwner->writeInt32(0); // version=0, flags=0
+ mOwner->beginBox("elst");
+ mOwner->writeInt32(0); // version=0, flags=0
+ mOwner->writeInt32(1); // a single entry
+ mOwner->writeInt32(mStartTimestampUs / 1000); // edit duration
+ mOwner->writeInt32(-1); // empty edit box to signal starting time offset
+ mOwner->writeInt32(1); // x1 rate
+ mOwner->endBox();
+ mOwner->endBox();
+ }
+
mOwner->beginBox("mdia");
mOwner->beginBox("mdhd");
@@ -972,7 +1061,7 @@
mOwner->writeInt32(0); // reserved
mOwner->writeInt32(0); // reserved
mOwner->writeInt32(0); // reserved
- mOwner->writeCString("SoundHandler"); // name
+ mOwner->writeCString(is_audio ? "SoundHandler": ""); // name
mOwner->endBox();
mOwner->beginBox("minf");
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index ce4dd32..33a118b 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -19,9 +19,11 @@
#include <utils/Log.h>
#include "include/AACDecoder.h"
+#include "include/AACEncoder.h"
#include "include/AMRNBDecoder.h"
#include "include/AMRNBEncoder.h"
#include "include/AMRWBDecoder.h"
+#include "include/AMRWBEncoder.h"
#include "include/AVCDecoder.h"
#include "include/M4vH263Decoder.h"
#include "include/MP3Decoder.h"
@@ -60,6 +62,11 @@
return new name(source); \
}
+#define FACTORY_CREATE_ENCODER(name) \
+static sp<MediaSource> Make##name(const sp<MediaSource> &source, const sp<MetaData> &meta) { \
+ return new name(source, meta); \
+}
+
#define FACTORY_REF(name) { #name, Make##name },
FACTORY_CREATE(MP3Decoder)
@@ -69,7 +76,32 @@
FACTORY_CREATE(AVCDecoder)
FACTORY_CREATE(M4vH263Decoder)
FACTORY_CREATE(VorbisDecoder)
-FACTORY_CREATE(AMRNBEncoder)
+FACTORY_CREATE_ENCODER(AMRNBEncoder)
+FACTORY_CREATE_ENCODER(AMRWBEncoder)
+FACTORY_CREATE_ENCODER(AACEncoder)
+
+static sp<MediaSource> InstantiateSoftwareEncoder(
+ const char *name, const sp<MediaSource> &source,
+ const sp<MetaData> &meta) {
+ struct FactoryInfo {
+ const char *name;
+ sp<MediaSource> (*CreateFunc)(const sp<MediaSource> &, const sp<MetaData> &);
+ };
+
+ static const FactoryInfo kFactoryInfo[] = {
+ FACTORY_REF(AMRNBEncoder)
+ FACTORY_REF(AMRWBEncoder)
+ FACTORY_REF(AACEncoder)
+ };
+ for (size_t i = 0;
+ i < sizeof(kFactoryInfo) / sizeof(kFactoryInfo[0]); ++i) {
+ if (!strcmp(name, kFactoryInfo[i].name)) {
+ return (*kFactoryInfo[i].CreateFunc)(source, meta);
+ }
+ }
+
+ return NULL;
+}
static sp<MediaSource> InstantiateSoftwareCodec(
const char *name, const sp<MediaSource> &source) {
@@ -86,7 +118,6 @@
FACTORY_REF(AVCDecoder)
FACTORY_REF(M4vH263Decoder)
FACTORY_REF(VorbisDecoder)
- FACTORY_REF(AMRNBEncoder)
};
for (size_t i = 0;
i < sizeof(kFactoryInfo) / sizeof(kFactoryInfo[0]); ++i) {
@@ -133,7 +164,9 @@
{ MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.encode" },
{ MEDIA_MIMETYPE_AUDIO_AMR_NB, "AMRNBEncoder" },
{ MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.encode" },
+ { MEDIA_MIMETYPE_AUDIO_AMR_WB, "AMRWBEncoder" },
{ MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.encode" },
+ { MEDIA_MIMETYPE_AUDIO_AAC, "AACEncoder" },
{ MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacenc" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.encoder.mpeg4" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.encoder" },
@@ -386,7 +419,8 @@
componentName = matchingCodecs[i].string();
#if BUILD_WITH_FULL_STAGEFRIGHT
- sp<MediaSource> softwareCodec =
+ sp<MediaSource> softwareCodec = createEncoder?
+ InstantiateSoftwareEncoder(componentName, source, meta):
InstantiateSoftwareCodec(componentName, source);
if (softwareCodec != NULL) {
@@ -511,18 +545,22 @@
}
}
+ int32_t bitRate = 0;
+ if (mIsEncoder) {
+ CHECK(meta->findInt32(kKeyBitRate, &bitRate));
+ }
if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mMIME)) {
- setAMRFormat(false /* isWAMR */);
+ setAMRFormat(false /* isWAMR */, bitRate);
}
if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mMIME)) {
- setAMRFormat(true /* isWAMR */);
+ setAMRFormat(true /* isWAMR */, bitRate);
}
if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mMIME)) {
int32_t numChannels, sampleRate;
CHECK(meta->findInt32(kKeyChannelCount, &numChannels));
CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
- setAACFormat(numChannels, sampleRate);
+ setAACFormat(numChannels, sampleRate, bitRate);
}
if (!strncasecmp(mMIME, "video/", 6)) {
@@ -2177,7 +2215,51 @@
CHECK_EQ(err, OK);
}
-void OMXCodec::setAMRFormat(bool isWAMR) {
+static OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate(bool isAMRWB, int32_t bps) {
+ if (isAMRWB) {
+ if (bps <= 6600) {
+ return OMX_AUDIO_AMRBandModeWB0;
+ } else if (bps <= 8850) {
+ return OMX_AUDIO_AMRBandModeWB1;
+ } else if (bps <= 12650) {
+ return OMX_AUDIO_AMRBandModeWB2;
+ } else if (bps <= 14250) {
+ return OMX_AUDIO_AMRBandModeWB3;
+ } else if (bps <= 15850) {
+ return OMX_AUDIO_AMRBandModeWB4;
+ } else if (bps <= 18250) {
+ return OMX_AUDIO_AMRBandModeWB5;
+ } else if (bps <= 19850) {
+ return OMX_AUDIO_AMRBandModeWB6;
+ } else if (bps <= 23050) {
+ return OMX_AUDIO_AMRBandModeWB7;
+ }
+
+ // 23850 bps
+ return OMX_AUDIO_AMRBandModeWB8;
+ } else { // AMRNB
+ if (bps <= 4750) {
+ return OMX_AUDIO_AMRBandModeNB0;
+ } else if (bps <= 5150) {
+ return OMX_AUDIO_AMRBandModeNB1;
+ } else if (bps <= 5900) {
+ return OMX_AUDIO_AMRBandModeNB2;
+ } else if (bps <= 6700) {
+ return OMX_AUDIO_AMRBandModeNB3;
+ } else if (bps <= 7400) {
+ return OMX_AUDIO_AMRBandModeNB4;
+ } else if (bps <= 7950) {
+ return OMX_AUDIO_AMRBandModeNB5;
+ } else if (bps <= 10200) {
+ return OMX_AUDIO_AMRBandModeNB6;
+ }
+
+ // 12200 bps
+ return OMX_AUDIO_AMRBandModeNB7;
+ }
+}
+
+void OMXCodec::setAMRFormat(bool isWAMR, int32_t bitRate) {
OMX_U32 portIndex = mIsEncoder ? kPortIndexOutput : kPortIndexInput;
OMX_AUDIO_PARAM_AMRTYPE def;
@@ -2191,10 +2273,7 @@
def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
- // XXX: Select bandmode based on bit rate
- def.eAMRBandMode =
- isWAMR ? OMX_AUDIO_AMRBandModeWB0 : OMX_AUDIO_AMRBandModeNB0;
-
+ def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitRate);
err = mOMX->setParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def));
CHECK_EQ(err, OK);
@@ -2211,7 +2290,7 @@
}
}
-void OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate) {
+void OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate) {
CHECK(numChannels == 1 || numChannels == 2);
if (mIsEncoder) {
//////////////// input port ////////////////////
@@ -2256,7 +2335,7 @@
profile.eChannelMode = (numChannels == 1?
OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo);
profile.nSampleRate = sampleRate;
- profile.nBitRate = 96000; // XXX
+ profile.nBitRate = bitRate;
profile.nAudioBandWidth = 0;
profile.nFrameLength = 0;
profile.nAACtools = OMX_AUDIO_AACToolAll;
@@ -3034,11 +3113,13 @@
} else if (audio_def->eEncoding == OMX_AUDIO_CodingAAC) {
mOutputFormat->setCString(
kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
- int32_t numChannels, sampleRate;
+ int32_t numChannels, sampleRate, bitRate;
inputFormat->findInt32(kKeyChannelCount, &numChannels);
inputFormat->findInt32(kKeySampleRate, &sampleRate);
+ inputFormat->findInt32(kKeyBitRate, &bitRate);
mOutputFormat->setInt32(kKeyChannelCount, numChannels);
mOutputFormat->setInt32(kKeySampleRate, sampleRate);
+ mOutputFormat->setInt32(kKeyBitRate, bitRate);
} else {
CHECK(!"Should not be here. Unknown audio encoding.");
}
diff --git a/media/libstagefright/codecs/aacenc/AACEncoder.cpp b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
new file mode 100644
index 0000000..d222cd9
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
@@ -0,0 +1,264 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "AACEncoder"
+#include <utils/Log.h>
+
+#include "AACEncoder.h"
+#include "voAAC.h"
+#include "cmnMemory.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+AACEncoder::AACEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta)
+ : mSource(source),
+ mMeta(meta),
+ mStarted(false),
+ mBufferGroup(NULL),
+ mInputBuffer(NULL),
+ mEncoderHandle(NULL),
+ mApiHandle(NULL),
+ mMemOperator(NULL) {
+}
+
+status_t AACEncoder::initCheck() {
+ CHECK(mApiHandle == NULL && mEncoderHandle == NULL);
+ CHECK(mMeta->findInt32(kKeySampleRate, &mSampleRate));
+ CHECK(mMeta->findInt32(kKeyChannelCount, &mChannels));
+ CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate));
+
+ mApiHandle = new VO_AUDIO_CODECAPI;
+ CHECK(mApiHandle);
+
+ if (VO_ERR_NONE != voGetAACEncAPI(mApiHandle)) {
+ LOGE("Failed to get api handle");
+ return UNKNOWN_ERROR;
+ }
+
+ mMemOperator = new VO_MEM_OPERATOR;
+ CHECK(mMemOperator != NULL);
+ mMemOperator->Alloc = cmnMemAlloc;
+ mMemOperator->Copy = cmnMemCopy;
+ mMemOperator->Free = cmnMemFree;
+ mMemOperator->Set = cmnMemSet;
+ mMemOperator->Check = cmnMemCheck;
+
+ VO_CODEC_INIT_USERDATA userData;
+ memset(&userData, 0, sizeof(userData));
+ userData.memflag = VO_IMF_USERMEMOPERATOR;
+ userData.memData = (VO_PTR) mMemOperator;
+ if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAAC, &userData)) {
+ LOGE("Failed to init AAC encoder");
+ return UNKNOWN_ERROR;
+ }
+ if (OK != setAudioSpecificConfigData()) {
+ LOGE("Failed to configure AAC encoder");
+ return UNKNOWN_ERROR;
+ }
+
+ // Configure AAC encoder$
+ AACENC_PARAM params;
+ memset(¶ms, 0, sizeof(params));
+ params.sampleRate = mSampleRate;
+ params.bitRate = mBitRate;
+ params.nChannels = mChannels;
+ params.adtsUsed = 0; // For MP4 file, don't use adts format$
+ if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AAC_ENCPARAM, ¶ms)) {
+ LOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+static status_t getSampleRateTableIndex(int32_t sampleRate, int32_t &index) {
+ static const int32_t kSampleRateTable[] = {
+ 96000, 88200, 64000, 48000, 44100, 32000,
+ 24000, 22050, 16000, 12000, 11025, 8000
+ };
+ const int32_t tableSize = sizeof(kSampleRateTable) / sizeof(kSampleRateTable[0]);
+ for (int32_t i = 0; i < tableSize; ++i) {
+ if (sampleRate == kSampleRateTable[i]) {
+ index = i;
+ return OK;
+ }
+ }
+
+ LOGE("Sampling rate %d bps is not supported", sampleRate);
+ return UNKNOWN_ERROR;
+}
+
+status_t AACEncoder::setAudioSpecificConfigData() {
+ LOGV("setAudioSpecificConfigData: %d hz, %d bps, and %d channels",
+ mSampleRate, mBitRate, mChannels);
+
+ int32_t index;
+ CHECK_EQ(OK, getSampleRateTableIndex(mSampleRate, index));
+ if (mChannels > 2 || mChannels <= 0) {
+ LOGE("Unsupported number of channels(%d)", mChannels);
+ return UNKNOWN_ERROR;
+ }
+
+ // OMX_AUDIO_AACObjectLC
+ mAudioSpecificConfigData[0] = ((0x02 << 3) | (index >> 1));
+ mAudioSpecificConfigData[1] = ((index & 0x01) << 7) | (mChannels << 3);
+ return OK;
+}
+
+AACEncoder::~AACEncoder() {
+ if (mStarted) {
+ stop();
+ }
+}
+
+status_t AACEncoder::start(MetaData *params) {
+ CHECK(!mStarted);
+
+ mBufferGroup = new MediaBufferGroup;
+ mBufferGroup->add_buffer(new MediaBuffer(2048));
+
+ CHECK_EQ(OK, initCheck());
+
+ mFrameCount = 0;
+ mSource->start();
+
+ mStarted = true;
+
+ return OK;
+}
+
+status_t AACEncoder::stop() {
+ CHECK(mStarted);
+
+ if (mInputBuffer) {
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+ }
+
+ delete mBufferGroup;
+ mBufferGroup = NULL;
+
+ mSource->stop();
+
+ if (mEncoderHandle) {
+ CHECK_EQ(VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle));
+ mEncoderHandle = NULL;
+ }
+ delete mApiHandle;
+ mApiHandle = NULL;
+
+ mStarted = false;
+
+ return OK;
+}
+
+sp<MetaData> AACEncoder::getFormat() {
+ sp<MetaData> srcFormat = mSource->getFormat();
+
+ mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
+
+ int64_t durationUs;
+ if (srcFormat->findInt64(kKeyDuration, &durationUs)) {
+ mMeta->setInt64(kKeyDuration, durationUs);
+ }
+
+ mMeta->setCString(kKeyDecoderComponent, "AACEncoder");
+
+ return mMeta;
+}
+
+status_t AACEncoder::read(
+ MediaBuffer **out, const ReadOptions *options) {
+ status_t err;
+
+ *out = NULL;
+
+ int64_t seekTimeUs;
+ CHECK(options == NULL || !options->getSeekTo(&seekTimeUs));
+
+ MediaBuffer *buffer;
+ CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+ uint8_t *outPtr = (uint8_t *)buffer->data();
+
+ if (mFrameCount == 0) {
+ memcpy(outPtr, mAudioSpecificConfigData, 2);
+ buffer->set_range(0, 2);
+ buffer->meta_data()->setInt32(kKeyIsCodecConfig, true);
+ *out = buffer;
+ ++mFrameCount;
+ mInputBuffer = NULL;
+ return OK;
+ } else {
+ buffer->meta_data()->setInt32(kKeyIsCodecConfig, false);
+ }
+
+ if (mInputBuffer == NULL) {
+ if (mSource->read(&mInputBuffer, options) != OK) {
+ LOGE("failed to read from input audio source");
+ return UNKNOWN_ERROR;
+ }
+ if (mInputBuffer->range_length() == 0) {
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+ return ERROR_END_OF_STREAM;
+ }
+ VO_CODECBUFFER inputData;
+ memset(&inputData, 0, sizeof(inputData));
+ inputData.Buffer = (unsigned char*) mInputBuffer->data();
+ inputData.Length = mInputBuffer->range_length();
+ CHECK(VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData));
+ }
+
+ CHECK(mInputBuffer != NULL);
+
+ VO_CODECBUFFER outputData;
+ memset(&outputData, 0, sizeof(outputData));
+ VO_AUDIO_OUTPUTINFO outputInfo;
+ memset(&outputInfo, 0, sizeof(outputInfo));
+
+ VO_U32 ret = VO_ERR_NONE;
+ int32_t outputLength = 0;
+ outputData.Buffer = outPtr;
+ outputData.Length = buffer->size();
+ ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo);
+ if (ret == VO_ERR_NONE || ret == VO_ERR_INPUT_BUFFER_SMALL) {
+ outputLength += outputData.Length;
+ if (ret == VO_ERR_INPUT_BUFFER_SMALL) { // All done
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+ }
+ } else {
+ LOGE("failed to encode the input data 0x%lx", ret);
+ }
+
+ buffer->set_range(0, outputLength);
+ ++mFrameCount;
+ int64_t timestampUs = (mFrameCount * 1000000LL * 1024) / mSampleRate;
+
+ buffer->meta_data()->setInt64(kKeyTime, timestampUs);
+
+ *out = buffer;
+ return OK;
+}
+
+} // namespace android
diff --git a/media/libstagefright/codecs/aacenc/Android.mk b/media/libstagefright/codecs/aacenc/Android.mk
new file mode 100644
index 0000000..cda4f9d
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/Android.mk
@@ -0,0 +1,87 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+include frameworks/base/media/libstagefright/codecs/common/Config.mk
+
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_SRC_FILES := basic_op/basicop2.c basic_op/oper_32b.c
+
+LOCAL_SRC_FILES += \
+ AACEncoder.cpp \
+ src/aac_rom.c \
+ src/aacenc.c \
+ src/aacenc_core.c \
+ src/adj_thr.c \
+ src/band_nrg.c \
+ src/bit_cnt.c \
+ src/bitbuffer.c \
+ src/bitenc.c \
+ src/block_switch.c \
+ src/channel_map.c \
+ src/dyn_bits.c \
+ src/grp_data.c \
+ src/interface.c \
+ src/line_pe.c \
+ src/ms_stereo.c \
+ src/pre_echo_control.c \
+ src/psy_configuration.c \
+ src/psy_main.c \
+ src/qc_main.c \
+ src/quantize.c \
+ src/sf_estim.c \
+ src/spreading.c \
+ src/stat_bits.c \
+ src/tns.c \
+ src/transform.c \
+ src/memalign.c
+
+ifeq ($(VOTT), v5)
+LOCAL_SRC_FILES += \
+ src/asm/ARMV5E/AutoCorrelation_v5.s \
+ src/asm/ARMV5E/band_nrg_v5.s \
+ src/asm/ARMV5E/CalcWindowEnergy_v5.s \
+ src/asm/ARMV5E/PrePostMDCT_v5.s \
+ src/asm/ARMV5E/R4R8First_v5.s \
+ src/asm/ARMV5E/Radix4FFT_v5.s
+endif
+
+ifeq ($(VOTT), v7)
+LOCAL_SRC_FILES += \
+ src/asm/ARMV5E/AutoCorrelation_v5.s \
+ src/asm/ARMV5E/band_nrg_v5.s \
+ src/asm/ARMV5E/CalcWindowEnergy_v5.s \
+ src/asm/ARMV7/PrePostMDCT_v7.s \
+ src/asm/ARMV7/R4R8First_v7.s \
+ src/asm/ARMV7/Radix4FFT_v7.s
+endif
+
+LOCAL_MODULE := libstagefright_aacenc
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_SHARED_LIBRARIES :=
+
+LOCAL_C_INCLUDES := \
+ frameworks/base/media/libstagefright/include \
+ frameworks/base/media/libstagefright/codecs/common/include \
+ frameworks/base/include \
+ $(LOCAL_PATH)/src \
+ $(LOCAL_PATH)/inc \
+ $(LOCAL_PATH)/basic_op
+
+LOCAL_CFLAGS := $(VO_CFLAGS)
+
+ifeq ($(VOTT), v5)
+LOCAL_CFLAGS += -DARMV5E -DARM_INASM -DARMV5_INASM
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+endif
+
+ifeq ($(VOTT), v7)
+LOCAL_CFLAGS += -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
+endif
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
new file mode 100644
index 0000000..64d012d
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
@@ -0,0 +1,283 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: AAC_E_SAMPLES.h
+
+ Content: sample code for AAC encoder
+
+*******************************************************************************/
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "voAAC.h"
+#include "cmnMemory.h"
+
+#define VO_AAC_E_OUTPUT 1
+#define READ_SIZE (1024*8)
+unsigned char outBuf[1024*8];
+unsigned char inBuf[READ_SIZE];
+
+const char* HelpString =
+"VisualOn AAC encoder Usage:\n"
+"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
+"-if input file name \n"
+"-of output file name \n"
+"-sr input pcm samplerate, default 44100 \n"
+"-ch input pcm channel, default 2 channel \n"
+"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"
+"-adts add or no adts header, default add adts header\n"
+"For example: \n"
+"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";
+
+static int parsecmdline(int argc, char **argv,char **input_filename, char **output_filename, AACENC_PARAM *param)
+{
+ // notice that:
+ // bitRate/nChannels > 8000
+ // bitRate/nChannels < 160000
+ // bitRate/nChannels < sampleRate*6
+ param->adtsUsed = 1;
+ param->bitRate = 0;
+ param->nChannels = 2;
+ param->sampleRate = 44100;
+
+ if(argc < 5 || argc > 13)
+ {
+ return -1;
+ }
+
+ argc--;
+ argv++;
+ while (argc > 0)
+ {
+ if (!strcmp(*argv, "-if"))
+ {
+ argv++;
+ argc--;
+ *input_filename = *argv;
+ }
+ else if (!strcmp(*argv, "-of"))
+ {
+ argv++;
+ argc--;
+ *output_filename = *argv;
+ }
+ else if (!strcmp(*argv, "-sr"))
+ {
+ argv++;
+ argc--;
+ param->sampleRate = atoi(*argv);
+ }
+ else if (!strcmp(*argv, "-ch"))
+ {
+ argv++;
+ argc--;
+ param->nChannels = atoi(*argv);
+ }
+ else if (!strcmp(*argv, "-br"))
+ {
+ argv++;
+ argc--;
+ param->bitRate = atoi(*argv);
+ }
+ else if(!strcmp(*argv, "-adts"))
+ {
+ argv++;
+ argc--;
+ param->adtsUsed = atoi(*argv);
+ }
+ else
+ {
+ return -1;
+ }
+
+ argv++;
+ argc--;
+ }
+
+ if(param->bitRate == 0)
+ {
+ int scale = 441;
+ if(param->sampleRate%8000 == 0)
+ scale = 480;
+ param->bitRate = 640*param->nChannels*param->sampleRate/scale;
+ }
+
+ return 0;
+}
+
+int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)
+{
+ int readBytes = 0;
+ readBytes = fread(dest, 1, readSize, infile);
+ return readBytes;
+}
+
+typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);
+
+int main(int argc, char **argv)
+{
+ FILE *infile, *outfile;
+ int t1, t2;
+ VO_AUDIO_CODECAPI AudioAPI;
+ VO_MEM_OPERATOR moper;
+ VO_CODEC_INIT_USERDATA useData;
+ VO_HANDLE hCodec;
+ VO_CODECBUFFER inData;
+ VO_CODECBUFFER outData;
+ VO_AUDIO_OUTPUTINFO outInfo;
+ int firstWrite = 1;
+ int eofFile = 0;
+ int *info=(int*)inBuf;
+ int bytesLeft, nRead;
+ int EncoderdFrame = 0;
+ int total = 0;
+ int isOutput = 1;
+ int returnCode;
+ AACENC_PARAM aacpara;
+ void *handle;
+ void *pfunc;
+ VOGETAUDIODECAPI pGetAPI;
+ const char *infileName = NULL;
+ const char *outfileName = NULL;
+
+ returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);
+ if(returnCode)
+ {
+ printf("%s", HelpString);
+ return 0;
+ }
+
+ /* open input file */
+ infile = fopen(infileName, "rb");
+ if (!infile) {
+ printf("Open input file fail...");
+ return -1;
+ }
+
+ /* open output file */
+ if(isOutput)
+ {
+ outfile = fopen(outfileName, "wb");
+ if (!outfile) {
+ printf("Open output file fail...");
+ return -1;
+ }
+ }
+ // set memory operators;
+ moper.Alloc = cmnMemAlloc;
+ moper.Copy = cmnMemCopy;
+ moper.Free = cmnMemFree;
+ moper.Set = cmnMemSet;
+ moper.Check = cmnMemCheck;
+ useData.memflag = VO_IMF_USERMEMOPERATOR;
+ useData.memData = (VO_PTR)(&moper);
+ // open encoder dll;
+ handle = dlopen("/data/local/tmp/libvoAACEncv7.so", RTLD_NOW);
+ if(handle == 0)
+ {
+ printf("open dll error......");
+ return -1;
+ }
+ // Get API;
+ pfunc = dlsym(handle, "voGetAACEncAPI");
+ if(pfunc == 0)
+ {
+ printf("open function error......");
+ return -1;
+ }
+ pGetAPI = (VOGETAUDIODECAPI)pfunc;
+ returnCode = pGetAPI(&AudioAPI);
+ if(returnCode)
+ return -1;
+
+
+//####################################### Init Encoding Section #########################################
+ returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);
+ if(returnCode < 0)
+ {
+ printf("#### VOI_Error2:fail to initialize the Encoderr###\n");
+ return -1;
+ }
+
+ returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
+
+ inData.Buffer = inBuf;
+ bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
+
+//####################################### Encoding Section #########################################
+
+ do {
+
+ inData.Length = bytesLeft;
+ outData.Buffer = outBuf;
+ outData.Length = 1024*8;
+
+ t1 = clock();
+
+ returnCode = AudioAPI.SetInputData(hCodec,&inData);
+
+ do {
+ outData.Buffer = outBuf;
+ outData.Length = 1024*8;
+
+ returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);
+
+ if(returnCode == 0)
+ EncoderdFrame++;
+ if(returnCode == VO_ERR_LICENSE_ERROR)
+ break;
+
+#if VO_AAC_E_OUTPUT
+ if (isOutput && returnCode == 0)
+ {
+ fwrite(outData.Buffer, 1, outData.Length, outfile);
+ }
+#endif
+ } while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));
+
+ if(returnCode == VO_ERR_LICENSE_ERROR)
+ break;
+
+ t2 = clock();
+ total += t2 - t1;
+
+ if (!eofFile) {
+ nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);
+ bytesLeft = nRead;
+ inData.Buffer = inBuf;
+ if (feof(infile))
+ eofFile = 1;
+ }
+
+ } while (!eofFile && returnCode);
+
+
+//################################################ End Encoding Section #######################################################
+ returnCode = AudioAPI.Uninit(hCodec);
+
+ fclose(infile);
+ if (outfile)
+ {
+ fclose(outfile);
+ }
+ dlclose(handle);
+ return 0;
+}
+
+
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/Android.mk b/media/libstagefright/codecs/aacenc/SampleCode/Android.mk
new file mode 100644
index 0000000..52c9c07
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/SampleCode/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := AAC_E_SAMPLES.c
+
+LOCAL_SRC_FILES += \
+ ../../../Common/cmnMemory.c
+
+LOCAL_MODULE := TestvoAACEnc
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_SHARED_LIBRARIES := libvoAACEnc
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/ \
+ $(LOCAL_PATH)/../../../Common \
+ $(LOCAL_PATH)/../../../Include \
+
+LOCAL_CFLAGS := $(VO_CFLAGS)
+
+include $(BUILD_EXECUTABLE)
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/eclair/Makefile b/media/libstagefright/codecs/aacenc/SampleCode/eclair/Makefile
new file mode 100644
index 0000000..22c5dc1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/SampleCode/eclair/Makefile
@@ -0,0 +1,55 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+# target6
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v7
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= exe
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+# e.g. -DVISUALON, macro VISUALON defined for your module
+VOMM:= #ARMV5E
+
+
+
+# please specify the name of your module
+VOTARGET:= voAACEncTestv7
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=-ldl
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../../../../../Release/
+
+
+# please modify here to be sure to see the doit.mk
+include ../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/ms.mk b/media/libstagefright/codecs/aacenc/SampleCode/ms.mk
new file mode 100644
index 0000000..771a569
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/SampleCode/ms.mk
@@ -0,0 +1,23 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+# please list all objects needed by your target here
+OBJS:=AAC_E_SAMPLES.o cmnMemory.o
+
+# please list all directories that all source files relative with your module(.h .c .cpp) locate
+VOSRCDIR:=../ ../../../../include ../../../../Common
+
+
diff --git a/media/libstagefright/codecs/aacenc/Tools/doit.mk b/media/libstagefright/codecs/aacenc/Tools/doit.mk
new file mode 100644
index 0000000..dea0b0a
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/Tools/doit.mk
@@ -0,0 +1,133 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+
+VERBOSE:=@
+
+
+VOMT ?= lib
+
+ifeq ($(VOMT), lib)
+LIB_STATIC=$(VOTARGET).a
+LIB_DYNAMIC=$(VOTARGET).so
+endif
+
+ifeq ($(VOMT), exe)
+TARGET=$(VOTARGET)
+endif
+
+CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
+CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
+ifneq ($(VOTT), pc)
+ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
+endif
+
+LDFLAGS:=$(VOLDFLAGS)
+VOTEDEPS+=$(VODEPLIBS)
+VOTLDEPS+=$(VODEPLIBS)
+VOSTCLIBS ?=
+
+vpath %.c $(VOSRCDIR)
+vpath %.cpp $(VOSRCDIR)
+ifneq ($(VOTT), pc)
+vpath %.s $(VOSRCDIR)
+endif
+
+ifeq ($(VOTT), pc)
+BLTDIRS=$(VORELDIR)/Linux/static
+BLTDIRD=$(VORELDIR)/Linux/shared
+else
+BLTDIRS=$(VORELDIR)/Google/$(VONJ)/lib/$(VOTT)
+BLTDIRD=$(VORELDIR)/Google/$(VONJ)/so/$(VOTT)
+endif
+
+
+.PRECIOUS: $(OBJDIR)/%.o
+
+ifeq ($(VOMT), lib)
+all: mkdirs $(LIB_STATIC) $(LIB_DYNAMIC)
+mkdirs: $(OBJDIR) $(BLTDIRS) $(BLTDIRD)
+else
+all: mkdirs $(TARGET)
+mkdirs: $(OBJDIR)
+endif
+
+$(OBJDIR):
+ @if test ! -d $@; then \
+ mkdir -p $@; \
+ fi;
+
+ifeq ($(VOMT), lib)
+$(BLTDIRS):
+ @if test ! -d $@; then \
+ mkdir -p $@; \
+ fi;
+$(BLTDIRD):
+ @if test ! -d $@; then \
+ mkdir -p $@; \
+ fi;
+endif
+
+
+ifeq ($(VOMT), lib)
+$(LIB_STATIC):$(OBJS)
+ $(AR) cr $@ $(OBJDIR)/*.o $(VOSTCLIBS)
+ $(RANLIB) $@
+ifneq ($(VODBG), yes)
+ #$(STRIP) $@
+endif
+
+$(LIB_DYNAMIC):$(OBJS)
+ $(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTLDEPS)
+ifneq ($(VODBG), yes)
+ $(STRIP) $@
+endif
+
+else
+
+$(TARGET):$(OBJS)
+ $(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTEDEPS)
+ifneq ($(VODBG), yes)
+ $(STRIP) $@
+endif
+
+endif
+
+
+.SUFFIXES: .c .cpp .s .o
+.c.o:
+ $(VERBOSE) $(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c $<
+#%.c:$(OBJDIR)/%.o
+# $(VERBOSE) $(CC) $(CFLAGS) -o $@ -c $<
+.cpp.o:
+ $(VERBOSE) $(GG) $(CPPFLAGS) -o $(OBJDIR)/$@ -c $<
+ifneq ($(VOTT), pc)
+.s.o:
+ $(VERBOSE) $(AS) $(ASFLAGS) -o $(OBJDIR)/$@ $<
+endif
+
+
+.PHONY: clean devel
+clean:
+ifeq ($(VOMT), lib)
+ -rm -fr $(OBJDIR) .*.sw* $(VOTARGET).*
+else
+ -rm -fr $(OBJDIR) .*.sw* $(VOTARGET)
+endif
+
+devel:
+ cp -a $(LIB_STATIC) $(BLTDIRS)
+ cp -a $(LIB_DYNAMIC) $(BLTDIRD)
+
diff --git a/media/libstagefright/codecs/aacenc/Tools/eclair.mk b/media/libstagefright/codecs/aacenc/Tools/eclair.mk
new file mode 100644
index 0000000..1688361
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/Tools/eclair.mk
@@ -0,0 +1,172 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+
+# special macro definitions for building
+VOPREDEF=-DLINUX -D_LINUX
+
+VOPRJ ?=
+VONJ ?= eclair
+VOTT ?= v6
+# control the version to release out
+# available: eva(evaluation), rel(release)
+VOVER=
+ifeq ($(VOVER), eva)
+VOPREDEF+=-D__VOVER_EVA__
+endif
+
+# for debug or not: yes for debug, any other for release
+VODBG?=ye
+
+# for detecting memory leak
+VODML=
+ifeq ($(VODML), yes)
+VOPREDEF+=-DDMEMLEAK
+endif
+
+VOPREDEF+=-D__VOTT_ARM__ -D__VONJ_ECLAIR__
+TCROOTPATH:=/opt/eclair
+GCCVER:=4.4.0
+TCPATH:=$(TCROOTPATH)/prebuilt/linux-x86/toolchain/arm-eabi-$(GCCVER)
+CCTPRE:=$(TCPATH)/bin/arm-eabi-
+AS:=$(CCTPRE)as
+AR:=$(CCTPRE)ar
+NM:=$(CCTPRE)nm
+CC:=$(CCTPRE)gcc
+GG:=$(CCTPRE)g++
+LD:=$(CCTPRE)ld
+SIZE:=$(CCTPRE)size
+STRIP:=$(CCTPRE)strip
+RANLIB:=$(CCTPRE)ranlib
+OBJCOPY:=$(CCTPRE)objcopy
+OBJDUMP:=$(CCTPRE)objdump
+READELF:=$(CCTPRE)readelf
+STRINGS:=$(CCTPRE)strings
+
+# target product dependcy
+# available: dream, generic
+VOTP:=sapphire-open
+CCTLIB:=$(TCROOTPATH)/out/target/product/$(VOTP)/obj/lib
+CCTINC:=-I$(TCROOTPATH)/system/core/include \
+ -I$(TCROOTPATH)/hardware/libhardware/include \
+ -I$(TCROOTPATH)/hardware/ril/include \
+ -I$(TCROOTPATH)/hardware/libhardware_legacy/include \
+ -I$(TCROOTPATH)/dalvik/libnativehelper/include \
+ -I$(TCROOTPATH)/dalvik/libnativehelper/include/nativehelper \
+ -I$(TCROOTPATH)/frameworks/base/include \
+ -I$(TCROOTPATH)/frameworks/base/core/jni \
+ -I$(TCROOTPATH)/frameworks/base/libs/audioflinger \
+ -I$(TCROOTPATH)/external/skia/include \
+ -I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/include \
+ -I$(TCROOTPATH)/bionic/libc/arch-arm/include \
+ -I$(TCROOTPATH)/bionic/libc/include \
+ -I$(TCROOTPATH)/bionic/libstdc++/include \
+ -I$(TCROOTPATH)/bionic/libc/kernel/common \
+ -I$(TCROOTPATH)/bionic/libc/kernel/arch-arm \
+ -I$(TCROOTPATH)/bionic/libm/include \
+ -I$(TCROOTPATH)/bionic/libm/include/arm \
+ -I$(TCROOTPATH)/bionic/libthread_db/include \
+ -I$(TCROOTPATH)/bionic/libm/arm \
+ -I$(TCROOTPATH)/bionic/libm \
+ -I$(TCROOTPATH)/frameworks/base/include/android_runtime
+ #-I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/SHARED_LIBRARIES/libm_intermediates
+
+CCTCFLAGS:=-msoft-float -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0 -finline-functions -finline-limit=600 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fstrict-aliasing -funswitch-loops
+#-fwide-exec-charset=charset=UTF-32
+
+# for target exe
+TELDFLAGS:=-nostdlib -Bdynamic -Wl,-T,$(TCROOTPATH)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(CCTLIB) -L$(CCTLIB)
+
+VOTEDEPS:=$(CCTLIB)/crtbegin_dynamic.o $(CCTLIB)/crtend_android.o $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a -lc -lm
+
+# for target lib
+TLLDFLAGS:=-nostdlib -Wl,-T,$(TCROOTPATH)/build/core/armelf.xsc -Wl,--gc-sections -Wl,-shared,-Bsymbolic -L$(CCTLIB) -Wl,--no-whole-archive -Wl,--no-undefined $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a
+
+VOTLDEPS:=-lm -lc
+
+
+ifeq ($(VOTT), v4)
+VOCFLAGS:=-mtune=arm9tdmi -march=armv4t
+VOASFLAGS:=-march=armv4t -mfpu=softfpa
+endif
+
+ifeq ($(VOTT), v5)
+VOCFLAGS:=-march=armv5te
+VOASFLAGS:=-march=armv5te -mfpu=vfp
+endif
+
+ifeq ($(VOTT), v5x)
+VOCFLAGS:=-march=armv5te -mtune=xscale
+VOASFLAGS:=-march=armv5te -mfpu=vfp
+endif
+
+ifeq ($(VOTT), v6)
+#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
+#VOASFLAGS:=-march=armv6
+VOCFLAGS:=-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mapcs -mtpcs-leaf-frame -mlong-calls
+VOASFLAGS:=-march=armv6j -mcpu=arm1136jf-s -mfpu=arm1136jf-s -mfloat-abi=softfp -mapcs-float -mapcs-reentrant
+endif
+
+#
+# global link options
+VOLDFLAGS:=-Wl,-x,-X,--as-needed
+
+
+ifeq ($(VOTT), v7)
+VOCFLAGS+=-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
+VOASFLAGS+=-march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp
+VOLDFLAGS+=-Wl,--fix-cortex-a8
+endif
+
+#global compiling options for ARM target
+ifneq ($(VOTT), pc)
+VOASFLAGS+=--strip-local-absolute -R
+endif
+
+
+ifeq ($(VODBG), yes)
+VOCFLAGS+=-D_DEBUG -g
+else
+VOCFLAGS+=-DNDEBUG -O3
+endif
+
+VOCFLAGS+=$(VOPREDEF) $(VOMM) -Wall -fsigned-char -fomit-frame-pointer -fno-leading-underscore -fpic -fPIC -pipe -ftracer -fforce-addr -fno-bounds-check #-fvisibility=hidden #-fvisibility-inlines-hidden ##-ftree-loop-linear -mthumb -nostdinc -dD -fprefetch-loop-arrays
+
+
+ifneq ($(VOTT), pc)
+VOCFLAGS+=$(CCTCFLAGS) $(CCTINC)
+VOCPPFLAGS:=-fno-rtti $(VOCFLAGS)
+
+ifeq ($(VOMT), exe)
+VOLDFLAGS+=$(TELDFLAGS)
+endif
+
+ifeq ($(VOMT), lib)
+VOLDFLAGS+=$(TLLDFLAGS)
+endif
+else
+VOCPPFLAGS:=$(VOCFLAGS)
+ifeq ($(VOMT), lib)
+VOLDFLAGS+=-shared
+endif
+endif
+
+ifeq ($(VODBG), yes)
+#VOLDFLAGS:=
+endif
+
+# where to place object files
+OBJDIR=obj
+
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
new file mode 100644
index 0000000..5457f33
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
@@ -0,0 +1,1166 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: basicop2.h
+
+ Content: Constants , Globals and Basic arithmetic operators.
+
+*******************************************************************************/
+
+#ifndef __BASIC_OP_H
+#define __BASIC_OP_H
+
+#include "typedef.h"
+
+#define MAX_32 (Word32)0x7fffffffL
+#define MIN_32 (Word32)0x80000000L
+
+#define MAX_16 (Word16)0x7fff
+#define MIN_16 (Word16)0x8000
+#define ABS(a) ((a) >= 0) ? (a) : (-(a))
+
+/* Short abs, 1 */
+#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))
+
+/* 16 bit var1 -> MSB, 2 */
+#define L_deposit_h(x) (((Word32)(x)) << 16)
+
+
+/* 16 bit var1 -> LSB, 2 */
+#define L_deposit_l(x) ((Word32)(x))
+
+
+/* Long abs, 3 */
+#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)
+
+
+/* Short negate, 1 */
+#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))
+
+
+/* Long negate, 2 */
+#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))
+
+
+#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)
+#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)
+
+
+#if (SATRUATE_IS_INLINE)
+__inline Word16 saturate(Word32 L_var1);
+#else
+Word16 saturate(Word32 L_var1);
+#endif
+
+/* Short shift left, 1 */
+#if (SHL_IS_INLINE)
+__inline Word16 shl (Word16 var1, Word16 var2);
+#else
+Word16 shl (Word16 var1, Word16 var2);
+#endif
+
+/* Short shift right, 1 */
+#if (SHR_IS_INLINE)
+__inline Word16 shr (Word16 var1, Word16 var2);
+#else
+Word16 shr (Word16 var1, Word16 var2);
+#endif
+
+#if (L_MULT_IS_INLINE)
+__inline Word32 L_mult(Word16 var1, Word16 var2);
+#else
+Word32 L_mult(Word16 var1, Word16 var2);
+#endif
+
+/* Msu, 1 */
+#if (L_MSU_IS_INLINE)
+__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+/* Long sub, 2 */
+#if (L_SUB_IS_INLINE)
+__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
+#else
+Word32 L_sub(Word32 L_var1, Word32 L_var2);
+#endif
+
+/* Long shift left, 2 */
+#if (L_SHL_IS_INLINE)
+__inline Word32 L_shl (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shl (Word32 L_var1, Word16 var2);
+#endif
+
+/* Long shift right, 2*/
+#if (L_SHR_IS_INLINE)
+__inline Word32 L_shr (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shr (Word32 L_var1, Word16 var2);
+#endif
+
+/* Short add, 1 */
+#if (ADD_IS_INLINE)
+__inline Word16 add (Word16 var1, Word16 var2);
+#else
+Word16 add (Word16 var1, Word16 var2);
+#endif
+
+/* Short sub, 1 */
+#if (SUB_IS_INLINE)
+__inline Word16 sub(Word16 var1, Word16 var2);
+#else
+Word16 sub(Word16 var1, Word16 var2);
+#endif
+
+/* Short division, 18 */
+#if (DIV_S_IS_INLINE)
+__inline Word16 div_s (Word16 var1, Word16 var2);
+#else
+Word16 div_s (Word16 var1, Word16 var2);
+#endif
+
+/* Short mult, 1 */
+#if (MULT_IS_INLINE)
+__inline Word16 mult (Word16 var1, Word16 var2);
+#else
+Word16 mult (Word16 var1, Word16 var2);
+#endif
+
+/* Short norm, 15 */
+#if (NORM_S_IS_INLINE)
+__inline Word16 norm_s (Word16 var1);
+#else
+Word16 norm_s (Word16 var1);
+#endif
+
+/* Long norm, 30 */
+#if (NORM_L_IS_INLINE)
+__inline Word16 norm_l (Word32 L_var1);
+#else
+Word16 norm_l (Word32 L_var1);
+#endif
+
+/* Round, 1 */
+#if (ROUND_IS_INLINE)
+__inline Word16 round16(Word32 L_var1);
+#else
+Word16 round16(Word32 L_var1);
+#endif
+
+/* Mac, 1 */
+#if (L_MAC_IS_INLINE)
+__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+#if (L_ADD_IS_INLINE)
+__inline Word32 L_add (Word32 L_var1, Word32 L_var2);
+#else
+Word32 L_add (Word32 L_var1, Word32 L_var2);
+#endif
+
+/* Extract high, 1 */
+#if (EXTRACT_H_IS_INLINE)
+__inline Word16 extract_h (Word32 L_var1);
+#else
+Word16 extract_h (Word32 L_var1);
+#endif
+
+/* Extract low, 1 */
+#if (EXTRACT_L_IS_INLINE)
+__inline Word16 extract_l(Word32 L_var1);
+#else
+Word16 extract_l(Word32 L_var1);
+#endif
+
+/* Mult with round, 2 */
+#if (MULT_R_IS_INLINE)
+__inline Word16 mult_r(Word16 var1, Word16 var2);
+#else
+Word16 mult_r(Word16 var1, Word16 var2);
+#endif
+
+/* Shift right with round, 2 */
+#if (SHR_R_IS_INLINE)
+__inline Word16 shr_r (Word16 var1, Word16 var2);
+#else
+Word16 shr_r (Word16 var1, Word16 var2);
+#endif
+
+/* Mac with rounding,2 */
+#if (MAC_R_IS_INLINE)
+__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+/* Msu with rounding,2 */
+#if (MSU_R_IS_INLINE)
+__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+/* Long shift right with round, 3 */
+#if (L_SHR_R_IS_INLINE)
+__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shr_r (Word32 L_var1, Word16 var2);
+#endif
+
+#if ARMV4_INASM
+__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
+{
+ Word32 result;
+ asm volatile(
+ "MOV %[result], %[L_var1], ASR %[var2] \n"
+ :[result]"=r"(result)
+ :[L_var1]"r"(L_var1), [var2]"r"(var2)
+ );
+ return result;
+}
+
+__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
+{
+ Word32 result;
+ asm volatile(
+ "MOV r2, %[L_var1] \n"
+ "MOV r3, #0x7fffffff\n"
+ "MOV %[result], %[L_var1], ASL %[var2] \n"
+ "TEQ r2, %[result], ASR %[var2]\n"
+ "EORNE %[result],r3,r2,ASR#31\n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1), [var2]"r"(var2)
+ :"r2", "r3"
+ );
+ return result;
+}
+
+__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
+{
+ Word32 result;
+ asm volatile(
+ "CMP %[var2], #15\n"
+ "MOVGE %[var2], #15\n"
+ "MOV %[result], %[L_var1], ASR %[var2]\n"
+ :[result]"=r"(result)
+ :[L_var1]"r"(L_var1), [var2]"r"(var2)
+ );
+ return result;
+}
+
+__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
+{
+ Word32 result;
+ asm volatile(
+ "CMP %[var2], #16\n"
+ "MOVGE %[var2], #16\n"
+ "MOV %[result], %[L_var1], ASL %[var2]\n"
+ "MOV r3, #1\n"
+ "MOV r2, %[result], ASR #15\n"
+ "RSB r3,r3,r3,LSL #15 \n"
+ "TEQ r2, %[result], ASR #31 \n"
+ "EORNE %[result], r3, %[result],ASR #31"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1), [var2]"r"(var2)
+ :"r2", "r3"
+ );
+ return result;
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | definitions for inline basic arithmetic operators |
+ |___________________________________________________________________________|
+*/
+#if (SATRUATE_IS_INLINE)
+__inline Word16 saturate(Word32 L_var1)
+{
+#if ARMV5TE_SAT
+ Word16 result;
+ asm volatile (
+ "MOV %[result], %[L_var1]\n"
+ "MOV r3, #1\n"
+ "MOV r2,%[L_var1],ASR#15\n"
+ "RSB r3, r3, r3, LSL #15\n"
+ "TEQ r2,%[L_var1],ASR#31\n"
+ "EORNE %[result],r3,%[L_var1],ASR#31\n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1)
+ :"r2", "r3"
+ );
+
+ return result;
+#else
+ Word16 var_out;
+
+ //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
+
+ if (L_var1 > 0X00007fffL)
+ {
+ var_out = MAX_16;
+ }
+ else if (L_var1 < (Word32) 0xffff8000L)
+ {
+ var_out = MIN_16;
+ }
+ else
+ {
+ var_out = extract_l(L_var1);
+ }
+
+ return (var_out);
+#endif
+}
+#endif
+
+/* Short shift left, 1 */
+#if (SHL_IS_INLINE)
+__inline Word16 shl (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SHL
+ if(var2>=0)
+ {
+ return ASM_shl( var1, var2);
+ }
+ else
+ {
+ return ASM_shr( var1, -var2);
+ }
+#else
+ Word16 var_out;
+ Word32 result;
+
+ if (var2 < 0)
+ {
+ var_out = shr (var1, (Word16)-var2);
+ }
+ else
+ {
+ result = (Word32) var1 *((Word32) 1 << var2);
+
+ if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+ {
+ var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+ }
+ else
+ {
+ var_out = extract_l(result);
+ }
+ }
+ return (var_out);
+#endif
+}
+#endif
+
+/* Short shift right, 1 */
+#if (SHR_IS_INLINE)
+__inline Word16 shr (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SHR
+ if(var2>=0)
+ {
+ return ASM_shr( var1, var2);
+ }
+ else
+ {
+ return ASM_shl( var1, -var2);
+ }
+#else
+ Word16 var_out;
+
+ if (var2 < 0)
+ {
+ var_out = shl (var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 15)
+ {
+ var_out = (Word16)((var1 < 0) ? -1 : 0);
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var_out = (Word16)(~((~var1) >> var2));
+ }
+ else
+ {
+ var_out = (Word16)(var1 >> var2);
+ }
+ }
+ }
+
+ return (var_out);
+#endif
+}
+#endif
+
+
+#if (L_MULT_IS_INLINE)
+__inline Word32 L_mult(Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MULT
+ Word32 result;
+ asm volatile(
+ "SMULBB %[result], %[var1], %[var2] \n"
+ "QADD %[result], %[result], %[result] \n"
+ :[result]"+r"(result)
+ :[var1]"r"(var1), [var2]"r"(var2)
+ );
+ return result;
+#else
+ Word32 L_var_out;
+
+ L_var_out = (Word32) var1 *(Word32) var2;
+
+ if (L_var_out != (Word32) 0x40000000L)
+ {
+ L_var_out <<= 1;
+ }
+ else
+ {
+ L_var_out = MAX_32;
+ }
+ return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_MSU_IS_INLINE)
+__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MSU
+ Word32 result;
+ asm volatile(
+ "SMULBB %[result], %[var1], %[var2] \n"
+ "QADD %[result], %[result], %[result] \n"
+ "QSUB %[result], %[L_var3], %[result]\n"
+ :[result]"+r"(result)
+ :[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
+ );
+ return result;
+#else
+ Word32 L_var_out;
+ Word32 L_product;
+
+ L_product = L_mult(var1, var2);
+ L_var_out = L_sub(L_var3, L_product);
+ return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_SUB_IS_INLINE)
+__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
+{
+#if ARMV5TE_L_SUB
+ Word32 result;
+ asm volatile(
+ "QSUB %[result], %[L_var1], %[L_var2]\n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
+ );
+ return result;
+#else
+ Word32 L_var_out;
+
+ L_var_out = L_var1 - L_var2;
+
+ if (((L_var1 ^ L_var2) & MIN_32) != 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+ }
+ }
+
+ return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_SHL_IS_INLINE)
+__inline Word32 L_shl(Word32 L_var1, Word16 var2)
+{
+#if ARMV5TE_L_SHL
+ if(var2>=0)
+ {
+ return ASM_L_shl( L_var1, var2);
+ }
+ else
+ {
+ return ASM_L_shr( L_var1, -var2);
+ }
+#else
+ Word32 L_var_out = 0L;
+
+ if (var2 <= 0)
+ {
+ L_var1 = L_shr(L_var1, (Word16)-var2);
+ }
+ else
+ {
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ return MAX_32;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ return MIN_32;
+ }
+ }
+ L_var1 <<= 1;
+ L_var_out = L_var1;
+ }
+ }
+ return (L_var1);
+#endif
+}
+#endif
+
+#if (L_SHR_IS_INLINE)
+__inline Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+#if ARMV5TE_L_SHR
+ if(var2>=0)
+ {
+ return ASM_L_shr( L_var1, var2);
+ }
+ else
+ {
+ return ASM_L_shl( L_var1, -var2);
+ }
+#else
+ Word32 L_var_out;
+
+ if (var2 < 0)
+ {
+ L_var_out = L_shl (L_var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 31)
+ {
+ L_var_out = (L_var1 < 0L) ? -1 : 0;
+ }
+ else
+ {
+ if (L_var1 < 0)
+ {
+ L_var_out = ~((~L_var1) >> var2);
+ }
+ else
+ {
+ L_var_out = L_var1 >> var2;
+ }
+ }
+ }
+ return (L_var_out);
+#endif
+}
+#endif
+
+/* Short add, 1 */
+#if (ADD_IS_INLINE)
+__inline Word16 add (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_ADD
+ Word32 result;
+ asm volatile(
+ "ADD %[result], %[var1], %[var2] \n"
+ "MOV r3, #0x1\n"
+ "MOV r2, %[result], ASR #15\n"
+ "RSB r3, r3, r3, LSL, #15\n"
+ "TEQ r2, %[result], ASR #31\n"
+ "EORNE %[result], r3, %[result], ASR #31"
+ :[result]"+r"(result)
+ :[var1]"r"(var1), [var2]"r"(var2)
+ :"r2", "r3"
+ );
+ return result;
+#else
+ Word16 var_out;
+ Word32 L_sum;
+
+ L_sum = (Word32) var1 + var2;
+ var_out = saturate(L_sum);
+
+ return (var_out);
+#endif
+}
+#endif
+
+/* Short sub, 1 */
+#if (SUB_IS_INLINE)
+__inline Word16 sub(Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SUB
+ Word32 result;
+ asm volatile(
+ "MOV r3, #1\n"
+ "SUB %[result], %[var1], %[var2] \n"
+ "RSB r3,r3,r3,LSL#15\n"
+ "MOV r2, %[var1], ASR #15 \n"
+ "TEQ r2, %[var1], ASR #31 \n"
+ "EORNE %[result], r3, %[result], ASR #31 \n"
+ :[result]"+r"(result)
+ :[var1]"r"(var1), [var2]"r"(var2)
+ :"r2", "r3"
+ );
+ return result;
+#else
+ Word16 var_out;
+ Word32 L_diff;
+
+ L_diff = (Word32) var1 - var2;
+ var_out = saturate(L_diff);
+
+ return (var_out);
+#endif
+}
+#endif
+
+/* Short division, 18 */
+#if (DIV_S_IS_INLINE)
+__inline Word16 div_s (Word16 var1, Word16 var2)
+{
+ Word16 var_out = 0;
+ Word16 iteration;
+ Word32 L_num;
+ Word32 L_denom;
+
+ var_out = MAX_16;
+ if (var1!= var2)//var1!= var2
+ {
+ var_out = 0;
+ L_num = (Word32) var1;
+
+ L_denom = (Word32) var2;
+
+ //return (L_num<<15)/var2;
+
+ for (iteration = 0; iteration < 15; iteration++)
+ {
+ var_out <<= 1;
+ L_num <<= 1;
+
+ if (L_num >= L_denom)
+ {
+ L_num -= L_denom;
+ var_out++;
+ }
+ }
+ }
+ return (var_out);
+}
+#endif
+
+/* Short mult, 1 */
+#if (MULT_IS_INLINE)
+__inline Word16 mult (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_MULT
+ Word32 result;
+ asm volatile(
+ "SMULBB r2, %[var1], %[var2] \n"
+ "MOV r3, #1\n"
+ "MOV %[result], r2, ASR #15\n"
+ "RSB r3, r3, r3, LSL #15\n"
+ "MOV r2, %[result], ASR #15\n"
+ "TEQ r2, %[result], ASR #31\n"
+ "EORNE %[result], r3, %[result], ASR #31 \n"
+ :[result]"+r"(result)
+ :[var1]"r"(var1), [var2]"r"(var2)
+ :"r2", "r3"
+ );
+ return result;
+#else
+ Word16 var_out;
+ Word32 L_product;
+
+ L_product = (Word32) var1 *(Word32) var2;
+ L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+ if (L_product & (Word32) 0x00010000L)
+ L_product = L_product | (Word32) 0xffff0000L;
+ var_out = saturate(L_product);
+
+ return (var_out);
+#endif
+}
+#endif
+
+
+/* Short norm, 15 */
+#if (NORM_S_IS_INLINE)
+__inline Word16 norm_s (Word16 var1)
+{
+#if ARMV5TE_NORM_S
+ Word16 result;
+ asm volatile(
+ "MOV r2,%[var1] \n"
+ "CMP r2, #0\n"
+ "RSBLT %[var1], %[var1], #0 \n"
+ "CLZNE %[result], %[var1]\n"
+ "SUBNE %[result], %[result], #17\n"
+ "MOVEQ %[result], #0\n"
+ "CMP r2, #-1\n"
+ "MOVEQ %[result], #15\n"
+ :[result]"+r"(result)
+ :[var1]"r"(var1)
+ :"r2"
+ );
+ return result;
+#else
+ Word16 var_out;
+
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == -1)
+ {
+ var_out = 15;
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var1 = (Word16)~var1;
+ }
+ for (var_out = 0; var1 < 0x4000; var_out++)
+ {
+ var1 <<= 1;
+ }
+ }
+ }
+ return (var_out);
+#endif
+}
+#endif
+
+/* Long norm, 30 */
+#if (NORM_L_IS_INLINE)
+__inline Word16 norm_l (Word32 L_var1)
+{
+#if ARMV5TE_NORM_L
+ Word16 result;
+ asm volatile(
+ "CMP %[L_var1], #0\n"
+ "CLZNE %[result], %[L_var1]\n"
+ "SUBNE %[result], %[result], #1\n"
+ "MOVEQ %[result], #0\n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1)
+ );
+ return result;
+#else
+ //Word16 var_out;
+
+ //if (L_var1 == 0)
+ //{
+ // var_out = 0;
+ //}
+ //else
+ //{
+ // if (L_var1 == (Word32) 0xffffffffL)
+ // {
+ // var_out = 31;
+ // }
+ // else
+ // {
+ // if (L_var1 < 0)
+ // {
+ // L_var1 = ~L_var1;
+ // }
+ // for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+ // {
+ // L_var1 <<= 1;
+ // }
+ // }
+ //}
+ //return (var_out);
+ Word16 a16;
+ Word16 r = 0 ;
+
+
+ if ( L_var1 < 0 ) {
+ L_var1 = ~L_var1;
+ }
+
+ if (0 == (L_var1 & 0x7fff8000)) {
+ a16 = extract_l(L_var1);
+ r += 16;
+
+ if (0 == (a16 & 0x7f80)) {
+ r += 8;
+
+ if (0 == (a16 & 0x0078)) {
+ r += 4;
+
+ if (0 == (a16 & 0x0006)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0001)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0004)) {
+ r += 1;
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0060)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0010)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0040)) {
+ r += 1;
+ }
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x7800)) {
+ r += 4;
+
+ if (0 == (a16 & 0x0600)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0100)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0400)) {
+ r += 1;
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x6000)) {
+ r += 2;
+
+ if (0 == (a16 & 0x1000)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x4000)) {
+ r += 1;
+ }
+ }
+ }
+ }
+ }
+ else {
+ a16 = extract_h(L_var1);
+
+ if (0 == (a16 & 0x7f80)) {
+ r += 8;
+
+ if (0 == (a16 & 0x0078)) {
+ r += 4 ;
+
+ if (0 == (a16 & 0x0006)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0001)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0004)) {
+ r += 1;
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0060)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0010)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0040)) {
+ r += 1;
+ }
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x7800)) {
+ r += 4;
+
+ if (0 == (a16 & 0x0600)) {
+ r += 2;
+
+ if (0 == (a16 & 0x0100)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x0400)) {
+ r += 1;
+ }
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x6000)) {
+ r += 2;
+
+ if (0 == (a16 & 0x1000)) {
+ r += 1;
+ }
+ }
+ else {
+
+ if (0 == (a16 & 0x4000)) {
+ return 1;
+ }
+ }
+ }
+ }
+ }
+
+ return r ;
+#endif
+}
+#endif
+
+/* Round, 1 */
+#if (ROUND_IS_INLINE)
+__inline Word16 round16(Word32 L_var1)
+{
+#if ARMV5TE_ROUND
+ Word16 result;
+ asm volatile(
+ "MOV r1,#0x00008000\n"
+ "QADD %[result], %[L_var1], r1\n"
+ "MOV %[result], %[result], ASR #16 \n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1)
+ :"r1"
+ );
+ return result;
+#else
+ Word16 var_out;
+ Word32 L_rounded;
+
+ L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+ var_out = extract_h (L_rounded);
+ return (var_out);
+#endif
+}
+#endif
+
+/* Mac, 1 */
+#if (L_MAC_IS_INLINE)
+__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MAC
+ Word32 result;
+ asm volatile(
+ "SMULBB %[result], %[var1], %[var2]\n"
+ "QADD %[result], %[result], %[result]\n"
+ "QADD %[result], %[result], %[L_var3]\n"
+ :[result]"+r"(result)
+ : [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
+ );
+ return result;
+#else
+ Word32 L_var_out;
+ Word32 L_product;
+
+ L_product = L_mult(var1, var2);
+ L_var_out = L_add (L_var3, L_product);
+ return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_ADD_IS_INLINE)
+__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+#if ARMV5TE_L_ADD
+ Word32 result;
+ asm volatile(
+ "QADD %[result], %[L_var1], %[L_var2]\n"
+ :[result]"+r"(result)
+ :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
+ );
+ return result;
+#else
+ Word32 L_var_out;
+
+ L_var_out = L_var1 + L_var2;
+ if (((L_var1 ^ L_var2) & MIN_32) == 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+ }
+ }
+ return (L_var_out);
+#endif
+}
+#endif
+
+
+
+#if (MULT_R_IS_INLINE)
+__inline Word16 mult_r (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_product_arr;
+
+ L_product_arr = (Word32)var1 *(Word32)var2; /* product */
+ L_product_arr += (Word32)0x00004000L; /* round */
+ L_product_arr >>= 15; /* shift */
+
+ var_out = saturate(L_product_arr);
+
+ return (var_out);
+}
+#endif
+
+#if (SHR_R_IS_INLINE)
+__inline Word16 shr_r (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ if (var2 > 15)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ var_out = shr(var1, var2);
+
+ if (var2 > 0)
+ {
+ if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+ {
+ var_out++;
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
+#if (MAC_R_IS_INLINE)
+__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ L_var3 = L_mac (L_var3, var1, var2);
+ var_out = (Word16)((L_var3 + 0x8000L) >> 16);
+
+ return (var_out);
+}
+#endif
+
+#if (MSU_R_IS_INLINE)
+__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ L_var3 = L_msu (L_var3, var1, var2);
+ var_out = (Word16)((L_var3 + 0x8000L) >> 16);
+
+ return (var_out);
+}
+#endif
+
+#if (L_SHR_R_IS_INLINE)
+__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out;
+
+ if (var2 > 31)
+ {
+ L_var_out = 0;
+ }
+ else
+ {
+ L_var_out = L_shr(L_var1, var2);
+
+ if (var2 > 0)
+ {
+ if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+ {
+ L_var_out++;
+ }
+ }
+ }
+
+ return (L_var_out);
+}
+#endif
+
+#if (EXTRACT_H_IS_INLINE)
+__inline Word16 extract_h (Word32 L_var1)
+{
+ Word16 var_out;
+
+ var_out = (Word16) (L_var1 >> 16);
+
+ return (var_out);
+}
+#endif
+
+#if (EXTRACT_L_IS_INLINE)
+__inline Word16 extract_l(Word32 L_var1)
+{
+ return (Word16) L_var1;
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
new file mode 100644
index 0000000..a0d5dba
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
@@ -0,0 +1,1624 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: basicop2.c
+
+ Content: Basic arithmetic operators.
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+
+/*___________________________________________________________________________
+ | |
+ | Functions |
+ |___________________________________________________________________________|
+*/
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : saturate |
+ | |
+ | Purpose : |
+ | |
+ | Limit the 32 bit input to the range of a 16 bit word. |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!SATRUATE_IS_INLINE)
+Word16 saturate(Word32 L_var1)
+{
+ Word16 var_out;
+
+ if (L_var1 > 0X00007fffL)
+ {
+ var_out = MAX_16;
+ }
+ else if (L_var1 < (Word32) 0xffff8000L)
+ {
+ var_out = MIN_16;
+ }
+ else
+ {
+ var_out = extract_l(L_var1);
+ }
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : add |
+ | |
+ | Purpose : |
+ | |
+ | Performs the addition (var1+var2) with overflow control and saturation;|
+ | the 16 bit result is set at +32767 when overflow occurs or at -32768 |
+ | when underflow occurs. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!ADD_IS_INLINE)
+Word16 add (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_sum;
+
+ L_sum = (Word32)var1 + (Word32)var2;
+ var_out = saturate(L_sum);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : sub |
+ | |
+ | Purpose : |
+ | |
+ | Performs the subtraction (var1+var2) with overflow control and satu- |
+ | ration; the 16 bit result is set at +32767 when overflow occurs or at |
+ | -32768 when underflow occurs. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!SUB_IS_INLINE)
+Word16 sub(Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_diff;
+
+ L_diff = (Word32) var1 - var2;
+ var_out = saturate(L_diff);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : abs_s |
+ | |
+ | Purpose : |
+ | |
+ | Absolute value of var1; abs_s(-32768) = 32767. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+//Word16 abs_s (Word16 var1)
+//{
+// Word16 var_out;
+//
+// if (var1 == MIN_16)
+// {
+// var_out = MAX_16;
+// }
+// else
+// {
+// if (var1 < 0)
+// {
+// var_out = (Word16)-var1;
+// }
+// else
+// {
+// var_out = var1;
+// }
+// }
+//
+// return (var_out);
+//}
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : shl |
+ | |
+ | Purpose : |
+ | |
+ | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
+ | the var2 LSB of the result. If var2 is negative, arithmetically shift |
+ | var1 right by -var2 with sign extension. Saturate the result in case of |
+ | underflows or overflows. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!SHL_IS_INLINE)
+Word16 shl (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 result;
+
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = shr (var1, (Word16)-var2);
+ }
+ else
+ {
+ result = (Word32) var1 *((Word32) 1 << var2);
+
+ if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+ {
+ //Overflow = 1;
+ var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+ }
+ else
+ {
+ var_out = extract_l(result);
+ }
+ }
+
+ return (var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : shr |
+ | |
+ | Purpose : |
+ | |
+ | Arithmetically shift the 16 bit input var1 right var2 positions with |
+ | sign extension. If var2 is negative, arithmetically shift var1 left by |
+ | -var2 with sign extension. Saturate the result in case of underflows or |
+ | overflows. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!SHR_IS_INLINE)
+Word16 shr (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = shl (var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 15)
+ {
+ var_out = (Word16)((var1 < 0) ? -1 : 0);
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var_out = (Word16)(~((~var1) >> var2));
+ }
+ else
+ {
+ var_out = (Word16)(var1 >> var2);
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : mult |
+ | |
+ | Purpose : |
+ | |
+ | Performs the multiplication of var1 by var2 and gives a 16 bit result |
+ | which is scaled i.e.: |
+ | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and |
+ | mult(-32768,-32768) = 32767. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!MULT_IS_INLINE)
+Word16 mult (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_product;
+
+ L_product = (Word32) var1 *(Word32) var2;
+
+ L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+
+ if (L_product & (Word32) 0x00010000L)
+ L_product = L_product | (Word32) 0xffff0000L;
+
+ var_out = saturate(L_product);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_mult |
+ | |
+ | Purpose : |
+ | |
+ | L_mult is the 32 bit result of the multiplication of var1 times var2 |
+ | with one shift left i.e.: |
+ | L_mult(var1,var2) = L_shl((var1 times var2),1) and |
+ | L_mult(-32768,-32768) = 2147483647. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_MULT_IS_INLINE)
+Word32 L_mult(Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+
+ L_var_out = (Word32) var1 *(Word32) var2;
+
+ if (L_var_out != (Word32) 0x40000000L)
+ {
+ L_var_out <<= 1;
+ }
+ else
+ {
+ L_var_out = MAX_32;
+ }
+
+ return (L_var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : negate |
+ | |
+ | Purpose : |
+ | |
+ | Negate var1 with saturation, saturate in the case where input is -32768:|
+ | negate(var1) = sub(0,var1). |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+//Word16 negate (Word16 var1)
+//{
+// Word16 var_out;
+//
+// var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1);
+//
+// return (var_out);
+//}
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : extract_h |
+ | |
+ | Purpose : |
+ | |
+ | Return the 16 MSB of L_var1. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32 ) whose value falls in the |
+ | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!EXTRACT_H_IS_INLINE)
+Word16 extract_h (Word32 L_var1)
+{
+ Word16 var_out;
+
+ var_out = (Word16) (L_var1 >> 16);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : extract_l |
+ | |
+ | Purpose : |
+ | |
+ | Return the 16 LSB of L_var1. |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32 ) whose value falls in the |
+ | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!EXTRACT_L_IS_INLINE)
+Word16 extract_l(Word32 L_var1)
+{
+ Word16 var_out;
+
+ var_out = (Word16) L_var1;
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : round |
+ | |
+ | Purpose : |
+ | |
+ | Round the lower 16 bits of the 32 bit input number into the MS 16 bits |
+ | with saturation. Shift the resulting bits right by 16 and return the 16 |
+ | bit number: |
+ | round(L_var1) = extract_h(L_add(L_var1,32768)) |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32 ) whose value falls in the |
+ | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!ROUND_IS_INLINE)
+Word16 round16(Word32 L_var1)
+{
+ Word16 var_out;
+ Word32 L_rounded;
+
+ L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+ var_out = extract_h (L_rounded);
+
+ return (var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_mac |
+ | |
+ | Purpose : |
+ | |
+ | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
+ | result to L_var3 with saturation, return a 32 bit result: |
+ | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | L_var3 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+#if (!L_MSU_IS_INLINE)
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+ Word32 L_product;
+
+ L_product = L_mult(var1, var2);
+ L_var_out = L_add (L_var3, L_product);
+
+ return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_msu |
+ | |
+ | Purpose : |
+ | |
+ | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
+ | bit result to L_var3 with saturation, return a 32 bit result: |
+ | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). |
+ | |
+ | Complexity weight : 1 |
+ | |
+ | Inputs : |
+ | |
+ | L_var3 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_MSU_IS_INLINE)
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+ Word32 L_product;
+
+ L_product = L_mult(var1, var2);
+ L_var_out = L_sub (L_var3, L_product);
+
+ return (L_var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_add |
+ | |
+ | Purpose : |
+ | |
+ | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with |
+ | overflow control and saturation; the result is set at +2147483647 when |
+ | overflow occurs or at -2147483648 when underflow occurs. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | L_var2 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+#if (!L_ADD_IS_INLINE)
+Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+ Word32 L_var_out;
+
+ L_var_out = L_var1 + L_var2;
+
+ if (((L_var1 ^ L_var2) & MIN_32) == 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+ //Overflow = 1;
+ }
+ }
+
+ return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_sub |
+ | |
+ | Purpose : |
+ | |
+ | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with |
+ | overflow control and saturation; the result is set at +2147483647 when |
+ | overflow occurs or at -2147483648 when underflow occurs. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | L_var2 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+#if (!L_SUB_IS_INLINE)
+Word32 L_sub(Word32 L_var1, Word32 L_var2)
+{
+ Word32 L_var_out;
+
+ L_var_out = L_var1 - L_var2;
+
+ if (((L_var1 ^ L_var2) & MIN_32) != 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+ //Overflow = 1;
+ }
+ }
+
+ return (L_var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_negate |
+ | |
+ | Purpose : |
+ | |
+ | Negate the 32 bit variable L_var1 with saturation; saturate in the case |
+ | where input is -2147483648 (0x8000 0000). |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+//Word32 L_negate (Word32 L_var1)
+//{
+// Word32 L_var_out;
+//
+// L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
+//
+// return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : mult_r |
+ | |
+ | Purpose : |
+ | |
+ | Same as mult with rounding, i.e.: |
+ | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and |
+ | mult_r(-32768,-32768) = 32767. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!MULT_R_IS_INLINE)
+Word16 mult_r (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_product_arr;
+
+ L_product_arr = (Word32) var1 *(Word32) var2; /* product */
+ L_product_arr += (Word32) 0x00004000L; /* round */
+ L_product_arr &= (Word32) 0xffff8000L;
+ L_product_arr >>= 15; /* shift */
+
+ if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */
+ {
+ L_product_arr |= (Word32) 0xffff0000L;
+ }
+ var_out = saturate(L_product_arr);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_shl |
+ | |
+ | Purpose : |
+ | |
+ | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero |
+ | fill the var2 LSB of the result. If var2 is negative, arithmetically |
+ | shift L_var1 right by -var2 with sign extension. Saturate the result in |
+ | case of underflows or overflows. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_SHL_IS_INLINE)
+Word32 L_shl (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out = 0L;
+
+ if (var2 <= 0)
+ {
+ L_var1 = L_shr(L_var1, (Word16)-var2);
+ }
+ else
+ {
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ return MAX_32;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ return MIN_32;
+ }
+ }
+ L_var1 <<= 1;
+ }
+ }
+ return (L_var1);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_shr |
+ | |
+ | Purpose : |
+ | |
+ | Arithmetically shift the 32 bit input L_var1 right var2 positions with |
+ | sign extension. If var2 is negative, arithmetically shift L_var1 left |
+ | by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+ | in case of underflows or overflows. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_SHR_IS_INLINE)
+Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out;
+
+ if (var2 < 0)
+ {
+ L_var_out = L_shl (L_var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 31)
+ {
+ L_var_out = (L_var1 < 0L) ? -1 : 0;
+ }
+ else
+ {
+ if (L_var1 < 0)
+ {
+ L_var_out = ~((~L_var1) >> var2);
+ }
+ else
+ {
+ L_var_out = L_var1 >> var2;
+ }
+ }
+ }
+ return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : shr_r |
+ | |
+ | Purpose : |
+ | |
+ | Same as shr(var1,var2) but with rounding. Saturate the result in case of|
+ | underflows or overflows : |
+ | - If var2 is greater than zero : |
+ | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) |
+ | is equal to zero |
+ | then |
+ | shr_r(var1,var2) = shr(var1,var2) |
+ | else |
+ | shr_r(var1,var2) = add(shr(var1,var2),1) |
+ | - If var2 is less than or equal to zero : |
+ | shr_r(var1,var2) = shr(var1,var2). |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!SHR_R_IS_INLINE)
+Word16 shr_r (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ if (var2 > 15)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ var_out = shr (var1, var2);
+
+ if (var2 > 0)
+ {
+ if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+ {
+ var_out++;
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : mac_r |
+ | |
+ | Purpose : |
+ | |
+ | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
+ | result to L_var3 with saturation. Round the LS 16 bits of the result |
+ | into the MS 16 bits with saturation and shift the result right by 16. |
+ | Return a 16 bit result. |
+ | mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2)) |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var3 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!MAC_R_IS_INLINE)
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ L_var3 = L_mac (L_var3, var1, var2);
+ L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+ var_out = extract_h (L_var3);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : msu_r |
+ | |
+ | Purpose : |
+ | |
+ | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
+ | bit result to L_var3 with saturation. Round the LS 16 bits of the res- |
+ | ult into the MS 16 bits with saturation and shift the result right by |
+ | 16. Return a 16 bit result. |
+ | msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2)) |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | L_var3 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+#if (!MSU_R_IS_INLINE)
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+
+ L_var3 = L_msu (L_var3, var1, var2);
+ L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+ var_out = extract_h (L_var3);
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_deposit_h |
+ | |
+ | Purpose : |
+ | |
+ | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The |
+ | 16 LS bits of the output are zeroed. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= var_out <= 0x7fff 0000. |
+ |___________________________________________________________________________|
+*/
+//Word32 L_deposit_h (Word16 var1)
+//{
+// Word32 L_var_out;
+//
+// L_var_out = (Word32) var1 << 16;
+//
+// return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_deposit_l |
+ | |
+ | Purpose : |
+ | |
+ | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The |
+ | 16 MS bits of the output are sign extended. |
+ | |
+ | Complexity weight : 2 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. |
+ |___________________________________________________________________________|
+*/
+//Word32 L_deposit_l (Word16 var1)
+//{
+// Word32 L_var_out;
+//
+// L_var_out = (Word32) var1;
+//
+// return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_shr_r |
+ | |
+ | Purpose : |
+ | |
+ | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in |
+ | case of underflows or overflows : |
+ | - If var2 is greater than zero : |
+ | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
+ | is equal to zero |
+ | then |
+ | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) |
+ | else |
+ | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) |
+ | - If var2 is less than or equal to zero : |
+ | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). |
+ | |
+ | Complexity weight : 3 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+#if (!L_SHR_R_IS_INLINE)
+Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out;
+
+ if (var2 > 31)
+ {
+ L_var_out = 0;
+ }
+ else
+ {
+ L_var_out = L_shr (L_var1, var2);
+
+ if (var2 > 0)
+ {
+ if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+ {
+ L_var_out++;
+ }
+ }
+ }
+
+ return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : L_abs |
+ | |
+ | Purpose : |
+ | |
+ | Absolute value of L_var1; Saturate in case where the input is |
+ | -214783648 |
+ | |
+ | Complexity weight : 3 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | L_var_out |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x0000 0000 <= var_out <= 0x7fff ffff. |
+ |___________________________________________________________________________|
+*/
+//Word32 L_abs (Word32 L_var1)
+//{
+// Word32 L_var_out;
+//
+// if (L_var1 == MIN_32)
+// {
+// L_var_out = MAX_32;
+// }
+// else
+// {
+// if (L_var1 < 0)
+// {
+// L_var_out = -L_var1;
+// }
+// else
+// {
+// L_var_out = L_var1;
+// }
+// }
+//
+// return (L_var_out);
+//}
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : norm_s |
+ | |
+ | Purpose : |
+ | |
+ | Produces the number of left shift needed to normalize the 16 bit varia- |
+ | ble var1 for positive values on the interval with minimum of 16384 and |
+ | maximum of 32767, and for negative values on the interval with minimum |
+ | of -32768 and maximum of -16384; in order to normalize the result, the |
+ | following operation must be done : |
+ | norm_var1 = shl(var1,norm_s(var1)). |
+ | |
+ | Complexity weight : 15 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 0000 <= var_out <= 0x0000 000f. |
+ |___________________________________________________________________________|
+*/
+
+#if (!NORM_S_IS_INLINE)
+Word16 norm_s (Word16 var1)
+{
+ Word16 var_out;
+
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == -1)
+ {
+ var_out = 15;
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var1 = (Word16)~var1;
+ }
+ for (var_out = 0; var1 < 0x4000; var_out++)
+ {
+ var1 <<= 1;
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : div_s |
+ | |
+ | Purpose : |
+ | |
+ | Produces a result which is the fractional integer division of var1 by |
+ | var2; var1 and var2 must be positive and var2 must be greater or equal |
+ | to var1; the result is positive (leading bit equal to 0) and truncated |
+ | to 16 bits. |
+ | If var1 = var2 then div(var1,var2) = 32767. |
+ | |
+ | Complexity weight : 18 |
+ | |
+ | Inputs : |
+ | |
+ | var1 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. |
+ | |
+ | var2 |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
+ | It's a Q15 value (point between b15 and b14). |
+ |___________________________________________________________________________|
+*/
+
+#if (!DIV_S_IS_INLINE)
+Word16 div_s (Word16 var1, Word16 var2)
+{
+ Word16 var_out = 0;
+ Word16 iteration;
+ Word32 L_num;
+ Word32 L_denom;
+
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == var2)
+ {
+ var_out = MAX_16;
+ }
+ else
+ {
+ L_num = L_deposit_l (var1);
+ L_denom = L_deposit_l (var2);
+
+ for (iteration = 0; iteration < 15; iteration++)
+ {
+ var_out <<= 1;
+ L_num <<= 1;
+
+ if (L_num >= L_denom)
+ {
+ L_num = L_sub(L_num, L_denom);
+ var_out = add (var_out, 1);
+ }
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ | |
+ | Function Name : norm_l |
+ | |
+ | Purpose : |
+ | |
+ | Produces the number of left shifts needed to normalize the 32 bit varia-|
+ | ble L_var1 for positive values on the interval with minimum of |
+ | 1073741824 and maximum of 2147483647, and for negative values on the in-|
+ | terval with minimum of -2147483648 and maximum of -1073741824; in order |
+ | to normalize the result, the following operation must be done : |
+ | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). |
+ | |
+ | Complexity weight : 30 |
+ | |
+ | Inputs : |
+ | |
+ | L_var1 |
+ | 32 bit long signed integer (Word32) whose value falls in the |
+ | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
+ | |
+ | Outputs : |
+ | |
+ | none |
+ | |
+ | Return Value : |
+ | |
+ | var_out |
+ | 16 bit short signed integer (Word16) whose value falls in the |
+ | range : 0x0000 0000 <= var_out <= 0x0000 001f. |
+ |___________________________________________________________________________|
+*/
+
+#if (!NORM_L_IS_INLINE)
+Word16 norm_l (Word32 L_var1)
+{
+ Word16 var_out;
+
+ if (L_var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (L_var1 == (Word32) 0xffffffffL)
+ {
+ var_out = 31;
+ }
+ else
+ {
+ if (L_var1 < 0)
+ {
+ L_var1 = ~L_var1;
+ }
+ for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+ {
+ L_var1 <<= 1;
+ }
+ }
+ }
+
+ return (var_out);
+}
+#endif
+
diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
new file mode 100644
index 0000000..906a9df
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
@@ -0,0 +1,361 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: oper_32b.c
+
+ Content: This file contains operations in double precision.
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+
+/*****************************************************************************
+ * *
+ * Function L_Extract() *
+ * *
+ * Extract from a 32 bit integer two 16 bit DPF. *
+ * *
+ * Arguments: *
+ * *
+ * L_32 : 32 bit integer. *
+ * 0x8000 0000 <= L_32 <= 0x7fff ffff. *
+ * hi : b16 to b31 of L_32 *
+ * lo : (L_32 - hi<<16)>>1 *
+ *****************************************************************************
+*/
+
+void L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
+{
+ *hi = extract_h (L_32);
+ *lo = extract_l (L_msu (L_shr (L_32, 1), *hi, 16384));
+ return;
+}
+
+/*****************************************************************************
+ * *
+ * Function L_Comp() *
+ * *
+ * Compose from two 16 bit DPF a 32 bit integer. *
+ * *
+ * L_32 = hi<<16 + lo<<1 *
+ * *
+ * Arguments: *
+ * *
+ * hi msb *
+ * lo lsf (with sign) *
+ * *
+ * Return Value : *
+ * *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x8000 0000 <= L_32 <= 0x7fff fff0. *
+ * *
+ *****************************************************************************
+*/
+
+Word32 L_Comp (Word16 hi, Word16 lo)
+{
+ Word32 L_32;
+
+ L_32 = L_deposit_h (hi);
+ return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */
+}
+
+/*****************************************************************************
+ * Function Mpy_32() *
+ * *
+ * Multiply two 32 bit integers (DPF). The result is divided by 2**31 *
+ * *
+ * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 *
+ * *
+ * This operation can also be viewed as the multiplication of two Q31 *
+ * number and the result is also in Q31. *
+ * *
+ * Arguments: *
+ * *
+ * hi1 hi part of first number *
+ * lo1 lo part of first number *
+ * hi2 hi part of second number *
+ * lo2 lo part of second number *
+ * *
+ *****************************************************************************
+*/
+
+Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
+{
+ Word32 L_32;
+
+ L_32 = L_mult (hi1, hi2);
+ L_32 = L_mac (L_32, mult (hi1, lo2), 1);
+ L_32 = L_mac (L_32, mult (lo1, hi2), 1);
+
+ return (L_32);
+}
+
+/*****************************************************************************
+ * Function Mpy_32_16() *
+ * *
+ * Multiply a 16 bit integer by a 32 bit (DPF). The result is divided *
+ * by 2**15 *
+ * *
+ * *
+ * L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 *
+ * *
+ * Arguments: *
+ * *
+ * hi hi part of 32 bit number. *
+ * lo lo part of 32 bit number. *
+ * n 16 bit number. *
+ * *
+ *****************************************************************************
+*/
+
+Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
+{
+ Word32 L_32;
+
+ L_32 = L_mult (hi, n);
+ L_32 = L_mac (L_32, mult (lo, n), 1);
+
+ return (L_32);
+}
+
+/*****************************************************************************
+ * *
+ * Function Name : Div_32 *
+ * *
+ * Purpose : *
+ * Fractional integer division of two 32 bit numbers. *
+ * L_num / L_denom. *
+ * L_num and L_denom must be positive and L_num < L_denom. *
+ * L_denom = denom_hi<<16 + denom_lo<<1 *
+ * denom_hi is a normalize number. *
+ * *
+ * Inputs : *
+ * *
+ * L_num *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x0000 0000 < L_num < L_denom *
+ * *
+ * L_denom = denom_hi<<16 + denom_lo<<1 (DPF) *
+ * *
+ * denom_hi *
+ * 16 bit positive normalized integer whose value falls in the *
+ * range : 0x4000 < hi < 0x7fff *
+ * denom_lo *
+ * 16 bit positive integer whose value falls in the *
+ * range : 0 < lo < 0x7fff *
+ * *
+ * Return Value : *
+ * *
+ * L_div *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x0000 0000 <= L_div <= 0x7fff ffff. *
+ * *
+ * Algorithm: *
+ * *
+ * - find = 1/L_denom. *
+ * First approximation: approx = 1 / denom_hi *
+ * 1/L_denom = approx * (2.0 - L_denom * approx ) *
+ * *
+ * - result = L_num * (1/L_denom) *
+ *****************************************************************************
+*/
+
+Word32 Div_32 (Word32 L_num, Word32 denom)
+{
+ Word16 approx;
+ Word32 L_32;
+ /* First approximation: 1 / L_denom = 1/denom_hi */
+
+ approx = div_s ((Word16) 0x3fff, denom >> 16);
+
+ /* 1/L_denom = approx * (2.0 - L_denom * approx) */
+
+ L_32 = L_mpy_ls (denom, approx);
+
+ L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
+
+ L_32 = L_mpy_ls (L_32, approx);
+ /* L_num * (1/L_denom) */
+
+ L_32 = MULHIGH(L_32, L_num);
+ L_32 = L_shl (L_32, 3);
+
+ return (L_32);
+}
+
+/*!
+
+ \brief calculates the log dualis times 4 of argument
+ iLog4(x) = (Word32)(4 * log(value)/log(2.0))
+
+ \return ilog4 value
+
+*/
+Word16 iLog4(Word32 value)
+{
+ Word16 iLog4;
+
+ if(value != 0){
+ Word32 tmp;
+ Word16 tmp16;
+ iLog4 = norm_l(value);
+ tmp = (value << iLog4);
+ tmp16 = round16(tmp);
+ tmp = L_mult(tmp16, tmp16);
+ tmp16 = round16(tmp);
+ tmp = L_mult(tmp16, tmp16);
+ tmp16 = round16(tmp);
+
+ iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
+ }
+ else {
+ iLog4 = -128; /* -(INT_BITS*4); */
+ }
+
+ return iLog4;
+}
+
+#define step(shift) \
+ if ((0x40000000l >> shift) + root <= value) \
+ { \
+ value -= (0x40000000l >> shift) + root; \
+ root = (root >> 1) | (0x40000000l >> shift); \
+ } else { \
+ root = root >> 1; \
+ }
+
+Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */
+ Word32 accuracy) /*!< Number of valid bits that will be calculated */
+{
+ Word32 root = 0;
+ Word32 scale;
+
+ if(value < 0)
+ return 0;
+
+ scale = norm_l(value);
+ if(scale & 1) scale--;
+
+ value <<= scale;
+
+ step( 0); step( 2); step( 4); step( 6);
+ step( 8); step(10); step(12); step(14);
+ step(16); step(18); step(20); step(22);
+ step(24); step(26); step(28); step(30);
+
+ scale >>= 1;
+ if (root < value)
+ ++root;
+
+ root >>= scale;
+ return root* 46334;
+}
+
+static const Word32 pow2Table[POW2_TABLE_SIZE] = {
+0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
+0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
+0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
+0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
+0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
+0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
+0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
+0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
+0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
+0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
+0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
+0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
+0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
+0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
+0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
+0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
+0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
+0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
+0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
+0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
+0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
+0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
+0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
+0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
+0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
+0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
+0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
+0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
+0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
+0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
+0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
+0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
+0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
+0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
+0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
+0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
+0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
+0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
+0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
+0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
+0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
+0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
+0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
+0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
+0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
+0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
+0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
+0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
+0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
+0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
+0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
+0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
+0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
+0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
+0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
+0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
+0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
+0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
+0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
+0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
+0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
+0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
+0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
+0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
+};
+
+/*!
+
+ \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y
+
+ avoids integer division
+
+ \return
+*/
+Word32 pow2_xy(Word32 x, Word32 y)
+{
+ Word32 iPart;
+ Word32 fPart;
+ Word32 res;
+ Word32 tmp, tmp2;
+ Word32 shift, shift2;
+
+ tmp2 = -x;
+ iPart = tmp2 / y;
+ fPart = tmp2 - iPart*y;
+ iPart = min(iPart,INT_BITS-1);
+
+ res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
+
+ return(res);
+}
\ 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
new file mode 100644
index 0000000..4119bc3
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
@@ -0,0 +1,89 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: oper_32b.h
+
+ Content: Double precision operations
+
+*******************************************************************************/
+
+#ifndef __OPER_32b_H
+#define __OPER_32b_H
+
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define POW2_TABLE_BITS 8
+#define POW2_TABLE_SIZE (1<<POW2_TABLE_BITS)
+
+void L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);
+Word32 L_Comp (Word16 hi, Word16 lo);
+Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);
+Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);
+Word32 Div_32 (Word32 L_num, Word32 denom);
+Word16 iLog4(Word32 value);
+Word32 rsqrt(Word32 value, Word32 accuracy);
+Word32 pow2_xy(Word32 x, Word32 y);
+
+__inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
+{
+ unsigned short swLow1;
+ Word16 swHigh1;
+ Word32 l_var_out;
+
+ swLow1 = (unsigned short)(L_var2);
+ swHigh1 = (Word16)(L_var2 >> 16);
+
+ l_var_out = (long)swLow1 * (long)var1 >> 15;
+
+ l_var_out += swHigh1 * var1 << 1;
+
+ return(l_var_out);
+}
+
+__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
+{
+#if ARMV5TE_L_MPY_LS
+ Word32 result;
+ asm volatile(
+ "SMULWB %[result], %[L_var2], %[var1] \n"
+ :[result]"+r"(result)
+ :[L_var2]"r"(L_var2), [var1]"r"(var1)
+ );
+ return result;
+#else
+ unsigned short swLow1;
+ Word16 swHigh1;
+ Word32 l_var_out;
+
+ swLow1 = (unsigned short)(L_var2);
+ swHigh1 = (Word16)(L_var2 >> 16);
+
+ l_var_out = (long)swLow1 * (long)var1 >> 16;
+ l_var_out += swHigh1 * var1;
+
+ return(l_var_out);
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedef.h b/media/libstagefright/codecs/aacenc/basic_op/typedef.h
new file mode 100644
index 0000000..d3a626a
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/typedef.h
@@ -0,0 +1,63 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: typedef.h
+
+ Content: type defined for defferent paltform
+
+*******************************************************************************/
+
+#ifndef typedef_h
+#define typedef_h "$Id $"
+
+#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version
+ of typedef.h */
+
+#ifdef ORIGINAL_TYPEDEF_H
+/*
+ * this is the original code from the ETSI file typedef.h
+ */
+
+#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__sun)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__unix__) || defined(__unix)
+typedef signed char Word8;
+typedef short Word16;
+typedef int Word32;
+typedef int Flag;
+
+#endif
+#else /* not original typedef.h */
+
+/*
+ * use (improved) type definition file typdefs.h and add a "Flag" type
+ */
+#include "typedefs.h"
+typedef int Flag;
+
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
new file mode 100644
index 0000000..7d16fca
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
@@ -0,0 +1,179 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: typedefs.h
+
+ Content: type defined or const defined
+
+*******************************************************************************/
+
+#ifndef typedefs_h
+#define typedefs_h "$Id $"
+
+#ifndef CHAR_BIT
+#define CHAR_BIT 8 /* number of bits in a char */
+#endif
+
+#ifndef VOAAC_SHRT_MAX
+#define VOAAC_SHRT_MAX (32767) /* maximum (signed) short value */
+#endif
+
+#ifndef VOAAC_SHRT_MIN
+#define VOAAC_SHRT_MIN (-32768) /* minimum (signed) short value */
+#endif
+
+/* Define NULL pointer value */
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+#ifndef assert
+#define assert(_Expression) ((void)0)
+#endif
+
+#ifdef LINUX
+#define __inline static __inline__
+#endif
+
+#define INT_BITS 32
+/*
+********************************************************************************
+* DEFINITION OF CONSTANTS
+********************************************************************************
+*/
+/*
+ ********* define char type
+ */
+typedef char Char;
+
+/*
+ ********* define 8 bit signed/unsigned types & constants
+ */
+typedef signed char Word8;
+typedef unsigned char UWord8;
+/*
+ ********* define 16 bit signed/unsigned types & constants
+ */
+typedef short Word16;
+typedef unsigned short UWord16;
+
+/*
+ ********* define 32 bit signed/unsigned types & constants
+ */
+typedef long Word32;
+typedef unsigned long UWord32;
+
+
+
+#ifdef LINUX
+typedef long long Word64;
+typedef unsigned long long UWord64;
+#else
+typedef __int64 Word64;
+typedef unsigned __int64 UWord64;
+#endif
+
+#ifndef min
+#define min(a,b) ( a < b ? a : b)
+#endif
+
+#ifndef max
+#define max(a,b) ( a > b ? a : b)
+#endif
+
+#ifdef ARM_INASM
+#ifdef ARMV5_INASM
+#define ARMV5E_INASM 1
+#endif
+#define ARMV4_INASM 1
+#endif
+
+#if ARMV4_INASM
+ #define ARMV5TE_SAT 1
+ #define ARMV5TE_ADD 1
+ #define ARMV5TE_SUB 1
+ #define ARMV5TE_SHL 1
+ #define ARMV5TE_SHR 1
+ #define ARMV5TE_L_SHL 1
+ #define ARMV5TE_L_SHR 1
+#endif//ARMV4
+#if ARMV5E_INASM
+ #define ARMV5TE_L_ADD 1
+ #define ARMV5TE_L_SUB 1
+ #define ARMV5TE_L_MULT 1
+ #define ARMV5TE_L_MAC 1
+ #define ARMV5TE_L_MSU 1
+
+
+ #define ARMV5TE_DIV_S 1
+ #define ARMV5TE_ROUND 1
+ #define ARMV5TE_MULT 1
+
+ #define ARMV5TE_NORM_S 1
+ #define ARMV5TE_NORM_L 1
+ #define ARMV5TE_L_MPY_LS 1
+#endif
+
+//basic operation functions optimization flags
+#define SATRUATE_IS_INLINE 1 //define saturate as inline function
+#define SHL_IS_INLINE 1 //define shl as inline function
+#define SHR_IS_INLINE 1 //define shr as inline function
+#define L_MULT_IS_INLINE 1 //define L_mult as inline function
+#define L_MSU_IS_INLINE 1 //define L_msu as inline function
+#define L_SUB_IS_INLINE 1 //define L_sub as inline function
+#define L_SHL_IS_INLINE 1 //define L_shl as inline function
+#define L_SHR_IS_INLINE 1 //define L_shr as inline function
+#define ADD_IS_INLINE 1 //define add as inline function //add, inline is the best
+#define SUB_IS_INLINE 1 //define sub as inline function //sub, inline is the best
+#define DIV_S_IS_INLINE 1 //define div_s as inline function
+#define MULT_IS_INLINE 1 //define mult as inline function
+#define NORM_S_IS_INLINE 1 //define norm_s as inline function
+#define NORM_L_IS_INLINE 1 //define norm_l as inline function
+#define ROUND_IS_INLINE 1 //define round as inline function
+#define L_MAC_IS_INLINE 1 //define L_mac as inline function
+#define L_ADD_IS_INLINE 1 //define L_add as inline function
+#define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function
+#define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //???
+#define MULT_R_IS_INLINE 1 //define mult_r as inline function
+#define SHR_R_IS_INLINE 1 //define shr_r as inline function
+#define MAC_R_IS_INLINE 1 //define mac_r as inline function
+#define MSU_R_IS_INLINE 1 //define msu_r as inline function
+#define L_SHR_R_IS_INLINE 1 //define L_shr_r as inline function
+
+#define PREFIX voAACEnc
+#define LINK0(x, y, z) LINK1(x,y,z)
+#define LINK1(x,y,z) x##y##z
+#define ADD_PREFIX(func) LINK0(PREFIX, _, func)
+
+#define L_Extract ADD_PREFIX(L_Extract)
+#define L_Comp ADD_PREFIX(L_Comp)
+#define Mpy_32 ADD_PREFIX(Mpy_32)
+#define Mpy_32_16 ADD_PREFIX(Mpy_32_16)
+#define Div_32 ADD_PREFIX(Div_32)
+#define iLog4 ADD_PREFIX(iLog4)
+#define rsqrt ADD_PREFIX(rsqrt)
+#define pow2_xy ADD_PREFIX(pow2_xy)
+#define L_mpy_ls ADD_PREFIX(L_mpy_ls)
+#define L_mpy_wx ADD_PREFIX(L_mpy_wx)
+
+#define mem_malloc ADD_PREFIX(mem_malloc)
+#define mem_free ADD_PREFIX(mem_free)
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/build/eclair/ARMV5E/Makefile b/media/libstagefright/codecs/aacenc/build/eclair/ARMV5E/Makefile
new file mode 100644
index 0000000..b4f63af
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/build/eclair/ARMV5E/Makefile
@@ -0,0 +1,55 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+# target6
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v5
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= lib
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+# e.g. -DVISUALON, macro VISUALON defined for your module
+VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
+
+
+
+# please specify the name of your module
+VOTARGET:=libvoAACEncv5
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=#-ldl -lstdc++
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../../../../../../Release
+
+
+# please modify here to be sure to see the doit.mk
+include ../../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/aacenc/build/eclair/ARMV7/Makefile b/media/libstagefright/codecs/aacenc/build/eclair/ARMV7/Makefile
new file mode 100644
index 0000000..cdce2c1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/build/eclair/ARMV7/Makefile
@@ -0,0 +1,55 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+# target6
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v7
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= lib
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+# e.g. -DVISUALON, macro VISUALON defined for your module
+VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
+
+
+
+# please specify the name of your module
+VOTARGET:=libvoAACEncv7
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=#-ldl -lstdc++
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../../../../../../Release
+
+
+# please modify here to be sure to see the doit.mk
+include ../../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/aacenc/build/eclair/makefile b/media/libstagefright/codecs/aacenc/build/eclair/makefile
new file mode 100644
index 0000000..6bb3c13
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/build/eclair/makefile
@@ -0,0 +1,40 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+# Just acting as Father Makefile of Modules
+# please keep the name 'makefile' unchanged
+
+# Module Subdirs
+VOMSD:=$(dir $(shell find . -name 'Makefile'))
+
+all:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir; \
+ done
+
+.PHONY:clean devel
+clean:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir clean; \
+ done
+
+devel:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir devel; \
+ done
diff --git a/media/libstagefright/codecs/aacenc/build/ms.mk b/media/libstagefright/codecs/aacenc/build/ms.mk
new file mode 100644
index 0000000..b67efbc
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/build/ms.mk
@@ -0,0 +1,42 @@
+#/*
+#** Copyright 2003-2010, VisualOn, Inc.
+#**
+#** Licensed under the Apache License, Version 2.0 (the "License");
+#** you may not use this file except in compliance with the License.
+#** You may obtain a copy of the License at
+#**
+#** http://www.apache.org/licenses/LICENSE-2.0
+#**
+#** Unless required by applicable law or agreed to in writing, software
+#** distributed under the License is distributed on an "AS IS" BASIS,
+#** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#** See the License for the specific language governing permissions and
+#** limitations under the License.
+#*/
+
+
+# please list all objects needed by your target here
+OBJS:=basicop2.o oper_32b.o aac_rom.o aacenc.o aacenc_core.o adj_thr.o \
+ band_nrg.o bit_cnt.o bitbuffer.o bitenc.o block_switch.o channel_map.o \
+ dyn_bits.o grp_data.o interface.o line_pe.o memalign.o ms_stereo.o \
+ pre_echo_control.o psy_configuration.o psy_main.o qc_main.o quantize.o sf_estim.o \
+ spreading.o stat_bits.o tns.o transform.o
+
+# please list all directories that all source files relative with your module(.h .c .cpp) locate
+VOSRCDIR:=../../../src \
+ ../../../inc \
+ ../../../basic_op\
+ ../../../../../Include
+
+ifeq ($(VOTT), v5)
+OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
+ PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o
+VOSRCDIR+= ../../../src/asm/ARMV5E/
+endif
+
+ifeq ($(VOTT), v7)
+OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
+ PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o
+VOSRCDIR+= ../../../src/asm/ARMV5E/
+VOSRCDIR+= ../../../src/asm/ARMV7/
+endif
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf b/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf
new file mode 100644
index 0000000..874d0f7
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf
Binary files differ
diff --git a/media/libstagefright/codecs/aacenc/inc/aac_rom.h b/media/libstagefright/codecs/aacenc/inc/aac_rom.h
new file mode 100644
index 0000000..b0429fc
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/aac_rom.h
@@ -0,0 +1,117 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: aac_rom.h
+
+ Content: constant tables
+
+*******************************************************************************/
+
+#ifndef ROM_H
+#define ROM_H
+
+#include "config.h"
+#include "psy_const.h"
+#include "tns_param.h"
+
+/*
+ mdct
+*/
+extern const int ShortWindowSine[FRAME_LEN_SHORT/2];
+extern const int LongWindowKBD[FRAME_LEN_LONG/2];
+
+extern const unsigned char bitrevTab[17 + 129];
+extern const int cossintab[128 + 1024];
+
+#if defined (ARMV5E) && !defined (ARMV7Neon)
+extern const int twidTab64[(4*6 + 16*6)/2];
+extern const int twidTab512[(8*6 + 32*6 + 128*6)/2];
+#else
+extern const int twidTab64[4*6 + 16*6];
+extern const int twidTab512[8*6 + 32*6 + 128*6];
+#endif
+
+/*
+ form factor
+*/
+extern const Word32 formfac_sqrttable[96];
+
+/*
+ quantizer
+*/
+extern const Word32 mTab_3_4[512];
+extern const Word32 mTab_4_3[512];
+/*! $2^{-\frac{n}{16}}$ table */
+extern const Word16 pow2tominusNover16[17] ;
+
+extern Word32 specExpMantTableComb_enc[4][14];
+extern const UWord8 specExpTableComb_enc[4][14];
+
+extern const Word16 quantBorders[4][4];
+//extern const Word16 quantRecon[3][4];
+extern const Word16 quantRecon[4][3];
+
+/*
+ huffman
+*/
+extern const UWord16 huff_ltab1_2[3][3][3][3];
+extern const UWord16 huff_ltab3_4[3][3][3][3];
+extern const UWord16 huff_ltab5_6[9][9];
+extern const UWord16 huff_ltab7_8[8][8];
+extern const UWord16 huff_ltab9_10[13][13];
+extern const UWord16 huff_ltab11[17][17];
+extern const UWord16 huff_ltabscf[121];
+extern const UWord16 huff_ctab1[3][3][3][3];
+extern const UWord16 huff_ctab2[3][3][3][3];
+extern const UWord16 huff_ctab3[3][3][3][3];
+extern const UWord16 huff_ctab4[3][3][3][3];
+extern const UWord16 huff_ctab5[9][9];
+extern const UWord16 huff_ctab6[9][9];
+extern const UWord16 huff_ctab7[8][8];
+extern const UWord16 huff_ctab8[8][8];
+extern const UWord16 huff_ctab9[13][13];
+extern const UWord16 huff_ctab10[13][13];
+extern const UWord16 huff_ctab11[17][17];
+extern const UWord32 huff_ctabscf[121];
+
+
+
+/*
+ misc
+*/
+extern const int sampRateTab[NUM_SAMPLE_RATES];
+extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES];
+extern const int rates[8];
+extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES];
+extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES];
+extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES];
+extern const short sfBandTabShort[76];
+extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES];
+extern const short sfBandTabLong[325];
+
+extern const Word32 m_log2_table[INT_BITS];
+
+/*
+ TNS
+*/
+extern const Word32 tnsCoeff3[8];
+extern const Word32 tnsCoeff3Borders[8];
+extern const Word32 tnsCoeff4[16];
+extern const Word32 tnsCoeff4Borders[16];
+extern const Word32 invSBF[24];
+extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1];
+extern const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1];
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
new file mode 100644
index 0000000..faa1d20
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
@@ -0,0 +1,117 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: aacenc_core.h
+
+ Content: aac encoder interface functions
+
+*******************************************************************************/
+
+#ifndef _aacenc_core_h_
+#define _aacenc_core_h_
+
+
+#include "typedef.h"
+#include "config.h"
+#include "bitenc.h"
+
+#include "psy_configuration.h"
+#include "psy_main.h"
+#include "qc_main.h"
+#include "psy_main.h"
+/*-------------------------- defines --------------------------------------*/
+
+
+/*-------------------- structure definitions ------------------------------*/
+typedef struct {
+ Word32 sampleRate; /* audio file sample rate */
+ Word32 bitRate; /* encoder bit rate in bits/sec */
+ Word16 nChannelsIn; /* number of channels on input (1,2) */
+ Word16 nChannelsOut; /* number of channels on output (1,2) */
+ Word16 bandWidth; /* targeted audio bandwidth in Hz */
+ Word16 adtsUsed; /* whether write adts header */
+} AACENC_CONFIG;
+
+
+typedef struct {
+
+ AACENC_CONFIG config; /* Word16 size: 8 */
+
+ ELEMENT_INFO elInfo; /* Word16 size: 4 */
+
+ QC_STATE qcKernel; /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */
+ QC_OUT qcOut; /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */
+
+ PSY_OUT psyOut; /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */
+ PSY_KERNEL psyKernel; /* Word16 size: 2587 / 4491 */
+
+ struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */
+ struct BIT_BUF bitStream; /* Word16 size: 8 */
+ HANDLE_BIT_BUF hBitStream;
+ int initOK;
+
+ short *intbuf;
+ short *encbuf;
+ short *inbuf;
+ int enclen;
+ int inlen;
+ int intlen;
+ int uselength;
+
+ void *hCheck;
+ VO_MEM_OPERATOR *voMemop;
+ VO_MEM_OPERATOR voMemoprator;
+
+}AAC_ENCODER; /* Word16 size: 3809 / 6851 */
+
+/*-----------------------------------------------------------------------------
+
+functionname: AacInitDefaultConfig
+description: gives reasonable default configuration
+returns: ---
+
+------------------------------------------------------------------------------*/
+void AacInitDefaultConfig(AACENC_CONFIG *config);
+
+/*---------------------------------------------------------------------------
+
+functionname:AacEncOpen
+description: allocate and initialize a new encoder instance
+returns: AACENC_OK if success
+
+---------------------------------------------------------------------------*/
+
+Word16 AacEncOpen (AAC_ENCODER *hAacEnc, /* pointer to an encoder handle, initialized on return */
+ const AACENC_CONFIG config); /* pre-initialized config struct */
+
+Word16 AacEncEncode(AAC_ENCODER *hAacEnc,
+ Word16 *timeSignal,
+ const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */
+ Word16 *numAncBytes, /*!< number of ancillary Data Bytes, send as fill element */
+ UWord8 *outBytes, /*!< pointer to output buffer */
+ Word32 *numOutBytes /*!< number of bytes in output buffer */
+ );
+
+/*---------------------------------------------------------------------------
+
+functionname:AacEncClose
+description: deallocate an encoder instance
+
+---------------------------------------------------------------------------*/
+
+void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP); /* an encoder handle */
+
+#endif /* _aacenc_h_ */
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr.h b/media/libstagefright/codecs/aacenc/inc/adj_thr.h
new file mode 100644
index 0000000..4057cbe
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/adj_thr.h
@@ -0,0 +1,57 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: adj_thr.h
+
+ Content: Threshold compensation function
+
+*******************************************************************************/
+
+#ifndef __ADJ_THR_H
+#define __ADJ_THR_H
+
+#include "adj_thr_data.h"
+#include "qc_data.h"
+#include "interface.h"
+
+Word16 bits2pe(const Word16 bits);
+
+Word32 AdjThrNew(ADJ_THR_STATE** phAdjThr,
+ Word32 nElements);
+
+void AdjThrDelete(ADJ_THR_STATE *hAdjThr);
+
+void AdjThrInit(ADJ_THR_STATE *hAdjThr,
+ const Word32 peMean,
+ Word32 chBitrate);
+
+void AdjustThresholds(ADJ_THR_STATE *adjThrState,
+ ATS_ELEMENT* AdjThrStateElement,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word16 *chBitDistribution,
+ Word16 logSfbEnergy[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);
+
+void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
+ const Word16 dynBitsUsed);
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
new file mode 100644
index 0000000..25dd437
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
@@ -0,0 +1,69 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: adj_thr_data.h
+
+ Content: Threshold compensation parameter
+
+*******************************************************************************/
+
+#ifndef __ADJ_THR_DATA_H
+#define __ADJ_THR_DATA_H
+
+#include "typedef.h"
+#include "psy_const.h"
+#include "line_pe.h"
+
+typedef struct {
+ Word16 clipSaveLow, clipSaveHigh;
+ Word16 minBitSave, maxBitSave;
+ Word16 clipSpendLow, clipSpendHigh;
+ Word16 minBitSpend, maxBitSpend;
+} BRES_PARAM;
+
+typedef struct {
+ UWord8 modifyMinSnr;
+ Word16 startSfbL, startSfbS;
+} AH_PARAM;
+
+typedef struct {
+ Word32 maxRed;
+ Word32 startRatio, maxRatio;
+ Word32 redRatioFac;
+ Word32 redOffs;
+} MINSNR_ADAPT_PARAM;
+
+typedef struct {
+ /* parameters for bitreservoir control */
+ Word16 peMin, peMax;
+ /* constant offset to pe */
+ Word16 peOffset;
+ /* avoid hole parameters */
+ AH_PARAM ahParam;
+ /* paramters for adaptation of minSnr */
+ MINSNR_ADAPT_PARAM minSnrAdaptParam;
+ /* values for correction of pe */
+ Word16 peLast;
+ Word16 dynBitsLast;
+ Word16 peCorrectionFactor;
+} ATS_ELEMENT;
+
+typedef struct {
+ BRES_PARAM bresParamLong, bresParamShort; /* Word16 size: 2*8 */
+ ATS_ELEMENT adjThrStateElem; /* Word16 size: 19 */
+} ADJ_THR_STATE;
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/band_nrg.h b/media/libstagefright/codecs/aacenc/inc/band_nrg.h
new file mode 100644
index 0000000..68509da
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/band_nrg.h
@@ -0,0 +1,46 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: band_nrg.h
+
+ Content: Band/Line energy calculations functions
+
+*******************************************************************************/
+
+
+#ifndef _BAND_NRG_H
+#define _BAND_NRG_H
+
+#include "typedef.h"
+
+
+void CalcBandEnergy(const Word32 *mdctSpectrum,
+ const Word16 *bandOffset,
+ const Word16 numBands,
+ Word32 *bandEnergy,
+ Word32 *bandEnergySum);
+
+
+void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
+ const Word32 *mdctSpectrumRight,
+ const Word16 *bandOffset,
+ const Word16 numBands,
+ Word32 *bandEnergyMid,
+ Word32 *bandEnergyMidSum,
+ Word32 *bandEnergySide,
+ Word32 *bandEnergySideSum);
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
new file mode 100644
index 0000000..808319e
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
@@ -0,0 +1,106 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bit_cnt.h
+
+ Content: Huffman Bitcounter & coder structure and functions
+
+*******************************************************************************/
+
+#ifndef __BITCOUNT_H
+#define __BITCOUNT_H
+
+#include "bitbuffer.h"
+#include "basic_op.h"
+#define INVALID_BITCOUNT (MAX_16/4)
+
+/*
+ code book number table
+*/
+
+enum codeBookNo{
+ CODE_BOOK_ZERO_NO= 0,
+ CODE_BOOK_1_NO= 1,
+ CODE_BOOK_2_NO= 2,
+ CODE_BOOK_3_NO= 3,
+ CODE_BOOK_4_NO= 4,
+ CODE_BOOK_5_NO= 5,
+ CODE_BOOK_6_NO= 6,
+ CODE_BOOK_7_NO= 7,
+ CODE_BOOK_8_NO= 8,
+ CODE_BOOK_9_NO= 9,
+ CODE_BOOK_10_NO= 10,
+ CODE_BOOK_ESC_NO= 11,
+ CODE_BOOK_RES_NO= 12,
+ CODE_BOOK_PNS_NO= 13
+};
+
+/*
+ code book index table
+*/
+
+enum codeBookNdx{
+ CODE_BOOK_ZERO_NDX=0,
+ CODE_BOOK_1_NDX,
+ CODE_BOOK_2_NDX,
+ CODE_BOOK_3_NDX,
+ CODE_BOOK_4_NDX,
+ CODE_BOOK_5_NDX,
+ CODE_BOOK_6_NDX,
+ CODE_BOOK_7_NDX,
+ CODE_BOOK_8_NDX,
+ CODE_BOOK_9_NDX,
+ CODE_BOOK_10_NDX,
+ CODE_BOOK_ESC_NDX,
+ CODE_BOOK_RES_NDX,
+ CODE_BOOK_PNS_NDX,
+ NUMBER_OF_CODE_BOOKS
+};
+
+/*
+ code book lav table
+*/
+
+enum codeBookLav{
+ CODE_BOOK_ZERO_LAV=0,
+ CODE_BOOK_1_LAV=1,
+ CODE_BOOK_2_LAV=1,
+ CODE_BOOK_3_LAV=2,
+ CODE_BOOK_4_LAV=2,
+ CODE_BOOK_5_LAV=4,
+ CODE_BOOK_6_LAV=4,
+ CODE_BOOK_7_LAV=7,
+ CODE_BOOK_8_LAV=7,
+ CODE_BOOK_9_LAV=12,
+ CODE_BOOK_10_LAV=12,
+ CODE_BOOK_ESC_LAV=16,
+ CODE_BOOK_SCF_LAV=60,
+ CODE_BOOK_PNS_LAV=60
+};
+
+Word16 bitCount(const Word16 *aQuantSpectrum,
+ const Word16 noOfSpecLines,
+ Word16 maxVal,
+ Word16 *bitCountLut);
+
+Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream);
+
+Word16 bitCountScalefactorDelta(Word16 delta);
+Word16 codeScalefactorDelta(Word16 scalefactor, HANDLE_BIT_BUF hBitstream);
+
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
new file mode 100644
index 0000000..cb850c9
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
@@ -0,0 +1,89 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bitbuffer.h
+
+ Content: Bit Buffer Management structure and functions
+
+*******************************************************************************/
+
+#ifndef BITBUFFER_H
+#define BITBUFFER_H
+
+#include "typedef.h"
+
+
+enum direction
+{
+ forwardDirection,
+ backwardDirection
+};
+
+
+/*!
+ The pointer 'pReadNext' points to the next available word, where bits can be read from. The pointer
+ 'pWriteNext' points to the next available word, where bits can be written to. The pointer pBitBufBase
+ points to the start of the bitstream buffer and the pointer pBitBufEnd points to the end of the bitstream
+ buffer. The two pointers are used as lower-bound respectively upper-bound address for the modulo addressing
+ mode.
+
+ The element cntBits contains the currently available bits in the bit buffer. It will be incremented when
+ bits are written to the bitstream buffer and decremented when bits are read from the bitstream buffer.
+*/
+struct BIT_BUF
+{
+ UWord8 *pBitBufBase; /*!< pointer points to first position in bitstream buffer */
+ UWord8 *pBitBufEnd; /*!< pointer points to last position in bitstream buffer */
+
+ UWord8 *pWriteNext; /*!< pointer points to next available word in bitstream buffer to write */
+
+ UWord32 cache;
+
+ Word16 wBitPos; /*!< 31<=wBitPos<=0*/
+ Word16 cntBits; /*!< number of available bits in the bitstream buffer
+ write bits to bitstream buffer => increment cntBits
+ read bits from bitstream buffer => decrement cntBits */
+ Word16 size; /*!< size of bitbuffer in bits */
+ Word16 isValid; /*!< indicates whether the instance has been initialized */
+}; /* size Word16: 8 */
+
+/*! Define pointer to bit buffer structure */
+typedef struct BIT_BUF *HANDLE_BIT_BUF;
+
+
+HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
+ UWord8 *pBitBufBase,
+ Word16 bitBufSize);
+
+
+void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf);
+
+
+Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf);
+
+
+Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
+ Word32 writeValue,
+ Word16 noBitsToWrite);
+
+void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
+ UWord8 *pBitBufBase,
+ Word16 bitBufSize);
+
+#define GetNrBitsAvailable(hBitBuf) ( (hBitBuf)->cntBits)
+#define GetNrBitsRead(hBitBuf) ((hBitBuf)->size-(hBitBuf)->cntBits)
+
+#endif /* BITBUFFER_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/bitenc.h b/media/libstagefright/codecs/aacenc/inc/bitenc.h
new file mode 100644
index 0000000..1151057
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/bitenc.h
@@ -0,0 +1,50 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bitenc.h
+
+ Content: Bitstream encoder structure and functions
+
+*******************************************************************************/
+
+#ifndef _BITENC_H
+#define _BITENC_H
+
+#include "qc_data.h"
+#include "tns.h"
+#include "channel_map.h"
+#include "interface.h"
+
+struct BITSTREAMENCODER_INIT
+{
+ Word16 nChannels;
+ Word32 bitrate;
+ Word32 sampleRate;
+ Word16 profile;
+};
+
+
+
+Word16 WriteBitstream (HANDLE_BIT_BUF hBitstream,
+ ELEMENT_INFO elInfo,
+ QC_OUT *qcOut,
+ PSY_OUT *psyOut,
+ Word16 *globUsedBits,
+ const UWord8 *ancBytes,
+ Word16 samplerate
+ );
+
+#endif /* _BITENC_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/block_switch.h b/media/libstagefright/codecs/aacenc/inc/block_switch.h
new file mode 100644
index 0000000..3e35819
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/block_switch.h
@@ -0,0 +1,72 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: block_switch.h
+
+ Content: Block switching structure and functions
+
+*******************************************************************************/
+
+#ifndef _BLOCK_SWITCH_H
+#define _BLOCK_SWITCH_H
+
+#include "typedef.h"
+
+
+/****************** Defines ******************************/
+#define BLOCK_SWITCHING_IIR_LEN 2 /* Length of HighPass-FIR-Filter for Attack-Detection */
+#define BLOCK_SWITCH_WINDOWS TRANS_FAC /* number of windows for energy calculation */
+#define BLOCK_SWITCH_WINDOW_LEN FRAME_LEN_SHORT /* minimal granularity of energy calculation */
+
+
+
+/****************** Structures ***************************/
+typedef struct{
+ Word32 invAttackRatio;
+ Word16 windowSequence;
+ Word16 nextwindowSequence;
+ Flag attack;
+ Flag lastattack;
+ Word16 attackIndex;
+ Word16 lastAttackIndex;
+ Word16 noOfGroups;
+ Word16 groupLen[TRANS_FAC];
+ Word32 windowNrg[2][BLOCK_SWITCH_WINDOWS]; /* time signal energy in Subwindows (last and current) */
+ Word32 windowNrgF[2][BLOCK_SWITCH_WINDOWS]; /* filtered time signal energy in segments (last and current) */
+ Word32 iirStates[BLOCK_SWITCHING_IIR_LEN]; /* filter delay-line */
+ Word32 maxWindowNrg; /* max energy in subwindows */
+ Word32 accWindowNrg; /* recursively accumulated windowNrgF */
+}BLOCK_SWITCHING_CONTROL;
+
+
+
+
+
+Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ const Word32 bitRate, const Word16 nChannels);
+
+Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ Word16 *timeSignal,
+ Word32 sampleRate,
+ Word16 chIncrement);
+
+Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
+ BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight,
+ const Word16 noOfChannels);
+
+
+
+#endif /* #ifndef _BLOCK_SWITCH_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/channel_map.h b/media/libstagefright/codecs/aacenc/inc/channel_map.h
new file mode 100644
index 0000000..e3aa8dc
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/channel_map.h
@@ -0,0 +1,37 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: channel_map.h
+
+ Content: channel mapping functions
+
+*******************************************************************************/
+
+#ifndef _CHANNEL_MAP_H
+#define _CHANNEL_MAP_H
+
+#include "psy_const.h"
+#include "qc_data.h"
+
+Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo);
+
+Word16 InitElementBits(ELEMENT_BITS *elementBits,
+ ELEMENT_INFO elInfo,
+ Word32 bitrateTot,
+ Word16 averageBitsTot,
+ Word16 staticBitsTot);
+
+#endif /* CHANNEL_MAP_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/config.h b/media/libstagefright/codecs/aacenc/inc/config.h
new file mode 100644
index 0000000..6211c8f
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/config.h
@@ -0,0 +1,36 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: config.h
+
+ Content: aac encoder parameter
+
+*******************************************************************************/
+
+#ifndef _AACENC_CONFIG_H_
+#define _AACENC_CONFIG_H_
+
+#define MAX_CHANNELS 2
+
+#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */
+#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */
+
+
+#define MAXBITS_COEF 6144
+#define MINBITS_COEF 744
+
+
+#endif
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
new file mode 100644
index 0000000..0468fa2
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
@@ -0,0 +1,82 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: dyn_bits.h
+
+ Content: Noiseless coder module structure and functions
+
+*******************************************************************************/
+
+#ifndef __DYN_BITS_H
+#define __DYN_BITS_H
+
+#include "psy_const.h"
+#include "tns.h"
+#include "bit_cnt.h"
+
+
+
+#define MAX_SECTIONS MAX_GROUPED_SFB
+#define SECT_ESC_VAL_LONG 31
+#define SECT_ESC_VAL_SHORT 7
+#define CODE_BOOK_BITS 4
+#define SECT_BITS_LONG 5
+#define SECT_BITS_SHORT 3
+
+typedef struct
+{
+ Word16 codeBook;
+ Word16 sfbStart;
+ Word16 sfbCnt;
+ Word16 sectionBits;
+}
+SECTION_INFO;
+
+
+
+
+typedef struct
+{
+ Word16 blockType;
+ Word16 noOfGroups;
+ Word16 sfbCnt;
+ Word16 maxSfbPerGroup;
+ Word16 sfbPerGroup;
+ Word16 noOfSections;
+ SECTION_INFO sectionInfo[MAX_SECTIONS];
+ Word16 sideInfoBits; /* sectioning bits */
+ Word16 huffmanBits; /* huffman coded bits */
+ Word16 scalefacBits; /* scalefac coded bits */
+ Word16 firstScf; /* first scf to be coded */
+ Word16 bitLookUp[MAX_SFB_LONG*(CODE_BOOK_ESC_NDX+1)];
+ Word16 mergeGainLookUp[MAX_SFB_LONG];
+}
+SECTION_DATA; /* Word16 size: 10 + 60(MAX_SECTIONS)*4(SECTION_INFO) + 51(MAX_SFB_LONG)*12(CODE_BOOK_ESC_NDX+1) + 51(MAX_SFB_LONG) = 913 */
+
+
+Word16 BCInit(void);
+
+Word16 dynBitCount(const Word16 *quantSpectrum,
+ const UWord16 *maxValueInSfb,
+ const Word16 *scalefac,
+ const Word16 blockType,
+ const Word16 sfbCnt,
+ const Word16 maxSfbPerGroup,
+ const Word16 sfbPerGroup,
+ const Word16 *sfbOffset,
+ SECTION_DATA *sectionData);
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/grp_data.h b/media/libstagefright/codecs/aacenc/inc/grp_data.h
new file mode 100644
index 0000000..9666577
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/grp_data.h
@@ -0,0 +1,44 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: grp_data.h
+
+ Content: Short block grouping function
+
+*******************************************************************************/
+
+#ifndef __GRP_DATA_H__
+#define __GRP_DATA_H__
+#include "psy_data.h"
+#include "typedefs.h"
+
+void
+groupShortData(Word32 *mdctSpectrum,
+ Word32 *tmpSpectrum,
+ SFB_THRESHOLD *sfbThreshold,
+ SFB_ENERGY *sfbEnergy,
+ SFB_ENERGY *sfbEnergyMS,
+ SFB_ENERGY *sfbSpreadedEnergy,
+ const Word16 sfbCnt,
+ const Word16 *sfbOffset,
+ const Word16 *sfbMinSnr,
+ Word16 *groupedSfbOffset,
+ Word16 *maxSfbPerGroup,
+ Word16 *groupedSfbMinSnr,
+ const Word16 noOfGroups,
+ const Word16 *groupLen);
+
+#endif /* _INTERFACE_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/interface.h b/media/libstagefright/codecs/aacenc/inc/interface.h
new file mode 100644
index 0000000..b84334a
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/interface.h
@@ -0,0 +1,106 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: interface.h
+
+ Content: psychoaccoustic/quantizer structures and interface
+
+*******************************************************************************/
+
+#ifndef _INTERFACE_H
+#define _INTERFACE_H
+
+#include "config.h"
+#include "psy_const.h"
+#include "psy_data.h"
+#include "typedefs.h"
+
+
+enum
+{
+ MS_NONE = 0,
+ MS_SOME = 1,
+ MS_ALL = 2
+};
+
+enum
+{
+ MS_ON = 1
+};
+
+struct TOOLSINFO {
+ Word16 msDigest;
+ Word16 msMask[MAX_GROUPED_SFB];
+};
+
+
+typedef struct {
+ Word16 sfbCnt;
+ Word16 sfbPerGroup;
+ Word16 maxSfbPerGroup;
+ Word16 windowSequence;
+ Word16 windowShape;
+ Word16 groupingMask;
+ Word16 sfbOffsets[MAX_GROUPED_SFB+1];
+ Word16 mdctScale;
+ Word32 *sfbEnergy;
+ Word32 *sfbSpreadedEnergy;
+ Word32 *sfbThreshold;
+ Word32 *mdctSpectrum;
+ Word32 sfbEnSumLR;
+ Word32 sfbEnSumMS;
+ Word32 sfbDist[MAX_GROUPED_SFB];
+ Word32 sfbDistNew[MAX_GROUPED_SFB];
+ Word16 sfbMinSnr[MAX_GROUPED_SFB];
+ Word16 minSfMaxQuant[MAX_GROUPED_SFB];
+ Word16 minScfCalculated[MAX_GROUPED_SFB];
+ Word16 prevScfLast[MAX_GROUPED_SFB];
+ Word16 prevScfNext[MAX_GROUPED_SFB];
+ Word16 deltaPeLast[MAX_GROUPED_SFB];
+ TNS_INFO tnsInfo;
+} PSY_OUT_CHANNEL; /* Word16 size: 14 + 60(MAX_GROUPED_SFB) + 112(TNS_INFO) = 186 */
+
+typedef struct {
+ struct TOOLSINFO toolsInfo;
+ Word16 groupedSfbOffset[MAX_CHANNELS][MAX_GROUPED_SFB+1]; /* plus one for last dummy offset ! */
+ Word16 groupedSfbMinSnr[MAX_CHANNELS][MAX_GROUPED_SFB];
+} PSY_OUT_ELEMENT;
+
+typedef struct {
+ /* information shared by both channels */
+ PSY_OUT_ELEMENT psyOutElement;
+ /* information specific to each channel */
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS];
+}PSY_OUT;
+
+void BuildInterface(Word32 *mdctSpectrum,
+ const Word16 mdctScale,
+ SFB_THRESHOLD *sfbThreshold,
+ SFB_ENERGY *sfbEnergy,
+ SFB_ENERGY *sfbSpreadedEnergy,
+ const SFB_ENERGY_SUM sfbEnergySumLR,
+ const SFB_ENERGY_SUM sfbEnergySumMS,
+ const Word16 windowSequence,
+ const Word16 windowShape,
+ const Word16 sfbCnt,
+ const Word16 *sfbOffset,
+ const Word16 maxSfbPerGroup,
+ const Word16 *groupedSfbMinSnr,
+ const Word16 noOfGroups,
+ const Word16 *groupLen,
+ PSY_OUT_CHANNEL *psyOutCh);
+
+#endif /* _INTERFACE_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/line_pe.h b/media/libstagefright/codecs/aacenc/inc/line_pe.h
new file mode 100644
index 0000000..fed938b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/line_pe.h
@@ -0,0 +1,75 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: line_pe.h
+
+ Content: Perceptual entropie module structure and functions
+
+*******************************************************************************/
+
+#ifndef __LINE_PE_H
+#define __LINE_PE_H
+
+
+#include "psy_const.h"
+#include "interface.h"
+
+
+typedef struct {
+ Word16 sfbLdEnergy[MAX_GROUPED_SFB]; /* 4*log(sfbEnergy)/log(2) */
+ Word16 sfbNLines4[MAX_GROUPED_SFB]; /* 4*number of relevant lines in sfb */
+ Word16 sfbPe[MAX_GROUPED_SFB]; /* pe for each sfb */
+ Word16 sfbConstPart[MAX_GROUPED_SFB]; /* constant part for each sfb */
+ Word16 sfbNActiveLines[MAX_GROUPED_SFB]; /* number of active lines in sfb */
+ Word16 pe; /* sum of sfbPe */
+ Word16 constPart; /* sum of sfbConstPart */
+ Word16 nActiveLines; /* sum of sfbNActiveLines */
+} PE_CHANNEL_DATA; /* size Word16: 303 */
+
+
+typedef struct {
+ PE_CHANNEL_DATA peChannelData[MAX_CHANNELS];
+ Word16 pe;
+ Word16 constPart;
+ Word16 nActiveLines;
+ Word16 offset;
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB];
+ Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB];
+ Word32 sfbPeFactors[MAX_CHANNELS][MAX_GROUPED_SFB];
+} PE_DATA; /* size Word16: 303 + 4 + 120 + 240 = 667 */
+
+
+
+
+void prepareSfbPe(PE_DATA *peData,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels,
+ const Word16 peOffset);
+
+
+
+
+
+void calcSfbPe(PE_DATA *peData,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels);
+
+
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/memalign.h b/media/libstagefright/codecs/aacenc/inc/memalign.h
new file mode 100644
index 0000000..3b302a7
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/memalign.h
@@ -0,0 +1,35 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: memalign.h
+
+ Content: Memory alloc alignments functions
+
+*******************************************************************************/
+
+#ifndef __VO_AACENC_MEM_ALIGN_H__
+#define __VO_AACENC_MEM_ALIGN_H__
+
+#include "voMem.h"
+#include "typedef.h"
+
+extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
+extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
+
+#endif /* __VO_MEM_ALIGN_H__ */
+
+
+
diff --git a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
new file mode 100644
index 0000000..6d43dec
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
@@ -0,0 +1,45 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: ms_stereo.h
+
+ Content: Declaration MS stereo processing structure and functions
+
+*******************************************************************************/
+
+#ifndef __MS_STEREO_H__
+#define __MS_STEREO_H__
+#include "typedef.h"
+
+void MsStereoProcessing(Word32 *sfbEnergyLeft,
+ Word32 *sfbEnergyRight,
+ const Word32 *sfbEnergyMid,
+ const Word32 *sfbEnergySide,
+ Word32 *mdctSpectrumLeft,
+ Word32 *mdctSpectrumRight,
+ Word32 *sfbThresholdLeft,
+ Word32 *sfbThresholdRight,
+ Word32 *sfbSpreadedEnLeft,
+ Word32 *sfbSpreadedEnRight,
+ Word16 *msDigest,
+ Word16 *msMask,
+ const Word16 sfbCnt,
+ const Word16 sfbPerGroup,
+ const Word16 maxSfbPerGroup,
+ const Word16 *sfbOffset);
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
new file mode 100644
index 0000000..35f36e8
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
@@ -0,0 +1,42 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: pre_echo_control.h
+
+ Content: Pre echo control functions
+
+*******************************************************************************/
+
+#ifndef __PRE_ECHO_CONTROL_H
+#define __PRE_ECHO_CONTROL_H
+
+#include "typedefs.h"
+
+void InitPreEchoControl(Word32 *pbThresholdnm1,
+ Word16 numPb,
+ Word32 *pbThresholdQuiet);
+
+
+void PreEchoControl(Word32 *pbThresholdNm1,
+ Word16 numPb,
+ Word32 maxAllowedIncreaseFactor,
+ Word16 minRemainingThresholdFactor,
+ Word32 *pbThreshold,
+ Word16 mdctScale,
+ Word16 mdctScalenm1);
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
new file mode 100644
index 0000000..53cf25b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
@@ -0,0 +1,107 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_configuration.h
+
+ Content: Psychoaccoustic configuration structure and functions
+
+*******************************************************************************/
+
+#ifndef _PSY_CONFIGURATION_H
+#define _PSY_CONFIGURATION_H
+
+#include "typedefs.h"
+#include "psy_const.h"
+#include "tns.h"
+
+typedef struct{
+
+ Word16 sfbCnt;
+ Word16 sfbActive; /* number of sf bands containing energy after lowpass */
+ Word16 *sfbOffset;
+
+ Word32 sfbThresholdQuiet[MAX_SFB_LONG];
+
+ Word16 maxAllowedIncreaseFactor; /* preecho control */
+ Word16 minRemainingThresholdFactor;
+
+ Word16 lowpassLine;
+ Word16 sampRateIdx;
+ Word32 clipEnergy; /* for level dependend tmn */
+
+ Word16 ratio;
+ Word16 sfbMaskLowFactor[MAX_SFB_LONG];
+ Word16 sfbMaskHighFactor[MAX_SFB_LONG];
+
+ Word16 sfbMaskLowFactorSprEn[MAX_SFB_LONG];
+ Word16 sfbMaskHighFactorSprEn[MAX_SFB_LONG];
+
+
+ Word16 sfbMinSnr[MAX_SFB_LONG]; /* minimum snr (formerly known as bmax) */
+
+ TNS_CONFIG tnsConf;
+
+}PSY_CONFIGURATION_LONG; /*Word16 size: 8 + 52 + 102 + 51 + 51 + 51 + 51 + 47 = 515 */
+
+
+typedef struct{
+
+ Word16 sfbCnt;
+ Word16 sfbActive; /* number of sf bands containing energy after lowpass */
+ Word16 *sfbOffset;
+
+ Word32 sfbThresholdQuiet[MAX_SFB_SHORT];
+
+ Word16 maxAllowedIncreaseFactor; /* preecho control */
+ Word16 minRemainingThresholdFactor;
+
+ Word16 lowpassLine;
+ Word16 sampRateIdx;
+ Word32 clipEnergy; /* for level dependend tmn */
+
+ Word16 ratio;
+ Word16 sfbMaskLowFactor[MAX_SFB_SHORT];
+ Word16 sfbMaskHighFactor[MAX_SFB_SHORT];
+
+ Word16 sfbMaskLowFactorSprEn[MAX_SFB_SHORT];
+ Word16 sfbMaskHighFactorSprEn[MAX_SFB_SHORT];
+
+
+ Word16 sfbMinSnr[MAX_SFB_SHORT]; /* minimum snr (formerly known as bmax) */
+
+ TNS_CONFIG tnsConf;
+
+}PSY_CONFIGURATION_SHORT; /*Word16 size: 8 + 16 + 16 + 16 + 16 + 16 + 16 + 16 + 47 = 167 */
+
+
+/* Returns the sample rate index */
+Word32 GetSRIndex(Word32 sampleRate);
+
+
+Word16 InitPsyConfigurationLong(Word32 bitrate,
+ Word32 samplerate,
+ Word16 bandwidth,
+ PSY_CONFIGURATION_LONG *psyConf);
+
+Word16 InitPsyConfigurationShort(Word32 bitrate,
+ Word32 samplerate,
+ Word16 bandwidth,
+ PSY_CONFIGURATION_SHORT *psyConf);
+
+#endif /* _PSY_CONFIGURATION_H */
+
+
+
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_const.h b/media/libstagefright/codecs/aacenc/inc/psy_const.h
new file mode 100644
index 0000000..5455ab1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/psy_const.h
@@ -0,0 +1,80 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_const.h
+
+ Content: Global psychoacoustic constants structures
+
+*******************************************************************************/
+
+#ifndef _PSYCONST_H
+#define _PSYCONST_H
+
+#include "config.h"
+
+#define TRUE 1
+#define FALSE 0
+
+#define FRAME_LEN_LONG AACENC_BLOCKSIZE
+#define TRANS_FAC 8
+#define FRAME_LEN_SHORT (FRAME_LEN_LONG/TRANS_FAC)
+
+
+
+/* Block types */
+enum
+{
+ LONG_WINDOW = 0,
+ START_WINDOW,
+ SHORT_WINDOW,
+ STOP_WINDOW
+};
+
+/* Window shapes */
+enum
+{
+ SINE_WINDOW = 0,
+ KBD_WINDOW = 1
+};
+
+/*
+ MS stuff
+*/
+enum
+{
+ SI_MS_MASK_NONE = 0,
+ SI_MS_MASK_SOME = 1,
+ SI_MS_MASK_ALL = 2
+};
+
+#define MAX_NO_OF_GROUPS 4
+#define MAX_SFB_SHORT 15 /* 15 for a memory optimized implementation, maybe 16 for convenient debugging */
+#define MAX_SFB_LONG 51 /* 51 for a memory optimized implementation, maybe 64 for convenient debugging */
+#define MAX_SFB (MAX_SFB_SHORT > MAX_SFB_LONG ? MAX_SFB_SHORT : MAX_SFB_LONG) /* = MAX_SFB_LONG */
+#define MAX_GROUPED_SFB (MAX_NO_OF_GROUPS*MAX_SFB_SHORT > MAX_SFB_LONG ? \
+ MAX_NO_OF_GROUPS*MAX_SFB_SHORT : MAX_SFB_LONG)
+
+#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
+
+#define LOG_NORM_PCM -15
+
+#define NUM_SAMPLE_RATES 12
+
+#endif /* _PSYCONST_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_data.h b/media/libstagefright/codecs/aacenc/inc/psy_data.h
new file mode 100644
index 0000000..1412d53
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/psy_data.h
@@ -0,0 +1,66 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_data.h
+
+ Content: Psychoacoustic data and structures
+
+*******************************************************************************/
+
+#ifndef _PSY_DATA_H
+#define _PSY_DATA_H
+
+#include "block_switch.h"
+#include "tns.h"
+
+/*
+ the structs can be implemented as unions
+*/
+
+typedef struct{
+ Word32 sfbLong[MAX_GROUPED_SFB];
+ Word32 sfbShort[TRANS_FAC][MAX_SFB_SHORT];
+}SFB_THRESHOLD; /* Word16 size: 260 */
+
+typedef struct{
+ Word32 sfbLong[MAX_GROUPED_SFB];
+ Word32 sfbShort[TRANS_FAC][MAX_SFB_SHORT];
+}SFB_ENERGY; /* Word16 size: 260 */
+
+typedef struct{
+ Word32 sfbLong;
+ Word32 sfbShort[TRANS_FAC];
+}SFB_ENERGY_SUM; /* Word16 size: 18 */
+
+
+typedef struct{
+ BLOCK_SWITCHING_CONTROL blockSwitchingControl; /* block switching */
+ Word16 *mdctDelayBuffer; /* mdct delay buffer [BLOCK_SWITCHING_OFFSET]*/
+ Word32 sfbThresholdnm1[MAX_SFB]; /* PreEchoControl */
+ Word16 mdctScalenm1; /* scale of last block's mdct (PreEchoControl) */
+
+ SFB_THRESHOLD sfbThreshold; /* adapt */
+ SFB_ENERGY sfbEnergy; /* sfb Energy */
+ SFB_ENERGY sfbEnergyMS;
+ SFB_ENERGY_SUM sfbEnergySum;
+ SFB_ENERGY_SUM sfbEnergySumMS;
+ SFB_ENERGY sfbSpreadedEnergy;
+
+ Word32 *mdctSpectrum; /* mdct spectrum [FRAME_LEN_LONG] */
+ Word16 mdctScale; /* scale of mdct */
+}PSY_DATA; /* Word16 size: 4 + 87 + 102 + 360 + 360 + 360 + 18 + 18 + 360 = 1669 */
+
+#endif /* _PSY_DATA_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_main.h b/media/libstagefright/codecs/aacenc/inc/psy_main.h
new file mode 100644
index 0000000..ab0b8b1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/psy_main.h
@@ -0,0 +1,69 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_main.h
+
+ Content: Psychoacoustic major function block
+
+*******************************************************************************/
+
+#ifndef _PSYMAIN_H
+#define _PSYMAIN_H
+
+#include "psy_configuration.h"
+#include "qc_data.h"
+#include "memalign.h"
+
+/*
+ psy kernel
+*/
+typedef struct {
+ PSY_CONFIGURATION_LONG psyConfLong; /* Word16 size: 515 */
+ PSY_CONFIGURATION_SHORT psyConfShort; /* Word16 size: 167 */
+ PSY_DATA psyData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*1669*/
+ TNS_DATA tnsData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*235 */
+ Word32* pScratchTns;
+ Word16 sampleRateIdx;
+}PSY_KERNEL; /* Word16 size: 2587 / 4491 */
+
+
+Word16 PsyNew( PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP);
+Word16 PsyDelete( PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP);
+
+Word16 PsyOutNew( PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP);
+Word16 PsyOutDelete( PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP);
+
+Word16 psyMainInit( PSY_KERNEL *hPsy,
+ Word32 sampleRate,
+ Word32 bitRate,
+ Word16 channels,
+ Word16 tnsMask,
+ Word16 bandwidth);
+
+
+Word16 psyMain(Word16 nChannels, /*!< total number of channels */
+ ELEMENT_INFO *elemInfo,
+ Word16 *timeSignal, /*!< interleaved time signal */
+ PSY_DATA psyData[MAX_CHANNELS],
+ TNS_DATA tnsData[MAX_CHANNELS],
+ PSY_CONFIGURATION_LONG* psyConfLong,
+ PSY_CONFIGURATION_SHORT* psyConfShort,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word32 *pScratchTns,
+ Word32 sampleRate);
+
+#endif /* _PSYMAIN_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_data.h b/media/libstagefright/codecs/aacenc/inc/qc_data.h
new file mode 100644
index 0000000..81d4051
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/qc_data.h
@@ -0,0 +1,143 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: qc_data.h
+
+ Content: Quantizing & coding structures
+
+*******************************************************************************/
+
+#ifndef _QC_DATA_H
+#define _QC_DATA_H
+
+#include "psy_const.h"
+#include "dyn_bits.h"
+#include "adj_thr_data.h"
+
+
+#define MAX_MODES 10
+
+typedef enum {
+ MODE_INVALID = 0,
+ MODE_1, /* mono */
+ MODE_1_1, /* dual mono */
+ MODE_2 /* stereo */
+} ENCODER_MODE;
+
+typedef enum {
+ ID_SCE=0, /* Single Channel Element */
+ ID_CPE=1, /* Channel Pair Element */
+ ID_CCE=2, /* Coupling Channel Element */
+ ID_LFE=3, /* LFE Channel Element */
+ ID_DSE=4, /* current one DSE element for ancillary is supported */
+ ID_PCE=5,
+ ID_FIL=6,
+ ID_END=7
+}ELEMENT_TYPE;
+
+typedef struct {
+ ELEMENT_TYPE elType;
+ Word16 instanceTag;
+ Word16 nChannelsInEl;
+ Word16 ChannelIndex[MAX_CHANNELS];
+} ELEMENT_INFO;
+
+typedef struct {
+ Word32 paddingRest;
+} PADDING;
+
+
+/* Quantizing & coding stage */
+
+struct QC_INIT{
+ ELEMENT_INFO *elInfo;
+ Word16 maxBits; /* maximum number of bits in reservoir */
+ Word16 averageBits; /* average number of bits we should use */
+ Word16 bitRes;
+ Word16 meanPe;
+ Word32 chBitrate;
+ Word16 maxBitFac;
+ Word32 bitrate;
+
+ PADDING padding;
+};
+
+typedef struct
+{
+ Word16 *quantSpec; /* [FRAME_LEN_LONG]; */
+ UWord16 *maxValueInSfb; /* [MAX_GROUPED_SFB]; */
+ Word16 *scf; /* [MAX_GROUPED_SFB]; */
+ Word16 globalGain;
+ Word16 mdctScale;
+ Word16 groupingMask;
+ SECTION_DATA sectionData;
+ Word16 windowShape;
+} QC_OUT_CHANNEL;
+
+typedef struct
+{
+ Word16 adtsUsed;
+ Word16 staticBitsUsed; /* for verification purposes */
+ Word16 dynBitsUsed; /* for verification purposes */
+ Word16 pe;
+ Word16 ancBitsUsed;
+ Word16 fillBits;
+} QC_OUT_ELEMENT;
+
+typedef struct
+{
+ QC_OUT_CHANNEL qcChannel[MAX_CHANNELS];
+ QC_OUT_ELEMENT qcElement;
+ Word16 totStaticBitsUsed; /* for verification purposes */
+ Word16 totDynBitsUsed; /* for verification purposes */
+ Word16 totAncBitsUsed; /* for verification purposes */
+ Word16 totFillBits;
+ Word16 alignBits;
+ Word16 bitResTot;
+ Word16 averageBitsTot;
+} QC_OUT;
+
+typedef struct {
+ Word32 chBitrate;
+ Word16 averageBits; /* brutto -> look ancillary.h */
+ Word16 maxBits;
+ Word16 bitResLevel;
+ Word16 maxBitResBits;
+ Word16 relativeBits; /* Bits relative to total Bits scaled down by 2 */
+} ELEMENT_BITS;
+
+typedef struct
+{
+ /* this is basically struct QC_INIT */
+ Word16 averageBitsTot;
+ Word16 maxBitsTot;
+ Word16 globStatBits;
+ Word16 nChannels;
+ Word16 bitResTot;
+
+ Word16 maxBitFac;
+
+ PADDING padding;
+
+ ELEMENT_BITS elementBits;
+ ADJ_THR_STATE adjThr;
+
+ Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB];
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB];
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB];
+} QC_STATE;
+
+#endif /* _QC_DATA_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_main.h b/media/libstagefright/codecs/aacenc/inc/qc_main.h
new file mode 100644
index 0000000..e1138b2
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/qc_main.h
@@ -0,0 +1,64 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: qc_main.h
+
+ Content: Quantizing & coding functions
+
+*******************************************************************************/
+
+#ifndef _QC_MAIN_H
+#define _QC_MAIN_H
+
+#include "qc_data.h"
+#include "interface.h"
+#include "memalign.h"
+
+/* Quantizing & coding stage */
+
+Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP);
+
+void QCOutDelete(QC_OUT *hQC, VO_MEM_OPERATOR *pMemOP);
+
+Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
+
+Word16 QCInit(QC_STATE *hQC,
+ struct QC_INIT *init);
+
+void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
+
+
+Word16 QCMain(QC_STATE *hQC,
+ ELEMENT_BITS* elBits,
+ ATS_ELEMENT* adjThrStateElement,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
+ PSY_OUT_ELEMENT* psyOutElement,
+ QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
+ QC_OUT_ELEMENT* qcOutElement,
+ Word16 nChannels,
+ Word16 ancillaryDataBytes); /* returns error code */
+
+void updateBitres(QC_STATE* qcKernel,
+ QC_OUT* qcOut);
+
+Word16 FinalizeBitConsumption(QC_STATE *hQC,
+ QC_OUT* qcOut);
+
+Word16 AdjustBitrate(QC_STATE *hQC,
+ Word32 bitRate,
+ Word32 sampleRate);
+
+#endif /* _QC_MAIN_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/quantize.h b/media/libstagefright/codecs/aacenc/inc/quantize.h
new file mode 100644
index 0000000..88a95e1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/quantize.h
@@ -0,0 +1,42 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: quantize.h
+
+ Content: Quantization functions
+
+*******************************************************************************/
+
+#ifndef _QUANTIZE_H_
+#define _QUANTIZE_H_
+#include "typedefs.h"
+
+/* quantizing */
+
+#define MAX_QUANT 8191
+
+void QuantizeSpectrum(Word16 sfbCnt,
+ Word16 maxSfbPerGroup,
+ Word16 sfbPerGroup,
+ Word16 *sfbOffset, Word32 *mdctSpectrum,
+ Word16 globalGain, Word16 *scalefactors,
+ Word16 *quantizedSpectrum);
+
+Word32 calcSfbDist(const Word32 *spec,
+ Word16 sfbWidth,
+ Word16 gain);
+
+#endif /* _QUANTIZE_H_ */
diff --git a/media/libstagefright/codecs/aacenc/inc/sf_estim.h b/media/libstagefright/codecs/aacenc/inc/sf_estim.h
new file mode 100644
index 0000000..b25ec3c
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/sf_estim.h
@@ -0,0 +1,46 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: sf_estim.h
+
+ Content: Scale factor estimation functions
+
+*******************************************************************************/
+
+#ifndef __SF_ESTIM_H__
+#define __SF_ESTIM_H__
+/*
+ Scale factor estimation
+ */
+#include "psy_const.h"
+#include "interface.h"
+#include "qc_data.h"
+
+void
+CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels);
+
+void
+EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels);
+#endif
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/inc/spreading.h b/media/libstagefright/codecs/aacenc/inc/spreading.h
new file mode 100644
index 0000000..29cf63d
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/spreading.h
@@ -0,0 +1,33 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: spreading.h
+
+ Content: Spreading of energy functions
+
+*******************************************************************************/
+
+#ifndef _SPREADING_H
+#define _SPREADING_H
+#include "typedefs.h"
+
+
+void SpreadingMax(const Word16 pbCnt,
+ const Word16 *maskLowFactor,
+ const Word16 *maskHighFactor,
+ Word32 *pbSpreadedEnergy);
+
+#endif /* #ifndef _SPREADING_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/stat_bits.h b/media/libstagefright/codecs/aacenc/inc/stat_bits.h
new file mode 100644
index 0000000..6e90b9c
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/stat_bits.h
@@ -0,0 +1,34 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: stat_bits.h
+
+ Content: Static bit counter functions
+
+*******************************************************************************/
+
+#ifndef __STAT_BITS_H
+#define __STAT_BITS_H
+
+#include "psy_const.h"
+#include "interface.h"
+
+Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word16 nChannels,
+ Word16 adtsUsed);
+
+#endif /* __STAT_BITS_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns.h b/media/libstagefright/codecs/aacenc/inc/tns.h
new file mode 100644
index 0000000..9ffcce9
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/tns.h
@@ -0,0 +1,108 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: tns.h
+
+ Content: TNS structures
+
+*******************************************************************************/
+
+#ifndef _TNS_H
+#define _TNS_H
+
+#include "typedef.h"
+#include "psy_const.h"
+
+
+
+#define TNS_MAX_ORDER 12
+#define TNS_MAX_ORDER_SHORT 5
+
+#define FILTER_DIRECTION 0
+
+typedef struct{ /*stuff that is tabulated dependent on bitrate etc. */
+ Word16 threshOn; /* min. prediction gain for using tns TABUL * 100*/
+ Word32 lpcStartFreq; /* lowest freq for lpc TABUL*/
+ Word32 lpcStopFreq; /* TABUL */
+ Word32 tnsTimeResolution;
+}TNS_CONFIG_TABULATED;
+
+
+typedef struct { /*assigned at InitTime*/
+ Word16 tnsActive;
+ Word16 tnsMaxSfb;
+
+ Word16 maxOrder; /* max. order of tns filter */
+ Word16 tnsStartFreq; /* lowest freq. for tns filtering */
+ Word16 coefRes;
+
+ TNS_CONFIG_TABULATED confTab;
+
+ Word32 acfWindow[TNS_MAX_ORDER+1];
+
+ Word16 tnsStartBand;
+ Word16 tnsStartLine;
+
+ Word16 tnsStopBand;
+ Word16 tnsStopLine;
+
+ Word16 lpcStartBand;
+ Word16 lpcStartLine;
+
+ Word16 lpcStopBand;
+ Word16 lpcStopLine;
+
+ Word16 tnsRatioPatchLowestCb;
+ Word16 tnsModifyBeginCb;
+
+ Word16 threshold; /* min. prediction gain for using tns TABUL * 100 */
+
+}TNS_CONFIG;
+
+
+typedef struct {
+ Word16 tnsActive;
+ Word32 parcor[TNS_MAX_ORDER];
+ Word16 predictionGain;
+} TNS_SUBBLOCK_INFO; /* Word16 size: 26 */
+
+typedef struct{
+ TNS_SUBBLOCK_INFO subBlockInfo[TRANS_FAC];
+} TNS_DATA_SHORT;
+
+typedef struct{
+ TNS_SUBBLOCK_INFO subBlockInfo;
+} TNS_DATA_LONG;
+
+typedef struct{
+ TNS_DATA_LONG tnsLong;
+ TNS_DATA_SHORT tnsShort;
+}TNS_DATA_RAW;
+
+typedef struct{
+ Word16 numOfSubblocks;
+ TNS_DATA_RAW dataRaw;
+}TNS_DATA; /* Word16 size: 1 + 8*26 + 26 = 235 */
+
+typedef struct{
+ Word16 tnsActive[TRANS_FAC];
+ Word16 coefRes[TRANS_FAC];
+ Word16 length[TRANS_FAC];
+ Word16 order[TRANS_FAC];
+ Word16 coef[TRANS_FAC*TNS_MAX_ORDER_SHORT];
+}TNS_INFO; /* Word16 size: 72 */
+
+#endif /* _TNS_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_func.h b/media/libstagefright/codecs/aacenc/inc/tns_func.h
new file mode 100644
index 0000000..58b75b6
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/tns_func.h
@@ -0,0 +1,75 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: tns_func.h
+
+ Content: TNS functions
+
+*******************************************************************************/
+
+/*
+ Temporal noise shaping
+ */
+#ifndef _TNS_FUNC_H
+#define _TNS_FUNC_H
+#include "typedef.h"
+#include "psy_configuration.h"
+
+Word16 InitTnsConfigurationLong(Word32 bitrate,
+ Word32 samplerate,
+ Word16 channels,
+ TNS_CONFIG *tnsConfig,
+ PSY_CONFIGURATION_LONG *psyConfig,
+ Word16 active);
+
+Word16 InitTnsConfigurationShort(Word32 bitrate,
+ Word32 samplerate,
+ Word16 channels,
+ TNS_CONFIG *tnsConfig,
+ PSY_CONFIGURATION_SHORT *psyConfig,
+ Word16 active);
+
+Word32 TnsDetect(TNS_DATA* tnsData,
+ TNS_CONFIG tC,
+ Word32* pScratchTns,
+ const Word16 sfbOffset[],
+ Word32* spectrum,
+ Word16 subBlockNumber,
+ Word16 blockType,
+ Word32 * sfbEnergy);
+
+void TnsSync(TNS_DATA *tnsDataDest,
+ const TNS_DATA *tnsDataSrc,
+ const TNS_CONFIG tC,
+ const Word16 subBlockNumber,
+ const Word16 blockType);
+
+Word16 TnsEncode(TNS_INFO* tnsInfo,
+ TNS_DATA* tnsData,
+ Word16 numOfSfb,
+ TNS_CONFIG tC,
+ Word16 lowPassLine,
+ Word32* spectrum,
+ Word16 subBlockNumber,
+ Word16 blockType);
+
+void ApplyTnsMultTableToRatios(Word16 startCb,
+ Word16 stopCb,
+ TNS_SUBBLOCK_INFO subInfo,
+ Word32 *thresholds);
+
+
+#endif /* _TNS_FUNC_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_param.h b/media/libstagefright/codecs/aacenc/inc/tns_param.h
new file mode 100644
index 0000000..26266ac
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/tns_param.h
@@ -0,0 +1,52 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: tns_param.h
+
+ Content: TNS parameters
+
+*******************************************************************************/
+
+/*
+ TNS parameters
+ */
+#ifndef _TNS_PARAM_H
+#define _TNS_PARAM_H
+
+#include "tns.h"
+
+typedef struct{
+ Word32 samplingRate;
+ Word16 maxBandLong;
+ Word16 maxBandShort;
+}TNS_MAX_TAB_ENTRY;
+
+typedef struct{
+ Word32 bitRateFrom;
+ Word32 bitRateTo;
+ const TNS_CONFIG_TABULATED *paramMono_Long; /* contains TNS parameters */
+ const TNS_CONFIG_TABULATED *paramMono_Short;
+ const TNS_CONFIG_TABULATED *paramStereo_Long;
+ const TNS_CONFIG_TABULATED *paramStereo_Short;
+}TNS_INFO_TAB;
+
+
+void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
+ Word32 bitRate, Word16 channels, Word16 blockType);
+
+void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);
+
+#endif /* _TNS_PARAM_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/transform.h b/media/libstagefright/codecs/aacenc/inc/transform.h
new file mode 100644
index 0000000..2666914
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/inc/transform.h
@@ -0,0 +1,36 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: transform.h
+
+ Content: MDCT Transform functions
+
+*******************************************************************************/
+
+#ifndef __TRANSFORM_H__
+#define __TRANSFORM_H__
+
+#include "typedef.h"
+
+void Transform_Real(Word16 *mdctDelayBuffer,
+ Word16 *timeSignal,
+ Word16 chIncrement, /*! channel increment */
+ Word32 *realOut,
+ Word16 *mdctScale,
+ Word16 windowSequence
+ );
+
+#endif
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/patent_disclaimer.txt b/media/libstagefright/codecs/aacenc/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/libstagefright/codecs/aacenc/src/aac_rom.c b/media/libstagefright/codecs/aacenc/src/aac_rom.c
new file mode 100644
index 0000000..2ce0352
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/aac_rom.c
@@ -0,0 +1,2363 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: aac_rom.c
+
+ Content: constant tables
+
+*******************************************************************************/
+
+#include "aac_rom.h"
+
+#if defined (ARMV5E) && !defined (ARMV7Neon)
+
+/*
+ * Q30 for 128 and 1024
+ *
+ * for (i = 0; i < num/4; i++) {
+ * angle = (i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 30);
+ * x = sin(angle) * (1 << 30);
+ *
+ * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 30);
+ * x = sin(angle) * (1 << 30);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+ /* 128 */
+ 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776,
+ 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea,
+ 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796,
+ 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad,
+ 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179,
+ 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728,
+ 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88,
+ 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb,
+ 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2,
+ 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663,
+ 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e,
+ 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4,
+ 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222,
+ 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea,
+ 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a,
+ 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da,
+ /* 1024 */
+ 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b,
+ 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b,
+ 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5,
+ 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec,
+ 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44,
+ 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5,
+ 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878,
+ 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265,
+ 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98,
+ 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f,
+ 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06,
+ 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f,
+ 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b,
+ 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac,
+ 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7,
+ 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2,
+ 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954,
+ 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7,
+ 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5,
+ 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79,
+ 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92,
+ 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e,
+ 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e,
+ 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4,
+ 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223,
+ 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181,
+ 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5,
+ 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5,
+ 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc,
+ 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965,
+ 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc,
+ 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920,
+ 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f,
+ 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c,
+ 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788,
+ 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778,
+ 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51,
+ 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a,
+ 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c,
+ 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480,
+ 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432,
+ 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef,
+ 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5,
+ 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84,
+ 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde,
+ 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145,
+ 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe,
+ 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e,
+ 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c,
+ 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2,
+ 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98,
+ 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c,
+ 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9,
+ 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e,
+ 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c,
+ 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2,
+ 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075,
+ 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8,
+ 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552,
+ 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08,
+ 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63,
+ 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be,
+ 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574,
+ 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1,
+ 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663,
+ 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b,
+ 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129,
+ 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f,
+ 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1,
+ 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74,
+ 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f,
+ 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a,
+ 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d,
+ 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324,
+ 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb,
+ 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f,
+ 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e,
+ 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9,
+ 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142,
+ 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb,
+ 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28,
+ 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f,
+ 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7,
+ 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7,
+ 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa,
+ 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b,
+ 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4,
+ 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135,
+ 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b,
+ 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608,
+ 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b,
+ 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8,
+ 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03,
+ 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621,
+ 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9,
+ 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2,
+ 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636,
+ 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef,
+ 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768,
+ 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f,
+ 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2,
+ 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df,
+ 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8,
+ 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e,
+ 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435,
+ 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1,
+ 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557,
+ 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee,
+ 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe,
+ 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620,
+ 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee,
+ 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04,
+ 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff,
+ 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d,
+ 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c,
+ 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c,
+ 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840,
+ 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a,
+ 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c,
+ 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d,
+ 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2,
+ 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543,
+ 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6,
+ 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556,
+ 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d,
+ 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7,
+ 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510,
+ 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
+};
+
+
+const int twidTab512[(8*6 + 32*6 + 128*6)/2] = {
+ 0x40000000, 0x40000000, 0x40000000, 0x3b20187d,
+ 0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d,
+ 0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5,
+ 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20,
+ 0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20,
+ 0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca,
+
+ 0x40000000, 0x40000000, 0x40000000, 0x3fb10645,
+ 0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645,
+ 0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d,
+ 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b,
+ 0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294,
+ 0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5,
+ 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179,
+ 0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b,
+ 0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec,
+ 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e,
+ 0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899,
+ 0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367,
+ 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1,
+ 0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179,
+ 0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f,
+ 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871,
+ 0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871,
+ 0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074,
+ 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899,
+ 0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e,
+ 0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095,
+ 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294,
+ 0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1,
+ 0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2,
+
+ 0x40000000, 0x40000000, 0x40000000, 0x3ffb0192,
+ 0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192,
+ 0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d,
+ 0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5,
+ 0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5,
+ 0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f,
+ 0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05,
+ 0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5,
+ 0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937,
+ 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413,
+ 0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1,
+ 0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192,
+ 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef,
+ 0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05,
+ 0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934,
+ 0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b,
+ 0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111,
+ 0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1,
+ 0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da,
+ 0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413,
+ 0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5,
+ 0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd,
+ 0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708,
+ 0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f,
+ 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a,
+ 0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef,
+ 0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77,
+ 0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274,
+ 0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6,
+ 0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a,
+ 0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612,
+ 0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b,
+ 0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe,
+ 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a,
+ 0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d,
+ 0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f,
+ 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6,
+ 0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da,
+ 0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02,
+ 0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae,
+ 0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f,
+ 0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983,
+ 0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e,
+ 0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd,
+ 0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6,
+ 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3,
+ 0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21,
+ 0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3,
+ 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb,
+ 0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a,
+ 0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd,
+ 0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84,
+ 0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076,
+ 0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039,
+ 0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71,
+ 0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274,
+ 0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3,
+ 0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5,
+ 0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453,
+ 0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9,
+ 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82,
+ 0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612,
+ 0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d,
+ 0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af,
+ 0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af,
+ 0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14,
+ 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453,
+ 0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a,
+ 0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf,
+ 0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076,
+ 0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82,
+ 0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4,
+ 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21,
+ 0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6,
+ 0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124,
+ 0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f,
+ 0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5,
+ 0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940,
+ 0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d,
+ 0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae,
+ 0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232,
+ 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6,
+ 0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71,
+ 0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22,
+ 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708,
+ 0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e,
+ 0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731,
+ 0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111,
+ 0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84,
+ 0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c,
+ 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1,
+ 0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3,
+ 0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115,
+ 0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5,
+ 0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb,
+ 0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c
+};
+
+const int twidTab64[(4*6 + 16*6)/2] = {
+ 0x40000000, 0x40000000, 0x40000000, 0x2d412d41,
+ 0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41,
+ 0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783,
+
+ 0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c,
+ 0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c,
+ 0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179,
+ 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536,
+ 0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e,
+ 0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871,
+ 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5,
+ 0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536,
+ 0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb,
+ 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e,
+ 0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5,
+ 0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2
+};
+
+#elif defined ARMV7Neon
+/*
+ * Q29 for 128 and 1024
+ *
+ * for (i = 0; i < num/4; i++) {
+ * angle = (i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 29);
+ * x = sin(angle) * (1 << 29);
+ *
+ * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 29);
+ * x = sin(angle) * (1 << 29);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+ /* 128 */
+ 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,
+ 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,
+ 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,
+ 0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9
+};
+
+#else
+
+/*
+ * Q30 for 128 and 1024
+ *
+ * for (i = 0; i < num/4; i++) {
+ * angle = (i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 30);
+ * x = sin(angle) * (1 << 30);
+ *
+ * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ * x = cos(angle) * (1 << 30);
+ * x = sin(angle) * (1 << 30);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+ /* 128 */
+ 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776,
+ 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea,
+ 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796,
+ 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad,
+ 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179,
+ 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728,
+ 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88,
+ 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb,
+ 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2,
+ 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663,
+ 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e,
+ 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4,
+ 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222,
+ 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea,
+ 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a,
+ 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da,
+ /* 1024 */
+ 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b,
+ 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b,
+ 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5,
+ 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec,
+ 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44,
+ 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5,
+ 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878,
+ 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265,
+ 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98,
+ 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f,
+ 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06,
+ 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f,
+ 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b,
+ 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac,
+ 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7,
+ 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2,
+ 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954,
+ 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7,
+ 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5,
+ 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79,
+ 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92,
+ 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e,
+ 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e,
+ 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4,
+ 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223,
+ 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181,
+ 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5,
+ 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5,
+ 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc,
+ 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965,
+ 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc,
+ 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920,
+ 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f,
+ 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c,
+ 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788,
+ 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778,
+ 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51,
+ 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a,
+ 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c,
+ 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480,
+ 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432,
+ 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef,
+ 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5,
+ 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84,
+ 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde,
+ 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145,
+ 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe,
+ 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e,
+ 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c,
+ 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2,
+ 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98,
+ 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c,
+ 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9,
+ 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e,
+ 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c,
+ 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2,
+ 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075,
+ 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8,
+ 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552,
+ 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08,
+ 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63,
+ 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be,
+ 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574,
+ 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1,
+ 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663,
+ 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b,
+ 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129,
+ 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f,
+ 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1,
+ 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74,
+ 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f,
+ 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a,
+ 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d,
+ 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324,
+ 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb,
+ 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f,
+ 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e,
+ 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9,
+ 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142,
+ 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb,
+ 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28,
+ 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f,
+ 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7,
+ 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7,
+ 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa,
+ 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b,
+ 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4,
+ 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135,
+ 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b,
+ 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608,
+ 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b,
+ 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8,
+ 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03,
+ 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621,
+ 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9,
+ 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2,
+ 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636,
+ 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef,
+ 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768,
+ 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f,
+ 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2,
+ 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df,
+ 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8,
+ 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e,
+ 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435,
+ 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1,
+ 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557,
+ 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee,
+ 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe,
+ 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620,
+ 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee,
+ 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04,
+ 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff,
+ 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d,
+ 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c,
+ 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c,
+ 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840,
+ 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a,
+ 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c,
+ 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d,
+ 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2,
+ 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543,
+ 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6,
+ 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556,
+ 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d,
+ 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7,
+ 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510,
+ 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
+};
+
+const int twidTab512[8*6 + 32*6 + 128*6] = {
+ 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6,
+ 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6,
+ 0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f,
+ 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e,
+ 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e,
+ 0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae,
+
+ 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af,
+ 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af,
+ 0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009,
+ 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38,
+ 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e,
+ 0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a,
+ 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6,
+ 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38,
+ 0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6,
+ 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad,
+ 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a,
+ 0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f,
+ 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47,
+ 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6,
+ 0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75,
+ 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3,
+ 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3,
+ 0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343,
+ 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a,
+ 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad,
+ 0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc,
+ 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e,
+ 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47,
+ 0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502,
+
+ 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f,
+ 0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f,
+ 0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171,
+ 0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395,
+ 0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824,
+ 0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e,
+ 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135,
+ 0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395,
+ 0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63,
+ 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94,
+ 0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22,
+ 0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a,
+ 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943,
+ 0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135,
+ 0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937,
+ 0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db,
+ 0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262,
+ 0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6,
+ 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99,
+ 0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94,
+ 0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c,
+ 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577,
+ 0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530,
+ 0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8,
+ 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f,
+ 0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943,
+ 0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191,
+ 0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493,
+ 0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99,
+ 0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3,
+ 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0,
+ 0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db,
+ 0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d,
+ 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642,
+ 0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8,
+ 0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249,
+ 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d,
+ 0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99,
+ 0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756,
+ 0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce,
+ 0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452,
+ 0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7,
+ 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4,
+ 0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577,
+ 0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236,
+ 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a,
+ 0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa,
+ 0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe,
+ 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1,
+ 0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f,
+ 0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6,
+ 0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1,
+ 0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17,
+ 0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e,
+ 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758,
+ 0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493,
+ 0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931,
+ 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8,
+ 0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40,
+ 0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2,
+ 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2,
+ 0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0,
+ 0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402,
+ 0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158,
+ 0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158,
+ 0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231,
+ 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40,
+ 0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642,
+ 0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee,
+ 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17,
+ 0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2,
+ 0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223,
+ 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa,
+ 0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d,
+ 0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae,
+ 0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452,
+ 0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8,
+ 0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e,
+ 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8,
+ 0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce,
+ 0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757,
+ 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99,
+ 0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758,
+ 0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822,
+ 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530,
+ 0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4,
+ 0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997,
+ 0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262,
+ 0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1,
+ 0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a,
+ 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22,
+ 0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a,
+ 0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9,
+ 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824,
+ 0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1,
+ 0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21
+};
+
+const int twidTab64[4*6 + 16*6] = {
+ 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc,
+ 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc,
+ 0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a,
+
+ 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e,
+ 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e,
+ 0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6,
+ 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52,
+ 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673,
+ 0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3,
+ 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f,
+ 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52,
+ 0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651,
+ 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673,
+ 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f,
+ 0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53
+};
+#endif //ARMV5E
+
+const int ShortWindowSine[FRAME_LEN_SHORT/2] ={
+ 0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75,
+ 0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1,
+ 0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7,
+ 0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e,
+ 0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141,
+ 0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add,
+ 0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371,
+ 0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10
+};
+
+const int LongWindowKBD[FRAME_LEN_LONG/2]={
+ 0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff,
+ 0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff,
+ 0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff,
+ 0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff,
+ 0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff,
+ 0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff,
+ 0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff,
+ 0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe,
+ 0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd,
+ 0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc,
+ 0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa,
+ 0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8,
+ 0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5,
+ 0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1,
+ 0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed,
+ 0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7,
+ 0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0,
+ 0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7,
+ 0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd,
+ 0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0,
+ 0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2,
+ 0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0,
+ 0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b,
+ 0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73,
+ 0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56,
+ 0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36,
+ 0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10,
+ 0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5,
+ 0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4,
+ 0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d,
+ 0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f,
+ 0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9,
+ 0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab,
+ 0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54,
+ 0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4,
+ 0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a,
+ 0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16,
+ 0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96,
+ 0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a,
+ 0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73,
+ 0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce,
+ 0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c,
+ 0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c,
+ 0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e,
+ 0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1,
+ 0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5,
+ 0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca,
+ 0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be,
+ 0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3,
+ 0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178,
+ 0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c,
+ 0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0,
+ 0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94,
+ 0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28,
+ 0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab,
+ 0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e,
+ 0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782,
+ 0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6,
+ 0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b,
+ 0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251,
+ 0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079,
+ 0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94,
+ 0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1,
+ 0x58995c62, 0x58da5c23, 0x591c5be3, 0x595e5ba4, 0x599f5b64, 0x59e05b24, 0x5a215ae3, 0x5a625aa3
+};
+
+
+/*
+ form factor
+*/
+/* sqrt(((i+(1<<(FF_SQRT_BITS-2)+0.5)/2^31) */
+const Word32 formfac_sqrttable[96] = {
+ 0x000407f8, 0x000417b9, 0x0004273f, 0x0004368c, 0x000445a1, 0x00045483, 0x00046332, 0x000471b0,
+ 0x00048000, 0x00048e22, 0x00049c1a, 0x0004a9e7, 0x0004b78c, 0x0004c50a, 0x0004d263, 0x0004df96,
+ 0x0004eca7, 0x0004f995, 0x00050662, 0x0005130e, 0x00051f9c, 0x00052c0a, 0x0005385b, 0x00054490,
+ 0x000550a8, 0x00055ca5, 0x00056888, 0x00057450, 0x00058000, 0x00058b96, 0x00059715, 0x0005a27c,
+ 0x0005adcc, 0x0005b906, 0x0005c42b, 0x0005cf39, 0x0005da33, 0x0005e519, 0x0005efea, 0x0005faa8,
+ 0x00060552, 0x00060fea, 0x00061a70, 0x000624e3, 0x00062f45, 0x00063996, 0x000643d5, 0x00064e04,
+ 0x00065823, 0x00066231, 0x00066c30, 0x0006761f, 0x00068000, 0x000689d1, 0x00069393, 0x00069d47,
+ 0x0006a6ed, 0x0006b085, 0x0006ba10, 0x0006c38d, 0x0006ccfc, 0x0006d65f, 0x0006dfb5, 0x0006e8fe,
+ 0x0006f23b, 0x0006fb6c, 0x00070490, 0x00070da9, 0x000716b6, 0x00071fb8, 0x000728ae, 0x00073199,
+ 0x00073a79, 0x0007434e, 0x00074c19, 0x000754d9, 0x00075d8e, 0x0007663a, 0x00076edb, 0x00077772,
+ 0x00078000, 0x00078883, 0x000790fd, 0x0007996e, 0x0007a1d5, 0x0007aa33, 0x0007b288, 0x0007bad4,
+ 0x0007c318, 0x0007cb52, 0x0007d384, 0x0007dbad, 0x0007e3ce, 0x0007ebe6, 0x0007f3f6, 0x0007fbfe
+};
+
+
+
+/*!
+ \name quantizer and inverse quantizer tables
+
+ \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,
+ 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,
+ 0x7f5571cd, 0x7f801003, 0x7faab1c8, 0x7fd5571d
+};
+
+
+const Word32 invSBF[24] = {
+ 0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E,
+ 0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000,
+ 0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE,
+ 0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE,
+ 0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886,
+ 0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C
+};
+
+const Word16 pow2tominusNover16[17] = {
+ 0x7fff, 0x7a93, 0x7560, 0x7066,
+ 0x6ba2, 0x6712, 0x62b4, 0x5e84,
+ 0x5a82, 0x56ac, 0x52ff, 0x4f7b,
+ 0x4c1c, 0x48e2, 0x45cb, 0x42d5,
+ 0x4000
+};
+
+const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = {
+ 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14
+};
+
+const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = {
+ 7, 7, 7, 7, 7, 7, 7, 10, 10,
+ 10, 10, 10, 10, 10, 13, 13
+};
+
+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,
+ 0x6ba27e65, 0x43ce3e4b}
+};
+
+const UWord8 specExpTableComb_enc[4][14] =
+{
+ {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18},
+ {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18},
+ {1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18},
+ {1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19}
+};
+
+const Word16 quantBorders[4][4] = {
+ /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+ {0x0400, 0x0ee7, 0x1c86, 0x2c0d},
+ /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+ {0x04c2, 0x11b9, 0x21eb, 0x3463},
+ /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+ {0x05a8, 0x1514, 0x2856, 0x3e4c},
+ /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+ {0x06ba, 0x1911, 0x2ff8, 0x4a16},
+};
+
+const Word16 quantRecon[4][3] = {
+ {0x0800, 0x1429, 0x229d},
+ {0x0983, 0x17f9, 0x292a},
+ {0x0b50, 0x1c82, 0x30f4},
+ {0x0d74, 0x21e7, 0x3a37},
+};
+
+const int sampRateTab[NUM_SAMPLE_RATES] = {
+ 96000, 88200, 64000, 48000, 44100, 32000,
+ 24000, 22050, 16000, 12000, 11025, 8000
+};
+
+
+const int rates[8] = {
+ 160, 240, 320, 400, 480, 560, 640, 0
+};
+
+const int BandwithCoefTab[8][NUM_SAMPLE_RATES] = {
+ { 7000, 7000, 4666, 3500, 3500, 2800, 2800, 2800, 2800, 2000, 2000, 2000},
+ {12000, 12000, 8000, 6000, 6000, 6000, 4000, 4000, 4000, 3000, 3000, 3000},
+ {18000, 18000, 12000, 9000, 9000, 9000, 7000, 7000, 7000, 5000, 5000, 5000},
+ {20000, 20000, 16000, 12000, 12000, 12000, 9000, 9000, 9000, 6000, 6000, 6000},
+ {20000, 20000, 18666, 14000, 14000, 14000, 10000, 10000, 10000, 7000, 7000, 7000},
+ {20000, 20000, 20000, 16000, 16000, 16000, 12000, 12000, 12000, 8000, 8000, 8000},
+ {20000, 20000, 20000, 20000, 20000, 20000, 15000, 15000, 15000, 10000, 10000, 10000},
+ {20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000}
+};
+
+
+/* total number of scale factor bands in one window */
+const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = {
+ 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
+};
+
+const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = {
+ 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
+};
+
+/* scale factor band tables */
+const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60};
+
+const short sfBandTabShort[76] = {
+ /* short block 64, 88, 96 kHz [13] */
+ 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128,
+
+ /* short block 32, 44, 48 kHz [15] */
+ 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128,
+
+ /* short block 22, 24 kHz [16] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128,
+
+ /* short block 11, 12, 16 kHz [16] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128,
+
+ /* short block 8 kHz [16] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
+};
+
+const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284};
+
+const short sfBandTabLong[325] = {
+ /* long block 88, 96 kHz [42] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52,
+ 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212,
+ 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024,
+
+ /* long block 64 kHz [48] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64,
+ 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384,
+ 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024,
+
+ /* long block 44, 48 kHz [50] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88,
+ 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448,
+ 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024,
+
+ /* long block 32 kHz [52] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96,
+ 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512,
+ 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024,
+
+ /* long block 22, 24 kHz [48] */
+ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76,
+ 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284,
+ 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024,
+
+ /* long block 11, 12, 16 kHz [44] */
+ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
+ 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368,
+ 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024,
+
+ /* long block 8 kHz [41] */
+ 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156,
+ 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420,
+ 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
+};
+
+/*
+ these tables are used only for counting and
+ are stored in packed format
+*/
+const UWord16 huff_ltab1_2[3][3][3][3]=
+{
+ {
+ {
+ {0x0b09,0x0907,0x0b09},
+ {0x0a08,0x0706,0x0a08},
+ {0x0b09,0x0908,0x0b09}
+ },
+ {
+ {0x0a08,0x0706,0x0a07},
+ {0x0706,0x0505,0x0706},
+ {0x0907,0x0706,0x0a08}
+ },
+ {
+ {0x0b09,0x0907,0x0b08},
+ {0x0908,0x0706,0x0908},
+ {0x0b09,0x0907,0x0b09}
+ }
+ },
+ {
+ {
+ {0x0908,0x0706,0x0907},
+ {0x0706,0x0505,0x0706},
+ {0x0907,0x0706,0x0908}
+ },
+ {
+ {0x0706,0x0505,0x0706},
+ {0x0505,0x0103,0x0505},
+ {0x0706,0x0505,0x0706}
+ },
+ {
+ {0x0908,0x0706,0x0907},
+ {0x0706,0x0505,0x0706},
+ {0x0908,0x0706,0x0908}
+ }
+ },
+ {
+ {
+ {0x0b09,0x0907,0x0b09},
+ {0x0908,0x0706,0x0908},
+ {0x0b08,0x0907,0x0b09}
+ },
+ {
+ {0x0a08,0x0706,0x0907},
+ {0x0706,0x0504,0x0706},
+ {0x0908,0x0706,0x0a07}
+ },
+ {
+ {0x0b09,0x0907,0x0b09},
+ {0x0a07,0x0706,0x0908},
+ {0x0b09,0x0907,0x0b09}
+ }
+ }
+};
+
+
+const UWord16 huff_ltab3_4[3][3][3][3]=
+{
+ {
+ {
+ {0x0104,0x0405,0x0808},
+ {0x0405,0x0504,0x0808},
+ {0x0909,0x0908,0x0a0b}
+ },
+ {
+ {0x0405,0x0605,0x0908},
+ {0x0605,0x0604,0x0908},
+ {0x0908,0x0907,0x0a0a}
+ },
+ {
+ {0x0909,0x0a08,0x0d0b},
+ {0x0908,0x0908,0x0b0a},
+ {0x0b0b,0x0a0a,0x0c0b}
+ }
+ },
+ {
+ {
+ {0x0404,0x0605,0x0a08},
+ {0x0604,0x0704,0x0a08},
+ {0x0a08,0x0a08,0x0c0a}
+ },
+ {
+ {0x0504,0x0704,0x0b08},
+ {0x0604,0x0704,0x0a07},
+ {0x0908,0x0907,0x0b09}
+ },
+ {
+ {0x0908,0x0a08,0x0d0a},
+ {0x0807,0x0907,0x0c09},
+ {0x0a0a,0x0b09,0x0c0a}
+ }
+ },
+ {
+ {
+ {0x0808,0x0a08,0x0f0b},
+ {0x0908,0x0b07,0x0f0a},
+ {0x0d0b,0x0e0a,0x100c}
+ },
+ {
+ {0x0808,0x0a07,0x0e0a},
+ {0x0907,0x0a07,0x0e09},
+ {0x0c0a,0x0c09,0x0f0b}
+ },
+ {
+ {0x0b0b,0x0c0a,0x100c},
+ {0x0a0a,0x0b09,0x0f0b},
+ {0x0c0b,0x0c0a,0x0f0b}
+ }
+ }
+};
+
+const UWord16 huff_ltab5_6[9][9]=
+{
+ {0x0d0b,0x0c0a,0x0b09,0x0b09,0x0a09,0x0b09,0x0b09,0x0c0a,0x0d0b},
+ {0x0c0a,0x0b09,0x0a08,0x0907,0x0807,0x0907,0x0a08,0x0b09,0x0c0a},
+ {0x0c09,0x0a08,0x0906,0x0806,0x0706,0x0806,0x0906,0x0a08,0x0b09},
+ {0x0b09,0x0907,0x0806,0x0504,0x0404,0x0504,0x0806,0x0907,0x0b09},
+ {0x0a09,0x0807,0x0706,0x0404,0x0104,0x0404,0x0706,0x0807,0x0b09},
+ {0x0b09,0x0907,0x0806,0x0504,0x0404,0x0504,0x0806,0x0907,0x0b09},
+ {0x0b09,0x0a08,0x0906,0x0806,0x0706,0x0806,0x0906,0x0a08,0x0b09},
+ {0x0c0a,0x0b09,0x0a08,0x0907,0x0807,0x0907,0x0a07,0x0b08,0x0c0a},
+ {0x0d0b,0x0c0a,0x0c09,0x0b09,0x0a09,0x0a09,0x0b09,0x0c0a,0x0d0b}
+};
+
+const UWord16 huff_ltab7_8[8][8]=
+{
+ {0x0105,0x0304,0x0605,0x0706,0x0807,0x0908,0x0a09,0x0b0a},
+ {0x0304,0x0403,0x0604,0x0705,0x0806,0x0807,0x0907,0x0908},
+ {0x0605,0x0604,0x0704,0x0805,0x0806,0x0907,0x0907,0x0a08},
+ {0x0706,0x0705,0x0805,0x0806,0x0906,0x0907,0x0a08,0x0a08},
+ {0x0807,0x0806,0x0906,0x0906,0x0a07,0x0a07,0x0a08,0x0b09},
+ {0x0908,0x0807,0x0906,0x0907,0x0a07,0x0a08,0x0b08,0x0b0a},
+ {0x0a09,0x0907,0x0907,0x0a08,0x0a08,0x0b08,0x0c09,0x0c09},
+ {0x0b0a,0x0a08,0x0a08,0x0a08,0x0b09,0x0b09,0x0c09,0x0c0a}
+};
+
+const UWord16 huff_ltab9_10[13][13]=
+{
+ {0x0106,0x0305,0x0606,0x0806,0x0907,0x0a08,0x0a09,0x0b0a,0x0b0a,0x0c0a,0x0c0b,0x0d0b,0x0d0c},
+ {0x0305,0x0404,0x0604,0x0705,0x0806,0x0807,0x0907,0x0a08,0x0a08,0x0a09,0x0b0a,0x0c0a,0x0c0b},
+ {0x0606,0x0604,0x0705,0x0805,0x0806,0x0906,0x0a07,0x0a08,0x0a08,0x0b09,0x0c09,0x0c0a,0x0c0a},
+ {0x0806,0x0705,0x0805,0x0905,0x0906,0x0a07,0x0a07,0x0b08,0x0b08,0x0b09,0x0c09,0x0c0a,0x0d0a},
+ {0x0907,0x0806,0x0906,0x0906,0x0a06,0x0a07,0x0b07,0x0b08,0x0b08,0x0c09,0x0c09,0x0c0a,0x0d0a},
+ {0x0a08,0x0907,0x0906,0x0a07,0x0b07,0x0b07,0x0b08,0x0c08,0x0b08,0x0c09,0x0c0a,0x0d0a,0x0d0b},
+ {0x0b09,0x0907,0x0a07,0x0b07,0x0b07,0x0b08,0x0c08,0x0c09,0x0c09,0x0c09,0x0d0a,0x0d0a,0x0d0b},
+ {0x0b09,0x0a08,0x0a08,0x0b08,0x0b08,0x0c08,0x0c09,0x0d09,0x0d09,0x0d0a,0x0d0a,0x0d0b,0x0d0b},
+ {0x0b09,0x0a08,0x0a08,0x0b08,0x0b08,0x0b08,0x0c09,0x0c09,0x0d0a,0x0d0a,0x0e0a,0x0d0b,0x0e0b},
+ {0x0b0a,0x0a09,0x0b09,0x0b09,0x0c09,0x0c09,0x0c09,0x0c0a,0x0d0a,0x0d0a,0x0e0b,0x0e0b,0x0e0c},
+ {0x0c0a,0x0b09,0x0b09,0x0c09,0x0c09,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0e0b,0x0e0b,0x0e0b,0x0f0c},
+ {0x0c0b,0x0b0a,0x0c09,0x0c0a,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0d0b,0x0e0b,0x0e0b,0x0f0b,0x0f0c},
+ {0x0d0b,0x0c0a,0x0c0a,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0d0b,0x0e0b,0x0e0c,0x0e0c,0x0e0c,0x0f0c}
+};
+
+const UWord16 huff_ltab11[17][17]=
+{
+ {0x0004,0x0005,0x0006,0x0007,0x0008,0x0008,0x0009,0x000a,0x000a,0x000a,0x000b,0x000b,0x000c,0x000b,0x000c,0x000c,0x000a},
+ {0x0005,0x0004,0x0005,0x0006,0x0007,0x0007,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000b,0x0008},
+ {0x0006,0x0005,0x0005,0x0006,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x0007,0x0006,0x0006,0x0006,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x0008,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x0008,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x0008},
+ {0x000a,0x0009,0x0008,0x0008,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x0008},
+ {0x000a,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x0008},
+ {0x000b,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000a,0x000b,0x000b,0x0008},
+ {0x000b,0x000a,0x0009,0x0009,0x000a,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x0008},
+ {0x000b,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
+ {0x000b,0x000a,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
+ {0x000b,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
+ {0x000c,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x000c,0x000c,0x0009},
+ {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0005}
+};
+
+const UWord16 huff_ltabscf[121]=
+{
+ 0x0012,
+ 0x0012,
+ 0x0012,
+ 0x0012,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0012,
+ 0x0013,
+ 0x0012,
+ 0x0011,
+ 0x0011,
+ 0x0010,
+ 0x0011,
+ 0x0010,
+ 0x0010,
+ 0x0010,
+ 0x0010,
+ 0x000f,
+ 0x000f,
+ 0x000e,
+ 0x000e,
+ 0x000e,
+ 0x000e,
+ 0x000e,
+ 0x000e,
+ 0x000d,
+ 0x000d,
+ 0x000c,
+ 0x000c,
+ 0x000c,
+ 0x000b,
+ 0x000c,
+ 0x000b,
+ 0x000a,
+ 0x000a,
+ 0x000a,
+ 0x0009,
+ 0x0009,
+ 0x0008,
+ 0x0008,
+ 0x0008,
+ 0x0007,
+ 0x0006,
+ 0x0006,
+ 0x0005,
+ 0x0004,
+ 0x0003,
+ 0x0001,
+ 0x0004,
+ 0x0004,
+ 0x0005,
+ 0x0006,
+ 0x0006,
+ 0x0007,
+ 0x0007,
+ 0x0008,
+ 0x0008,
+ 0x0009,
+ 0x0009,
+ 0x000a,
+ 0x000a,
+ 0x000a,
+ 0x000b,
+ 0x000b,
+ 0x000b,
+ 0x000b,
+ 0x000c,
+ 0x000c,
+ 0x000d,
+ 0x000d,
+ 0x000d,
+ 0x000e,
+ 0x000e,
+ 0x0010,
+ 0x000f,
+ 0x0010,
+ 0x000f,
+ 0x0012,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013,
+ 0x0013
+};
+
+
+const UWord16 huff_ctab1[3][3][3][3]=
+{
+ {
+ {
+ {0x07f8,0x01f1,0x07fd},
+ {0x03f5,0x0068,0x03f0},
+ {0x07f7,0x01ec,0x07f5}
+ },
+ {
+ {0x03f1,0x0072,0x03f4},
+ {0x0074,0x0011,0x0076},
+ {0x01eb,0x006c,0x03f6}
+ },
+ {
+ {0x07fc,0x01e1,0x07f1},
+ {0x01f0,0x0061,0x01f6},
+ {0x07f2,0x01ea,0x07fb}
+ }
+ },
+ {
+ {
+ {0x01f2,0x0069,0x01ed},
+ {0x0077,0x0017,0x006f},
+ {0x01e6,0x0064,0x01e5}
+ },
+ {
+ {0x0067,0x0015,0x0062},
+ {0x0012,0x0000,0x0014},
+ {0x0065,0x0016,0x006d}
+ },
+ {
+ {0x01e9,0x0063,0x01e4},
+ {0x006b,0x0013,0x0071},
+ {0x01e3,0x0070,0x01f3}
+ }
+ },
+ {
+ {
+ {0x07fe,0x01e7,0x07f3},
+ {0x01ef,0x0060,0x01ee},
+ {0x07f0,0x01e2,0x07fa}
+ },
+ {
+ {0x03f3,0x006a,0x01e8},
+ {0x0075,0x0010,0x0073},
+ {0x01f4,0x006e,0x03f7}
+ },
+ {
+ {0x07f6,0x01e0,0x07f9},
+ {0x03f2,0x0066,0x01f5},
+ {0x07ff,0x01f7,0x07f4}
+ }
+ }
+};
+
+const UWord16 huff_ctab2[3][3][3][3]=
+{
+ {
+ {
+ {0x01f3,0x006f,0x01fd},
+ {0x00eb,0x0023,0x00ea},
+ {0x01f7,0x00e8,0x01fa}
+ },
+ {
+ {0x00f2,0x002d,0x0070},
+ {0x0020,0x0006,0x002b},
+ {0x006e,0x0028,0x00e9}
+ },
+ {
+ {0x01f9,0x0066,0x00f8},
+ {0x00e7,0x001b,0x00f1},
+ {0x01f4,0x006b,0x01f5}
+ }
+ },
+ {
+ {
+ {0x00ec,0x002a,0x006c},
+ {0x002c,0x000a,0x0027},
+ {0x0067,0x001a,0x00f5}
+ },
+ {
+ {0x0024,0x0008,0x001f},
+ {0x0009,0x0000,0x0007},
+ {0x001d,0x000b,0x0030}
+ },
+ {
+ {0x00ef,0x001c,0x0064},
+ {0x001e,0x000c,0x0029},
+ {0x00f3,0x002f,0x00f0}
+ }
+ },
+ {
+ {
+ {0x01fc,0x0071,0x01f2},
+ {0x00f4,0x0021,0x00e6},
+ {0x00f7,0x0068,0x01f8}
+ },
+ {
+ {0x00ee,0x0022,0x0065},
+ {0x0031,0x0002,0x0026},
+ {0x00ed,0x0025,0x006a}
+ },
+ {
+ {0x01fb,0x0072,0x01fe},
+ {0x0069,0x002e,0x00f6},
+ {0x01ff,0x006d,0x01f6}
+ }
+ }
+};
+
+const UWord16 huff_ctab3[3][3][3][3]=
+{
+ {
+ {
+ {0x0000,0x0009,0x00ef},
+ {0x000b,0x0019,0x00f0},
+ {0x01eb,0x01e6,0x03f2}
+ },
+ {
+ {0x000a,0x0035,0x01ef},
+ {0x0034,0x0037,0x01e9},
+ {0x01ed,0x01e7,0x03f3}
+ },
+ {
+ {0x01ee,0x03ed,0x1ffa},
+ {0x01ec,0x01f2,0x07f9},
+ {0x07f8,0x03f8,0x0ff8}
+ }
+ },
+ {
+ {
+ {0x0008,0x0038,0x03f6},
+ {0x0036,0x0075,0x03f1},
+ {0x03eb,0x03ec,0x0ff4}
+ },
+ {
+ {0x0018,0x0076,0x07f4},
+ {0x0039,0x0074,0x03ef},
+ {0x01f3,0x01f4,0x07f6}
+ },
+ {
+ {0x01e8,0x03ea,0x1ffc},
+ {0x00f2,0x01f1,0x0ffb},
+ {0x03f5,0x07f3,0x0ffc}
+ }
+ },
+ {
+ {
+ {0x00ee,0x03f7,0x7ffe},
+ {0x01f0,0x07f5,0x7ffd},
+ {0x1ffb,0x3ffa,0xffff}
+ },
+ {
+ {0x00f1,0x03f0,0x3ffc},
+ {0x01ea,0x03ee,0x3ffb},
+ {0x0ff6,0x0ffa,0x7ffc}
+ },
+ {
+ {0x07f2,0x0ff5,0xfffe},
+ {0x03f4,0x07f7,0x7ffb},
+ {0x0ff7,0x0ff9,0x7ffa}
+ }
+ }
+};
+
+const UWord16 huff_ctab4[3][3][3][3]=
+{
+ {
+ {
+ {0x0007,0x0016,0x00f6},
+ {0x0018,0x0008,0x00ef},
+ {0x01ef,0x00f3,0x07f8}
+ },
+ {
+ {0x0019,0x0017,0x00ed},
+ {0x0015,0x0001,0x00e2},
+ {0x00f0,0x0070,0x03f0}
+ },
+ {
+ {0x01ee,0x00f1,0x07fa},
+ {0x00ee,0x00e4,0x03f2},
+ {0x07f6,0x03ef,0x07fd}
+ }
+ },
+ {
+ {
+ {0x0005,0x0014,0x00f2},
+ {0x0009,0x0004,0x00e5},
+ {0x00f4,0x00e8,0x03f4}
+ },
+ {
+ {0x0006,0x0002,0x00e7},
+ {0x0003,0x0000,0x006b},
+ {0x00e3,0x0069,0x01f3}
+ },
+ {
+ {0x00eb,0x00e6,0x03f6},
+ {0x006e,0x006a,0x01f4},
+ {0x03ec,0x01f0,0x03f9}
+ }
+ },
+ {
+ {
+ {0x00f5,0x00ec,0x07fb},
+ {0x00ea,0x006f,0x03f7},
+ {0x07f9,0x03f3,0x0fff}
+ },
+ {
+ {0x00e9,0x006d,0x03f8},
+ {0x006c,0x0068,0x01f5},
+ {0x03ee,0x01f2,0x07f4}
+ },
+ {
+ {0x07f7,0x03f1,0x0ffe},
+ {0x03ed,0x01f1,0x07f5},
+ {0x07fe,0x03f5,0x07fc}
+ }
+ }
+};
+const UWord16 huff_ctab5[9][9]=
+{
+ {0x1fff,0x0ff7,0x07f4,0x07e8,0x03f1,0x07ee,0x07f9,0x0ff8,0x1ffd},
+ {0x0ffd,0x07f1,0x03e8,0x01e8,0x00f0,0x01ec,0x03ee,0x07f2,0x0ffa},
+ {0x0ff4,0x03ef,0x01f2,0x00e8,0x0070,0x00ec,0x01f0,0x03ea,0x07f3},
+ {0x07eb,0x01eb,0x00ea,0x001a,0x0008,0x0019,0x00ee,0x01ef,0x07ed},
+ {0x03f0,0x00f2,0x0073,0x000b,0x0000,0x000a,0x0071,0x00f3,0x07e9},
+ {0x07ef,0x01ee,0x00ef,0x0018,0x0009,0x001b,0x00eb,0x01e9,0x07ec},
+ {0x07f6,0x03eb,0x01f3,0x00ed,0x0072,0x00e9,0x01f1,0x03ed,0x07f7},
+ {0x0ff6,0x07f0,0x03e9,0x01ed,0x00f1,0x01ea,0x03ec,0x07f8,0x0ff9},
+ {0x1ffc,0x0ffc,0x0ff5,0x07ea,0x03f3,0x03f2,0x07f5,0x0ffb,0x1ffe}
+};
+
+const UWord16 huff_ctab6[9][9]=
+{
+ {0x07fe,0x03fd,0x01f1,0x01eb,0x01f4,0x01ea,0x01f0,0x03fc,0x07fd},
+ {0x03f6,0x01e5,0x00ea,0x006c,0x0071,0x0068,0x00f0,0x01e6,0x03f7},
+ {0x01f3,0x00ef,0x0032,0x0027,0x0028,0x0026,0x0031,0x00eb,0x01f7},
+ {0x01e8,0x006f,0x002e,0x0008,0x0004,0x0006,0x0029,0x006b,0x01ee},
+ {0x01ef,0x0072,0x002d,0x0002,0x0000,0x0003,0x002f,0x0073,0x01fa},
+ {0x01e7,0x006e,0x002b,0x0007,0x0001,0x0005,0x002c,0x006d,0x01ec},
+ {0x01f9,0x00ee,0x0030,0x0024,0x002a,0x0025,0x0033,0x00ec,0x01f2},
+ {0x03f8,0x01e4,0x00ed,0x006a,0x0070,0x0069,0x0074,0x00f1,0x03fa},
+ {0x07ff,0x03f9,0x01f6,0x01ed,0x01f8,0x01e9,0x01f5,0x03fb,0x07fc}
+};
+
+const UWord16 huff_ctab7[8][8]=
+{
+ {0x0000,0x0005,0x0037,0x0074,0x00f2,0x01eb,0x03ed,0x07f7},
+ {0x0004,0x000c,0x0035,0x0071,0x00ec,0x00ee,0x01ee,0x01f5},
+ {0x0036,0x0034,0x0072,0x00ea,0x00f1,0x01e9,0x01f3,0x03f5},
+ {0x0073,0x0070,0x00eb,0x00f0,0x01f1,0x01f0,0x03ec,0x03fa},
+ {0x00f3,0x00ed,0x01e8,0x01ef,0x03ef,0x03f1,0x03f9,0x07fb},
+ {0x01ed,0x00ef,0x01ea,0x01f2,0x03f3,0x03f8,0x07f9,0x07fc},
+ {0x03ee,0x01ec,0x01f4,0x03f4,0x03f7,0x07f8,0x0ffd,0x0ffe},
+ {0x07f6,0x03f0,0x03f2,0x03f6,0x07fa,0x07fd,0x0ffc,0x0fff}
+};
+
+const UWord16 huff_ctab8[8][8]=
+{
+ {0x000e,0x0005,0x0010,0x0030,0x006f,0x00f1,0x01fa,0x03fe},
+ {0x0003,0x0000,0x0004,0x0012,0x002c,0x006a,0x0075,0x00f8},
+ {0x000f,0x0002,0x0006,0x0014,0x002e,0x0069,0x0072,0x00f5},
+ {0x002f,0x0011,0x0013,0x002a,0x0032,0x006c,0x00ec,0x00fa},
+ {0x0071,0x002b,0x002d,0x0031,0x006d,0x0070,0x00f2,0x01f9},
+ {0x00ef,0x0068,0x0033,0x006b,0x006e,0x00ee,0x00f9,0x03fc},
+ {0x01f8,0x0074,0x0073,0x00ed,0x00f0,0x00f6,0x01f6,0x01fd},
+ {0x03fd,0x00f3,0x00f4,0x00f7,0x01f7,0x01fb,0x01fc,0x03ff}
+};
+
+const UWord16 huff_ctab9[13][13]=
+{
+ {0x0000,0x0005,0x0037,0x00e7,0x01de,0x03ce,0x03d9,0x07c8,0x07cd,0x0fc8,0x0fdd,0x1fe4,0x1fec},
+ {0x0004,0x000c,0x0035,0x0072,0x00ea,0x00ed,0x01e2,0x03d1,0x03d3,0x03e0,0x07d8,0x0fcf,0x0fd5},
+ {0x0036,0x0034,0x0071,0x00e8,0x00ec,0x01e1,0x03cf,0x03dd,0x03db,0x07d0,0x0fc7,0x0fd4,0x0fe4},
+ {0x00e6,0x0070,0x00e9,0x01dd,0x01e3,0x03d2,0x03dc,0x07cc,0x07ca,0x07de,0x0fd8,0x0fea,0x1fdb},
+ {0x01df,0x00eb,0x01dc,0x01e6,0x03d5,0x03de,0x07cb,0x07dd,0x07dc,0x0fcd,0x0fe2,0x0fe7,0x1fe1},
+ {0x03d0,0x01e0,0x01e4,0x03d6,0x07c5,0x07d1,0x07db,0x0fd2,0x07e0,0x0fd9,0x0feb,0x1fe3,0x1fe9},
+ {0x07c4,0x01e5,0x03d7,0x07c6,0x07cf,0x07da,0x0fcb,0x0fda,0x0fe3,0x0fe9,0x1fe6,0x1ff3,0x1ff7},
+ {0x07d3,0x03d8,0x03e1,0x07d4,0x07d9,0x0fd3,0x0fde,0x1fdd,0x1fd9,0x1fe2,0x1fea,0x1ff1,0x1ff6},
+ {0x07d2,0x03d4,0x03da,0x07c7,0x07d7,0x07e2,0x0fce,0x0fdb,0x1fd8,0x1fee,0x3ff0,0x1ff4,0x3ff2},
+ {0x07e1,0x03df,0x07c9,0x07d6,0x0fca,0x0fd0,0x0fe5,0x0fe6,0x1feb,0x1fef,0x3ff3,0x3ff4,0x3ff5},
+ {0x0fe0,0x07ce,0x07d5,0x0fc6,0x0fd1,0x0fe1,0x1fe0,0x1fe8,0x1ff0,0x3ff1,0x3ff8,0x3ff6,0x7ffc},
+ {0x0fe8,0x07df,0x0fc9,0x0fd7,0x0fdc,0x1fdc,0x1fdf,0x1fed,0x1ff5,0x3ff9,0x3ffb,0x7ffd,0x7ffe},
+ {0x1fe7,0x0fcc,0x0fd6,0x0fdf,0x1fde,0x1fda,0x1fe5,0x1ff2,0x3ffa,0x3ff7,0x3ffc,0x3ffd,0x7fff}
+};
+
+const UWord16 huff_ctab10[13][13]=
+{
+ {0x0022,0x0008,0x001d,0x0026,0x005f,0x00d3,0x01cf,0x03d0,0x03d7,0x03ed,0x07f0,0x07f6,0x0ffd},
+ {0x0007,0x0000,0x0001,0x0009,0x0020,0x0054,0x0060,0x00d5,0x00dc,0x01d4,0x03cd,0x03de,0x07e7},
+ {0x001c,0x0002,0x0006,0x000c,0x001e,0x0028,0x005b,0x00cd,0x00d9,0x01ce,0x01dc,0x03d9,0x03f1},
+ {0x0025,0x000b,0x000a,0x000d,0x0024,0x0057,0x0061,0x00cc,0x00dd,0x01cc,0x01de,0x03d3,0x03e7},
+ {0x005d,0x0021,0x001f,0x0023,0x0027,0x0059,0x0064,0x00d8,0x00df,0x01d2,0x01e2,0x03dd,0x03ee},
+ {0x00d1,0x0055,0x0029,0x0056,0x0058,0x0062,0x00ce,0x00e0,0x00e2,0x01da,0x03d4,0x03e3,0x07eb},
+ {0x01c9,0x005e,0x005a,0x005c,0x0063,0x00ca,0x00da,0x01c7,0x01ca,0x01e0,0x03db,0x03e8,0x07ec},
+ {0x01e3,0x00d2,0x00cb,0x00d0,0x00d7,0x00db,0x01c6,0x01d5,0x01d8,0x03ca,0x03da,0x07ea,0x07f1},
+ {0x01e1,0x00d4,0x00cf,0x00d6,0x00de,0x00e1,0x01d0,0x01d6,0x03d1,0x03d5,0x03f2,0x07ee,0x07fb},
+ {0x03e9,0x01cd,0x01c8,0x01cb,0x01d1,0x01d7,0x01df,0x03cf,0x03e0,0x03ef,0x07e6,0x07f8,0x0ffa},
+ {0x03eb,0x01dd,0x01d3,0x01d9,0x01db,0x03d2,0x03cc,0x03dc,0x03ea,0x07ed,0x07f3,0x07f9,0x0ff9},
+ {0x07f2,0x03ce,0x01e4,0x03cb,0x03d8,0x03d6,0x03e2,0x03e5,0x07e8,0x07f4,0x07f5,0x07f7,0x0ffb},
+ {0x07fa,0x03ec,0x03df,0x03e1,0x03e4,0x03e6,0x03f0,0x07e9,0x07ef,0x0ff8,0x0ffe,0x0ffc,0x0fff}
+};
+
+const UWord16 huff_ctab11[17][17]=
+{
+ {0x0000,0x0006,0x0019,0x003d,0x009c,0x00c6,0x01a7,0x0390,0x03c2,0x03df,0x07e6,0x07f3,0x0ffb,0x07ec,0x0ffa,0x0ffe,0x038e},
+ {0x0005,0x0001,0x0008,0x0014,0x0037,0x0042,0x0092,0x00af,0x0191,0x01a5,0x01b5,0x039e,0x03c0,0x03a2,0x03cd,0x07d6,0x00ae},
+ {0x0017,0x0007,0x0009,0x0018,0x0039,0x0040,0x008e,0x00a3,0x00b8,0x0199,0x01ac,0x01c1,0x03b1,0x0396,0x03be,0x03ca,0x009d},
+ {0x003c,0x0015,0x0016,0x001a,0x003b,0x0044,0x0091,0x00a5,0x00be,0x0196,0x01ae,0x01b9,0x03a1,0x0391,0x03a5,0x03d5,0x0094},
+ {0x009a,0x0036,0x0038,0x003a,0x0041,0x008c,0x009b,0x00b0,0x00c3,0x019e,0x01ab,0x01bc,0x039f,0x038f,0x03a9,0x03cf,0x0093},
+ {0x00bf,0x003e,0x003f,0x0043,0x0045,0x009e,0x00a7,0x00b9,0x0194,0x01a2,0x01ba,0x01c3,0x03a6,0x03a7,0x03bb,0x03d4,0x009f},
+ {0x01a0,0x008f,0x008d,0x0090,0x0098,0x00a6,0x00b6,0x00c4,0x019f,0x01af,0x01bf,0x0399,0x03bf,0x03b4,0x03c9,0x03e7,0x00a8},
+ {0x01b6,0x00ab,0x00a4,0x00aa,0x00b2,0x00c2,0x00c5,0x0198,0x01a4,0x01b8,0x038c,0x03a4,0x03c4,0x03c6,0x03dd,0x03e8,0x00ad},
+ {0x03af,0x0192,0x00bd,0x00bc,0x018e,0x0197,0x019a,0x01a3,0x01b1,0x038d,0x0398,0x03b7,0x03d3,0x03d1,0x03db,0x07dd,0x00b4},
+ {0x03de,0x01a9,0x019b,0x019c,0x01a1,0x01aa,0x01ad,0x01b3,0x038b,0x03b2,0x03b8,0x03ce,0x03e1,0x03e0,0x07d2,0x07e5,0x00b7},
+ {0x07e3,0x01bb,0x01a8,0x01a6,0x01b0,0x01b2,0x01b7,0x039b,0x039a,0x03ba,0x03b5,0x03d6,0x07d7,0x03e4,0x07d8,0x07ea,0x00ba},
+ {0x07e8,0x03a0,0x01bd,0x01b4,0x038a,0x01c4,0x0392,0x03aa,0x03b0,0x03bc,0x03d7,0x07d4,0x07dc,0x07db,0x07d5,0x07f0,0x00c1},
+ {0x07fb,0x03c8,0x03a3,0x0395,0x039d,0x03ac,0x03ae,0x03c5,0x03d8,0x03e2,0x03e6,0x07e4,0x07e7,0x07e0,0x07e9,0x07f7,0x0190},
+ {0x07f2,0x0393,0x01be,0x01c0,0x0394,0x0397,0x03ad,0x03c3,0x03c1,0x03d2,0x07da,0x07d9,0x07df,0x07eb,0x07f4,0x07fa,0x0195},
+ {0x07f8,0x03bd,0x039c,0x03ab,0x03a8,0x03b3,0x03b9,0x03d0,0x03e3,0x03e5,0x07e2,0x07de,0x07ed,0x07f1,0x07f9,0x07fc,0x0193},
+ {0x0ffd,0x03dc,0x03b6,0x03c7,0x03cc,0x03cb,0x03d9,0x03da,0x07d3,0x07e1,0x07ee,0x07ef,0x07f5,0x07f6,0x0ffc,0x0fff,0x019d},
+ {0x01c2,0x00b5,0x00a1,0x0096,0x0097,0x0095,0x0099,0x00a0,0x00a2,0x00ac,0x00a9,0x00b1,0x00b3,0x00bb,0x00c0,0x018f,0x0004}
+};
+
+const UWord32 huff_ctabscf[121]=
+{
+ 0x0003ffe8,
+ 0x0003ffe6,
+ 0x0003ffe7,
+ 0x0003ffe5,
+ 0x0007fff5,
+ 0x0007fff1,
+ 0x0007ffed,
+ 0x0007fff6,
+ 0x0007ffee,
+ 0x0007ffef,
+ 0x0007fff0,
+ 0x0007fffc,
+ 0x0007fffd,
+ 0x0007ffff,
+ 0x0007fffe,
+ 0x0007fff7,
+ 0x0007fff8,
+ 0x0007fffb,
+ 0x0007fff9,
+ 0x0003ffe4,
+ 0x0007fffa,
+ 0x0003ffe3,
+ 0x0001ffef,
+ 0x0001fff0,
+ 0x0000fff5,
+ 0x0001ffee,
+ 0x0000fff2,
+ 0x0000fff3,
+ 0x0000fff4,
+ 0x0000fff1,
+ 0x00007ff6,
+ 0x00007ff7,
+ 0x00003ff9,
+ 0x00003ff5,
+ 0x00003ff7,
+ 0x00003ff3,
+ 0x00003ff6,
+ 0x00003ff2,
+ 0x00001ff7,
+ 0x00001ff5,
+ 0x00000ff9,
+ 0x00000ff7,
+ 0x00000ff6,
+ 0x000007f9,
+ 0x00000ff4,
+ 0x000007f8,
+ 0x000003f9,
+ 0x000003f7,
+ 0x000003f5,
+ 0x000001f8,
+ 0x000001f7,
+ 0x000000fa,
+ 0x000000f8,
+ 0x000000f6,
+ 0x00000079,
+ 0x0000003a,
+ 0x00000038,
+ 0x0000001a,
+ 0x0000000b,
+ 0x00000004,
+ 0x00000000,
+ 0x0000000a,
+ 0x0000000c,
+ 0x0000001b,
+ 0x00000039,
+ 0x0000003b,
+ 0x00000078,
+ 0x0000007a,
+ 0x000000f7,
+ 0x000000f9,
+ 0x000001f6,
+ 0x000001f9,
+ 0x000003f4,
+ 0x000003f6,
+ 0x000003f8,
+ 0x000007f5,
+ 0x000007f4,
+ 0x000007f6,
+ 0x000007f7,
+ 0x00000ff5,
+ 0x00000ff8,
+ 0x00001ff4,
+ 0x00001ff6,
+ 0x00001ff8,
+ 0x00003ff8,
+ 0x00003ff4,
+ 0x0000fff0,
+ 0x00007ff4,
+ 0x0000fff6,
+ 0x00007ff5,
+ 0x0003ffe2,
+ 0x0007ffd9,
+ 0x0007ffda,
+ 0x0007ffdb,
+ 0x0007ffdc,
+ 0x0007ffdd,
+ 0x0007ffde,
+ 0x0007ffd8,
+ 0x0007ffd2,
+ 0x0007ffd3,
+ 0x0007ffd4,
+ 0x0007ffd5,
+ 0x0007ffd6,
+ 0x0007fff2,
+ 0x0007ffdf,
+ 0x0007ffe7,
+ 0x0007ffe8,
+ 0x0007ffe9,
+ 0x0007ffea,
+ 0x0007ffeb,
+ 0x0007ffe6,
+ 0x0007ffe0,
+ 0x0007ffe1,
+ 0x0007ffe2,
+ 0x0007ffe3,
+ 0x0007ffe4,
+ 0x0007ffe5,
+ 0x0007ffd7,
+ 0x0007ffec,
+ 0x0007fff4,
+ 0x0007fff3
+};
+
+const Word32 m_log2_table[INT_BITS] = {
+ 0x00000000,0x4ae00d00,0x2934f080,0x15c01a3f,
+ 0x0b31fb80,0x05aeb4e0,0x02dcf2d0,0x016fe50c,
+ 0x00b84e23,0x005c3e10,0x002e24ca,0x001713d6,
+ 0x000b8a47,0x0005c53b,0x0002e2a3,0x00017153,
+ 0x0000b8aa,0x00005c55,0x00002e2b,0x00001715,
+ 0x00000b8b,0x000005c5,0x000002e3,0x00000171,
+ 0x000000b9,0x0000005c,0x0000002e,0x00000017,
+ 0x0000000c,0x00000006,0x00000003,0x00000001
+};
+
+
+/*
+ 3 bit resolution
+*/
+const Word32 tnsCoeff3[8] =
+{
+ 0x81f1d1d4,
+ 0x9126147c,
+ 0xadb922f7,
+ 0xd438af09,
+ 0x00000000,
+ 0x37898087,
+ 0x64130dfa,
+ 0x7cca6ffb,
+};
+
+const Word32 tnsCoeff3Borders[8] =
+{
+ 0x80000000, /* -4 */
+ 0x87b826de, /* -3 */
+ 0x9df24153, /* -2 */
+ 0xbfffffe5, /* -1 */
+ 0xe9c5e578, /* 0 */
+ 0x1c7b90f0, /* 1 */
+ 0x4fce83aa, /* 2 */
+ 0x7352f2c4, /* 3 */
+};
+
+
+/*
+ 4 bit resolution
+*/
+
+const Word32 tnsCoeff4[16] =
+{
+ 0x808bc84b,
+ 0x84e2e57d,
+ 0x8d6b49fb,
+ 0x99da9207,
+ 0xa9c45707,
+ 0xbc9dde78,
+ 0xd1c2d4fc,
+ 0xe87ae539,
+ 0x00000000,
+ 0x1a9cd9c0,
+ 0x340ff23b,
+ 0x4b3c8bf7,
+ 0x5f1f5e80,
+ 0x6ed9eb84,
+ 0x79bc3880,
+ 0x7f4c7e89
+};
+
+const Word32 tnsCoeff4Borders[16]=
+{
+ 0x80000000, /* -8 */
+ 0x822defef, /* -7 */
+ 0x88a4bfe5, /* -6 */
+ 0x932c159c, /* -5 */
+ 0xa16827c1, /* -4 */
+ 0xb2dcde26, /* -3 */
+ 0xc6f20b91, /* -2 */
+ 0xdcf89c64, /* -1 */
+ 0xf4308ce1, /* 0 */
+ 0x0d613054, /* 1 */
+ 0x278dde80, /* 2 */
+ 0x4000001b, /* 3 */
+ 0x55a6127c, /* 4 */
+ 0x678dde8f, /* 5 */
+ 0x74ef0ed8, /* 6 */
+ 0x7d33f0db /* 7 */
+};
+
+
+const unsigned char bitrevTab[17 + 129] =
+{
+/* 64 */
+0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f,
+0x00,
+
+/* 512 */
+0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48,
+0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24,
+0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c,
+0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a,
+0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76,
+0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69,
+0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b,
+0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f,
+0x00,
+};
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c
new file mode 100644
index 0000000..552ae41
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/aacenc.c
@@ -0,0 +1,495 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: aacenc.c
+
+ Content: aac encoder interface functions
+
+*******************************************************************************/
+
+#include "voAAC.h"
+#include "typedef.h"
+#include "aacenc_core.h"
+#include "aac_rom.h"
+#include "cmnMemory.h"
+#include "memalign.h"
+
+/**
+* Init the audio codec module and return codec handle
+* \param phCodec [OUT] Return the video codec handle
+* \param vType [IN] The codec type if the module support multi codec.
+* \param pUserData [IN] The init param. It is memory operator or alloced memory
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)
+{
+ AAC_ENCODER*hAacEnc;
+ AACENC_CONFIG config;
+ int error;
+
+#ifdef USE_DEAULT_MEM
+ VO_MEM_OPERATOR voMemoprator;
+#endif
+ VO_MEM_OPERATOR *pMemOP;
+ int interMem;
+
+ interMem = 0;
+ error = 0;
+
+ /* init the memory operator */
+ if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
+ {
+#ifdef USE_DEAULT_MEM
+ voMemoprator.Alloc = cmnMemAlloc;
+ voMemoprator.Copy = cmnMemCopy;
+ voMemoprator.Free = cmnMemFree;
+ voMemoprator.Set = cmnMemSet;
+ voMemoprator.Check = cmnMemCheck;
+
+ interMem = 1;
+
+ pMemOP = &voMemoprator;
+#else
+ *phCodec = NULL;
+ return VO_ERR_INVALID_ARG;
+#endif
+ }
+ else
+ {
+ pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
+ }
+
+ /* init the aac encoder handle */
+ hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC);
+ if(NULL == hAacEnc)
+ {
+ error = 1;
+ }
+
+ if(!error)
+ {
+ /* init the aac encoder intra memory */
+ hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC);
+ if(NULL == hAacEnc->intbuf)
+ {
+ error = 1;
+ }
+ }
+
+ if (!error) {
+ /* init the aac encoder psychoacoustic */
+ error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) ||
+ PsyOutNew(&hAacEnc->psyOut, pMemOP));
+ }
+
+ if (!error) {
+ /* init the aac encoder quantization elements */
+ error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP);
+ }
+
+ if (!error) {
+ /* init the aac encoder quantization state */
+ error = QCNew(&hAacEnc->qcKernel, pMemOP);
+ }
+
+ /* uninit the aac encoder if error is nozero */
+ if(error)
+ {
+ AacEncClose(hAacEnc, pMemOP);
+ if(hAacEnc)
+ {
+ mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
+ hAacEnc = NULL;
+ }
+ *phCodec = NULL;
+ return VO_ERR_OUTOF_MEMORY;
+ }
+
+ /* init the aac encoder memory operator */
+#ifdef USE_DEAULT_MEM
+ if(interMem)
+ {
+ hAacEnc->voMemoprator.Alloc = cmnMemAlloc;
+ hAacEnc->voMemoprator.Copy = cmnMemCopy;
+ hAacEnc->voMemoprator.Free = cmnMemFree;
+ hAacEnc->voMemoprator.Set = cmnMemSet;
+ hAacEnc->voMemoprator.Check = cmnMemCheck;
+
+ pMemOP = &hAacEnc->voMemoprator;
+ }
+#endif
+ /* init the aac encoder default parameter */
+ if(hAacEnc->initOK == 0)
+ {
+ AACENC_CONFIG config;
+ config.adtsUsed = 1;
+ config.bitRate = 128000;
+ config.nChannelsIn = 2;
+ config.nChannelsOut = 2;
+ config.sampleRate = 44100;
+ config.bandWidth = 20000;
+
+ AacEncOpen(hAacEnc, config);
+ }
+
+ hAacEnc->voMemop = pMemOP;
+
+ *phCodec = hAacEnc;
+
+ return VO_ERR_NONE;
+}
+
+/**
+* Set input audio data.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param pInput [IN] The input buffer param.
+* \param pOutBuffer [OUT] The output buffer info.
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
+{
+ AAC_ENCODER *hAacEnc;
+ int length;
+
+ if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer)
+ {
+ return VO_ERR_INVALID_ARG;
+ }
+
+ hAacEnc = (AAC_ENCODER *)hCodec;
+
+ /* init input pcm buffer and length*/
+ hAacEnc->inbuf = (short *)pInput->Buffer;
+ hAacEnc->inlen = pInput->Length / sizeof(short);
+ hAacEnc->uselength = 0;
+
+ hAacEnc->encbuf = hAacEnc->inbuf;
+ hAacEnc->enclen = hAacEnc->inlen;
+
+ /* rebuild intra pcm buffer and length*/
+ if(hAacEnc->intlen)
+ {
+ length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
+ hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
+ hAacEnc->inbuf, length*sizeof(short));
+
+ hAacEnc->encbuf = hAacEnc->intbuf;
+ hAacEnc->enclen = hAacEnc->intlen + length;
+
+ hAacEnc->inbuf += length;
+ hAacEnc->inlen -= length;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/**
+* Get the outut audio data
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param pOutBuffer [OUT] The output audio data
+* \param pOutInfo [OUT] The dec module filled audio format and used the input size.
+* pOutInfo->InputUsed is total used the input size.
+* \retval VO_ERR_NONE Succeeded.
+* VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought.
+*/
+VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo)
+{
+ AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+ Word16 numAncDataBytes=0;
+ Word32 inbuflen;
+ int ret, length;
+ if(NULL == hAacEnc)
+ return VO_ERR_INVALID_ARG;
+
+ inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn;
+
+ /* check the input pcm buffer and length*/
+ if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
+ {
+ length = hAacEnc->enclen;
+ if(hAacEnc->intlen == 0)
+ {
+ hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
+ hAacEnc->encbuf, length*sizeof(short));
+ hAacEnc->uselength += length*sizeof(short);
+ }
+ else
+ {
+ hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short);
+ }
+
+ hAacEnc->intlen = length;
+
+ pOutput->Length = 0;
+ if(pOutInfo)
+ pOutInfo->InputUsed = hAacEnc->uselength;
+ return VO_ERR_INPUT_BUFFER_SMALL;
+ }
+
+ /* check the output aac buffer and length*/
+ if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32)))
+ return VO_ERR_OUTPUT_BUFFER_SMALL;
+
+ /* aac encoder core function */
+ AacEncEncode( hAacEnc,
+ (Word16*)hAacEnc->encbuf,
+ NULL,
+ &numAncDataBytes,
+ pOutput->Buffer,
+ &pOutput->Length);
+
+ /* update the input pcm buffer and length*/
+ if(hAacEnc->intlen)
+ {
+ length = inbuflen - hAacEnc->intlen;
+ hAacEnc->encbuf = hAacEnc->inbuf;
+ hAacEnc->enclen = hAacEnc->inlen;
+ hAacEnc->uselength += length*sizeof(short);
+ hAacEnc->intlen = 0;
+ }
+ else
+ {
+ hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
+ hAacEnc->enclen = hAacEnc->enclen - inbuflen;
+ hAacEnc->uselength += inbuflen*sizeof(short);
+ }
+
+ /* update the output aac information */
+ if(pOutInfo)
+ {
+ pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut;
+ pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate;
+ pOutInfo->Format.SampleBits = 16;
+ pOutInfo->InputUsed = hAacEnc->uselength;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/**
+* Uninit the Codec.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
+{
+ AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+
+ if(NULL != hAacEnc)
+ {
+ /* close the aac encoder */
+ AacEncClose(hAacEnc, hAacEnc->voMemop);
+
+ /* free the aac encoder handle*/
+ mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
+ hAacEnc = NULL;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/**
+* Set the param for special target.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param uParamID [IN] The param ID.
+* \param pData [IN] The param value depend on the ID>
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
+{
+ AACENC_CONFIG config;
+ AACENC_PARAM* pAAC_param;
+ VO_AUDIO_FORMAT *pWAV_Format;
+ AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+ int ret, i, bitrate, tmp;
+ int SampleRateIdx;
+
+ if(NULL == hAacEnc)
+ return VO_ERR_INVALID_ARG;
+
+ switch(uParamID)
+ {
+ case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/
+ AacInitDefaultConfig(&config);
+ if(pData == NULL)
+ return VO_ERR_INVALID_ARG;
+ pAAC_param = (AACENC_PARAM*)pData;
+ config.adtsUsed = pAAC_param->adtsUsed;
+ config.bitRate = pAAC_param->bitRate;
+ config.nChannelsIn = pAAC_param->nChannels;
+ config.nChannelsOut = pAAC_param->nChannels;
+ config.sampleRate = pAAC_param->sampleRate;
+
+ /* check the channel */
+ if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS ||
+ config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
+ return VO_ERR_AUDIO_UNSCHANNEL;
+
+ /* check the samplerate */
+ ret = -1;
+ for(i = 0; i < NUM_SAMPLE_RATES; i++)
+ {
+ if(config.sampleRate == sampRateTab[i])
+ {
+ ret = 0;
+ break;
+ }
+ }
+ if(ret < 0)
+ return VO_ERR_AUDIO_UNSSAMPLERATE;
+
+ SampleRateIdx = i;
+
+ tmp = 441;
+ if(config.sampleRate%8000 == 0)
+ tmp =480;
+ /* check the bitrate */
+ if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
+ (config.bitRate/config.nChannelsOut > 160000) ||
+ (config.bitRate > config.sampleRate*6*config.nChannelsOut))
+ {
+ config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
+
+ if(config.bitRate/config.nChannelsOut < 4000)
+ config.bitRate = 4000 * config.nChannelsOut;
+ else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
+ config.bitRate = config.sampleRate*6*config.nChannelsOut;
+ else if(config.bitRate/config.nChannelsOut > 160000)
+ config.bitRate = config.nChannelsOut*160000;
+ }
+
+ /* check the bandwidth */
+ bitrate = config.bitRate / config.nChannelsOut;
+ bitrate = bitrate * tmp / config.sampleRate;
+
+ for (i = 0; rates[i]; i++)
+ {
+ if (rates[i] >= bitrate)
+ break;
+ }
+
+ config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
+
+ /* init aac encoder core */
+ ret = AacEncOpen(hAacEnc, config);
+ if(ret)
+ return VO_ERR_AUDIO_UNSFEATURE;
+ break;
+ case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/
+ AacInitDefaultConfig(&config);
+ if(pData == NULL)
+ return VO_ERR_INVALID_ARG;
+ pWAV_Format = (VO_AUDIO_FORMAT*)pData;
+ config.adtsUsed = 1;
+ config.nChannelsIn = pWAV_Format->Channels;
+ config.nChannelsOut = pWAV_Format->Channels;
+ config.sampleRate = pWAV_Format->SampleRate;
+
+ /* check the channel */
+ if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS ||
+ config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
+ return VO_ERR_AUDIO_UNSCHANNEL;
+
+ /* check the samplebits */
+ if(pWAV_Format->SampleBits != 16)
+ {
+ return VO_ERR_AUDIO_UNSFEATURE;
+ }
+
+ /* check the samplerate */
+ ret = -1;
+ for(i = 0; i < NUM_SAMPLE_RATES; i++)
+ {
+ if(config.sampleRate == sampRateTab[i])
+ {
+ ret = 0;
+ break;
+ }
+ }
+ if(ret < 0)
+ return VO_ERR_AUDIO_UNSSAMPLERATE;
+
+ SampleRateIdx = i;
+
+ /* update the bitrates */
+ tmp = 441;
+ if(config.sampleRate%8000 == 0)
+ tmp =480;
+
+ config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
+
+ if(config.bitRate/config.nChannelsOut < 4000)
+ config.bitRate = 4000 * config.nChannelsOut;
+ else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
+ config.bitRate = config.sampleRate*6*config.nChannelsOut;
+ else if(config.bitRate/config.nChannelsOut > 160000)
+ config.bitRate = config.nChannelsOut*160000;
+
+ /* check the bandwidth */
+ bitrate = config.bitRate / config.nChannelsOut;
+ bitrate = bitrate * tmp / config.sampleRate;
+
+ for (i = 0; rates[i]; i++)
+ {
+ if (rates[i] >= bitrate)
+ break;
+ }
+
+ config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
+
+ /* init aac encoder core */
+ ret = AacEncOpen(hAacEnc, config);
+ if(ret)
+ return VO_ERR_AUDIO_UNSFEATURE;
+ break;
+ default:
+ return VO_ERR_WRONG_PARAM_ID;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/**
+* Get the param for special target.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param uParamID [IN] The param ID.
+* \param pData [IN] The param value depend on the ID>
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
+{
+ return VO_ERR_NONE;
+}
+
+/**
+ * Get audio codec API interface
+ * \param pEncHandle [out] Return the AAC Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
+{
+ if(pDecHandle == NULL)
+ return VO_ERR_INVALID_ARG;
+
+ pDecHandle->Init = voAACEncInit;
+ pDecHandle->SetInputData = voAACEncSetInputData;
+ pDecHandle->GetOutputData = voAACEncGetOutputData;
+ pDecHandle->SetParam = voAACEncSetParam;
+ pDecHandle->GetParam = voAACEncGetParam;
+ pDecHandle->Uninit = voAACEncUninit;
+
+ return VO_ERR_NONE;
+}
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c
new file mode 100644
index 0000000..616475c
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/aacenc_core.c
@@ -0,0 +1,239 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: aacenc_core.c
+
+ Content: aac encoder core functions
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "aacenc_core.h"
+#include "bitenc.h"
+
+#include "psy_configuration.h"
+#include "psy_main.h"
+#include "qc_main.h"
+#include "psy_main.h"
+#include "channel_map.h"
+#include "aac_rom.h"
+
+/********************************************************************************
+*
+* function name: AacInitDefaultConfig
+* description: gives reasonable default configuration
+*
+**********************************************************************************/
+void AacInitDefaultConfig(AACENC_CONFIG *config)
+{
+ /* default configurations */
+ config->adtsUsed = 1;
+ config->nChannelsIn = 2;
+ config->nChannelsOut = 2;
+ config->bitRate = 128000;
+ config->bandWidth = 0;
+}
+
+/********************************************************************************
+*
+* function name: AacEncOpen
+* description: allocate and initialize a new encoder instance
+* returns: 0 if success
+*
+**********************************************************************************/
+Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder handle, initialized on return */
+ const AACENC_CONFIG config /* pre-initialized config struct */
+ )
+{
+ Word32 i;
+ Word32 error = 0;
+ Word16 profile = 1;
+
+ ELEMENT_INFO *elInfo = NULL;
+
+ if (hAacEnc==0) {
+ error=1;
+ }
+
+ if (!error) {
+ hAacEnc->config = config;
+ }
+
+ if (!error) {
+ error = InitElementInfo (config.nChannelsOut,
+ &hAacEnc->elInfo);
+ }
+
+ if (!error) {
+ elInfo = &hAacEnc->elInfo;
+ }
+
+ if (!error) {
+ /* use or not tns tool for long and short block */
+ Word16 tnsMask=3;
+
+ /* init encoder psychoacoustic */
+ error = psyMainInit(&hAacEnc->psyKernel,
+ config.sampleRate,
+ config.bitRate,
+ elInfo->nChannelsInEl,
+ tnsMask,
+ hAacEnc->config.bandWidth);
+ }
+
+ /* use or not adts header */
+ if(!error) {
+ hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed;
+ }
+
+ /* init encoder quantization */
+ if (!error) {
+ struct QC_INIT qcInit;
+
+ /*qcInit.channelMapping = &hAacEnc->channelMapping;*/
+ qcInit.elInfo = &hAacEnc->elInfo;
+
+ qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl);
+ qcInit.bitRes = qcInit.maxBits;
+ qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate);
+
+ qcInit.padding.paddingRest = config.sampleRate;
+
+ qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
+ (config.sampleRate>>1));
+
+ qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/
+ (qcInit.averageBits?qcInit.averageBits:1));
+
+ 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;
+ }
+
+ return error;
+}
+
+/********************************************************************************
+*
+* function name: AacEncEncode
+* description: encode pcm to aac data core function
+* returns: 0 if success
+*
+**********************************************************************************/
+Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
+ Word16 *timeSignal, /*!< BLOCKSIZE*nChannels audio samples, interleaved */
+ const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */
+ Word16 *numAncBytes, /*!< number of ancillary Data Bytes */
+ UWord8 *outBytes, /*!< pointer to output buffer (must be large MINBITS_COEF/8*MAX_CHANNELS bytes) */
+ Word32 *numOutBytes /*!< number of bytes in output buffer after processing */
+ )
+{
+ ELEMENT_INFO *elInfo = &aacEnc->elInfo;
+ Word16 globUsedBits;
+ Word16 ancDataBytes, ancDataBytesLeft;
+
+ ancDataBytes = ancDataBytesLeft = *numAncBytes;
+
+ /* init output aac data buffer and length */
+ aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
+
+ /* psychoacoustic process */
+ psyMain(aacEnc->config.nChannelsOut,
+ elInfo,
+ timeSignal,
+ &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
+ &aacEnc->psyKernel.tnsData[elInfo->ChannelIndex[0]],
+ &aacEnc->psyKernel.psyConfLong,
+ &aacEnc->psyKernel.psyConfShort,
+ &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
+ &aacEnc->psyOut.psyOutElement,
+ aacEnc->psyKernel.pScratchTns,
+ aacEnc->config.sampleRate);
+
+ /* adjust bitrate and frame length */
+ AdjustBitrate(&aacEnc->qcKernel,
+ aacEnc->config.bitRate,
+ aacEnc->config.sampleRate);
+
+ /* quantization and coding process */
+ QCMain(&aacEnc->qcKernel,
+ &aacEnc->qcKernel.elementBits,
+ &aacEnc->qcKernel.adjThr.adjThrStateElem,
+ &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
+ &aacEnc->psyOut.psyOutElement,
+ &aacEnc->qcOut.qcChannel[elInfo->ChannelIndex[0]],
+ &aacEnc->qcOut.qcElement,
+ elInfo->nChannelsInEl,
+ min(ancDataBytesLeft,ancDataBytes));
+
+ ancDataBytesLeft = ancDataBytesLeft - ancDataBytes;
+
+ globUsedBits = FinalizeBitConsumption(&aacEnc->qcKernel,
+ &aacEnc->qcOut);
+
+ /* write bitstream process */
+ WriteBitstream(aacEnc->hBitStream,
+ *elInfo,
+ &aacEnc->qcOut,
+ &aacEnc->psyOut,
+ &globUsedBits,
+ ancBytes,
+ aacEnc->psyKernel.sampleRateIdx);
+
+ updateBitres(&aacEnc->qcKernel,
+ &aacEnc->qcOut);
+
+ /* write out the bitstream */
+ *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3;
+
+ return 0;
+}
+
+
+/********************************************************************************
+*
+* function name:AacEncClose
+* description: deallocate an encoder instance
+*
+**********************************************************************************/
+void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
+{
+ if (hAacEnc) {
+ QCDelete(&hAacEnc->qcKernel, pMemOP);
+
+ QCOutDelete(&hAacEnc->qcOut, pMemOP);
+
+ PsyDelete(&hAacEnc->psyKernel, pMemOP);
+
+ PsyOutDelete(&hAacEnc->psyOut, pMemOP);
+
+ DeleteBitBuffer(&hAacEnc->hBitStream);
+
+ if(hAacEnc->intbuf)
+ {
+ mem_free(pMemOP, hAacEnc->intbuf, VO_INDEX_ENC_AAC);
+ hAacEnc->intbuf = NULL;
+ }
+ }
+}
diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c
new file mode 100644
index 0000000..0dbd216
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c
@@ -0,0 +1,1223 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: adj_thr.c
+
+ Content: Threshold compensation functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "adj_thr_data.h"
+#include "adj_thr.h"
+#include "qc_data.h"
+#include "line_pe.h"
+
+
+#define minSnrLimit 0x6666 /* 1 dB */
+#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/
+
+#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */
+#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */
+
+#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */
+
+#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */
+
+/* values for avoid hole flag */
+enum _avoid_hole_state {
+ NO_AH =0,
+ AH_INACTIVE =1,
+ AH_ACTIVE =2
+};
+
+/********************************************************************************
+*
+* function name:bits2pe
+* description: convert from bits to pe
+* pe = 1.18*desiredBits
+*
+**********************************************************************************/
+Word16 bits2pe(const Word16 bits) {
+ return (bits + ((PEBITS_COEF * bits) >> 15));
+}
+
+/********************************************************************************
+*
+* function name:calcThreshExp
+* description: loudness calculation (threshold to the power of redExp)
+* thr(n)^0.25
+*
+**********************************************************************************/
+static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels)
+{
+ Word16 ch, sfb, sfbGrp;
+ Word32 *pthrExp, *psfbThre;
+ for (ch=0; ch<nChannels; ch++) {
+ PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
+ for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
+ pthrExp = &(thrExp[ch][sfbGrp]);
+ psfbThre = psyOutChan->sfbThreshold + sfbGrp;
+ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
+ *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS);
+ pthrExp++; psfbThre++;
+ }
+ }
+}
+
+/********************************************************************************
+*
+* function name:adaptMinSnr
+* description: reduce minSnr requirements for bands with relative low energies
+*
+**********************************************************************************/
+static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ MINSNR_ADAPT_PARAM *msaParam,
+ const Word16 nChannels)
+{
+ Word16 ch, sfb, sfbOffs, shift;
+ 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;
+ 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;
+
+ log_avgEn = iLog4(avgEn);
+ 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++) {
+ if (psyOutChan->sfbEnergy[sfbOffs+sfb] < startRatio_x_avgEn) {
+ 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,
+ 3: 0.00375(redRatioFac)*80
+ 20: 0.25(maxRed) * 80 */
+
+ 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);
+ }
+ }
+ }
+ }
+
+}
+
+
+/********************************************************************************
+*
+* function name:initAvoidHoleFlag
+* description: determine bands where avoid hole is not necessary resp. possible
+*
+**********************************************************************************/
+static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT* psyOutElement,
+ const Word16 nChannels,
+ AH_PARAM *ahParam)
+{
+ Word16 ch, sfb, sfbGrp, shift;
+ Word32 threshold;
+ Word32* psfbSpreadEn;
+
+ 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;
+ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
+ *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */
+ ++psfbSpreadEn;
+ }
+ }
+ }
+ else {
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
+ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
+ *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */
+ ++psfbSpreadEn;
+ }
+ }
+ }
+ }
+
+ /* increase minSnr for local peaks, decrease it for valleys */
+ 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
+ threshold = HOLE_THR_SHORT;
+
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ 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];
+
+ 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, threshold);
+ *psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
+ }
+ /* valley ? */
+
+ if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
+ Word32 tmpMinSnr;
+ 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 = min(minSnrLimit, tmpMinSnr);
+
+ *psfbMinSnr =
+ (min((tmpMinSnr >> 2), mult(*psfbMinSnr, MIN_SNR_COEF)) << 2);
+ }
+ psfbMinSnr++;
+ }
+ }
+ }
+ }
+
+ /* 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];
+ for (sfb=0; sfb<psyOutChanM->sfbCnt; sfb++) {
+ if (psyOutElement->toolsInfo.msMask[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;
+
+ if(maxThr >= sfbEnM) {
+ psyOutChanM->sfbMinSnr[sfb] = MAX_16;
+ }
+ else {
+ 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],
+ 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);
+ }
+ }
+ }
+
+
+ /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
+ for(ch=0; ch<nChannels; ch++) {
+ PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ Word16 *pahFlag = ahFlag[ch] + sfbGrp;
+ 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)) {
+ *pahFlag++ = NO_AH;
+ }
+ else {
+ *pahFlag++ = AH_INACTIVE;
+ }
+ }
+ for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) {
+ *pahFlag++ = NO_AH;
+ }
+ }
+ }
+}
+
+/********************************************************************************
+*
+* function name:calcPeNoAH
+* description: sum the pe data only for bands where avoid hole is inactive
+*
+**********************************************************************************/
+static void calcPeNoAH(Word16 *pe,
+ Word16 *constPart,
+ Word16 *nActiveLines,
+ PE_DATA *peData,
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels)
+{
+ Word16 ch, sfb, sfbGrp;
+ int ipe, iconstPart, inActiveLines;
+
+ 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];
+ inActiveLines = inActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
+ }
+ }
+ }
+ }
+
+ *pe = saturate(ipe);
+ *constPart = saturate(iconstPart);
+ *nActiveLines = saturate(inActiveLines);
+}
+
+/********************************************************************************
+*
+* function name:reduceThresholds
+* description: apply reduction formula
+*
+**********************************************************************************/
+static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels,
+ const Word32 redVal)
+{
+ Word32 sfbThrReduced;
+ Word32 *psfbEn, *psfbThr;
+ Word16 ch, sfb, sfbGrp;
+
+ for(ch=0; ch<nChannels; ch++) {
+ PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
+ for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
+ psfbEn = psyOutChan->sfbEnergy + sfbGrp;
+ psfbThr = psyOutChan->sfbThreshold + sfbGrp;
+ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
+
+ if (*psfbEn > *psfbThr) {
+ /* threshold reduction formula */
+ Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
+ tmp = fixmul(tmp, tmp);
+ sfbThrReduced = fixmul(tmp, tmp);
+ /* avoid holes */
+ tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
+
+ if ((sfbThrReduced > tmp) &&
+ (ahFlag[ch][sfbGrp+sfb] != NO_AH)){
+ sfbThrReduced = max(tmp, *psfbThr);
+ ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
+ }
+ *psfbThr = sfbThrReduced;
+ }
+
+ psfbEn++; psfbThr++;
+ }
+ }
+ }
+}
+
+
+/********************************************************************************
+*
+* function name:correctThresh
+* description: if pe difference deltaPe between desired pe and real pe is small enough,
+* the difference can be distributed among the scale factor bands.
+*
+**********************************************************************************/
+static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PE_DATA *peData,
+ Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word32 redVal,
+ const Word16 nChannels,
+ const Word32 deltaPe)
+{
+ Word16 ch, sfb, sfbGrp,shift;
+ PSY_OUT_CHANNEL *psyOutChan;
+ PE_CHANNEL_DATA *peChanData;
+ Word32 deltaSfbPe;
+ Word32 normFactor;
+ Word32 *psfbPeFactors;
+ Word16 *psfbNActiveLines, *pahFlag;
+ Word32 sfbEn, sfbThr;
+ Word32 sfbThrReduced;
+
+ /* for each sfb calc relative factors for pe changes */
+ normFactor = 1;
+ for(ch=0; ch<nChannels; ch++) {
+ psyOutChan = &psyOutChannel[ch];
+ peChanData = &peData->peChannelData[ch];
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
+ psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
+ pahFlag = ahFlag[ch] + sfbGrp;
+ 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++;
+ pahFlag++; psfbNActiveLines++;
+ }
+ }
+ }
+
+
+ /* calculate new thresholds */
+ for(ch=0; ch<nChannels; ch++) {
+ psyOutChan = &psyOutChannel[ch];
+ peChanData = &peData->peChannelData[ch];
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
+ psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
+ pahFlag = ahFlag[ch] + sfbGrp;
+ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
+ /* pe difference for this sfb */
+ deltaSfbPe = *psfbPeFactors * deltaPe;
+
+ /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
+ if (*psfbNActiveLines > 0) {
+ /* new threshold */
+ Word32 thrFactor;
+ sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
+ sfbThr = psyOutChan->sfbThreshold[sfbGrp+sfb];
+
+ if(deltaSfbPe >= 0){
+ /*
+ reduce threshold
+ */
+ thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
+
+ sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
+ }
+ else {
+ /*
+ 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;
+ }
+
+ }
+
+ /* avoid hole */
+ sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
+
+ if ((sfbThrReduced > sfbEn) &&
+ (*pahFlag == AH_INACTIVE)) {
+ sfbThrReduced = max(sfbEn, sfbThr);
+ *pahFlag = AH_ACTIVE;
+ }
+
+ psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
+ }
+
+ pahFlag++; psfbNActiveLines++; psfbPeFactors++;
+ }
+ }
+ }
+}
+
+
+/********************************************************************************
+*
+* function name:reduceMinSnr
+* 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,
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels,
+ const Word16 desiredPe)
+{
+ Word16 ch, sfb, sfbSubWin;
+ Word16 deltaPe;
+
+ /* start at highest freq down to 0 */
+ sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
+ while (peData->pe > desiredPe && sfbSubWin > 0) {
+
+ sfbSubWin = sfbSubWin - 1;
+ /* loop over all subwindows */
+ for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
+ sfb+=psyOutChannel[0].sfbPerGroup) {
+ /* loop over all channels */
+ PE_CHANNEL_DATA* peChan = peData->peChannelData;
+ PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
+ for (ch=0; ch<nChannels; ch++) {
+ if (ahFlag[ch][sfb] != NO_AH &&
+ psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
+ psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
+ psyOutCh->sfbThreshold[sfb] =
+ L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]);
+
+ /* calc new pe */
+ deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) -
+ peChan->sfbPe[sfb];
+ peData->pe = peData->pe + deltaPe;
+ peChan->pe = peChan->pe + deltaPe;
+ }
+ peChan += 1; psyOutCh += 1;
+ }
+ /* stop if enough has been saved */
+
+ if (peData->pe <= desiredPe)
+ break;
+ }
+ }
+}
+
+/********************************************************************************
+*
+* function name:allowMoreHoles
+* 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],
+ PSY_OUT_ELEMENT *psyOutElement,
+ PE_DATA *peData,
+ Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const AH_PARAM *ahParam,
+ const Word16 nChannels,
+ const Word16 desiredPe)
+{
+ Word16 ch, sfb;
+ Word16 actPe, shift;
+
+ 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;
+ 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;
+ 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 */
+ if (actPe > desiredPe) {
+ Word16 startSfb[2];
+ Word32 avgEn, minEn;
+ Word16 ahCnt;
+ Word16 enIdx;
+ Word16 enDiff;
+ Word32 en[4];
+ Word16 minSfb, maxSfb;
+ Flag done;
+
+ /* 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;
+ 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]);
+ avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfb]);
+ ahCnt++;
+ }
+ }
+ }
+
+ if(ahCnt) {
+ Word32 iahCnt;
+ shift = norm_l(ahCnt);
+ iahCnt = Div_32( 1 << shift, ahCnt << shift );
+ avgEn = fixmul(avgEn, iahCnt);
+ }
+
+ enDiff = iLog4(avgEn) - iLog4(minEn);
+ /* calc some energy borders between minEn and avgEn */
+ for (enIdx=0; enIdx<4; enIdx++) {
+ Word32 enFac;
+ enFac = ((6-(enIdx << 1)) * enDiff);
+ en[enIdx] = fixmul(avgEn, pow2_xy(L_negate(enFac),7*4));
+ }
+
+ /* start with lowest energy border at highest sfb */
+ maxSfb = psyOutChannel[0].sfbCnt - 1;
+ minSfb = startSfb[0];
+
+ if (nChannels == 2) {
+ maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
+ minSfb = min(minSfb, startSfb[1]);
+ }
+
+ 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;
+ psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
+ actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
+ }
+
+ if (actPe < desiredPe) {
+ done = 1;
+ break;
+ }
+ }
+ }
+ sfb = sfb - 1;
+
+ if (sfb < minSfb) {
+ /* restart with next energy border */
+ sfb = maxSfb;
+ enIdx = enIdx + 1;
+
+ if (enIdx - 4 >= 0)
+ done = 1;
+ }
+ }
+ }
+}
+
+/********************************************************************************
+*
+* function name:adaptThresholdsToPe
+* description: two guesses for the reduction value and one final correction of the
+* thresholds
+*
+**********************************************************************************/
+static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PE_DATA *peData,
+ const Word16 nChannels,
+ const Word16 desiredPe,
+ AH_PARAM *ahParam,
+ MINSNR_ADAPT_PARAM *msaParam)
+{
+ Word16 noRedPe, redPe, redPeNoAH;
+ Word16 constPart, constPartNoAH;
+ Word16 nActiveLines, nActiveLinesNoAH;
+ Word16 desiredPeNoAH;
+ Word32 redVal, avgThrExp;
+ Word32 iter;
+
+ calcThreshExp(peData->thrExp, psyOutChannel, nChannels);
+
+ adaptMinSnr(psyOutChannel, logSfbEnergy, msaParam, nChannels);
+
+ initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam);
+
+ 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;
+
+ /* reduce thresholds */
+ reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
+
+ /* pe after first guess */
+ calcSfbPe(peData, psyOutChannel, nChannels);
+ redPe = peData->pe;
+
+ 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;
+ }
+
+ /* 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;
+
+ 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);
+ }
+ else {
+ Word16 desiredPe105 = (105 * desiredPe) / 100;
+ reduceMinSnr(psyOutChannel, peData, peData->ahFlag,
+ nChannels, desiredPe105);
+ allowMoreHoles(psyOutChannel, psyOutElement, peData, peData->ahFlag,
+ ahParam, nChannels, desiredPe105);
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: calcBitSave
+* description: Calculates percentage of bit save, see figure below
+* returns:
+* input: parameters and bitres-fullness
+* output: percentage of bit save
+*
+*****************************************************************************/
+static Word16 calcBitSave(Word16 fillLevel,
+ const Word16 clipLow,
+ const Word16 clipHigh,
+ const Word16 minBitSave,
+ const Word16 maxBitSave)
+{
+ Word16 bitsave = 0;
+
+ fillLevel = max(fillLevel, clipLow);
+ fillLevel = min(fillLevel, clipHigh);
+
+ if(clipHigh-clipLow)
+ bitsave = (maxBitSave - (((maxBitSave-minBitSave)*(fillLevel-clipLow))/
+ (clipHigh-clipLow)));
+
+ return (bitsave);
+}
+
+
+
+/*****************************************************************************
+*
+* function name: calcBitSpend
+* description: Calculates percentage of bit spend, see figure below
+* returns:
+* input: parameters and bitres-fullness
+* output: percentage of bit spend
+*
+*****************************************************************************/
+static Word16 calcBitSpend(Word16 fillLevel,
+ const Word16 clipLow,
+ const Word16 clipHigh,
+ const Word16 minBitSpend,
+ const Word16 maxBitSpend)
+{
+ Word16 bitspend = 1;
+
+ fillLevel = max(fillLevel, clipLow);
+ fillLevel = min(fillLevel, clipHigh);
+
+ if(clipHigh-clipLow)
+ bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
+ (clipHigh-clipLow)));
+
+ return (bitspend);
+}
+
+
+/*****************************************************************************
+*
+* function name: adjustPeMinMax()
+* description: adjusts peMin and peMax parameters over time
+* returns:
+* input: current pe, peMin, peMax
+* output: adjusted peMin/peMax
+*
+*****************************************************************************/
+static void adjustPeMinMax(const Word16 currPe,
+ Word16 *peMin,
+ Word16 *peMax)
+{
+ Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
+ Word16 diff;
+ Word16 minDiff = extract_l(currPe / 6);
+ 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);
+ } else {
+ *peMin = *peMin + ((currPe - *peMin) * minFacHi / 100);
+ *peMax = *peMax - ((*peMax - currPe) * maxFacLo / 100);
+ }
+ }
+
+
+ if ((*peMax - *peMin) < minDiff) {
+ Word16 partLo, partHi;
+
+ partLo = max(0, (currPe - *peMin));
+ partHi = max(0, (*peMax - currPe));
+
+ *peMax = currPe + ((partHi * minDiff) / (partLo + partHi));
+ *peMin = currPe - ((partLo * minDiff) / (partLo + partHi));
+ *peMin = max(0, *peMin);
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: BitresCalcBitFac
+* description: calculates factor of spending bits for one frame
+* 1.0 : take all frame dynpart bits
+* >1.0 : take all frame dynpart bits + bitres
+* <1.0 : put bits in bitreservoir
+* returns: BitFac*100
+* input: bitres-fullness, pe, blockType, parameter-settings
+* output:
+*
+*****************************************************************************/
+static Word16 bitresCalcBitFac( const Word16 bitresBits,
+ const Word16 maxBitresBits,
+ const Word16 pe,
+ const Word16 windowSequence,
+ const Word16 avgBits,
+ const Word16 maxBitFac,
+ ADJ_THR_STATE *AdjThr,
+ ATS_ELEMENT *adjThrChan)
+{
+ BRES_PARAM *bresParam;
+ Word16 pex;
+ Word16 fillLevel;
+ Word16 bitSave, bitSpend, bitresFac;
+
+ fillLevel = extract_l((100* bitresBits) / maxBitresBits);
+
+ if (windowSequence != SHORT_WINDOW)
+ bresParam = &(AdjThr->bresParamLong);
+ else
+ bresParam = &(AdjThr->bresParamShort);
+
+ pex = max(pe, adjThrChan->peMin);
+ pex = min(pex,adjThrChan->peMax);
+
+ bitSave = calcBitSave(fillLevel,
+ bresParam->clipSaveLow, bresParam->clipSaveHigh,
+ bresParam->minBitSave, bresParam->maxBitSave);
+
+ bitSpend = calcBitSpend(fillLevel,
+ bresParam->clipSpendLow, bresParam->clipSpendHigh,
+ bresParam->minBitSpend, bresParam->maxBitSpend);
+
+ if(adjThrChan->peMax != adjThrChan->peMin)
+ bitresFac = (100 - bitSave) + extract_l(((bitSpend + bitSave) * (pex - adjThrChan->peMin)) /
+ (adjThrChan->peMax - adjThrChan->peMin));
+ else
+ bitresFac = 0x7fff;
+
+ bitresFac = min(bitresFac,
+ (100-30 + extract_l((100 * bitresBits) / avgBits)));
+
+ bitresFac = min(bitresFac, maxBitFac);
+
+ adjustPeMinMax(pe, &adjThrChan->peMin, &adjThrChan->peMax);
+
+ return bitresFac;
+}
+
+/*****************************************************************************
+*
+* function name: AdjThrInit
+* description: init thresholds parameter
+*
+*****************************************************************************/
+void AdjThrInit(ADJ_THR_STATE *hAdjThr,
+ const Word32 meanPe,
+ Word32 chBitrate)
+{
+ ATS_ELEMENT* atsElem = &hAdjThr->adjThrStateElem;
+ MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
+
+ /* 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;
+
+ /* specific for each element: */
+
+ /* parameters for bitres control */
+ atsElem->peMin = extract_l(((80*meanPe) / 100));
+ atsElem->peMax = extract_l(((120*meanPe) / 100));
+
+ /* additional pe offset to correct pe2bits for low bitrates */
+ atsElem->peOffset = 0;
+ if (chBitrate < 32000) {
+ atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
+ }
+
+ /* avoid hole parameters */
+ if (chBitrate > 20000) {
+ atsElem->ahParam.modifyMinSnr = TRUE;
+ atsElem->ahParam.startSfbL = 15;
+ atsElem->ahParam.startSfbS = 3;
+ }
+ else {
+ atsElem->ahParam.modifyMinSnr = FALSE;
+ atsElem->ahParam.startSfbL = 0;
+ atsElem->ahParam.startSfbS = 0;
+ }
+
+ /* minSnr adaptation */
+ /* maximum reduction of minSnr goes down to minSnr^maxRed */
+ msaParam->maxRed = 0x20000000; /* *0.25f /
+ /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
+ msaParam->startRatio = 0x0ccccccd; /* 10 */
+ /* maximum minSnr reduction to minSnr^maxRed is reached for
+ avgEn/sfbEn >= maxRatio */
+ msaParam->maxRatio = 0x0020c49c; /* 1000 */
+ /* helper variables to interpolate minSnr reduction for
+ avgEn/sfbEn between startRatio and maxRatio */
+
+ msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */
+
+ msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
+
+
+ /* pe correction */
+ atsElem->peLast = 0;
+ atsElem->dynBitsLast = 0;
+ atsElem->peCorrectionFactor = 100; /* 1.0 */
+
+}
+
+/*****************************************************************************
+*
+* function name: calcPeCorrection
+* description: calculates the desired perceptual entropy factor
+* It is between 0.85 and 1.15
+*
+*****************************************************************************/
+static void calcPeCorrection(Word16 *correctionFac,
+ const Word16 peAct,
+ 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);
+ }
+ else {
+ newFac = max(((90 * newFac) / 100), 100);
+ newFac = min(newFac, 115);
+ }
+
+ if ((newFac > 100 && *correctionFac < 100) ||
+ (newFac < 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;
+ else
+ *correctionFac = (70 * *correctionFac + 30 * newFac) / 100;
+ *correctionFac = min(*correctionFac, 115);
+ *correctionFac = max(*correctionFac, 85);
+ }
+ else {
+ *correctionFac = 100;
+ }
+}
+
+/********************************************************************************
+*
+* function name: AdjustThresholds
+* description: Adjust thresholds to the desired bitrate
+*
+**********************************************************************************/
+void AdjustThresholds(ADJ_THR_STATE *adjThrState,
+ ATS_ELEMENT *AdjThrStateElement,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word16 *chBitDistribution,
+ Word16 logSfbEnergy[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;
+ Word16 noRedPe, grantedPe, grantedPeCorr;
+ Word16 curWindowSequence;
+ Word16 bitFactor;
+ Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
+ 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;
+
+
+ curWindowSequence = LONG_WINDOW;
+
+ if (nChannels == 2) {
+
+ if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
+ (psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
+ curWindowSequence = SHORT_WINDOW;
+ }
+ }
+ else {
+ curWindowSequence = psyOutChannel[0].windowSequence;
+ }
+
+
+ /* bit factor */
+ bitFactor = bitresCalcBitFac(bitresBits, maxBitresBits, noRedPe+5*sideInfoBits,
+ curWindowSequence, avgBits, maxBitFac,
+ adjThrState,
+ AdjThrStateElement);
+
+ /* desired pe */
+ grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
+
+ /* correction of pe value */
+ calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
+ min(grantedPe, noRedPe),
+ AdjThrStateElement->peLast,
+ AdjThrStateElement->dynBitsLast);
+ grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
+
+
+ if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
+ /* calc threshold necessary for desired pe */
+ adaptThresholdsToPe(psyOutChannel,
+ psyOutElement,
+ logSfbEnergy,
+ &peData,
+ nChannels,
+ grantedPeCorr,
+ &AdjThrStateElement->ahParam,
+ &AdjThrStateElement->minSnrAdaptParam);
+ }
+
+ /* calculate relative distribution */
+ for (ch=0; ch<nChannels; ch++) {
+ Word16 peOffsDiff = peData.pe - peData.offset;
+ chBitDistribution[ch] = 200;
+
+ if (peOffsDiff > 0) {
+ Word32 temp = 1000 - (nChannels * 200);
+ chBitDistribution[ch] = chBitDistribution[ch] +
+ (temp * peData.peChannelData[ch].pe) / peOffsDiff;
+ }
+ }
+
+ /* store pe */
+ qcOE->pe = noRedPe;
+
+ /* update last pe */
+ AdjThrStateElement->peLast = grantedPe;
+}
+
+/********************************************************************************
+*
+* function name: AdjThrUpdate
+* description: save dynBitsUsed for correction of bits2pe relation
+*
+**********************************************************************************/
+void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
+ const Word16 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
new file mode 100644
index 0000000..48edd4f
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
@@ -0,0 +1,167 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: AutoCorrelation_v5.s
+@
+@ Content: AutoCorrelation function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+
+ .section .text
+ .global AutoCorrelation
+
+AutoCorrelation:
+ stmdb sp!, {r4 - r11, lr}
+
+ sub r13, r13, #20
+
+ mov r5, r0
+ mov r7, r1
+ mov r9, r3
+ mov r2, r2, lsl #16
+ mov r0, #0
+ mov r4, r2, asr #16
+ mov r8, #0
+ cmp r4, #0
+ ble L136
+
+ cmp r4, #8
+ mov r2, #0
+ blt L133
+
+ sub r12, r4, #8
+L132:
+ ldr r6, [r5, r2]
+ add r2, r2, #4
+ smulbb r3, r6, r6
+ ldr r1, [r5, r2]
+ smultt r10, r6, r6
+ mov r3, r3, asr #9
+ smulbb r6, r1, r1
+ mov r10, r10, asr #9
+ qadd r0, r0, r3
+ smultt r11, r1, r1
+ add r2, r2, #4
+ qadd r0, r0, r10
+ mov r6, r6, asr #9
+ mov r11, r11, asr #9
+ ldr r1, [r5, r2]
+ qadd r0, r0, r6
+ smulbb r10, r1, r1
+ smultt r6, r1, r1
+ qadd r0, r0, r11
+ mov r10, r10, asr #9
+ mov r6, r6, asr #9
+ qadd r0, r0, r10
+ add r2, r2, #4
+ add r8, r8, #6
+
+ qadd r0, r0, r6
+ cmp r8, r12
+ blt L132
+L133:
+ ldrsh r6, [r5, r2]
+ mul r10, r6, r6
+ add r2, r2, #2
+ mov r1, r10, asr #9
+ qadd r0, r0, r1
+L134:
+ add r8, r8, #1
+ cmp r8, r4
+ blt L133
+L135:
+L136:
+ str r0, [r7, #0]
+ cmp r0, #0
+ beq L1320
+L137:
+ mov r2, r9, lsl #16
+ mov r8, #1
+ mov r2, r2, asr #16
+ cmp r2, #1
+ ble L1319
+L138:
+L139:
+ sub r4, r4, #1
+ mov r14, #0
+ mov r3, #0
+ cmp r4, #0
+ ble L1317
+L1310:
+ cmp r4, #6
+ addlt r6, r5, r8, lsl #1
+ blt L1314
+L1311:
+ add r6, r5, r8, lsl #1
+ sub r12, r4, #6
+ str r8, [r13, #8]
+ str r7, [r13, #4]
+L1312:
+ mov r1, r3, lsl #1
+ ldrsh r7, [r6, r1]
+ ldrsh r10, [r5, r1]
+ add r8, r1, r6
+ add r9, r5, r1
+ mul r7, r10, r7
+ ldrsh r1, [r8, #2]
+ ldrsh r10, [r8, #4]
+ add r7, r14, r7, asr #9
+ ldrsh r0, [r9, #2]
+ ldrsh r11, [r9, #4]
+ mul r1, r0, r1
+ ldrsh r14, [r8, #6]
+ mul r10, r11, r10
+ add r7, r7, r1, asr #9
+ ldrsh r8, [r8, #8]
+ add r3, r3, #5
+ ldrsh r11, [r9, #6]
+ ldrsh r1, [r9, #8]
+ mul r14, r11, r14
+ add r7, r7, r10, asr #9
+ mul r1, r1, r8
+ add r14, r7, r14, asr #9
+ cmp r3, r12
+ add r14, r14, r1, asr #9
+ ble L1312
+L1313:
+ ldr r8, [r13, #8]
+ ldr r7, [r13, #4]
+L1314:
+L1315:
+ mov r12, r3, lsl #1
+ ldrsh r9, [r6, r12]
+ ldrsh r12, [r5, r12]
+ add r3, r3, #1
+ cmp r3, r4
+ mul r12, r12, r9
+ add r14, r14, r12, asr #9
+ blt L1315
+L1316:
+L1317:
+ str r14, [r7, +r8, lsl #2]
+ add r8, r8, #1
+ cmp r8, r2
+ blt L139
+
+L1319:
+L1320:
+ add r13, r13, #20
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP @ |AutoCorrelation|
+ .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
new file mode 100644
index 0000000..7997e98
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
@@ -0,0 +1,112 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: CalcWindowEnergy_v5.s
+@
+@ Content: CalcWindowEnergy function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+
+ .global CalcWindowEnergy
+
+CalcWindowEnergy:
+ stmdb sp!, {r4 - r11, lr}
+ sub r13, r13, #20
+
+ mov r3, r3, lsl #16
+ ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0];
+ mov r3, r3, asr #16
+ ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
+
+ mov r2, r2, lsl #16
+ ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
+ mov r2, r2, asr #16
+ ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
+
+ mov r8, #0 @ w=0
+ mov r5, #0 @ wOffset = 0;
+
+BLOCK_BEGIN:
+ mov r6, #0 @ accuUE = 0;
+ mov r7, #0 @ accuFE = 0;
+ mov r4, #0 @ i=0
+
+ str r8, [r13, #4]
+ str r0, [r13, #8]
+ str r3, [r13, #12]
+
+ENERGY_BEG:
+ mov r9, r5, lsl #1
+ ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
+
+ add r5, r5, r2 @ tidx = tidx + chIncrement;
+
+ smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
+ smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 );
+
+ mov r3, r3, lsl #1
+ mov r8, r8, lsl #1
+
+ sub r0, r3, r10 @ accu3 = accu1 - states0;
+ sub r8, r0, r8 @ out = accu3 - accu2;
+
+ mov r10, r3 @ states0 = accu1;
+ mov r11, r8 @ states1 = out;
+
+ mul r3, r9, r9
+ mov r8, r8, asr #16
+
+ add r4, r4, #1
+ add r6, r6, r3, asr #7
+
+ mul r9, r8, r8
+ ldr r3, [r13, #12]
+
+ add r7, r7, r9, asr #7
+
+ cmp r4, r3
+ blt ENERGY_BEG
+
+ ldr r0, [r13, #8]
+ ldr r8, [r13, #4]
+
+ENERGY_END:
+ add r4, r0, r8, lsl #2
+
+ str r6, [r4, #72]
+ add r8, r8, #1
+ str r7, [r4, #136]
+
+ cmp r8, #8
+ blt BLOCK_BEGIN
+
+BLOCK_END:
+ str r10, [r0, #168]
+ str r11, [r0, #172]
+ mov r0, #1
+
+ add r13, r13, #20
+ ldmia sp!, {r4 - r11, pc}
+
+hiPassCoeff:
+ .word 0xbec8b439
+ .word 0x609d4952
+
+ @ENDP
+ .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
new file mode 100644
index 0000000..d4d3edb
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
@@ -0,0 +1,131 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: PrePostMDCT_v5.s
+@
+@ Content: premdct and postmdct function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+ .global PreMDCT
+
+PreMDCT:
+ stmdb sp!, {r4 - r11, lr}
+
+ add r9, r0, r1, lsl #2
+ sub r3, r9, #8
+
+ movs r1, r1, asr #2
+ beq PreMDCT_END
+
+PreMDCT_LOOP:
+ ldr r8, [r2], #4
+ ldr r9, [r2], #4
+
+ ldrd r4, [r0]
+ ldrd r6, [r3]
+
+ smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
+ smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
+
+ smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
+ smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
+
+ add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+ sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
+
+ ldr r8, [r2], #4
+ ldr r9, [r2], #4
+
+ smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
+ smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
+
+ smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
+ smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
+
+ add r8, r8, r4
+ sub r9, r12, r10
+
+ mov r6, r11
+
+ strd r6, [r0]
+ strd r8, [r3]
+
+ subs r1, r1, #1
+ sub r3, r3, #8
+ add r0, r0, #8
+ bne PreMDCT_LOOP
+
+PreMDCT_END:
+ ldmia sp!, {r4 - r11, pc}
+ @ENDP @ |PreMDCT|
+
+ .section .text
+ .global PostMDCT
+
+PostMDCT:
+ stmdb sp!, {r4 - r11, lr}
+
+ add r9, r0, r1, lsl #2
+ sub r3, r9, #8
+
+ movs r1, r1, asr #2
+ beq PostMDCT_END
+
+PostMDCT_LOOP:
+ ldr r8, [r2], #4
+ ldr r9, [r2], #4
+
+ ldrd r4, [r0]
+ ldrd r6, [r3]
+
+ smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
+ smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
+
+ smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
+ smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
+
+ add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+ sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
+
+ ldr r8, [r2], #4 @
+ ldr r9, [r2], #4
+
+ smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
+ smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
+
+ smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
+ smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
+
+ add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
+ sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
+
+ mov r7, r11
+
+ strd r4, [r0]
+ strd r6, [r3]
+
+ subs r1, r1, #1
+ sub r3, r3, #8
+ add r0, r0, #8
+ bne PostMDCT_LOOP
+
+PostMDCT_END:
+ ldmia sp!, {r4 - r11, pc}
+ @ENDP @ |PostMDCT|
+ .end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
new file mode 100644
index 0000000..370daf4
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
@@ -0,0 +1,252 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: R4R8First_v5.s
+@
+@ Content: Radix8First and Radix4First function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+ .global Radix4First
+
+Radix4First:
+ stmdb sp!, {r4 - r11, lr}
+
+ movs r10, r1
+ mov r11, r0
+ beq Radix4First_END
+
+Radix4First_LOOP:
+ ldrd r0, [r11]
+ ldrd r2, [r11, #8]
+ ldrd r4, [r11, #16]
+ ldrd r6, [r11, #24]
+
+ add r8, r0, r2
+ add r9, r1, r3
+
+ sub r0, r0, r2
+ sub r1, r1, r3
+
+ add r2, r4, r6
+ add r3, r5, r7
+
+ sub r4, r4, r6
+ sub r5, r5, r7
+
+ add r6, r8, r2
+ add r7, r9, r3
+
+ sub r8, r8, r2
+ sub r9, r9, r3
+
+ add r2, r0, r5
+ sub r3, r1, r4
+
+ sub r0, r0, r5
+ add r1, r1, r4
+
+ strd r6, [r11]
+ strd r2, [r11, #8]
+ strd r8, [r11, #16]
+ strd r0, [r11, #24]
+
+ subs r10, r10, #1
+ add r11, r11, #32
+ bne Radix4First_LOOP
+
+Radix4First_END:
+ ldmia sp!, {r4 - r11, pc}
+ @ENDP @ |Radix4First|
+
+ .section .text
+ .global Radix8First
+
+Radix8First:
+ stmdb sp!, {r4 - r11, lr}
+ sub sp, sp, #0x24
+
+ mov r12, r1
+ mov r14, r0
+ cmp r12, #0
+ beq Radix8First_END
+
+Radix8First_LOOP:
+ ldrd r0, [r14]
+ ldrd r2, [r14, #8]
+ ldrd r4, [r14, #16]
+ ldrd r6, [r14, #24]
+
+ add r8, r0, r2 @ r0 = buf[0] + buf[2]@
+ add r9, r1, r3 @ i0 = buf[1] + buf[3]@
+
+ sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
+ sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
+
+ add r2, r4, r6 @ r2 = buf[4] + buf[6]@
+ add r3, r5, r7 @ i2 = buf[5] + buf[7]@
+
+ sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
+ sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
+
+ add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
+ add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
+
+ sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
+ sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
+
+ sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
+ add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
+
+ add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
+ sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
+
+ mov r6, r6, asr #1 @
+ mov r7, r7, asr #1 @
+
+ mov r8, r8, asr #1
+ mov r9, r9, asr #1
+
+ mov r2, r2, asr #1
+ mov r3, r3, asr #1
+
+ mov r0, r0, asr #1
+ mov r1, r1, asr #1
+
+ str r6, [sp]
+ str r7, [sp, #4]
+
+ str r8, [sp, #8]
+ str r9, [sp, #12]
+
+ str r2, [sp, #16]
+ str r3, [sp, #20]
+
+ str r0, [sp, #24]
+ str r1, [sp, #28]
+
+ ldrd r2, [r14, #32]
+ ldrd r4, [r14, #40]
+ ldrd r6, [r14, #48]
+ ldrd r8, [r14, #56]
+
+ add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
+ add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
+
+ sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
+ sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
+
+ add r4, r6, r8 @ r2 = buf[12] + buf[14]@
+ add r5, r7, r9 @ i2 = buf[13] + buf[15]@
+
+ sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
+ sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
+
+ add r8, r0, r4 @ t0 = (r0 + r2)
+ add r9, r1, r5 @ t1 = (i0 + i2)
+
+ sub r0, r0, r4 @ t2 = (r0 - r2)
+ sub r1, r1, r5 @ t3 = (i0 - i2)
+
+ mov r8, r8, asr #1
+ ldr r4, [sp]
+
+ mov r9, r9, asr #1
+ ldr r5, [sp, #4]
+
+ mov r0, r0, asr #1
+ mov r1, r1, asr #1
+
+ add r10, r4, r8 @ buf[ 0] = r4 + t0@
+ add r11, r5, r9 @ buf[ 1] = i4 + t1@
+
+ sub r4, r4, r8 @ buf[ 8] = r4 - t0@
+ sub r5, r5, r9 @ buf[ 9] = i4 - t1@
+
+ strd r10, [r14]
+ strd r4, [r14, #32]
+
+ ldr r10, [sp, #8]
+ ldr r11, [sp, #12]
+
+ add r4, r10, r1 @ buf[ 4] = r5 + t3@
+ sub r5, r11, r0 @ buf[ 5] = i5 - t2@
+
+ sub r10, r10, r1 @ buf[12] = r5 - t3@
+ add r11, r11, r0 @ buf[13] = i5 + t2@
+
+ strd r4, [r14, #16]
+ strd r10, [r14, #48]
+
+ sub r0, r2, r7 @ r0 = r1 - i3@
+ add r1, r3, r6 @ i0 = i1 + r3@
+
+ ldr r11, DATATab
+
+ add r2, r2, r7 @ r2 = r1 + i3@
+ sub r3, r3, r6 @ i2 = i1 - r3@
+
+ sub r4, r0, r1 @ r0 - i0
+ add r5, r0, r1 @ r0 + i0
+
+ sub r0, r2, r3 @ r2 - i2
+ add r1, r2, r3 @ r2 + i2
+
+ smull r8, r6, r4, r11
+ smull r9, r7, r5, r11
+
+ ldr r2, [sp, #16]
+ ldr r3, [sp, #20]
+
+ smull r8, r4, r0, r11
+ smull r9, r5, r1, r11
+
+ ldr r10, [sp, #24]
+ ldr r11, [sp, #28]
+
+ sub r8, r2, r6
+ sub r9, r3, r7
+
+ add r2, r2, r6
+ add r3, r3, r7
+
+ add r6, r10, r5
+ sub r7, r11, r4
+
+ sub r0, r10, r5
+ add r1, r11, r4
+
+ strd r6, [r14, #8]
+ strd r8, [r14, #24]
+ strd r0, [r14, #40]
+ strd r2, [r14, #56]
+
+ subs r12, r12, #1
+ add r14, r14, #64
+
+ bne Radix8First_LOOP
+
+Radix8First_END:
+ add sp, sp, #0x24
+ ldmia sp!, {r4 - r11, pc}
+
+DATATab:
+ .word 0x5a82799a
+
+ @ENDP @ |Radix8First|
+ .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
new file mode 100644
index 0000000..db8e5d8
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
@@ -0,0 +1,169 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: Radix4FFT_v5.s
+@
+@ Content: Radix4FFT armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ .section .text
+ .global Radix4FFT
+
+Radix4FFT:
+ stmdb sp!, {r4 - r11, lr}
+ sub sp, sp, #32
+
+ mov r1, r1, asr #2
+ cmp r1, #0
+ beq Radix4FFT_END
+
+Radix4FFT_LOOP1:
+ mov r14, r0 @ xptr = buf@
+ mov r10, r1 @ i = num@
+ mov r9, r2, lsl #3 @ step = 2*bgn@
+ cmp r10, #0
+ str r0, [sp]
+ str r1, [sp, #4]
+ str r2, [sp, #8]
+ str r3, [sp, #12]
+ beq Radix4FFT_LOOP1_END
+
+Radix4FFT_LOOP2:
+ mov r12, r3 @ csptr = twidTab@
+ mov r11, r2 @ j = bgn
+ cmp r11, #0
+ str r10, [sp, #16]
+ beq Radix4FFT_LOOP2_END
+
+Radix4FFT_LOOP3:
+ str r11, [sp, #20]
+
+ ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
+ add r14, r14, r9 @ xptr += step@
+
+ ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@
+ ldr r8, [r12], #4 @ cosxsinx = csptr[0]@
+
+ smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
+ smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1)
+
+ smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+ smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
+
+ mov r10, r0, asr #2 @ t0 = r0 >> 2@
+ mov r11, r1, asr #2 @ t1 = r1 >> 2@
+
+ sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+ add r14, r14, r9 @ xptr += step@
+
+ sub r0, r10, r2 @ r0 = t0 - r2@
+ sub r1, r11, r3 @ r1 = t1 - r3@
+
+ add r2, r10, r2 @ r2 = t0 + r2@
+ add r3, r11, r3 @ r3 = t1 + r3@
+
+ str r2, [sp, #24]
+ str r3, [sp, #28]
+
+ ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
+ ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
+
+ smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
+ smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1)
+
+ smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+ smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
+
+ add r14, r14, r9 @ xptr += step@
+ sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+
+ ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
+ ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
+
+ smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
+ smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1)
+
+ smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+ smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0)
+
+ mov r10, r4 @ t0 = r4@
+ mov r11, r5 @ t1 = r5@
+
+ sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+
+
+ add r4, r10, r6 @ r4 = t0 + r6@
+ sub r5, r7, r11 @ r5 = r7 - t1@
+
+ sub r6, r10, r6 @ r6 = t0 - r6@
+ add r7, r7, r11 @ r7 = r7 + t1@
+
+ ldr r2, [sp, #24]
+ ldr r3, [sp, #28]
+
+ add r10, r0, r5 @ xptr[0] = r0 + r5@
+ add r11, r1, r6 @ xptr[0] = r1 + r6
+
+ strd r10, [r14]
+ sub r14, r14, r9 @ xptr -= step@
+
+ sub r10, r2, r4 @ xptr[0] = r2 - r4@
+ sub r11, r3, r7 @ xptr[1] = r3 - r7@
+
+ strd r10, [r14]
+ sub r14, r14, r9 @ xptr -= step@
+
+ sub r10, r0, r5 @ xptr[0] = r0 - r5@
+ sub r11, r1, r6 @ xptr[0] = r1 - r6
+
+ strd r10, [r14]
+ sub r14, r14, r9 @ xptr -= step@
+
+ add r10, r2, r4 @ xptr[0] = r2 - r4@
+ add r11, r3, r7 @ xptr[1] = r3 - r7@
+
+ strd r10, [r14]
+ add r14, r14, #8 @ xptr += 2@
+
+ ldr r11, [sp, #20]
+ subs r11, r11, #1
+ bne Radix4FFT_LOOP3
+
+Radix4FFT_LOOP2_END:
+ ldr r10, [sp, #16]
+ ldr r3, [sp, #12]
+ ldr r2, [sp, #8]
+ rsb r8, r9, r9, lsl #2
+ sub r10, r10, #1
+ add r14, r14, r8
+ cmp r10, #0
+ bhi Radix4FFT_LOOP2
+
+Radix4FFT_LOOP1_END:
+ ldr r0, [sp]
+ ldr r1, [sp, #4]
+ add r3, r3, r8, asr #1
+ mov r2, r2, lsl #2
+ movs r1, r1, asr #2
+ bne Radix4FFT_LOOP1
+
+Radix4FFT_END:
+ add sp, sp, #32
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP @ |Radix4FFT|
+ .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
new file mode 100644
index 0000000..a463dfd
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
@@ -0,0 +1,204 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: band_nrg_v5.s
+@
+@ Content: CalcBandEnergy and CalcBandEnergyMS function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+
+ .global CalcBandEnergy
+
+CalcBandEnergy:
+ stmdb sp!, {r4 - r11, lr}
+
+ mov r2, r2, lsl #16
+ ldr r12, [r13, #36]
+ mov r9, #0
+ mov r5, r2, asr #16
+ mov r4, #0
+ cmp r5, #0
+ ble L212
+
+L22:
+ mov r2, r4, lsl #1
+ ldrsh r10, [r1, r2]
+ add r11, r1, r2
+ ldrsh r2, [r11, #2]
+ mov r14, #0
+ cmp r10, r2
+ bge L28
+
+L23:
+ ldr r11, [r0, +r10, lsl #2]
+ add r10, r10, #1
+ ldr r6, [r0, +r10, lsl #2]
+ smull r11, r7, r11, r11
+ add r10, r10, #1
+ smull r6, r8, r6, r6
+ ldr r11, [r0, +r10, lsl #2]
+ qadd r14, r14, r7
+ add r10, r10, #1
+ smull r11, r7, r11, r11
+ ldr r6, [r0, +r10, lsl #2]
+ qadd r14, r14, r8
+ smull r6, r8, r6, r6
+ add r10, r10, #1
+ qadd r14, r14, r7
+ cmp r10, r2
+ qadd r14, r14, r8
+ blt L23
+
+L28:
+ qadd r14, r14, r14
+ str r14, [r3, +r4, lsl #2]
+ add r4, r4, #1
+ qadd r9, r9, r14
+ cmp r4, r5
+
+ blt L22
+
+L212:
+ str r9, [r12, #0]
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP ; |CalcBandEnergy|
+
+ .global CalcBandEnergyMS
+
+CalcBandEnergyMS:
+ stmdb sp!, {r4 - r11, lr}
+ sub r13, r13, #24
+
+ mov r12, #0
+ mov r3, r3, lsl #16
+ mov r14, #0
+ mov r3, r3, asr #16
+ cmp r3, #0
+ mov r4, #0
+ ble L315
+
+L32:
+ mov r5, r4, lsl #1
+ mov r6, #0
+ ldrsh r10, [r2, r5]
+ add r5, r2, r5
+ mov r7, #0
+ ldrsh r11, [r5, #2]
+ cmp r10, r11
+ bge L39
+
+ str r3, [r13, #4]
+ str r4, [r13, #8]
+ str r12, [r13, #12]
+ str r14, [r13, #16]
+
+L33:
+ ldr r8, [r0, +r10, lsl #2]
+ ldr r9, [r1, +r10, lsl #2]
+ mov r8, r8, asr #1
+ add r10, r10, #1
+ mov r9, r9, asr #1
+
+ ldr r12, [r0, +r10, lsl #2]
+ add r5, r8, r9
+ ldr r14, [r1, +r10, lsl #2]
+ sub r8, r8, r9
+
+ smull r5, r3, r5, r5
+ mov r12, r12, asr #1
+ smull r8, r4, r8, r8
+ mov r14, r14, asr #1
+
+ qadd r6, r6, r3
+ add r5, r12, r14
+ qadd r7, r7, r4
+ sub r8, r12, r14
+
+ smull r5, r3, r5, r5
+ add r10, r10, #1
+ smull r8, r4, r8, r8
+
+ qadd r6, r6, r3
+ qadd r7, r7, r4
+
+ ldr r8, [r0, +r10, lsl #2]
+ ldr r9, [r1, +r10, lsl #2]
+ mov r8, r8, asr #1
+ add r10, r10, #1
+ mov r9, r9, asr #1
+
+ ldr r12, [r0, +r10, lsl #2]
+ add r5, r8, r9
+ ldr r14, [r1, +r10, lsl #2]
+ sub r8, r8, r9
+
+ smull r5, r3, r5, r5
+ mov r12, r12, asr #1
+ smull r8, r4, r8, r8
+ mov r14, r14, asr #1
+
+ qadd r6, r6, r3
+ add r5, r12, r14
+ qadd r7, r7, r4
+ sub r8, r12, r14
+
+ smull r5, r3, r5, r5
+ add r10, r10, #1
+ smull r8, r4, r8, r8
+
+ qadd r6, r6, r3
+ qadd r7, r7, r4
+
+ cmp r10, r11
+
+ blt L33
+
+ ldr r3, [r13, #4]
+ ldr r4, [r13, #8]
+ ldr r12, [r13, #12]
+ ldr r14, [r13, #16]
+L39:
+ qadd r6, r6, r6
+ qadd r7, r7, r7
+
+ ldr r8, [r13, #60]
+ ldr r9, [r13, #68]
+
+ qadd r12, r12, r6
+ qadd r14, r14, r7
+
+ str r6, [r8, +r4, lsl #2]
+ str r7, [r9, +r4, lsl #2]
+
+ add r4, r4, #1
+ cmp r4, r3
+ blt L32
+
+L315:
+ ldr r8, [r13, #64]
+ ldr r9, [r13, #72]
+ str r12, [r8, #0]
+ str r14, [r9, #0]
+
+ add r13, r13, #24
+ ldmia sp!, {r4 - r11, pc}
+ @ENDP ; |CalcBandEnergyMS|
+
+ .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
new file mode 100644
index 0000000..bf7dcbad
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
@@ -0,0 +1,135 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: PrePostMDCT_v7.s
+@
+@ Content: premdct and postmdct function armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+ .global PreMDCT
+
+PreMDCT:
+ stmdb sp!, {r4 - r11, lr}
+
+ add r9, r0, r1, lsl #2
+ sub r3, r9, #32
+
+ movs r1, r1, asr #2
+ beq PreMDCT_END
+
+PreMDCT_LOOP:
+ VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
+ VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
+ VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
+ VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
+ VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
+
+ VREV64.32 Q8, Q7
+ VREV64.32 Q9, Q6
+
+
+ VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
+ VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
+ VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
+ VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
+
+ VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+ VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
+
+ VST2.I32 {d0, d1, d2, d3}, [r0]!
+ sub r3, r3, #32
+
+ VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
+ VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
+ VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
+ VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
+
+ VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
+ VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
+
+ VREV64.32 Q3, Q1
+ VREV64.32 Q2, Q0
+
+ VST2.I32 {d5, d7}, [r3]!
+ VST2.I32 {d4, d6}, [r3]!
+
+ subs r1, r1, #4
+ sub r3, r3, #64
+ bne PreMDCT_LOOP
+
+PreMDCT_END:
+ ldmia sp!, {r4 - r11, pc}
+ @ENDP @ |PreMDCT|
+
+ .section .text
+ .global PostMDCT
+
+PostMDCT:
+ stmdb sp!, {r4 - r11, lr}
+
+ add r9, r0, r1, lsl #2
+ sub r3, r9, #32
+
+ movs r1, r1, asr #2
+ beq PostMDCT_END
+
+PostMDCT_LOOP:
+ VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
+ VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
+ VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
+ VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
+ VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
+
+ VREV64.32 Q8, Q6
+ VREV64.32 Q9, Q7
+
+ VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
+ VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
+ VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
+ VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
+
+ VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+ VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
+
+ VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
+ VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
+ VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
+ VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
+
+ VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
+ VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@
+
+ VREV64.32 Q2, Q4
+ VREV64.32 Q3, Q5
+
+ sub r3, r3, #32
+ VST2.I32 {d0, d1, d2, d3}, [r0]!
+
+ VST2.I32 {d5, d7}, [r3]!
+ VST2.I32 {d4, d6}, [r3]!
+
+ subs r1, r1, #4
+ sub r3, r3, #64
+ bne PostMDCT_LOOP
+
+PostMDCT_END:
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP @ |PostMDCT|
+ .end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
new file mode 100644
index 0000000..99ee68b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
@@ -0,0 +1,146 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: R4R8First_v7.s
+@
+@ Content: Radix8First and Radix4First function armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+ .global Radix8First
+
+Radix8First:
+ stmdb sp!, {r4 - r11, lr}
+
+ ldr r3, SQRT1_2
+ cmp r1, #0
+
+ VDUP.I32 Q15, r3
+ beq Radix8First_END
+
+Radix8First_LOOP:
+ VLD1.I32 {d0, d1, d2, d3}, [r0]!
+ VLD1.I32 {d8, d9, d10, d11}, [r0]!
+
+ VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
+ VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
+ VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
+ VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
+ VREV64.I32 d7, d7
+
+ VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
+ VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
+
+ VREV64.I32 d3, d3
+
+ VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
+ VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
+ VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
+ VREV64.I32 d7, d7
+ VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
+
+ VTRN.32 d1, d3
+
+ VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
+ VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
+
+ VREV64.I32 d3, d3
+
+ VSHR.S32 d8, d8, #1
+ VSHR.S32 Q0, Q0, #1
+ VREV64.I32 d10, d10
+ VTRN.32 d11, d9
+ VSHR.S32 Q1, Q1, #1
+ VSHR.S32 d10, d10, #1
+ VREV64.I32 d9, d9
+
+ sub r0, r0, #0x40
+
+ VADD.S32 d12, d0, d8
+ VSUB.S32 d16, d0, d8
+ VADD.S32 d14, d2, d10
+ VSUB.S32 d18, d2, d10
+
+ VSUB.S32 d4, d11, d9
+ VADD.S32 d5, d11, d9
+
+ VREV64.I32 d18, d18
+
+ VQDMULH.S32 Q3, Q2, Q15
+ VTRN.32 d14, d18
+ VTRN.32 d6, d7
+ VREV64.I32 d18, d18
+
+ VSUB.S32 d15, d3, d6
+ VREV64.I32 d7, d7
+ VADD.S32 d19, d3, d6
+ VADD.S32 d13, d1, d7
+ VSUB.S32 d17, d1, d7
+
+ VREV64.I32 d17, d17
+ VTRN.32 d13, d17
+ VREV64.I32 d17, d17
+
+ subs r1, r1, #1
+
+ VST1.I32 {d12, d13, d14, d15}, [r0]!
+ VST1.I32 {d16, d17, d18, d19}, [r0]!
+ bne Radix8First_LOOP
+
+Radix8First_END:
+ ldmia sp!, {r4 - r11, pc}
+SQRT1_2:
+ .word 0x2d413ccd
+
+ @ENDP @ |Radix8First|
+
+ .section .text
+ .global Radix4First
+
+Radix4First:
+ stmdb sp!, {r4 - r11, lr}
+
+ cmp r1, #0
+ beq Radix4First_END
+
+Radix4First_LOOP:
+ VLD1.I32 {d0, d1, d2, d3}, [r0]
+
+ VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
+ VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
+ VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
+ VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
+
+ VREV64.I32 d7, d7 @
+
+ VADD.S32 Q4, Q2, Q3
+ VSUB.S32 Q5, Q2, Q3
+
+ VREV64.I32 d11, d11
+ VTRN.32 d9, d11
+ subs r1, r1, #1
+ VREV64.I32 d11, d11
+ VST1.I32 {d8, d9, d10, d11}, [r0]!
+
+ bne Radix4First_LOOP
+
+Radix4First_END:
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP @ |Radix4First|
+ .end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
new file mode 100644
index 0000000..e1a8438
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
@@ -0,0 +1,143 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ File: Radix4FFT_v7.s
+@
+@ Content: Radix4FFT armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+ .section .text
+ .global Radix4FFT
+
+Radix4FFT:
+ stmdb sp!, {r4 - r11, lr}
+
+ mov r1, r1, asr #2
+ cmp r1, #0
+ beq Radix4FFT_END
+
+Radix4FFT_LOOP1:
+ mov r5, r2, lsl #1
+ mov r8, r0
+ mov r7, r1
+ mov r5, r5, lsl #2
+ cmp r1, #0
+ rsbeq r12, r5, r5, lsl #2
+ beq Radix4FFT_LOOP1_END
+
+ rsb r12, r5, r5, lsl #2
+
+Radix4FFT_LOOP2:
+ mov r6, r3
+ mov r4, r2
+ cmp r2, #0
+ beq Radix4FFT_LOOP2_END
+
+Radix4FFT_LOOP3:
+ @r0 = xptr[0]@
+ @r1 = xptr[1]@
+ VLD2.I32 {D0, D1, D2, D3}, [r8]
+ VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@
+
+ add r8, r8, r5 @ xptr += step@
+ VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@
+
+ VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
+ VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
+ VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
+ VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
+
+ VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+ VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
+
+ add r8, r8, r5 @ xptr += step@
+ VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
+ VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
+
+ VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
+ VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
+ VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
+ VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
+
+ VLD2.I32 {D8, D9, D10, D11}, [r8]
+ VLD2.I32 {D28, D29, D30, D31}, [r6]!
+ add r8, r8, r5
+
+ VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
+ VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
+ VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
+ VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
+
+ VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+ VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
+
+ VLD2.I32 {D12, D13, D14, D15}, [r8]
+ VLD2.I32 {D28, D29, D30, D31}, [r6]!
+
+ VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
+ VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
+ VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
+ VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
+
+ VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+ VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
+
+ VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@
+ VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
+ VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
+ VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
+
+ VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
+ VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
+ VST2.I32 {D16, D17, D18, D19}, [r8]
+
+ VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
+ sub r8, r8, r5 @ xptr -= step@
+ VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
+ VST2.I32 {D20, D21, D22, D23}, [r8]
+
+ VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
+ sub r8, r8, r5 @ xptr -= step@
+ VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
+ VST2.I32 {D16, D17, D18, D19}, [r8]
+
+ VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
+ sub r8, r8, r5 @ xptr -= step@
+ VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
+ VST2.I32 {D20, D21, D22, D23}, [r8]!
+
+ subs r4, r4, #4
+ bne Radix4FFT_LOOP3
+
+Radix4FFT_LOOP2_END:
+ add r8, r8, r12
+ sub r7, r7, #1
+ cmp r7, #0
+ bhi Radix4FFT_LOOP2
+
+Radix4FFT_LOOP1_END:
+ add r3, r12, r3
+ mov r2, r2, lsl #2
+ movs r1, r1, asr #2
+ bne Radix4FFT_LOOP1
+
+Radix4FFT_END:
+ ldmia sp!, {r4 - r11, pc}
+
+ @ENDP @ |Radix4FFT|
+ .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
new file mode 100644
index 0000000..666c4ca
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/band_nrg.c
@@ -0,0 +1,102 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: band_nrg.c
+
+ Content: Band/Line energy calculations functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "band_nrg.h"
+
+#ifndef ARMV5E
+/********************************************************************************
+*
+* function name: CalcBandEnergy
+* description: Calc sfb-bandwise mdct-energies for left and right channel
+*
+**********************************************************************************/
+void CalcBandEnergy(const Word32 *mdctSpectrum,
+ const Word16 *bandOffset,
+ const Word16 numBands,
+ Word32 *bandEnergy,
+ Word32 *bandEnergySum)
+{
+ Word32 i, j;
+ Word32 accuSum = 0;
+
+ for (i=0; i<numBands; i++) {
+ Word32 accu = 0;
+ for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
+ accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
+
+ accu = L_add(accu, accu);
+ accuSum = L_add(accuSum, accu);
+ bandEnergy[i] = accu;
+ }
+ *bandEnergySum = accuSum;
+}
+
+/********************************************************************************
+*
+* function name: CalcBandEnergyMS
+* description: Calc sfb-bandwise mdct-energies for left add or minus right channel
+*
+**********************************************************************************/
+void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
+ const Word32 *mdctSpectrumRight,
+ const Word16 *bandOffset,
+ const Word16 numBands,
+ Word32 *bandEnergyMid,
+ Word32 *bandEnergyMidSum,
+ Word32 *bandEnergySide,
+ Word32 *bandEnergySideSum)
+{
+
+ Word32 i, j;
+ Word32 accuMidSum = 0;
+ Word32 accuSideSum = 0;
+
+
+ for(i=0; i<numBands; i++) {
+ Word32 accuMid = 0;
+ Word32 accuSide = 0;
+ for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
+ Word32 specm, specs;
+ Word32 l, r;
+
+ l = mdctSpectrumLeft[j] >> 1;
+ r = mdctSpectrumRight[j] >> 1;
+ specm = l + r;
+ specs = l - r;
+ 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;
+ accuMidSum = L_add(accuMidSum, accuMid);
+ bandEnergySide[i] = accuSide;
+ accuSideSum = L_add(accuSideSum, accuSide);
+
+ }
+ *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
new file mode 100644
index 0000000..24837e8
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/bit_cnt.c
@@ -0,0 +1,885 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bit_cnt.c
+
+ Content: Huffman Bitcounter & coder functions
+
+*******************************************************************************/
+
+#include "bit_cnt.h"
+#include "aac_rom.h"
+
+#define HI_LTAB(a) (a>>8)
+#define LO_LTAB(a) (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:
+* input: quantized spectrum
+* output: bitCount for tables 1-11
+*
+*****************************************************************************/
+
+static void count1_2_3_4_5_6_7_8_9_10_11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+ 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;
+
+ for(i=0;i<width;i+=4){
+
+ 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]);
+
+ /* 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]);
+
+ 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]);
+
+ 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;
+ bitCount[4]=extract_l(bc3_4) + sc;
+ bitCount[5]=extract_h(bc5_6);
+ bitCount[6]=extract_l(bc5_6);
+ 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: count3_4_5_6_7_8_9_10_11
+* description: counts tables 3-11
+* returns:
+* input: quantized spectrum
+* output: bitCount for tables 3-11
+*
+*****************************************************************************/
+
+static void count3_4_5_6_7_8_9_10_11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+ 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;
+
+ for(i=0;i<width;i+=4){
+
+ 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]);
+
+ 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]);
+
+ bc11 = bc11 + huff_ltab11[t0][t1];
+ bc11 = bc11 + huff_ltab11[t2][t3];
+
+
+ sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0);
+ }
+
+ 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);
+ bitCount[6]=extract_l(bc5_6);
+ 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: count5_6_7_8_9_10_11
+* description: counts tables 5-11
+* returns:
+* input: quantized spectrum
+* output: bitCount for tables 5-11
+*
+*****************************************************************************/
+static void count5_6_7_8_9_10_11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+
+ Word32 t0,t1,i;
+ Word32 bc5_6,bc7_8,bc9_10;
+ Word16 bc11,sc;
+
+ 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];
+
+ 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]);
+ 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]=extract_h(bc5_6);
+ bitCount[6]=extract_l(bc5_6);
+ 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: count7_8_9_10_11
+* description: counts tables 7-11
+* returns:
+* input: quantized spectrum
+* output: bitCount for tables 7-11
+*
+*****************************************************************************/
+
+static void count7_8_9_10_11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+ Word32 t0,t1, i;
+ Word32 bc7_8,bc9_10;
+ Word16 bc11,sc;
+
+ 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]);
+ 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]=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:
+* input: quantized spectrum
+* output: bitCount for tables 9-11
+*
+*****************************************************************************/
+static void count9_10_11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+
+ Word32 t0,t1,i;
+ Word32 bc9_10;
+ Word16 bc11,sc;
+
+ bc9_10=0;
+ bc11=0;
+ sc=0;
+
+ for(i=0;i<width;i+=2){
+
+ t0=ABS(values[i+0]);
+ t1=ABS(values[i+1]);
+
+
+ bc9_10 += EXPAND(huff_ltab9_10[t0][t1]);
+ bc11 = bc11 + huff_ltab11[t0][t1];
+
+
+ sc = sc + (t0>0) + (t1>0);
+ }
+ bitCount[1]=INVALID_BITCOUNT;
+ bitCount[2]=INVALID_BITCOUNT;
+ bitCount[3]=INVALID_BITCOUNT;
+ bitCount[4]=INVALID_BITCOUNT;
+ bitCount[5]=INVALID_BITCOUNT;
+ bitCount[6]=INVALID_BITCOUNT;
+ bitCount[7]=INVALID_BITCOUNT;
+ bitCount[8]=INVALID_BITCOUNT;
+ bitCount[9]=extract_h(bc9_10) + sc;
+ bitCount[10]=extract_l(bc9_10) + sc;
+ bitCount[11]=bc11 + sc;
+
+}
+
+/*****************************************************************************
+*
+* function name: count11
+* description: counts table 11
+* returns:
+* input: quantized spectrum
+* output: bitCount for table 11
+*
+*****************************************************************************/
+ static void count11(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+ Word32 t0,t1,i;
+ Word16 bc11,sc;
+
+ bc11=0;
+ sc=0;
+ for(i=0;i<width;i+=2){
+ t0=ABS(values[i+0]);
+ t1=ABS(values[i+1]);
+ bc11 = bc11 + huff_ltab11[t0][t1];
+
+
+ sc = sc + (t0>0) + (t1>0);
+ }
+
+ bitCount[1]=INVALID_BITCOUNT;
+ bitCount[2]=INVALID_BITCOUNT;
+ bitCount[3]=INVALID_BITCOUNT;
+ bitCount[4]=INVALID_BITCOUNT;
+ bitCount[5]=INVALID_BITCOUNT;
+ bitCount[6]=INVALID_BITCOUNT;
+ bitCount[7]=INVALID_BITCOUNT;
+ bitCount[8]=INVALID_BITCOUNT;
+ bitCount[9]=INVALID_BITCOUNT;
+ bitCount[10]=INVALID_BITCOUNT;
+ bitCount[11]=bc11 + sc;
+}
+
+/*****************************************************************************
+*
+* function name: countEsc
+* description: counts table 11 (with Esc)
+* returns:
+* input: quantized spectrum
+* output: bitCount for tables 11 (with Esc)
+*
+*****************************************************************************/
+
+static void countEsc(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount)
+{
+ Word32 t0,t1,t00,t01,i;
+ Word16 bc11,ec,sc;
+
+ bc11=0;
+ sc=0;
+ ec=0;
+ for(i=0;i<width;i+=2){
+ t0=ABS(values[i+0]);
+ t1=ABS(values[i+1]);
+
+
+ sc = sc + (t0>0) + (t1>0);
+
+ t00 = min(t0,16);
+ t01 = min(t1,16);
+ bc11 = bc11 + huff_ltab11[t00][t01];
+
+
+ if(t0 >= 16){
+ ec = ec + 5;
+ while(sub(t0=(t0 >> 1), 16) >= 0) {
+ ec = ec + 2;
+ }
+ }
+
+
+ if(t1 >= 16){
+ ec = ec + 5;
+ while(sub(t1=(t1 >> 1), 16) >= 0) {
+ ec = ec + 2;
+ }
+ }
+ }
+ bitCount[1]=INVALID_BITCOUNT;
+ bitCount[2]=INVALID_BITCOUNT;
+ bitCount[3]=INVALID_BITCOUNT;
+ bitCount[4]=INVALID_BITCOUNT;
+ bitCount[5]=INVALID_BITCOUNT;
+ bitCount[6]=INVALID_BITCOUNT;
+ bitCount[7]=INVALID_BITCOUNT;
+ bitCount[8]=INVALID_BITCOUNT;
+ bitCount[9]=INVALID_BITCOUNT;
+ bitCount[10]=INVALID_BITCOUNT;
+ bitCount[11]=bc11 + sc + ec;
+}
+
+
+typedef void (*COUNT_FUNCTION)(const Word16 *values,
+ const Word16 width,
+ Word16 *bitCount);
+
+static COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV+1] =
+ {
+
+ count1_2_3_4_5_6_7_8_9_10_11, /* 0 */
+ count1_2_3_4_5_6_7_8_9_10_11, /* 1 */
+ count3_4_5_6_7_8_9_10_11, /* 2 */
+ count5_6_7_8_9_10_11, /* 3 */
+ count5_6_7_8_9_10_11, /* 4 */
+ count7_8_9_10_11, /* 5 */
+ count7_8_9_10_11, /* 6 */
+ count7_8_9_10_11, /* 7 */
+ count9_10_11, /* 8 */
+ count9_10_11, /* 9 */
+ count9_10_11, /* 10 */
+ count9_10_11, /* 11 */
+ count9_10_11, /* 12 */
+ count11, /* 13 */
+ count11, /* 14 */
+ count11, /* 15 */
+ countEsc /* 16 */
+ };
+
+/*****************************************************************************
+*
+* function name: bitCount
+* description: count bits
+*
+*****************************************************************************/
+Word16 bitCount(const Word16 *values,
+ const Word16 width,
+ Word16 maxVal,
+ Word16 *bitCount)
+{
+ /*
+ check if we can use codebook 0
+ */
+
+ if(maxVal == 0)
+ bitCount[0] = 0;
+ else
+ bitCount[0] = INVALID_BITCOUNT;
+
+ maxVal = min(maxVal, CODE_BOOK_ESC_LAV);
+ countFuncTable[maxVal](values,width,bitCount);
+
+ return(0);
+}
+
+/*****************************************************************************
+*
+* function name: codeValues
+* description: write huffum bits
+*
+*****************************************************************************/
+Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream)
+{
+
+ Word32 i, t0, t1, t2, t3, t00, t01;
+ Word16 codeWord, codeLength;
+ Word16 sign, signLength;
+
+
+ switch (codeBook) {
+ case CODE_BOOK_ZERO_NO:
+ break;
+
+ case CODE_BOOK_1_NO:
+ for(i=0; i<width; i+=4) {
+ t0 = values[i+0];
+ t1 = values[i+1];
+ t2 = values[i+2];
+ t3 = values[i+3];
+ codeWord = huff_ctab1[t0+1][t1+1][t2+1][t3+1];
+ codeLength = HI_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);
+ WriteBits(hBitstream, codeWord, codeLength);
+ }
+ break;
+
+ case CODE_BOOK_2_NO:
+ for(i=0; i<width; i+=4) {
+ t0 = values[i+0];
+ t1 = values[i+1];
+ t2 = values[i+2];
+ t3 = values[i+3];
+ codeWord = huff_ctab2[t0+1][t1+1][t2+1][t3+1];
+ codeLength = LO_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ }
+ break;
+
+ case CODE_BOOK_3_NO:
+ for(i=0; i<width; i+=4) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ t2 = values[i+2];
+
+ if(t2 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t2 < 0){
+ sign|=1;
+ t2=-t2;
+ }
+ }
+ t3 = values[i+3];
+ if(t3 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t3 < 0){
+ sign|=1;
+ t3=-t3;
+ }
+ }
+
+ codeWord = huff_ctab3[t0][t1][t2][t3];
+ codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][t3]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_4_NO:
+ for(i=0; i<width; i+=4) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ t2 = values[i+2];
+
+ if(t2 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t2 < 0){
+ sign|=1;
+ t2=-t2;
+ }
+ }
+ t3 = values[i+3];
+
+ if(t3 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t3 < 0){
+ sign|=1;
+ t3=-t3;
+ }
+ }
+ codeWord = huff_ctab4[t0][t1][t2][t3];
+ codeLength = LO_LTAB(huff_ltab3_4[t0][t1][t2][t3]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_5_NO:
+ for(i=0; i<width; i+=2) {
+ t0 = values[i+0];
+ t1 = values[i+1];
+ codeWord = huff_ctab5[t0+4][t1+4];
+ codeLength = HI_LTAB(huff_ltab5_6[t0+4][t1+4]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ }
+ break;
+
+ case CODE_BOOK_6_NO:
+ for(i=0; i<width; i+=2) {
+ t0 = values[i+0];
+ t1 = values[i+1];
+ codeWord = huff_ctab6[t0+4][t1+4];
+ codeLength = LO_LTAB(huff_ltab5_6[t0+4][t1+4]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ }
+ break;
+
+ case CODE_BOOK_7_NO:
+ for(i=0; i<width; i+=2){
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ codeWord = huff_ctab7[t0][t1];
+ codeLength = HI_LTAB(huff_ltab7_8[t0][t1]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_8_NO:
+ for(i=0; i<width; i+=2) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ codeWord = huff_ctab8[t0][t1];
+ codeLength = LO_LTAB(huff_ltab7_8[t0][t1]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_9_NO:
+ for(i=0; i<width; i+=2) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ codeWord = huff_ctab9[t0][t1];
+ codeLength = HI_LTAB(huff_ltab9_10[t0][t1]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_10_NO:
+ for(i=0; i<width; i+=2) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ codeWord = huff_ctab10[t0][t1];
+ codeLength = LO_LTAB(huff_ltab9_10[t0][t1]);
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+ }
+ break;
+
+ case CODE_BOOK_ESC_NO:
+ for(i=0; i<width; i+=2) {
+ sign=0;
+ signLength=0;
+ t0 = values[i+0];
+
+ if(t0 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t0 < 0){
+ sign|=1;
+ t0=-t0;
+ }
+ }
+
+ t1 = values[i+1];
+
+ if(t1 != 0){
+ signLength = signLength + 1;
+ sign = sign << 1;
+
+ if(t1 < 0){
+ sign|=1;
+ t1=-t1;
+ }
+ }
+ t00 = min(t0,16);
+ t01 = min(t1,16);
+
+ codeWord = huff_ctab11[t00][t01];
+ codeLength = huff_ltab11[t00][t01];
+ WriteBits(hBitstream,codeWord,codeLength);
+ WriteBits(hBitstream,sign,signLength);
+
+ if(t0 >= 16){
+ Word16 n, p;
+ n=0;
+ p=t0;
+ while(sub(p=(p >> 1), 16) >= 0){
+
+ WriteBits(hBitstream,1,1);
+ n = n + 1;
+ }
+ WriteBits(hBitstream,0,1);
+ n = n + 4;
+ WriteBits(hBitstream,(t0 - (1 << n)),n);
+ }
+
+ if(t1 >= 16){
+ Word16 n, p;
+ n=0;
+ p=t1;
+ while(sub(p=(p >> 1), 16) >= 0){
+
+ WriteBits(hBitstream,1,1);
+ n = n + 1;
+ }
+ WriteBits(hBitstream,0,1);
+ n = n + 4;
+ WriteBits(hBitstream,(t1 - (1 << n)),n);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ return(0);
+}
+
+Word16 bitCountScalefactorDelta(Word16 delta)
+{
+ return(huff_ltabscf[delta+CODE_BOOK_SCF_LAV]);
+}
+
+Word16 codeScalefactorDelta(Word16 delta, HANDLE_BIT_BUF hBitstream)
+{
+ 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];
+ WriteBits(hBitstream,codeWord,codeLength);
+ return(0);
+}
diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
new file mode 100644
index 0000000..3248f0b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
@@ -0,0 +1,172 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bitbuffer.c
+
+ Content: Bit Buffer Management functions
+
+*******************************************************************************/
+
+#include "bitbuffer.h"
+
+/*****************************************************************************
+*
+* function name: updateBitBufWordPtr
+* description: update Bit Buffer pointer
+*
+*****************************************************************************/
+static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,
+ UWord8 **pBitBufWord,
+ Word16 cnt)
+{
+ *pBitBufWord += cnt;
+
+
+ if(*pBitBufWord > hBitBuf->pBitBufEnd) {
+ *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
+ }
+
+ if(*pBitBufWord < hBitBuf->pBitBufBase) {
+ *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: CreateBitBuffer
+* description: create and init Bit Buffer Management
+*
+*****************************************************************************/
+HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
+ UWord8 *pBitBufBase,
+ Word16 bitBufSize)
+{
+ assert(bitBufSize*8 <= 32768);
+
+ hBitBuf->pBitBufBase = pBitBufBase;
+ hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
+
+ hBitBuf->pWriteNext = pBitBufBase;
+
+ hBitBuf->cache = 0;
+
+ hBitBuf->wBitPos = 0;
+ hBitBuf->cntBits = 0;
+
+ hBitBuf->size = (bitBufSize << 3);
+ hBitBuf->isValid = 1;
+
+ return hBitBuf;
+}
+
+/*****************************************************************************
+*
+* function name: DeleteBitBuffer
+* description: uninit Bit Buffer Management
+*
+*****************************************************************************/
+void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
+{
+ if(*hBitBuf)
+ (*hBitBuf)->isValid = 0;
+ *hBitBuf = NULL;
+}
+
+/*****************************************************************************
+*
+* function name: ResetBitBuf
+* description: reset Bit Buffer Management
+*
+*****************************************************************************/
+void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
+ UWord8 *pBitBufBase,
+ Word16 bitBufSize)
+{
+ hBitBuf->pBitBufBase = pBitBufBase;
+ hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
+
+
+ hBitBuf->pWriteNext = pBitBufBase;
+
+ hBitBuf->wBitPos = 0;
+ hBitBuf->cntBits = 0;
+
+ hBitBuf->cache = 0;
+}
+
+/*****************************************************************************
+*
+* function name: CopyBitBuf
+* description: copy Bit Buffer Management
+*
+*****************************************************************************/
+void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
+ HANDLE_BIT_BUF hBitBufDst)
+{
+ *hBitBufDst = *hBitBufSrc;
+}
+
+/*****************************************************************************
+*
+* function name: GetBitsAvail
+* description: get available bits
+*
+*****************************************************************************/
+Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf)
+{
+ return hBitBuf->cntBits;
+}
+
+/*****************************************************************************
+*
+* function name: WriteBits
+* description: write bits to the buffer
+*
+*****************************************************************************/
+Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
+ Word32 writeValue,
+ Word16 noBitsToWrite)
+{
+ Word16 wBitPos;
+
+ assert(noBitsToWrite <= (Word16)sizeof(Word32)*8);
+
+ if(noBitsToWrite == 0)
+ return noBitsToWrite;
+
+ hBitBuf->cntBits += noBitsToWrite;
+
+ wBitPos = hBitBuf->wBitPos;
+ wBitPos += noBitsToWrite;
+ writeValue <<= 32 - wBitPos;
+ writeValue |= hBitBuf->cache;
+
+ while (wBitPos >= 8)
+ {
+ UWord8 tmp;
+ tmp = (UWord8)((writeValue >> 24) & 0xFF);
+
+ *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
new file mode 100644
index 0000000..588c2da1
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/bitenc.c
@@ -0,0 +1,690 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: bitenc.c
+
+ Content: Bitstream encoder functions
+
+*******************************************************************************/
+
+#include "bitenc.h"
+#include "bit_cnt.h"
+#include "dyn_bits.h"
+#include "qc_data.h"
+#include "interface.h"
+
+
+static const Word16 globalGainOffset = 100;
+static const Word16 icsReservedBit = 0;
+
+
+/*****************************************************************************
+*
+* function name: encodeSpectralData
+* description: encode spectral data
+* returns: spectral bits used
+*
+*****************************************************************************/
+static Word32 encodeSpectralData(Word16 *sfbOffset,
+ SECTION_DATA *sectionData,
+ Word16 *quantSpectrum,
+ HANDLE_BIT_BUF hBitStream)
+{
+ Word16 i,sfb;
+ Word16 dbgVal;
+ SECTION_INFO* psectioninfo;
+ dbgVal = GetBitsAvail(hBitStream);
+
+ for(i=0; i<sectionData->noOfSections; i++) {
+ psectioninfo = &(sectionData->sectionInfo[i]);
+ /*
+ huffencode spectral data for this section
+ */
+ for(sfb=psectioninfo->sfbStart;
+ sfb<psectioninfo->sfbStart+psectioninfo->sfbCnt;
+ sfb++) {
+ codeValues(quantSpectrum+sfbOffset[sfb],
+ sfbOffset[sfb+1] - sfbOffset[sfb],
+ psectioninfo->codeBook,
+ hBitStream);
+ }
+ }
+
+ return(GetBitsAvail(hBitStream)-dbgVal);
+}
+
+/*****************************************************************************
+*
+* function name:encodeGlobalGain
+* description: encodes Global Gain (common scale factor)
+* returns: none
+*
+*****************************************************************************/
+static void encodeGlobalGain(Word16 globalGain,
+ Word16 logNorm,
+ Word16 scalefac,
+ HANDLE_BIT_BUF hBitStream)
+{
+ WriteBits(hBitStream, ((globalGain - scalefac) + globalGainOffset-(logNorm << 2)), 8);
+}
+
+
+/*****************************************************************************
+*
+* function name:encodeIcsInfo
+* description: encodes Ics Info
+* returns: none
+*
+*****************************************************************************/
+
+static void encodeIcsInfo(Word16 blockType,
+ Word16 windowShape,
+ Word16 groupingMask,
+ SECTION_DATA *sectionData,
+ HANDLE_BIT_BUF hBitStream)
+{
+ WriteBits(hBitStream,icsReservedBit,1);
+ WriteBits(hBitStream,blockType,2);
+ WriteBits(hBitStream,windowShape,1);
+
+
+ switch(blockType){
+ case LONG_WINDOW:
+ case START_WINDOW:
+ case STOP_WINDOW:
+ WriteBits(hBitStream,sectionData->maxSfbPerGroup,6);
+
+ /* No predictor data present */
+ WriteBits(hBitStream, 0, 1);
+ break;
+
+ case SHORT_WINDOW:
+ WriteBits(hBitStream,sectionData->maxSfbPerGroup,4);
+
+ /*
+ Write grouping bits
+ */
+ WriteBits(hBitStream,groupingMask,TRANS_FAC-1);
+ break;
+ }
+}
+
+/*****************************************************************************
+*
+* function name: encodeSectionData
+* description: encode section data (common Huffman codebooks for adjacent
+* SFB's)
+* returns: none
+*
+*****************************************************************************/
+static Word32 encodeSectionData(SECTION_DATA *sectionData,
+ HANDLE_BIT_BUF hBitStream)
+{
+ Word16 sectEscapeVal=0,sectLenBits=0;
+ 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;
+ break;
+
+ case SHORT_WINDOW:
+ 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;
+
+ while(sectLen >= sectEscapeVal) {
+
+ WriteBits(hBitStream,sectEscapeVal,sectLenBits);
+ sectLen = sectLen - sectEscapeVal;
+ }
+ WriteBits(hBitStream,sectLen,sectLenBits);
+ }
+ return(GetBitsAvail(hBitStream)-dbgVal);
+}
+
+/*****************************************************************************
+*
+* function name: encodeScaleFactorData
+* description: encode DPCM coded scale factors
+* returns: none
+*
+*****************************************************************************/
+static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb,
+ SECTION_DATA *sectionData,
+ Word16 *scalefac,
+ HANDLE_BIT_BUF hBitStream)
+{
+ Word16 i,j,lastValScf,deltaScf;
+ Word16 dbgVal = GetBitsAvail(hBitStream);
+ SECTION_INFO* psectioninfo;
+
+ lastValScf=scalefac[sectionData->firstScf];
+
+ for(i=0;i<sectionData->noOfSections;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;
+ }
+ else {
+ deltaScf = lastValScf - scalefac[j];
+ lastValScf = scalefac[j];
+ }
+
+ if(codeScalefactorDelta(deltaScf,hBitStream)){
+ return(1);
+ }
+ }
+ }
+
+ }
+ return(GetBitsAvail(hBitStream)-dbgVal);
+}
+
+/*****************************************************************************
+*
+* function name:encodeMsInfo
+* description: encodes MS-Stereo Info
+* returns: none
+*
+*****************************************************************************/
+static void encodeMSInfo(Word16 sfbCnt,
+ Word16 grpSfb,
+ Word16 maxSfb,
+ Word16 msDigest,
+ Word16 *jsFlags,
+ HANDLE_BIT_BUF hBitStream)
+{
+ Word16 sfb, sfbOff;
+
+
+ switch(msDigest)
+ {
+ case MS_NONE:
+ WriteBits(hBitStream,SI_MS_MASK_NONE,2);
+ break;
+
+ case MS_ALL:
+ WriteBits(hBitStream,SI_MS_MASK_ALL,2);
+ break;
+
+ case MS_SOME:
+ 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);
+ }
+ else{
+ WriteBits(hBitStream,0,1);
+ }
+ }
+ }
+ break;
+ }
+
+}
+
+/*****************************************************************************
+*
+* function name: encodeTnsData
+* description: encode TNS data (filter order, coeffs, ..)
+* returns: none
+*
+*****************************************************************************/
+static void encodeTnsData(TNS_INFO tnsInfo,
+ Word16 blockType,
+ HANDLE_BIT_BUF hBitStream) {
+ Word16 i,k;
+ Flag tnsPresent;
+ Word16 numOfWindows;
+ Word16 coefBits;
+ Flag isShort;
+
+
+ if (blockType==2) {
+ isShort = 1;
+ numOfWindows = TRANS_FAC;
+ }
+ else {
+ isShort = 0;
+ numOfWindows = 1;
+ }
+
+ tnsPresent=0;
+ for (i=0; i<numOfWindows; i++) {
+
+ if (tnsInfo.tnsActive[i]) {
+ 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;
+ 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;
+ break;
+ }
+ }
+ }
+ else {
+ 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;
+ break;
+ }
+ }
+ }
+ 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);
+ }
+ }
+ }
+ }
+ }
+
+}
+
+/*****************************************************************************
+*
+* function name: encodeGainControlData
+* description: unsupported
+* returns: none
+*
+*****************************************************************************/
+static void encodeGainControlData(HANDLE_BIT_BUF hBitStream)
+{
+ WriteBits(hBitStream,0,1);
+}
+
+/*****************************************************************************
+*
+* function name: encodePulseData
+* description: not supported yet (dummy)
+* returns: none
+*
+*****************************************************************************/
+static void encodePulseData(HANDLE_BIT_BUF hBitStream)
+{
+ WriteBits(hBitStream,0,1);
+}
+
+
+/*****************************************************************************
+*
+* function name: WriteIndividualChannelStream
+* description: management of write process of individual channel stream
+* returns: none
+*
+*****************************************************************************/
+static void
+writeIndividualChannelStream(Flag commonWindow,
+ Word16 mdctScale,
+ Word16 windowShape,
+ Word16 groupingMask,
+ Word16 *sfbOffset,
+ Word16 scf[],
+ UWord16 *maxValueInSfb,
+ Word16 globalGain,
+ Word16 quantSpec[],
+ SECTION_DATA *sectionData,
+ HANDLE_BIT_BUF hBitStream,
+ TNS_INFO tnsInfo)
+{
+ Word16 logNorm;
+
+ logNorm = LOG_NORM_PCM - (mdctScale + 1);
+
+ encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream);
+
+
+ if(!commonWindow) {
+ encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
+ }
+
+ encodeSectionData(sectionData, hBitStream);
+
+ encodeScaleFactorData(maxValueInSfb,
+ sectionData,
+ scf,
+ hBitStream);
+
+ encodePulseData(hBitStream);
+
+ encodeTnsData(tnsInfo, sectionData->blockType, hBitStream);
+
+ encodeGainControlData(hBitStream);
+
+ encodeSpectralData(sfbOffset,
+ sectionData,
+ quantSpec,
+ hBitStream);
+
+}
+
+/*****************************************************************************
+*
+* function name: writeSingleChannelElement
+* description: write single channel element to bitstream
+* returns: none
+*
+*****************************************************************************/
+static Word16 writeSingleChannelElement(Word16 instanceTag,
+ Word16 *sfbOffset,
+ QC_OUT_CHANNEL* qcOutChannel,
+ HANDLE_BIT_BUF hBitStream,
+ TNS_INFO tnsInfo)
+{
+ WriteBits(hBitStream,ID_SCE,3);
+ WriteBits(hBitStream,instanceTag,4);
+ writeIndividualChannelStream(0,
+ qcOutChannel->mdctScale,
+ qcOutChannel->windowShape,
+ qcOutChannel->groupingMask,
+ sfbOffset,
+ qcOutChannel->scf,
+ qcOutChannel->maxValueInSfb,
+ qcOutChannel->globalGain,
+ qcOutChannel->quantSpec,
+ &(qcOutChannel->sectionData),
+ hBitStream,
+ tnsInfo
+ );
+ return(0);
+}
+
+
+
+/*****************************************************************************
+*
+* function name: writeChannelPairElement
+* description:
+* returns: none
+*
+*****************************************************************************/
+static Word16 writeChannelPairElement(Word16 instanceTag,
+ Word16 msDigest,
+ Word16 msFlags[MAX_GROUPED_SFB],
+ Word16 *sfbOffset[2],
+ QC_OUT_CHANNEL qcOutChannel[2],
+ HANDLE_BIT_BUF hBitStream,
+ TNS_INFO tnsInfo[2])
+{
+ WriteBits(hBitStream,ID_CPE,3);
+ WriteBits(hBitStream,instanceTag,4);
+ WriteBits(hBitStream,1,1); /* common window */
+
+ encodeIcsInfo(qcOutChannel[0].sectionData.blockType,
+ qcOutChannel[0].windowShape,
+ qcOutChannel[0].groupingMask,
+ &(qcOutChannel[0].sectionData),
+ hBitStream);
+
+ encodeMSInfo(qcOutChannel[0].sectionData.sfbCnt,
+ qcOutChannel[0].sectionData.sfbPerGroup,
+ qcOutChannel[0].sectionData.maxSfbPerGroup,
+ msDigest,
+ msFlags,
+ hBitStream);
+
+ writeIndividualChannelStream(1,
+ qcOutChannel[0].mdctScale,
+ qcOutChannel[0].windowShape,
+ qcOutChannel[0].groupingMask,
+ sfbOffset[0],
+ qcOutChannel[0].scf,
+ qcOutChannel[0].maxValueInSfb,
+ qcOutChannel[0].globalGain,
+ qcOutChannel[0].quantSpec,
+ &(qcOutChannel[0].sectionData),
+ hBitStream,
+ tnsInfo[0]);
+
+ writeIndividualChannelStream(1,
+ qcOutChannel[1].mdctScale,
+ qcOutChannel[1].windowShape,
+ qcOutChannel[1].groupingMask,
+ sfbOffset[1],
+ qcOutChannel[1].scf,
+ qcOutChannel[1].maxValueInSfb,
+ qcOutChannel[1].globalGain,
+ qcOutChannel[1].quantSpec,
+ &(qcOutChannel[1].sectionData),
+ hBitStream,
+ tnsInfo[1]);
+
+ return(0);
+}
+
+
+
+/*****************************************************************************
+*
+* function name: writeFillElement
+* description: write fill elements to bitstream
+* returns: none
+*
+*****************************************************************************/
+static void writeFillElement( const UWord8 *ancBytes,
+ Word16 totFillBits,
+ HANDLE_BIT_BUF hBitStream)
+{
+ Word16 i;
+ Word16 cnt,esc_count;
+
+ /*
+ 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));
+
+ WriteBits(hBitStream,ID_FIL,3);
+ WriteBits(hBitStream,cnt,4);
+
+ totFillBits = totFillBits - (3+4);
+
+
+ if ((cnt == (1<<4)-1)) {
+
+ esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);
+ WriteBits(hBitStream,esc_count,8);
+ totFillBits = (totFillBits - 8);
+ cnt = cnt + (esc_count - 1);
+ }
+
+ for(i=0;i<cnt;i++) {
+
+ if(ancBytes)
+ WriteBits(hBitStream, *ancBytes++,8);
+ else
+ WriteBits(hBitStream,0,8);
+ totFillBits = totFillBits - 8;
+ }
+ }
+}
+
+/*****************************************************************************
+*
+* function name: WriteBitStream
+* description: main function of write bitsteam process
+* returns: 0 if success
+*
+*****************************************************************************/
+Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
+ ELEMENT_INFO elInfo,
+ QC_OUT *qcOut,
+ PSY_OUT *psyOut,
+ Word16 *globUsedBits,
+ const UWord8 *ancBytes,
+ Word16 sampindex
+ ) /* returns error code */
+{
+ Word16 bitMarkUp;
+ Word16 elementUsedBits;
+ Word16 frameBits=0;
+
+ /* struct bitbuffer bsWriteCopy; */
+ bitMarkUp = GetBitsAvail(hBitStream);
+ if(qcOut->qcElement.adtsUsed) /* write adts header*/
+ {
+ WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
+ WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */
+ WriteBits(hBitStream, 0, 2); /* layer == 0 */
+ WriteBits(hBitStream, 1, 1); /* protection absent */
+ WriteBits(hBitStream, 1, 2); /* profile */
+ WriteBits(hBitStream, sampindex, 4); /* sampling rate */
+ WriteBits(hBitStream, 0, 1); /* private bit */
+ WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */
+ /* simply using numChannels only works for
+ 6 channels or less, else a channel
+ configuration should be written */
+ WriteBits(hBitStream, 0, 1); /* original/copy */
+ WriteBits(hBitStream, 0, 1); /* home */
+
+ /* Variable ADTS header */
+ WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
+ WriteBits(hBitStream, 0, 1); /* copyr. id. start */
+ WriteBits(hBitStream, *globUsedBits >> 3, 13);
+ WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
+ WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */
+ }
+
+ *globUsedBits=0;
+
+ {
+
+ Word16 *sfbOffset[2];
+ TNS_INFO tnsInfo[2];
+ elementUsedBits = 0;
+
+ switch (elInfo.elType) {
+
+ case ID_SCE: /* single channel */
+ sfbOffset[0] = psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
+ tnsInfo[0] = psyOut->psyOutChannel[elInfo.ChannelIndex[0]].tnsInfo;
+
+ writeSingleChannelElement(elInfo.instanceTag,
+ sfbOffset[0],
+ &qcOut->qcChannel[elInfo.ChannelIndex[0]],
+ hBitStream,
+ tnsInfo[0]);
+ break;
+
+ case ID_CPE: /* channel pair */
+ {
+ Word16 msDigest;
+ Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
+ msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
+ sfbOffset[0] =
+ psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
+ sfbOffset[1] =
+ psyOut->psyOutChannel[elInfo.ChannelIndex[1]].sfbOffsets;
+
+ tnsInfo[0]=
+ psyOut->psyOutChannel[elInfo.ChannelIndex[0]].tnsInfo;
+ tnsInfo[1]=
+ psyOut->psyOutChannel[elInfo.ChannelIndex[1]].tnsInfo;
+ writeChannelPairElement(elInfo.instanceTag,
+ msDigest,
+ msFlags,
+ sfbOffset,
+ &qcOut->qcChannel[elInfo.ChannelIndex[0]],
+ hBitStream,
+ tnsInfo);
+ }
+ break;
+
+ default:
+ return(1);
+
+ } /* switch */
+
+ elementUsedBits = elementUsedBits - bitMarkUp;
+ bitMarkUp = GetBitsAvail(hBitStream);
+ frameBits = frameBits + elementUsedBits + bitMarkUp;
+
+ }
+
+ writeFillElement(NULL,
+ qcOut->totFillBits,
+ hBitStream);
+
+ WriteBits(hBitStream,ID_END,3);
+
+ /* byte alignement */
+ WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
+
+ *globUsedBits = *globUsedBits- bitMarkUp;
+ bitMarkUp = GetBitsAvail(hBitStream);
+ *globUsedBits = *globUsedBits + bitMarkUp;
+ frameBits = frameBits + *globUsedBits;
+
+
+ if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
+ qcOut->totFillBits + qcOut->alignBits)) {
+ return(-1);
+ }
+ return(0);
+}
diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c
new file mode 100644
index 0000000..c0054f7
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/block_switch.c
@@ -0,0 +1,431 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: block_switch.c
+
+ Content: Block switching functions
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "psy_const.h"
+#include "block_switch.h"
+
+
+#define ENERGY_SHIFT (8 - 1)
+
+/**************** internal function prototypes ***********/
+static Word16
+IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[]);
+
+static Word32
+SrchMaxWithIndex(const Word32 *in, Word16 *index, Word16 n);
+
+
+Word32
+CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ Word16 *timeSignal,
+ Word16 chIncrement,
+ Word16 windowLen);
+
+
+
+/****************** Constants *****************************/
+
+
+/*
+ IIR high pass coeffs
+*/
+Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = {
+ 0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */
+};
+
+static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */
+static const Word32 oneMinusAccWindowNrgFac = 0x5999999a; /* 0.7 */
+static const Word32 invAttackRatioHighBr = 0x0ccccccd; /* inverted lower ratio limit for attacks 0.1*/
+static const Word32 invAttackRatioLowBr = 0x072b020c; /* 0.056 */
+static const Word32 minAttackNrg = 0x00001e84; /* minimum energy for attacks 1e+6 */
+
+
+/****************** Routines ****************************/
+
+
+/*****************************************************************************
+*
+* function name: InitBlockSwitching
+* description: init Block Switching parameter.
+* returns: TRUE if success
+*
+**********************************************************************************/
+Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ const Word32 bitRate, const Word16 nChannels)
+{
+ /* select attackRatio */
+
+ if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) ||
+ (sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) {
+ blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
+ }
+ else {
+ blockSwitchingControl->invAttackRatio = invAttackRatioLowBr;
+ }
+
+ return(TRUE);
+}
+
+static Word16 suggestedGroupingTable[TRANS_FAC][MAX_NO_OF_GROUPS] = {
+ /* Attack in Window 0 */ {1, 3, 3, 1},
+ /* Attack in Window 1 */ {1, 1, 3, 3},
+ /* Attack in Window 2 */ {2, 1, 3, 2},
+ /* Attack in Window 3 */ {3, 1, 3, 1},
+ /* Attack in Window 4 */ {3, 1, 1, 3},
+ /* Attack in Window 5 */ {3, 2, 1, 2},
+ /* Attack in Window 6 */ {3, 3, 1, 1},
+ /* Attack in Window 7 */ {3, 3, 1, 1}
+};
+
+/*****************************************************************************
+*
+* function name: BlockSwitching
+* description: detect this frame whether there is an attack
+* returns: TRUE if success
+*
+**********************************************************************************/
+Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ Word16 *timeSignal,
+ Word32 sampleRate,
+ Word16 chIncrement)
+{
+ Word32 i, w;
+ Word32 enM1, enMax;
+
+ /* Reset grouping info */
+ for (i=0; i<TRANS_FAC; i++) {
+ blockSwitchingControl->groupLen[i] = 0;
+ }
+
+
+ /* Search for position and amplitude of attack in last frame (1 windows delay) */
+ blockSwitchingControl->maxWindowNrg = SrchMaxWithIndex( &blockSwitchingControl->windowNrg[0][BLOCK_SWITCH_WINDOWS-1],
+ &blockSwitchingControl->attackIndex,
+ BLOCK_SWITCH_WINDOWS);
+
+ blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
+
+ /* Set grouping info */
+ blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
+
+ for (i=0; i<MAX_NO_OF_GROUPS; i++) {
+ blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];
+ }
+
+ /* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
+ if(sampleRate >= 16000) {
+ /* 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];
+ }
+
+
+ /* Calculate unfiltered and filtered energies in subwindows and combine to segments */
+ CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN);
+
+ /* reset attack */
+ blockSwitchingControl->attack = FALSE;
+
+ 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;
+ Word16 enM1_Shf, accWindowNrg_Shf, windowNrgF_Shf;
+
+ accWindowNrg_Shf = norm_l(blockSwitchingControl->accWindowNrg);
+ enM1_Shf = norm_l(enM1);
+ windowNrgF_Shf = norm_l(blockSwitchingControl->windowNrgF[1][w]);
+
+ accWindowNrg_Tmp = blockSwitchingControl->accWindowNrg << accWindowNrg_Shf;
+ enM1_Tmp = enM1 << enM1_Shf;
+ windowNrgF_Tmp = blockSwitchingControl->windowNrgF[1][w] << windowNrgF_Shf;
+
+ /* a sliding average of the previous energies */
+ blockSwitchingControl->accWindowNrg = (fixmul(oneMinusAccWindowNrgFac, accWindowNrg_Tmp) >> accWindowNrg_Shf) +
+ (fixmul(accWindowNrgFac, enM1_Tmp) >> enM1_Shf);
+
+
+ /* 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;
+ }
+ enM1 = blockSwitchingControl->windowNrgF[1][w];
+ enMax = max(enMax, enM1);
+ }
+
+ if (enMax < minAttackNrg) {
+ blockSwitchingControl->attack = FALSE;
+ }
+ }
+ else
+ {
+ blockSwitchingControl->attack = TRUE;
+ }
+
+ /* Check if attack spreads over frame border */
+ if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
+
+ if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
+ blockSwitchingControl->attack = TRUE;
+ }
+
+ blockSwitchingControl->lastattack = FALSE;
+ }
+ else {
+ blockSwitchingControl->lastattack = blockSwitchingControl->attack;
+ }
+
+ blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
+
+
+ if (blockSwitchingControl->attack) {
+ blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
+ }
+ else {
+ blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
+ }
+
+ /* update short block group */
+ if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
+
+ if (blockSwitchingControl->windowSequence== LONG_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;
+ }
+ }
+
+ /* update block type */
+ if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) {
+
+ if (blockSwitchingControl->windowSequence == SHORT_WINDOW) {
+ blockSwitchingControl->nextwindowSequence = STOP_WINDOW;
+ }
+ }
+
+ return(TRUE);
+}
+
+
+/*****************************************************************************
+*
+* function name: SrchMaxWithIndex
+* description: search for the biggest value in an array
+* returns: the max value
+*
+**********************************************************************************/
+static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n)
+{
+ Word32 max;
+ Word32 i, idx;
+
+ /* Search maximum value in array and return index and value */
+ max = 0;
+ idx = 0;
+
+ for (i = 0; i < n; i++) {
+
+ if (in[i+1] > max) {
+ max = in[i+1];
+ idx = i;
+ }
+ }
+ *index = idx;
+
+ return(max);
+}
+
+/*****************************************************************************
+*
+* function name: CalcWindowEnergy
+* description: calculate the energy before iir-filter and after irr-filter
+* returns: TRUE if success
+*
+**********************************************************************************/
+#ifndef ARMV5E
+Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
+ Word16 *timeSignal,
+ Word16 chIncrement,
+ Word16 windowLen)
+{
+ Word32 w, i, wOffset, tidx, ch;
+ Word32 accuUE, accuFE;
+ Word32 tempUnfiltered;
+ Word32 tempFiltered;
+ Word32 states0, states1;
+ Word32 Coeff0, Coeff1;
+
+
+ states0 = blockSwitchingControl->iirStates[0];
+ states1 = blockSwitchingControl->iirStates[1];
+ Coeff0 = hiPassCoeff[0];
+ Coeff1 = hiPassCoeff[1];
+ tidx = 0;
+ for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
+
+ accuUE = 0;
+ accuFE = 0;
+
+ for(i=0; i<windowLen; i++) {
+ Word32 accu1, accu2, accu3;
+ Word32 out;
+ tempUnfiltered = timeSignal[tidx];
+ tidx = tidx + chIncrement;
+
+ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
+ accu2 = fixmul( Coeff0, states1 );
+ accu3 = accu1 - states0;
+ out = accu3 - accu2;
+
+ states0 = accu1;
+ states1 = out;
+
+ 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->iirStates[0] = states0;
+ blockSwitchingControl->iirStates[1] = states1;
+
+ return(TRUE);
+}
+#endif
+
+/*****************************************************************************
+*
+* function name: IIRFilter
+* description: calculate the iir-filter for an array
+* returns: the result after iir-filter
+*
+**********************************************************************************/
+static Word16 IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[])
+{
+ Word32 accu1, accu2, accu3;
+ Word32 out;
+
+ accu1 = L_mpy_ls(coeff[1], in);
+ accu3 = accu1 - states[0];
+ accu2 = fixmul( coeff[0], states[1] );
+ out = accu3 - accu2;
+
+ states[0] = accu1;
+ states[1] = out;
+
+ return round16(out);
+}
+
+
+static Word16 synchronizedBlockTypeTable[4][4] = {
+ /* LONG_WINDOW START_WINDOW SHORT_WINDOW STOP_WINDOW */
+ /* LONG_WINDOW */{LONG_WINDOW, START_WINDOW, SHORT_WINDOW, STOP_WINDOW},
+ /* START_WINDOW */{START_WINDOW, START_WINDOW, SHORT_WINDOW, SHORT_WINDOW},
+ /* SHORT_WINDOW */{SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW},
+ /* STOP_WINDOW */{STOP_WINDOW, SHORT_WINDOW, SHORT_WINDOW, STOP_WINDOW}
+};
+
+
+/*****************************************************************************
+*
+* function name: SyncBlockSwitching
+* description: update block type and group value
+* returns: TRUE if success
+*
+**********************************************************************************/
+Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
+ BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight,
+ const Word16 nChannels)
+{
+ Word16 i;
+ Word16 patchType = LONG_WINDOW;
+
+
+ if (nChannels == 1) { /* Mono */
+ if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
+ blockSwitchingControlLeft->noOfGroups = 1;
+ blockSwitchingControlLeft->groupLen[0] = 1;
+
+ for (i=1; i<TRANS_FAC; i++) {
+ blockSwitchingControlLeft->groupLen[i] = 0;
+ }
+ }
+ }
+ else { /* Stereo common Window */
+ patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
+ patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
+
+ /* Set synchronized Blocktype */
+ blockSwitchingControlLeft->windowSequence = patchType;
+ blockSwitchingControlRight->windowSequence = patchType;
+
+ /* 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;
+
+ for (i=1; i<TRANS_FAC; i++) {
+ blockSwitchingControlLeft->groupLen[i] = 0;
+ blockSwitchingControlRight->groupLen[i] = 0;
+ }
+ }
+ else {
+
+ if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
+ /* Left Channel wins */
+ blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
+ for (i=0; i<TRANS_FAC; i++) {
+ blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
+ }
+ }
+ else {
+ /* Right Channel wins */
+ blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
+ for (i=0; i<TRANS_FAC; i++) {
+ blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
+ }
+ }
+ }
+ } /*endif Mono or Stereo */
+
+ return(TRUE);
+}
diff --git a/media/libstagefright/codecs/aacenc/src/channel_map.c b/media/libstagefright/codecs/aacenc/src/channel_map.c
new file mode 100644
index 0000000..247293b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/channel_map.c
@@ -0,0 +1,123 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: channel_map.c
+
+ Content: channel mapping functions
+
+*******************************************************************************/
+
+#include "channel_map.h"
+#include "bitenc.h"
+#include "psy_const.h"
+#include "qc_data.h"
+
+static const Word16 maxChannelBits = MAXBITS_COEF;
+
+static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
+{
+ Word16 error=0;
+
+ elInfo->elType=elType;
+
+ switch(elInfo->elType) {
+
+ case ID_SCE:
+ elInfo->nChannelsInEl=1;
+
+ elInfo->ChannelIndex[0]=0;
+
+ elInfo->instanceTag=0;
+ break;
+
+ case ID_CPE:
+
+ elInfo->nChannelsInEl=2;
+
+ elInfo->ChannelIndex[0]=0;
+ elInfo->ChannelIndex[1]=1;
+
+ elInfo->instanceTag=0;
+ break;
+
+ default:
+ error=1;
+ }
+
+ return error;
+}
+
+
+Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
+{
+ Word16 error;
+ error = 0;
+
+ switch(nChannels) {
+
+ case 1:
+ initElement(elInfo, ID_SCE);
+ break;
+
+ case 2:
+ initElement(elInfo, ID_CPE);
+ break;
+
+ default:
+ error=4;
+ }
+
+ return error;
+}
+
+
+Word16 InitElementBits(ELEMENT_BITS *elementBits,
+ ELEMENT_INFO elInfo,
+ Word32 bitrateTot,
+ Word16 averageBitsTot,
+ Word16 staticBitsTot)
+{
+ Word16 error;
+ error = 0;
+
+ switch(elInfo.nChannelsInEl) {
+ case 1:
+ elementBits->chBitrate = bitrateTot;
+ elementBits->averageBits = averageBitsTot - staticBitsTot;
+ elementBits->maxBits = maxChannelBits;
+
+ elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
+ elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
+ elementBits->bitResLevel = elementBits->maxBitResBits;
+ elementBits->relativeBits = 0x4000; /* 1.0f/2 */
+ break;
+
+ case 2:
+ elementBits->chBitrate = bitrateTot >> 1;
+ elementBits->averageBits = averageBitsTot - staticBitsTot;
+ 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 */
+ break;
+
+ default:
+ error = 1;
+ }
+ return error;
+}
diff --git a/media/libstagefright/codecs/aacenc/src/dyn_bits.c b/media/libstagefright/codecs/aacenc/src/dyn_bits.c
new file mode 100644
index 0000000..3deacca
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/dyn_bits.c
@@ -0,0 +1,545 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: dyn_bits.c
+
+ Content: Noiseless coder module functions
+
+*******************************************************************************/
+
+#include "aac_rom.h"
+#include "dyn_bits.h"
+#include "bit_cnt.h"
+#include "psy_const.h"
+
+
+/*****************************************************************************
+*
+* function name: buildBitLookUp
+* description: count bits using all possible tables
+*
+*****************************************************************************/
+static void
+buildBitLookUp(const Word16 *quantSpectrum,
+ const Word16 maxSfb,
+ const Word16 *sfbOffset,
+ const UWord16 *sfbMax,
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ SECTION_INFO * sectionInfo)
+{
+ Word32 i;
+
+ 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];
+ bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: findBestBook
+* description: essential helper functions
+*
+*****************************************************************************/
+static Word16
+findBestBook(const Word16 *bc, Word16 *book)
+{
+ Word32 minBits, j;
+ minBits = INVALID_BITCOUNT;
+
+ for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
+
+ if (bc[j] < minBits) {
+ minBits = bc[j];
+ *book = j;
+ }
+ }
+ return extract_l(minBits);
+}
+
+static Word16
+findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
+{
+ Word32 minBits, j, sum;
+ minBits = INVALID_BITCOUNT;
+
+ for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
+ sum = bc1[j] + bc2[j];
+ if (sum < minBits) {
+ minBits = sum;
+ }
+ }
+ return extract_l(minBits);
+}
+
+static void
+mergeBitLookUp(Word16 *bc1, const Word16 *bc2)
+{
+ Word32 j;
+
+ for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
+ bc1[j] = min(bc1[j] + bc2[j], INVALID_BITCOUNT);
+ }
+}
+
+static Word16
+findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG],
+ const SECTION_INFO *sectionInfo,
+ const Word16 maxSfb, Word16 *maxNdx)
+{
+ Word32 i, maxMergeGain;
+ maxMergeGain = 0;
+
+ for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
+
+ if (mergeGainLookUp[i] > maxMergeGain) {
+ maxMergeGain = mergeGainLookUp[i];
+ *maxNdx = i;
+ }
+ }
+ return extract_l(maxMergeGain);
+}
+
+
+
+static Word16
+CalcMergeGain(const SECTION_INFO *sectionInfo,
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ const Word16 *sideInfoTab,
+ const Word16 ndx1,
+ const Word16 ndx2)
+{
+ Word32 SplitBits;
+ Word32 MergeBits;
+ Word32 MergeGain;
+
+ /*
+ Bit amount for splitted sections
+ */
+ SplitBits = sectionInfo[ndx1].sectionBits + sectionInfo[ndx2].sectionBits;
+
+ MergeBits = sideInfoTab[sectionInfo[ndx1].sfbCnt + sectionInfo[ndx2].sfbCnt] +
+ findMinMergeBits(bitLookUp[ndx1], bitLookUp[ndx2]);
+ MergeGain = (SplitBits - MergeBits);
+
+ return extract_l(MergeGain);
+}
+
+/*
+ sectioning Stage 0:find minimum codbooks
+*/
+
+static void
+gmStage0(SECTION_INFO * sectionInfo,
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ const Word16 maxSfb)
+{
+ Word32 i;
+
+ 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));
+ }
+ }
+}
+
+/*
+ sectioning Stage 1:merge all connected regions with the same code book and
+ calculate side info
+*/
+
+static void
+gmStage1(SECTION_INFO * sectionInfo,
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ const Word16 maxSfb,
+ const Word16 *sideInfoTab)
+{
+ SECTION_INFO * sectionInfo_s;
+ SECTION_INFO * sectionInfo_e;
+ Word32 mergeStart, mergeEnd;
+ mergeStart = 0;
+
+ do {
+
+ sectionInfo_s = sectionInfo + mergeStart;
+ for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
+ sectionInfo_e = sectionInfo + mergeEnd;
+ if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
+ break;
+ sectionInfo_s->sfbCnt += 1;
+ sectionInfo_s->sectionBits += sectionInfo_e->sectionBits;
+
+ mergeBitLookUp(bitLookUp[mergeStart], bitLookUp[mergeEnd]);
+ }
+
+ sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt];
+ sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */
+
+ mergeStart = mergeEnd;
+
+
+ } while (mergeStart - maxSfb < 0);
+}
+
+/*
+ sectioning Stage 2:greedy merge algorithm, merge connected sections with
+ maximum bit gain until no more gain is possible
+*/
+static void
+gmStage2(SECTION_INFO *sectionInfo,
+ Word16 mergeGainLookUp[MAX_SFB_LONG],
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ const Word16 maxSfb,
+ const Word16 *sideInfoTab)
+{
+ Word16 i;
+
+ for (i=0; i+sectionInfo[i].sfbCnt<maxSfb; i+=sectionInfo[i].sfbCnt) {
+ mergeGainLookUp[i] = CalcMergeGain(sectionInfo,
+ bitLookUp,
+ sideInfoTab,
+ i,
+ (i + sectionInfo[i].sfbCnt));
+ }
+
+ while (TRUE) {
+ Word16 maxMergeGain, maxNdx, maxNdxNext, maxNdxLast;
+
+ maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
+
+
+ if (maxMergeGain <= 0)
+ break;
+
+
+ maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
+
+ sectionInfo[maxNdx].sfbCnt = sectionInfo[maxNdx].sfbCnt + sectionInfo[maxNdxNext].sfbCnt;
+ sectionInfo[maxNdx].sectionBits = sectionInfo[maxNdx].sectionBits +
+ (sectionInfo[maxNdxNext].sectionBits - maxMergeGain);
+
+
+ mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
+
+
+ if (maxNdx != 0) {
+ maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
+ mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
+ bitLookUp,
+ sideInfoTab,
+ maxNdxLast,
+ maxNdx);
+ }
+ maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
+
+ sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
+
+
+ if (maxNdxNext - maxSfb < 0) {
+ mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
+ bitLookUp,
+ sideInfoTab,
+ maxNdx,
+ maxNdxNext);
+ }
+ }
+}
+
+/*
+ count bits used by the noiseless coder
+*/
+static void
+noiselessCounter(SECTION_DATA *sectionData,
+ Word16 mergeGainLookUp[MAX_SFB_LONG],
+ Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
+ const Word16 *quantSpectrum,
+ const UWord16 *maxValueInSfb,
+ const Word16 *sfbOffset,
+ const Word32 blockType)
+{
+ Word32 grpNdx, i;
+ Word16 *sideInfoTab = NULL;
+ SECTION_INFO *sectionInfo;
+
+ /*
+ use appropriate side info table
+ */
+ switch (blockType)
+ {
+ case LONG_WINDOW:
+ case START_WINDOW:
+ case STOP_WINDOW:
+ sideInfoTab = sideInfoTabLong;
+ break;
+ case SHORT_WINDOW:
+ sideInfoTab = sideInfoTabShort;
+ break;
+ }
+
+
+ sectionData->noOfSections = 0;
+ sectionData->huffmanBits = 0;
+ sectionData->sideInfoBits = 0;
+
+
+ if (sectionData->maxSfbPerGroup == 0)
+ return;
+
+ /*
+ loop trough groups
+ */
+ for (grpNdx=0; grpNdx<sectionData->sfbCnt; grpNdx+=sectionData->sfbPerGroup) {
+
+ sectionInfo = sectionData->sectionInfo + sectionData->noOfSections;
+
+ buildBitLookUp(quantSpectrum,
+ sectionData->maxSfbPerGroup,
+ sfbOffset + grpNdx,
+ maxValueInSfb + grpNdx,
+ bitLookUp,
+ sectionInfo);
+
+ /*
+ 0.Stage
+ */
+ gmStage0(sectionInfo, bitLookUp, sectionData->maxSfbPerGroup);
+
+ /*
+ 1.Stage
+ */
+ gmStage1(sectionInfo, bitLookUp, sectionData->maxSfbPerGroup, sideInfoTab);
+
+
+ /*
+ 2.Stage
+ */
+ gmStage2(sectionInfo,
+ mergeGainLookUp,
+ bitLookUp,
+ sectionData->maxSfbPerGroup,
+ sideInfoTab);
+
+
+ /*
+ compress output, calculate total huff and side bits
+ */
+ for (i=0; i<sectionData->maxSfbPerGroup; i+=sectionInfo[i].sfbCnt) {
+ findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
+ sectionInfo[i].sfbStart = sectionInfo[i].sfbStart + grpNdx;
+
+ 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->noOfSections = sectionData->noOfSections + 1;
+ }
+ }
+}
+
+
+/*******************************************************************************
+*
+* functionname: scfCount
+* returns : ---
+* description : count bits used by scalefactors.
+*
+********************************************************************************/
+static void scfCount(const Word16 *scalefacGain,
+ const UWord16 *maxValueInSfb,
+ SECTION_DATA * sectionData)
+
+{
+ SECTION_INFO *psectionInfo;
+ SECTION_INFO *psectionInfom;
+
+ /* counter */
+ Word32 i = 0; /* section counter */
+ Word32 j = 0; /* sfb counter */
+ Word32 k = 0; /* current section auxiliary counter */
+ Word32 m = 0; /* other section auxiliary counter */
+ Word32 n = 0; /* other sfb auxiliary counter */
+
+ /* further variables */
+ Word32 lastValScf = 0;
+ Word32 deltaScf = 0;
+ Flag found = 0;
+ Word32 scfSkipCounter = 0;
+
+
+ sectionData->scalefacBits = 0;
+
+
+ if (scalefacGain == NULL) {
+ return;
+ }
+
+ 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];
+ break;
+ }
+ psectionInfo += 1;
+ }
+
+ 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;
+
+ if (scfSkipCounter == 0) {
+ /* end of section */
+
+ if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 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;
+
+ if ( tmp < CODE_BOOK_SCF_LAV) {
+ /* save bits */
+ deltaScf = 0;
+ }
+ else {
+ /* do not save bits */
+ deltaScf = lastValScf - scalefacGain[j];
+ lastValScf = scalefacGain[j];
+ scfSkipCounter = 0;
+ }
+ break;
+ }
+ /* count scalefactor skip */
+ 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;
+
+ if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
+ deltaScf = 0;
+ }
+ else {
+ deltaScf = (lastValScf - scalefacGain[j]);
+ lastValScf = scalefacGain[j];
+ scfSkipCounter = 0;
+ }
+ break;
+ }
+ /* count scalefactor skip */
+ scfSkipCounter = scfSkipCounter + 1;
+ }
+ }
+
+ psectionInfom += 1;
+ }
+
+ if (found == 0) {
+ deltaScf = 0;
+ scfSkipCounter = 0;
+ }
+ }
+ else {
+ deltaScf = 0;
+ scfSkipCounter = scfSkipCounter - 1;
+ }
+ }
+ else {
+ deltaScf = lastValScf - scalefacGain[j];
+ lastValScf = scalefacGain[j];
+ }
+ sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
+ }
+ }
+ }
+}
+
+
+typedef Word16 (*lookUpTable)[CODE_BOOK_ESC_NDX + 1];
+
+
+Word16
+dynBitCount(const Word16 *quantSpectrum,
+ const UWord16 *maxValueInSfb,
+ const Word16 *scalefac,
+ const Word16 blockType,
+ const Word16 sfbCnt,
+ const Word16 maxSfbPerGroup,
+ const Word16 sfbPerGroup,
+ const Word16 *sfbOffset,
+ SECTION_DATA *sectionData)
+{
+ sectionData->blockType = blockType;
+ sectionData->sfbCnt = sfbCnt;
+ sectionData->sfbPerGroup = sfbPerGroup;
+ if(sfbPerGroup)
+ sectionData->noOfGroups = sfbCnt/sfbPerGroup;
+ else
+ sectionData->noOfGroups = 0x7fff;
+ sectionData->maxSfbPerGroup = maxSfbPerGroup;
+
+ noiselessCounter(sectionData,
+ sectionData->mergeGainLookUp,
+ (lookUpTable)sectionData->bitLookUp,
+ quantSpectrum,
+ maxValueInSfb,
+ sfbOffset,
+ blockType);
+
+ scfCount(scalefac,
+ maxValueInSfb,
+ sectionData);
+
+
+ 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
new file mode 100644
index 0000000..08d9a76
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/grp_data.c
@@ -0,0 +1,188 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: grp_data.c
+
+ Content: Short block grouping function
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "psy_const.h"
+#include "interface.h"
+#include "grp_data.h"
+
+/*****************************************************************************
+*
+* function name: groupShortData
+* description: group short data for next quantization and coding
+*
+**********************************************************************************/
+void
+groupShortData(Word32 *mdctSpectrum,
+ Word32 *tmpSpectrum,
+ SFB_THRESHOLD *sfbThreshold,
+ SFB_ENERGY *sfbEnergy,
+ SFB_ENERGY *sfbEnergyMS,
+ SFB_ENERGY *sfbSpreadedEnergy,
+ const Word16 sfbCnt,
+ const Word16 *sfbOffset,
+ const Word16 *sfbMinSnr,
+ Word16 *groupedSfbOffset,
+ Word16 *maxSfbPerGroup,
+ Word16 *groupedSfbMinSnr,
+ const Word16 noOfGroups,
+ const Word16 *groupLen)
+{
+ Word32 i, j;
+ Word32 line;
+ Word32 sfb;
+ Word32 grp;
+ Word32 wnd;
+ Word32 offset;
+ Word32 highestSfb;
+
+ /* for short: regroup and */
+ /* cumulate energies und thresholds group-wise . */
+
+ /* calculate sfbCnt */
+ 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 (line >= sfbOffset[sfb]) break;
+ }
+ highestSfb = max(highestSfb, sfb);
+ }
+
+ if (highestSfb < 0) {
+ highestSfb = 0;
+ }
+ *maxSfbPerGroup = highestSfb + 1;
+
+ /* calculate sfbOffset */
+ i = 0;
+ offset = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; sfb++) {
+ groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
+ i += 1;
+ }
+ offset += groupLen[grp] * FRAME_LEN_SHORT;
+ }
+ groupedSfbOffset[i] = FRAME_LEN_LONG;
+ i += 1;
+
+ /* calculate minSnr */
+ i = 0;
+ offset = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; sfb++) {
+ groupedSfbMinSnr[i] = sfbMinSnr[sfb];
+ i += 1;
+ }
+ offset += groupLen[grp] * FRAME_LEN_SHORT;
+ }
+
+
+ /* sum up sfbThresholds */
+ wnd = 0;
+ i = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; 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;
+ i += 1;
+ }
+ wnd += groupLen[grp];
+ }
+
+ /* sum up sfbEnergies left/right */
+ wnd = 0;
+ i = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; 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;
+ i += 1;
+ }
+ wnd += groupLen[grp];
+ }
+
+ /* sum up sfbEnergies mid/side */
+ wnd = 0;
+ i = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; 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;
+ i += 1;
+ }
+ wnd += groupLen[grp];
+ }
+
+ /* sum up sfbSpreadedEnergies */
+ wnd = 0;
+ i = 0;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ for (sfb = 0; sfb < sfbCnt; 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;
+ i += 1;
+ }
+ wnd += groupLen[grp];
+ }
+
+ /* re-group spectrum */
+ 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];
+ i = i + 1;
+ }
+ }
+ }
+ wnd += groupLen[grp];
+ }
+
+ 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];
+ }
+}
+
diff --git a/media/libstagefright/codecs/aacenc/src/interface.c b/media/libstagefright/codecs/aacenc/src/interface.c
new file mode 100644
index 0000000..304b1d4
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/interface.c
@@ -0,0 +1,112 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: interface.c
+
+ Content: Interface psychoaccoustic/quantizer functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "psy_const.h"
+#include "interface.h"
+
+/*****************************************************************************
+*
+* function name: BuildInterface
+* description: update output parameter
+*
+**********************************************************************************/
+void BuildInterface(Word32 *groupedMdctSpectrum,
+ const Word16 mdctScale,
+ SFB_THRESHOLD *groupedSfbThreshold,
+ SFB_ENERGY *groupedSfbEnergy,
+ SFB_ENERGY *groupedSfbSpreadedEnergy,
+ const SFB_ENERGY_SUM sfbEnergySumLR,
+ const SFB_ENERGY_SUM sfbEnergySumMS,
+ const Word16 windowSequence,
+ const Word16 windowShape,
+ const Word16 groupedSfbCnt,
+ const Word16 *groupedSfbOffset,
+ const Word16 maxSfbPerGroup,
+ const Word16 *groupedSfbMinSnr,
+ const Word16 noOfGroups,
+ const Word16 *groupLen,
+ PSY_OUT_CHANNEL *psyOutCh)
+{
+ Word32 j;
+ Word32 grp;
+ Word32 mask;
+ Word16 *tmpV;
+
+ /*
+ copy values to psyOut
+ */
+ 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->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;
+ for (grp = 0; grp < noOfGroups; grp++) {
+ mask = mask << 1;
+ for (j=1; j<groupLen[grp]; j++) {
+ mask = mask << 1;
+ mask |= 1;
+ }
+ }
+ psyOutCh->groupingMask = mask;
+
+ if (windowSequence != SHORT_WINDOW) {
+ psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
+ psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
+ }
+ else {
+ Word32 i;
+ Word32 accuSumMS=0;
+ Word32 accuSumLR=0;
+ Word32 *pSumMS = sfbEnergySumMS.sfbShort;
+ Word32 *pSumLR = sfbEnergySumLR.sfbShort;
+
+ for (i=TRANS_FAC; i; i--) {
+ accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
+ accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
+ }
+ 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
new file mode 100644
index 0000000..da57647
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/line_pe.c
@@ -0,0 +1,145 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: line_pe.c
+
+ Content: Perceptual entropie module functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "typedef.h"
+#include "line_pe.h"
+
+
+static const Word16 C1_I = 12; /* log(8.0)/log(2) *4 */
+static const Word32 C2_I = 10830; /* log(2.5)/log(2) * 1024 * 4 * 2 */
+static const Word16 C3_I = 573; /* (1-C2/C1) *1024 */
+
+
+/*****************************************************************************
+*
+* function name: prepareSfbPe
+* description: constants that do not change during successive pe calculations
+*
+**********************************************************************************/
+void prepareSfbPe(PE_DATA *peData,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels,
+ const Word16 peOffset)
+{
+ Word32 sfbGrp, sfb;
+ 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];
+ }
+ }
+ }
+ peData->offset = peOffset;
+}
+
+
+/*****************************************************************************
+*
+* function name: calcSfbPe
+* description: constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr)
+*
+**********************************************************************************/
+void calcSfbPe(PE_DATA *peData,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels)
+{
+ Word32 ch;
+ Word32 sfbGrp, sfb;
+ Word32 nLines4;
+ Word32 ldThr, ldRatio;
+ Word32 pe, constPart, nActiveLines;
+
+ 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;
+
+ 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 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
+
+ if (nrg > thres) {
+ ldThr = iLog4(thres);
+
+ ldRatio = sfbLDEn - ldThr;
+
+ nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
+
+ /* sfbPe = nl*log2(en/thr)*/
+ if (ldRatio >= C1_I) {
+ peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
+ peChanData->sfbConstPart[sfbGrp+sfb] = ((nLines4*sfbLDEn)) >> 4;
+ }
+ else {
+ /* sfbPe = nl*(c2 + c3*log2(en/thr))*/
+ peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx(
+ (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3);
+ peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx(
+ (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3);
+ nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10;
+ }
+ peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
+ }
+ else {
+ 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);
+
+
+ pe += peData->pe;
+ peData->pe = saturate(pe);
+ constPart += peData->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
new file mode 100644
index 0000000..7d203527
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/memalign.c
@@ -0,0 +1,107 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*******************************************************************************
+ File: mem_align.c
+
+ Content: Memory alloc alignments functions
+
+*******************************************************************************/
+
+
+#include "memalign.h"
+
+/*****************************************************************************
+*
+* function name: mem_malloc
+* description: malloc the alignments memory
+* returns: the point of the memory
+*
+**********************************************************************************/
+void *
+mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
+{
+ int ret;
+ unsigned char *mem_ptr;
+ VO_MEM_INFO MemInfo;
+
+ if (!alignment) {
+
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + 1;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
+ mem_ptr = (unsigned char *)MemInfo.VBuffer;
+
+ pMemop->Set(CodecID, mem_ptr, 0, size + 1);
+
+ *mem_ptr = (unsigned char)1;
+
+ return ((void *)(mem_ptr+1));
+ } else {
+ unsigned char *tmp;
+
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + alignment;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
+
+ tmp = (unsigned char *)MemInfo.VBuffer;
+
+ pMemop->Set(CodecID, tmp, 0, size + alignment);
+
+ mem_ptr =
+ (unsigned char *) ((unsigned int) (tmp + alignment - 1) &
+ (~((unsigned int) (alignment - 1))));
+
+ if (mem_ptr == tmp)
+ mem_ptr += alignment;
+
+ *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
+
+ return ((void *)mem_ptr);
+ }
+
+ return(0);
+}
+
+
+/*****************************************************************************
+*
+* function name: mem_free
+* description: free the memory
+*
+*******************************************************************************/
+void
+mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
+{
+
+ unsigned char *ptr;
+
+ if (mem_ptr == 0)
+ return;
+
+ ptr = mem_ptr;
+
+ ptr -= *(ptr - 1);
+
+ pMemop->Free(CodecID, ptr);
+}
+
+
+
diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c
new file mode 100644
index 0000000..c83d07b
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/ms_stereo.c
@@ -0,0 +1,139 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: ms_stereo.c
+
+ Content: MS stereo processing function
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "psy_const.h"
+#include "ms_stereo.h"
+
+
+/********************************************************************************
+*
+* function name: MsStereoProcessing
+* description: detect use ms stereo or not
+* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn))
+* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo
+*
+**********************************************************************************/
+void MsStereoProcessing(Word32 *sfbEnergyLeft,
+ Word32 *sfbEnergyRight,
+ const Word32 *sfbEnergyMid,
+ const Word32 *sfbEnergySide,
+ Word32 *mdctSpectrumLeft,
+ Word32 *mdctSpectrumRight,
+ Word32 *sfbThresholdLeft,
+ Word32 *sfbThresholdRight,
+ Word32 *sfbSpreadedEnLeft,
+ Word32 *sfbSpreadedEnRight,
+ Word16 *msDigest,
+ Word16 *msMask,
+ const Word16 sfbCnt,
+ const Word16 sfbPerGroup,
+ const Word16 maxSfbPerGroup,
+ const Word16 *sfbOffset) {
+ Word32 temp;
+ Word32 sfb,sfboffs, j;
+ Word32 msMaskTrueSomewhere = 0;
+ Word32 msMaskFalseSomewhere = 0;
+
+ for (sfb=0; sfb<sfbCnt; sfb+=sfbPerGroup) {
+ for (sfboffs=0;sfboffs<maxSfbPerGroup;sfboffs++) {
+
+ Word32 temp;
+ Word32 pnlr,pnms;
+ Word32 minThreshold;
+ Word32 thrL, thrR, nrgL, nrgR;
+ Word32 idx, shift;
+
+ idx = sfb + sfboffs;
+
+ thrL = sfbThresholdLeft[idx];
+ thrR = sfbThresholdRight[idx];
+ nrgL = sfbEnergyLeft[idx];
+ nrgR = sfbEnergyRight[idx];
+
+ minThreshold = min(thrL, thrR);
+
+ nrgL = max(nrgL,thrL) + 1;
+ shift = norm_l(nrgL);
+ nrgL = Div_32(thrL << shift, nrgL << shift);
+ nrgR = max(nrgR,thrR) + 1;
+ shift = norm_l(nrgR);
+ nrgR = Div_32(thrR << shift, nrgR << shift);
+
+ pnlr = fixmul(nrgL, nrgR);
+
+ nrgL = sfbEnergyMid[idx];
+ nrgR = sfbEnergySide[idx];
+
+ nrgL = max(nrgL,minThreshold) + 1;
+ shift = norm_l(nrgL);
+ nrgL = Div_32(minThreshold << shift, nrgL << shift);
+
+ nrgR = max(nrgR,minThreshold) + 1;
+ shift = norm_l(nrgR);
+ nrgR = Div_32(minThreshold << shift, nrgR << shift);
+
+ pnms = fixmul(nrgL, nrgR);
+
+ temp = (pnlr + 1) / ((pnms >> 8) + 1);
+
+ temp = pnms - pnlr;
+ if( temp > 0 ){
+
+ 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;
+ }
+
+ 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;
+ }
+ }
+ if ( msMaskTrueSomewhere ) {
+ if(msMaskFalseSomewhere ) {
+ *msDigest = SI_MS_MASK_SOME;
+ } else {
+ *msDigest = SI_MS_MASK_ALL;
+ }
+ } else {
+ *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
new file mode 100644
index 0000000..f59216e
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
@@ -0,0 +1,113 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: pre_echo_control.c
+
+ Content: Pre echo control functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+
+#include "oper_32b.h"
+#include "pre_echo_control.h"
+
+
+/*****************************************************************************
+*
+* function name:InitPreEchoControl
+* description: init pre echo control parameter
+*
+*****************************************************************************/
+void InitPreEchoControl(Word32 *pbThresholdNm1,
+ Word16 numPb,
+ Word32 *pbThresholdQuiet)
+{
+ Word16 pb;
+
+ for(pb=0; pb<numPb; pb++) {
+ pbThresholdNm1[pb] = pbThresholdQuiet[pb];
+ }
+}
+
+/*****************************************************************************
+*
+* function name:PreEchoControl
+* description: update shreshold to avoid pre echo
+* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
+*
+*
+*****************************************************************************/
+void PreEchoControl(Word32 *pbThresholdNm1,
+ Word16 numPb,
+ Word32 maxAllowedIncreaseFactor,
+ Word16 minRemainingThresholdFactor,
+ Word32 *pbThreshold,
+ Word16 mdctScale,
+ Word16 mdctScalenm1)
+{
+ Word32 i;
+ Word32 tmpThreshold1, tmpThreshold2;
+ Word32 scaling;
+
+ /* maxAllowedIncreaseFactor is hard coded to 2 */
+ (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];
+
+
+ if(pbThreshold[i] > tmpThreshold1) {
+ pbThreshold[i] = tmpThreshold1;
+ }
+
+ if(tmpThreshold2 > pbThreshold[i]) {
+ pbThreshold[i] = tmpThreshold2;
+ }
+
+ }
+ }
+ else {
+ scaling = -scaling;
+ for(i = 0; i < numPb; i++) {
+
+ tmpThreshold1 = pbThresholdNm1[i] << 1;
+ tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
+
+ /* copy thresholds to internal memory */
+ pbThresholdNm1[i] = pbThreshold[i];
+
+
+ if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
+ pbThreshold[i] = tmpThreshold1 << scaling;
+ }
+
+ if(tmpThreshold2 > pbThreshold[i]) {
+ pbThreshold[i] = tmpThreshold2;
+ }
+
+ }
+ }
+}
+
diff --git a/media/libstagefright/codecs/aacenc/src/psy_configuration.c b/media/libstagefright/codecs/aacenc/src/psy_configuration.c
new file mode 100644
index 0000000..586e00f
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/psy_configuration.c
@@ -0,0 +1,505 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_configuration.c
+
+ Content: Psychoaccoustic configuration functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "psy_configuration.h"
+#include "adj_thr.h"
+#include "aac_rom.h"
+
+
+
+#define BARC_SCALE 100 /* integer barc values are scaled with 100 */
+#define LOG2_1000 301 /* log2*1000 */
+#define PI2_1000 1571 /* pi/2*1000*/
+#define ATAN_COEF1 3560 /* 1000/0.280872f*/
+#define ATAN_COEF2 281 /* 1000*0.280872f*/
+
+
+typedef struct{
+ Word32 sampleRate;
+ const UWord8 *paramLong;
+ const UWord8 *paramShort;
+}SFB_INFO_TAB;
+
+static const Word16 ABS_LEV = 20;
+static const Word16 BARC_THR_QUIET[] = {15, 10, 7, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 5, 10, 20, 30};
+
+
+
+static const Word16 max_bark = 24; /* maximum bark-value */
+static const Word16 maskLow = 30; /* in 1dB/bark */
+static const Word16 maskHigh = 15; /* in 1*dB/bark */
+static const Word16 c_ratio = 0x0029; /* pow(10.0f, -(29.0f/10.0f)) */
+
+static const Word16 maskLowSprEnLong = 30; /* in 1dB/bark */
+static const Word16 maskHighSprEnLong = 20; /* in 1dB/bark */
+static const Word16 maskHighSprEnLongLowBr = 15; /* in 1dB/bark */
+static const Word16 maskLowSprEnShort = 20; /* in 1dB/bark */
+static const Word16 maskHighSprEnShort = 15; /* in 1dB/bark */
+static const Word16 c_minRemainingThresholdFactor = 0x0148; /* 0.01 *(1 << 15)*/
+static const Word32 c_maxsnr = 0x66666666; /* upper limit is -1 dB */
+static const Word32 c_minsnr = 0x00624dd3; /* lower limit is -25 dB */
+
+static const Word32 c_maxClipEnergyLong = 0x77359400; /* 2.0e9f*/
+static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/
+
+
+Word32 GetSRIndex(Word32 sampleRate)
+{
+ if (92017 <= sampleRate) return 0;
+ if (75132 <= sampleRate) return 1;
+ if (55426 <= sampleRate) return 2;
+ if (46009 <= sampleRate) return 3;
+ if (37566 <= sampleRate) return 4;
+ if (27713 <= sampleRate) return 5;
+ if (23004 <= sampleRate) return 6;
+ if (18783 <= sampleRate) return 7;
+ if (13856 <= sampleRate) return 8;
+ if (11502 <= sampleRate) return 9;
+ if (9391 <= sampleRate) return 10;
+
+ return 11;
+}
+
+
+/*********************************************************************************
+*
+* function name: atan_1000
+* description: calculates 1000*atan(x/1000)
+* based on atan approx for x > 0
+* atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1
+* = pi/2 - x/((float)0.280872f +x*x) if x >= 1
+* return: 1000*atan(x/1000)
+*
+**********************************************************************************/
+static Word16 atan_1000(Word32 val)
+{
+ Word32 y;
+
+
+ if(L_sub(val, 1000) < 0) {
+ y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
+ }
+ else {
+ y = PI2_1000 - ((1000 * val) / (ATAN_COEF2 + ((val * val) / 1000)));
+ }
+
+ return extract_l(y);
+}
+
+
+/*****************************************************************************
+*
+* function name: BarcLineValue
+* description: Calculates barc value for one frequency line
+* returns: barc value of line * BARC_SCALE
+* input: number of lines in transform, index of line to check, Fs
+* output:
+*
+*****************************************************************************/
+static Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFreq)
+{
+ Word32 center_freq, temp, bvalFFTLine;
+
+ /* center frequency of fft line */
+ center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
+ temp = atan_1000((center_freq << 2) / (3*10));
+ bvalFFTLine =
+ (26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
+
+ return saturate(bvalFFTLine);
+}
+
+/*****************************************************************************
+*
+* function name: initThrQuiet
+* description: init thredhold in quiet
+*
+*****************************************************************************/
+static void initThrQuiet(Word16 numPb,
+ Word16 *pbOffset,
+ Word16 *pbBarcVal,
+ Word32 *pbThresholdQuiet) {
+ Word16 i;
+ Word16 barcThrQuiet;
+
+ 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];
+ }
+
+ bv1 = min((bv1 / BARC_SCALE), max_bark);
+ bv2 = min((bv2 / BARC_SCALE), max_bark);
+
+ barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
+
+
+ /*
+ we calculate
+ pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
+ */
+
+ pbThresholdQuiet[i] = pow2_xy((((barcThrQuiet - ABS_LEV) * 100) +
+ LOG2_1000*(14+2*LOG_NORM_PCM)), LOG2_1000) * (pbOffset[i+1] - pbOffset[i]);
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: initSpreading
+* description: init energy spreading parameter
+*
+*****************************************************************************/
+static void initSpreading(Word16 numPb,
+ Word16 *pbBarcValue,
+ Word16 *pbMaskLoFactor,
+ Word16 *pbMaskHiFactor,
+ Word16 *pbMaskLoFactorSprEn,
+ Word16 *pbMaskHiFactorSprEn,
+ const Word32 bitrate,
+ const Word16 blockType)
+{
+ Word16 i;
+ Word16 maskLowSprEn, maskHighSprEn;
+
+
+ if (sub(blockType, SHORT_WINDOW) != 0) {
+ maskLowSprEn = maskLowSprEnLong;
+
+ if (bitrate > 22000)
+ maskHighSprEn = maskHighSprEnLong;
+ else
+ maskHighSprEn = maskHighSprEnLongLowBr;
+ }
+ else {
+ 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)
+ */
+ 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));
+
+
+ dbVal = (maskHighSprEn * dbark);
+ 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;
+
+ pbMaskHiFactorSprEn[i] = 0;
+ pbMaskLoFactorSprEn[numPb-1] = 0;
+ }
+ }
+
+}
+
+
+/*****************************************************************************
+*
+* function name: initBarcValues
+* description: init bark value
+*
+*****************************************************************************/
+static void initBarcValues(Word16 numPb,
+ Word16 *pbOffset,
+ Word16 numLines,
+ Word32 samplingFrequency,
+ Word16 *pbBval)
+{
+ Word16 i;
+ Word16 pbBval0, pbBval1;
+
+ pbBval0 = 0;
+
+ for(i=0; i<numPb; i++){
+ pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
+ pbBval[i] = (pbBval0 + pbBval1) >> 1;
+ pbBval0 = pbBval1;
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: initMinSnr
+* description: calculate min snr parameter
+* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)
+*
+*****************************************************************************/
+static void initMinSnr(const Word32 bitrate,
+ const Word32 samplerate,
+ const Word16 numLines,
+ const Word16 *sfbOffset,
+ const Word16 *pbBarcVal,
+ const Word16 sfbActive,
+ Word16 *sfbMinSnr)
+{
+ Word16 sfb;
+ Word16 barcWidth;
+ Word16 pePerWindow;
+ Word32 pePart;
+ Word32 snr;
+ Word16 pbVal0, pbVal1, shift;
+
+ /* relative number of active barks */
+
+
+ pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
+
+ pbVal0 = 0;
+
+ for (sfb=0; sfb<sfbActive; sfb++) {
+
+ pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
+ barcWidth = pbVal1 - pbVal0;
+ 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 = 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);
+ }
+ else
+ {
+ snr = 0x7fffffff;
+ }
+
+ /* upper limit is -1 dB */
+ snr = min(snr, c_maxsnr);
+ /* lower limit is -25 dB */
+ snr = max(snr, c_minsnr);
+ sfbMinSnr[sfb] = round16(snr);
+ }
+
+}
+
+/*****************************************************************************
+*
+* function name: InitPsyConfigurationLong
+* description: init long block psychoacoustic configuration
+*
+*****************************************************************************/
+Word16 InitPsyConfigurationLong(Word32 bitrate,
+ Word32 samplerate,
+ Word16 bandwidth,
+ PSY_CONFIGURATION_LONG *psyConf)
+{
+ Word32 samplerateindex;
+ Word16 sfbBarcVal[MAX_SFB_LONG];
+ Word16 sfb;
+
+ /*
+ init sfb table
+ */
+ samplerateindex = GetSRIndex(samplerate);
+ psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
+ psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
+ psyConf->sampRateIdx = samplerateindex;
+
+ /*
+ calculate barc values for each pb
+ */
+ initBarcValues(psyConf->sfbCnt,
+ psyConf->sfbOffset,
+ psyConf->sfbOffset[psyConf->sfbCnt],
+ samplerate,
+ sfbBarcVal);
+
+ /*
+ init thresholds in quiet
+ */
+ initThrQuiet(psyConf->sfbCnt,
+ psyConf->sfbOffset,
+ sfbBarcVal,
+ psyConf->sfbThresholdQuiet);
+
+ /*
+ calculate spreading function
+ */
+ initSpreading(psyConf->sfbCnt,
+ sfbBarcVal,
+ psyConf->sfbMaskLowFactor,
+ psyConf->sfbMaskHighFactor,
+ psyConf->sfbMaskLowFactorSprEn,
+ psyConf->sfbMaskHighFactorSprEn,
+ bitrate,
+ LONG_WINDOW);
+
+ /*
+ init ratio
+ */
+ psyConf->ratio = c_ratio;
+
+ psyConf->maxAllowedIncreaseFactor = 2;
+ psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
+
+ 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;
+
+ /*
+ calculate minSnr
+ */
+ initMinSnr(bitrate,
+ samplerate,
+ psyConf->sfbOffset[psyConf->sfbCnt],
+ psyConf->sfbOffset,
+ sfbBarcVal,
+ psyConf->sfbActive,
+ psyConf->sfbMinSnr);
+
+
+ return(0);
+}
+
+/*****************************************************************************
+*
+* function name: InitPsyConfigurationShort
+* description: init short block psychoacoustic configuration
+*
+*****************************************************************************/
+Word16 InitPsyConfigurationShort(Word32 bitrate,
+ Word32 samplerate,
+ Word16 bandwidth,
+ PSY_CONFIGURATION_SHORT *psyConf)
+{
+ Word32 samplerateindex;
+ Word16 sfbBarcVal[MAX_SFB_SHORT];
+ Word16 sfb;
+ /*
+ init sfb table
+ */
+ samplerateindex = GetSRIndex(samplerate);
+ psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
+ psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
+ psyConf->sampRateIdx = samplerateindex;
+ /*
+ calculate barc values for each pb
+ */
+ initBarcValues(psyConf->sfbCnt,
+ psyConf->sfbOffset,
+ psyConf->sfbOffset[psyConf->sfbCnt],
+ samplerate,
+ sfbBarcVal);
+
+ /*
+ init thresholds in quiet
+ */
+ initThrQuiet(psyConf->sfbCnt,
+ psyConf->sfbOffset,
+ sfbBarcVal,
+ psyConf->sfbThresholdQuiet);
+
+ /*
+ calculate spreading function
+ */
+ initSpreading(psyConf->sfbCnt,
+ sfbBarcVal,
+ psyConf->sfbMaskLowFactor,
+ psyConf->sfbMaskHighFactor,
+ psyConf->sfbMaskLowFactorSprEn,
+ psyConf->sfbMaskHighFactorSprEn,
+ bitrate,
+ SHORT_WINDOW);
+
+ /*
+ init ratio
+ */
+ psyConf->ratio = c_ratio;
+
+ psyConf->maxAllowedIncreaseFactor = 2;
+ psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
+
+ 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;
+
+ /*
+ calculate minSnr
+ */
+ initMinSnr(bitrate,
+ samplerate,
+ psyConf->sfbOffset[psyConf->sfbCnt],
+ psyConf->sfbOffset,
+ sfbBarcVal,
+ psyConf->sfbActive,
+ psyConf->sfbMinSnr);
+
+ return(0);
+}
+
diff --git a/media/libstagefright/codecs/aacenc/src/psy_main.c b/media/libstagefright/codecs/aacenc/src/psy_main.c
new file mode 100644
index 0000000..8746a72
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/psy_main.c
@@ -0,0 +1,810 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: psy_main.c
+
+ Content: Psychoacoustic major functions
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "psy_const.h"
+#include "block_switch.h"
+#include "transform.h"
+#include "spreading.h"
+#include "pre_echo_control.h"
+#include "band_nrg.h"
+#include "psy_configuration.h"
+#include "psy_data.h"
+#include "ms_stereo.h"
+#include "interface.h"
+#include "psy_main.h"
+#include "grp_data.h"
+#include "tns_func.h"
+#include "memalign.h"
+
+/* long start short stop */
+static Word16 blockType2windowShape[] = {KBD_WINDOW,SINE_WINDOW,SINE_WINDOW,KBD_WINDOW};
+
+/*
+ forward definitions
+*/
+static Word16 advancePsychLong(PSY_DATA* psyData,
+ TNS_DATA* tnsData,
+ PSY_CONFIGURATION_LONG *hPsyConfLong,
+ PSY_OUT_CHANNEL* psyOutChannel,
+ Word32 *pScratchTns,
+ const TNS_DATA *tnsData2,
+ const Word16 ch);
+
+static Word16 advancePsychLongMS (PSY_DATA psyData[MAX_CHANNELS],
+ const PSY_CONFIGURATION_LONG *hPsyConfLong);
+
+static Word16 advancePsychShort(PSY_DATA* psyData,
+ TNS_DATA* tnsData,
+ const PSY_CONFIGURATION_SHORT *hPsyConfShort,
+ PSY_OUT_CHANNEL* psyOutChannel,
+ Word32 *pScratchTns,
+ const TNS_DATA *tnsData2,
+ const Word16 ch);
+
+static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
+ const PSY_CONFIGURATION_SHORT *hPsyConfShort);
+
+
+/*****************************************************************************
+*
+* function name: PsyNew
+* description: allocates memory for psychoacoustic
+* returns: an error code
+* input: pointer to a psych handle
+*
+*****************************************************************************/
+Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
+{
+ Word16 i;
+ Word32 *mdctSpectrum;
+ Word32 *scratchTNS;
+ Word16 *mdctDelayBuffer;
+
+ mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
+ if(NULL == mdctSpectrum)
+ return 1;
+
+ scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
+ if(NULL == scratchTNS)
+ {
+ return 1;
+ }
+
+ mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
+ if(NULL == mdctDelayBuffer)
+ {
+ return 1;
+ }
+
+ for (i=0; i<nChan; i++){
+ hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;
+ hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
+ }
+
+ hPsy->pScratchTns = scratchTNS;
+
+ return 0;
+}
+
+
+/*****************************************************************************
+*
+* function name: PsyDelete
+* description: allocates memory for psychoacoustic
+* returns: an error code
+*
+*****************************************************************************/
+Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP)
+{
+ Word32 nch;
+
+ if(hPsy)
+ {
+ if(hPsy->psyData[0].mdctDelayBuffer)
+ mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
+
+ if(hPsy->psyData[0].mdctSpectrum)
+ mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
+
+ for (nch=0; nch<MAX_CHANNELS; nch++){
+ hPsy->psyData[nch].mdctDelayBuffer = NULL;
+ hPsy->psyData[nch].mdctSpectrum = NULL;
+ }
+
+ if(hPsy->pScratchTns)
+ {
+ mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC);
+ hPsy->pScratchTns = NULL;
+ }
+ }
+
+ return 0;
+}
+
+
+/*****************************************************************************
+*
+* function name: PsyOutNew
+* description: allocates memory for psyOut struc
+* returns: an error code
+* input: pointer to a psych handle
+*
+*****************************************************************************/
+Word16 PsyOutNew(PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP)
+{
+ pMemOP->Set(VO_INDEX_ENC_AAC, hPsyOut, 0, sizeof(PSY_OUT));
+ /*
+ alloc some more stuff, tbd
+ */
+ return 0;
+}
+
+/*****************************************************************************
+*
+* function name: PsyOutDelete
+* description: allocates memory for psychoacoustic
+* returns: an error code
+*
+*****************************************************************************/
+Word16 PsyOutDelete(PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP)
+{
+ hPsyOut=NULL;
+ return 0;
+}
+
+
+/*****************************************************************************
+*
+* function name: psyMainInit
+* description: initializes psychoacoustic
+* returns: an error code
+*
+*****************************************************************************/
+
+Word16 psyMainInit(PSY_KERNEL *hPsy,
+ Word32 sampleRate,
+ Word32 bitRate,
+ Word16 channels,
+ Word16 tnsMask,
+ Word16 bandwidth)
+{
+ Word16 ch, err;
+ Word32 channelBitRate = bitRate/channels;
+
+ err = InitPsyConfigurationLong(channelBitRate,
+ sampleRate,
+ bandwidth,
+ &(hPsy->psyConfLong));
+
+ if (!err) {
+ hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx;
+ err = InitTnsConfigurationLong(bitRate, sampleRate, channels,
+ &hPsy->psyConfLong.tnsConf, &hPsy->psyConfLong, tnsMask&2);
+ }
+
+ if (!err)
+ err = InitPsyConfigurationShort(channelBitRate,
+ sampleRate,
+ bandwidth,
+ &hPsy->psyConfShort);
+ if (!err) {
+ err = InitTnsConfigurationShort(bitRate, sampleRate, channels,
+ &hPsy->psyConfShort.tnsConf, &hPsy->psyConfShort, tnsMask&1);
+ }
+
+ 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;
+ }
+
+ return(err);
+}
+
+/*****************************************************************************
+*
+* function name: psyMain
+* description: psychoacoustic main function
+* returns: an error code
+*
+* This function assumes that enough input data is in the modulo buffer.
+*
+*****************************************************************************/
+
+Word16 psyMain(Word16 nChannels,
+ ELEMENT_INFO *elemInfo,
+ Word16 *timeSignal,
+ PSY_DATA psyData[MAX_CHANNELS],
+ TNS_DATA tnsData[MAX_CHANNELS],
+ PSY_CONFIGURATION_LONG *hPsyConfLong,
+ PSY_CONFIGURATION_SHORT *hPsyConfShort,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word32 *pScratchTns,
+ Word32 sampleRate)
+{
+ Word16 maxSfbPerGroup[MAX_CHANNELS];
+ Word16 mdctScalingArray[MAX_CHANNELS];
+
+ Word16 ch; /* counts through channels */
+ Word16 sfb; /* counts through scalefactor bands */
+ Word16 line; /* counts through lines */
+ Word16 channels;
+ Word16 maxScale;
+
+ channels = elemInfo->nChannelsInEl;
+ maxScale = 0;
+
+ /* block switching */
+ for(ch = 0; ch < channels; ch++) {
+ BlockSwitching(&psyData[ch].blockSwitchingControl,
+ timeSignal+elemInfo->ChannelIndex[ch],
+ sampleRate,
+ nChannels);
+ }
+
+ /* synch left and right block type */
+ SyncBlockSwitching(&psyData[0].blockSwitchingControl,
+ &psyData[1].blockSwitchingControl,
+ channels);
+
+ /* transform
+ and get maxScale (max mdctScaling) for all channels */
+ for(ch=0; ch<channels; ch++) {
+ Transform_Real(psyData[ch].mdctDelayBuffer,
+ timeSignal+elemInfo->ChannelIndex[ch],
+ nChannels,
+ psyData[ch].mdctSpectrum,
+ &(mdctScalingArray[ch]),
+ psyData[ch].blockSwitchingControl.windowSequence);
+ maxScale = max(maxScale, mdctScalingArray[ch]);
+ }
+
+ /* 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++) {
+ *Spectrum = (*Spectrum) >> scaleDiff;
+ Spectrum++;
+ }
+ }
+ psyData[ch].mdctScale = maxScale;
+ }
+
+ for (ch=0; ch<channels; ch++) {
+
+ if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
+ /* update long block parameter */
+ advancePsychLong(&psyData[ch],
+ &tnsData[ch],
+ hPsyConfLong,
+ &psyOutChannel[ch],
+ pScratchTns,
+ &tnsData[1 - ch],
+ ch);
+
+ /* 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;
+ }
+ maxSfbPerGroup[ch] = sfb + 1;
+
+ /* Calc bandwise energies for mid and side channel
+ Do it only if 2 channels exist */
+
+ if (ch == 1)
+ advancePsychLongMS(psyData, hPsyConfLong);
+ }
+ else {
+ advancePsychShort(&psyData[ch],
+ &tnsData[ch],
+ hPsyConfShort,
+ &psyOutChannel[ch],
+ pScratchTns,
+ &tnsData[1 - ch],
+ ch);
+
+ /* Calc bandwise energies for mid and side channel
+ Do it only if 2 channels exist */
+
+ if (ch == 1)
+ advancePsychShortMS (psyData, hPsyConfShort);
+ }
+ }
+
+ /* group short data */
+ for(ch=0; ch<channels; ch++) {
+
+ if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
+ groupShortData(psyData[ch].mdctSpectrum,
+ pScratchTns,
+ &psyData[ch].sfbThreshold,
+ &psyData[ch].sfbEnergy,
+ &psyData[ch].sfbEnergyMS,
+ &psyData[ch].sfbSpreadedEnergy,
+ hPsyConfShort->sfbCnt,
+ hPsyConfShort->sfbOffset,
+ hPsyConfShort->sfbMinSnr,
+ psyOutElement->groupedSfbOffset[ch],
+ &maxSfbPerGroup[ch],
+ psyOutElement->groupedSfbMinSnr[ch],
+ psyData[ch].blockSwitchingControl.noOfGroups,
+ psyData[ch].blockSwitchingControl.groupLen);
+ }
+ }
+
+
+#if (MAX_CHANNELS>1)
+ /*
+ stereo Processing
+ */
+ if (channels == 2) {
+ 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,
+ psyData[0].sfbEnergyMS.sfbLong,
+ psyData[1].sfbEnergyMS.sfbLong,
+ psyData[0].mdctSpectrum,
+ psyData[1].mdctSpectrum,
+ psyData[0].sfbThreshold.sfbLong,
+ psyData[1].sfbThreshold.sfbLong,
+ psyData[0].sfbSpreadedEnergy.sfbLong,
+ psyData[1].sfbSpreadedEnergy.sfbLong,
+ (Word16*)&psyOutElement->toolsInfo.msDigest,
+ (Word16*)psyOutElement->toolsInfo.msMask,
+ hPsyConfLong->sfbCnt,
+ hPsyConfLong->sfbCnt,
+ maxSfbPerGroup[0],
+ (const Word16*)hPsyConfLong->sfbOffset);
+ else
+ MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
+ psyData[1].sfbEnergy.sfbLong,
+ psyData[0].sfbEnergyMS.sfbLong,
+ psyData[1].sfbEnergyMS.sfbLong,
+ psyData[0].mdctSpectrum,
+ psyData[1].mdctSpectrum,
+ psyData[0].sfbThreshold.sfbLong,
+ psyData[1].sfbThreshold.sfbLong,
+ psyData[0].sfbSpreadedEnergy.sfbLong,
+ psyData[1].sfbSpreadedEnergy.sfbLong,
+ (Word16*)&psyOutElement->toolsInfo.msDigest,
+ (Word16*)psyOutElement->toolsInfo.msMask,
+ psyData[0].blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt,
+ hPsyConfShort->sfbCnt,
+ maxSfbPerGroup[0],
+ (const Word16*)psyOutElement->groupedSfbOffset[0]);
+ }
+
+#endif /* (MAX_CHANNELS>1) */
+
+ /*
+ build output
+ */
+ for(ch=0;ch<channels;ch++) {
+
+ if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
+ BuildInterface(psyData[ch].mdctSpectrum,
+ psyData[ch].mdctScale,
+ &psyData[ch].sfbThreshold,
+ &psyData[ch].sfbEnergy,
+ &psyData[ch].sfbSpreadedEnergy,
+ psyData[ch].sfbEnergySum,
+ psyData[ch].sfbEnergySumMS,
+ psyData[ch].blockSwitchingControl.windowSequence,
+ blockType2windowShape[psyData[ch].blockSwitchingControl.windowSequence],
+ hPsyConfLong->sfbCnt,
+ hPsyConfLong->sfbOffset,
+ maxSfbPerGroup[ch],
+ hPsyConfLong->sfbMinSnr,
+ psyData[ch].blockSwitchingControl.noOfGroups,
+ psyData[ch].blockSwitchingControl.groupLen,
+ &psyOutChannel[ch]);
+ else
+ BuildInterface(psyData[ch].mdctSpectrum,
+ psyData[ch].mdctScale,
+ &psyData[ch].sfbThreshold,
+ &psyData[ch].sfbEnergy,
+ &psyData[ch].sfbSpreadedEnergy,
+ psyData[ch].sfbEnergySum,
+ psyData[ch].sfbEnergySumMS,
+ SHORT_WINDOW,
+ SINE_WINDOW,
+ psyData[0].blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt,
+ psyOutElement->groupedSfbOffset[ch],
+ maxSfbPerGroup[ch],
+ psyOutElement->groupedSfbMinSnr[ch],
+ psyData[ch].blockSwitchingControl.noOfGroups,
+ psyData[ch].blockSwitchingControl.groupLen,
+ &psyOutChannel[ch]);
+ }
+
+ return(0); /* no error */
+}
+
+/*****************************************************************************
+*
+* function name: advancePsychLong
+* description: psychoacoustic for long blocks
+*
+*****************************************************************************/
+
+static Word16 advancePsychLong(PSY_DATA* psyData,
+ TNS_DATA* tnsData,
+ PSY_CONFIGURATION_LONG *hPsyConfLong,
+ PSY_OUT_CHANNEL* psyOutChannel,
+ Word32 *pScratchTns,
+ const TNS_DATA* tnsData2,
+ const Word16 ch)
+{
+ Word32 i;
+ Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
+ Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift;
+ Word32 *data0, *data1, tdata;
+
+ /* low pass */
+ data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
+ for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
+ *data0++ = 0;
+ }
+
+ /* Calc sfb-bandwise mdct-energies for left and right channel */
+ CalcBandEnergy( psyData->mdctSpectrum,
+ hPsyConfLong->sfbOffset,
+ hPsyConfLong->sfbActive,
+ psyData->sfbEnergy.sfbLong,
+ &psyData->sfbEnergySum.sfbLong);
+
+ /*
+ TNS detect
+ */
+ TnsDetect(tnsData,
+ hPsyConfLong->tnsConf,
+ pScratchTns,
+ (const Word16*)hPsyConfLong->sfbOffset,
+ psyData->mdctSpectrum,
+ 0,
+ psyData->blockSwitchingControl.windowSequence,
+ psyData->sfbEnergy.sfbLong);
+
+ /* TnsSync */
+ if (ch == 1) {
+ TnsSync(tnsData,
+ tnsData2,
+ hPsyConfLong->tnsConf,
+ 0,
+ psyData->blockSwitchingControl.windowSequence);
+ }
+
+ /* Tns Encoder */
+ TnsEncode(&psyOutChannel->tnsInfo,
+ tnsData,
+ hPsyConfLong->sfbCnt,
+ hPsyConfLong->tnsConf,
+ hPsyConfLong->lowpassLine,
+ psyData->mdctSpectrum,
+ 0,
+ psyData->blockSwitchingControl.windowSequence);
+
+ /* first part of threshold calculation */
+ data0 = psyData->sfbEnergy.sfbLong;
+ data1 = psyData->sfbThreshold.sfbLong;
+ for (i=hPsyConfLong->sfbCnt; i; i--) {
+ tdata = L_mpy_ls(*data0++, hPsyConfLong->ratio);
+ *data1++ = min(tdata, clipEnergy);
+ }
+
+ /* Calc sfb-bandwise mdct-energies for left and right channel again */
+ if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) {
+ 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++)
+ tdata += *data0++;
+
+ psyData->sfbEnergySum.sfbLong = tdata;
+ }
+
+
+ /* spreading energy */
+ SpreadingMax(hPsyConfLong->sfbCnt,
+ hPsyConfLong->sfbMaskLowFactor,
+ hPsyConfLong->sfbMaskHighFactor,
+ psyData->sfbThreshold.sfbLong);
+
+ /* threshold in quiet */
+ data0 = psyData->sfbThreshold.sfbLong;
+ data1 = hPsyConfLong->sfbThresholdQuiet;
+ for (i=hPsyConfLong->sfbCnt; i; i--)
+ {
+ *data0 = max(*data0, (*data1 >> normEnergyShift));
+ data0++; data1++;
+ }
+
+ /* preecho control */
+ if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
+ data0 = psyData->sfbThresholdnm1;
+ for (i=hPsyConfLong->sfbCnt; i; i--) {
+ *data0++ = MAX_32;
+ }
+ psyData->mdctScalenm1 = 0;
+ }
+
+ PreEchoControl( psyData->sfbThresholdnm1,
+ hPsyConfLong->sfbCnt,
+ hPsyConfLong->maxAllowedIncreaseFactor,
+ hPsyConfLong->minRemainingThresholdFactor,
+ psyData->sfbThreshold.sfbLong,
+ psyData->mdctScale,
+ psyData->mdctScalenm1);
+ psyData->mdctScalenm1 = psyData->mdctScale;
+
+
+ if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
+ data0 = psyData->sfbThresholdnm1;
+ for (i=hPsyConfLong->sfbCnt; i; i--) {
+ *data0++ = MAX_32;
+ }
+ psyData->mdctScalenm1 = 0;
+ }
+
+ /* apply tns mult table on cb thresholds */
+ ApplyTnsMultTableToRatios(hPsyConfLong->tnsConf.tnsRatioPatchLowestCb,
+ hPsyConfLong->tnsConf.tnsStartBand,
+ tnsData->dataRaw.tnsLong.subBlockInfo,
+ psyData->sfbThreshold.sfbLong);
+
+
+ /* spreaded energy */
+ data0 = psyData->sfbSpreadedEnergy.sfbLong;
+ data1 = psyData->sfbEnergy.sfbLong;
+ for (i=hPsyConfLong->sfbCnt; i; i--) {
+ //psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
+ *data0++ = *data1++;
+ }
+
+ /* spreading energy */
+ SpreadingMax(hPsyConfLong->sfbCnt,
+ hPsyConfLong->sfbMaskLowFactorSprEn,
+ hPsyConfLong->sfbMaskHighFactorSprEn,
+ psyData->sfbSpreadedEnergy.sfbLong);
+
+ return 0;
+}
+
+/*****************************************************************************
+*
+* function name: advancePsychLongMS
+* description: update mdct-energies for left add or minus right channel
+* for long block
+*
+*****************************************************************************/
+static Word16 advancePsychLongMS (PSY_DATA psyData[MAX_CHANNELS],
+ const PSY_CONFIGURATION_LONG *hPsyConfLong)
+{
+ CalcBandEnergyMS(psyData[0].mdctSpectrum,
+ psyData[1].mdctSpectrum,
+ hPsyConfLong->sfbOffset,
+ hPsyConfLong->sfbActive,
+ psyData[0].sfbEnergyMS.sfbLong,
+ &psyData[0].sfbEnergySumMS.sfbLong,
+ psyData[1].sfbEnergyMS.sfbLong,
+ &psyData[1].sfbEnergySumMS.sfbLong);
+
+ return 0;
+}
+
+
+/*****************************************************************************
+*
+* function name: advancePsychShort
+* description: psychoacoustic for short blocks
+*
+*****************************************************************************/
+
+static Word16 advancePsychShort(PSY_DATA* psyData,
+ TNS_DATA* tnsData,
+ const PSY_CONFIGURATION_SHORT *hPsyConfShort,
+ PSY_OUT_CHANNEL* psyOutChannel,
+ Word32 *pScratchTns,
+ const TNS_DATA *tnsData2,
+ const Word16 ch)
+{
+ 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 *data0, *data1;
+
+ for(w = 0; w < TRANS_FAC; w++) {
+ Word32 i, tdata;
+
+ /* low pass */
+ data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
+ for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
+ *data0++ = 0;
+ }
+
+ /* Calc sfb-bandwise mdct-energies for left and right channel */
+ CalcBandEnergy( psyData->mdctSpectrum+wOffset,
+ hPsyConfShort->sfbOffset,
+ hPsyConfShort->sfbActive,
+ psyData->sfbEnergy.sfbShort[w],
+ &psyData->sfbEnergySum.sfbShort[w]);
+ /*
+ TNS
+ */
+ TnsDetect(tnsData,
+ hPsyConfShort->tnsConf,
+ pScratchTns,
+ (const Word16*)hPsyConfShort->sfbOffset,
+ psyData->mdctSpectrum+wOffset,
+ w,
+ psyData->blockSwitchingControl.windowSequence,
+ psyData->sfbEnergy.sfbShort[w]);
+
+ /* TnsSync */
+ if (ch == 1) {
+ TnsSync(tnsData,
+ tnsData2,
+ hPsyConfShort->tnsConf,
+ w,
+ psyData->blockSwitchingControl.windowSequence);
+ }
+
+ TnsEncode(&psyOutChannel->tnsInfo,
+ tnsData,
+ hPsyConfShort->sfbCnt,
+ hPsyConfShort->tnsConf,
+ hPsyConfShort->lowpassLine,
+ psyData->mdctSpectrum+wOffset,
+ w,
+ psyData->blockSwitchingControl.windowSequence);
+
+ /* first part of threshold calculation */
+ data0 = psyData->sfbThreshold.sfbShort[w];
+ data1 = psyData->sfbEnergy.sfbShort[w];
+ for (i=hPsyConfShort->sfbCnt; i; i--) {
+ tdata = L_mpy_ls(*data1++, hPsyConfShort->ratio);
+ *data0++ = min(tdata, clipEnergy);
+ }
+
+ /* Calc sfb-bandwise mdct-energies for left and right channel again */
+ if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) {
+ Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
+ CalcBandEnergy( psyData->mdctSpectrum+wOffset,
+ hPsyConfShort->sfbOffset+tnsStartBand,
+ (hPsyConfShort->sfbActive - tnsStartBand),
+ psyData->sfbEnergy.sfbShort[w]+tnsStartBand,
+ &psyData->sfbEnergySum.sfbShort[w]);
+
+ tdata = psyData->sfbEnergySum.sfbShort[w];
+ data0 = psyData->sfbEnergy.sfbShort[w];
+ for (i=tnsStartBand; i; i--)
+ tdata += *data0++;
+
+ psyData->sfbEnergySum.sfbShort[w] = tdata;
+ }
+
+ /* spreading */
+ SpreadingMax(hPsyConfShort->sfbCnt,
+ hPsyConfShort->sfbMaskLowFactor,
+ hPsyConfShort->sfbMaskHighFactor,
+ psyData->sfbThreshold.sfbShort[w]);
+
+
+ /* threshold in quiet */
+ data0 = psyData->sfbThreshold.sfbShort[w];
+ data1 = hPsyConfShort->sfbThresholdQuiet;
+ for (i=hPsyConfShort->sfbCnt; i; i--)
+ {
+ *data0 = max(*data0, (*data1 >> normEnergyShift));
+
+ data0++; data1++;
+ }
+
+
+ /* preecho */
+ PreEchoControl( psyData->sfbThresholdnm1,
+ hPsyConfShort->sfbCnt,
+ hPsyConfShort->maxAllowedIncreaseFactor,
+ hPsyConfShort->minRemainingThresholdFactor,
+ psyData->sfbThreshold.sfbShort[w],
+ psyData->mdctScale,
+ w==0 ? psyData->mdctScalenm1 : psyData->mdctScale);
+
+ /* apply tns mult table on cb thresholds */
+ ApplyTnsMultTableToRatios( hPsyConfShort->tnsConf.tnsRatioPatchLowestCb,
+ hPsyConfShort->tnsConf.tnsStartBand,
+ tnsData->dataRaw.tnsShort.subBlockInfo[w],
+ psyData->sfbThreshold.sfbShort[w]);
+
+ /* spreaded energy */
+ data0 = psyData->sfbSpreadedEnergy.sfbShort[w];
+ data1 = psyData->sfbEnergy.sfbShort[w];
+ for (i=hPsyConfShort->sfbCnt; i; i--) {
+ *data0++ = *data1++;
+ }
+ SpreadingMax(hPsyConfShort->sfbCnt,
+ hPsyConfShort->sfbMaskLowFactorSprEn,
+ hPsyConfShort->sfbMaskHighFactorSprEn,
+ psyData->sfbSpreadedEnergy.sfbShort[w]);
+
+ wOffset += FRAME_LEN_SHORT;
+ } /* for TRANS_FAC */
+
+ psyData->mdctScalenm1 = psyData->mdctScale;
+
+ return 0;
+}
+
+/*****************************************************************************
+*
+* function name: advancePsychShortMS
+* description: update mdct-energies for left add or minus right channel
+* for short block
+*
+*****************************************************************************/
+static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
+ const PSY_CONFIGURATION_SHORT *hPsyConfShort)
+{
+ Word32 w, wOffset;
+ wOffset = 0;
+ for(w=0; w<TRANS_FAC; w++) {
+ CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
+ psyData[1].mdctSpectrum+wOffset,
+ hPsyConfShort->sfbOffset,
+ hPsyConfShort->sfbActive,
+ psyData[0].sfbEnergyMS.sfbShort[w],
+ &psyData[0].sfbEnergySumMS.sfbShort[w],
+ psyData[1].sfbEnergyMS.sfbShort[w],
+ &psyData[1].sfbEnergySumMS.sfbShort[w]);
+ wOffset += FRAME_LEN_SHORT;
+ }
+
+ return 0;
+}
diff --git a/media/libstagefright/codecs/aacenc/src/qc_main.c b/media/libstagefright/codecs/aacenc/src/qc_main.c
new file mode 100644
index 0000000..a568020
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/qc_main.c
@@ -0,0 +1,580 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: qc_main.c
+
+ Content: Quantizing & coding functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "qc_main.h"
+#include "quantize.h"
+#include "interface.h"
+#include "adj_thr.h"
+#include "sf_estim.h"
+#include "stat_bits.h"
+#include "bit_cnt.h"
+#include "dyn_bits.h"
+#include "channel_map.h"
+#include "memalign.h"
+
+
+typedef enum{
+ FRAME_LEN_BYTES_MODULO = 1,
+ FRAME_LEN_BYTES_INT = 2
+}FRAME_LEN_RESULT_MODE;
+
+static const Word16 maxFillElemBits = 7 + 270*8;
+
+/* forward declarations */
+
+static Word16 calcMaxValueInSfb(Word16 sfbCnt,
+ Word16 maxSfbPerGroup,
+ Word16 sfbPerGroup,
+ Word16 sfbOffset[MAX_GROUPED_SFB],
+ Word16 quantSpectrum[FRAME_LEN_LONG],
+ UWord16 maxValue[MAX_GROUPED_SFB]);
+
+
+/*****************************************************************************
+*
+* function name: calcFrameLen
+* description: estimate the frame length according the bitrates
+*
+*****************************************************************************/
+static Word16 calcFrameLen(Word32 bitRate,
+ Word32 sampleRate,
+ FRAME_LEN_RESULT_MODE mode)
+{
+
+ Word32 result;
+ Word32 quot;
+
+ 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;
+ }
+
+ return result;
+}
+
+/*****************************************************************************
+*
+* function name:framePadding
+* description: Calculates if padding is needed for actual frame
+* returns: paddingOn or not
+*
+*****************************************************************************/
+static Word16 framePadding(Word32 bitRate,
+ Word32 sampleRate,
+ Word32 *paddingRest)
+{
+ Word16 paddingOn;
+ Word16 difference;
+
+ paddingOn = 0;
+
+ difference = calcFrameLen( bitRate,
+ sampleRate,
+ FRAME_LEN_BYTES_MODULO );
+ *paddingRest = *paddingRest - difference;
+
+
+ if (*paddingRest <= 0 ) {
+ paddingOn = 1;
+ *paddingRest = *paddingRest + sampleRate;
+ }
+
+ return paddingOn;
+}
+
+
+/*********************************************************************************
+*
+* function name: QCOutNew
+* description: init qcout parameter
+* returns: 0 if success
+*
+**********************************************************************************/
+
+Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
+{
+ Word32 i;
+ Word16 *quantSpec;
+ Word16 *scf;
+ UWord16 *maxValueInSfb;
+
+ quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
+ if(NULL == quantSpec)
+ return 1;
+ scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
+ if(NULL == scf)
+ {
+ return 1;
+ }
+ maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC);
+ if(NULL == maxValueInSfb)
+ {
+ return 1;
+ }
+
+ 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;
+}
+
+
+/*********************************************************************************
+*
+* function name: QCOutDelete
+* description: unint qcout parameter
+* returns: 0 if success
+*
+**********************************************************************************/
+void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
+{
+ Word32 i;
+ if(hQC)
+ {
+ if(hQC->qcChannel[0].quantSpec);
+ mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
+
+ if(hQC->qcChannel[0].maxValueInSfb)
+ mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
+
+ if(hQC->qcChannel[0].scf)
+ mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
+
+ for (i=0; i<MAX_CHANNELS; i++) {
+ hQC->qcChannel[i].quantSpec = NULL;
+
+ hQC->qcChannel[i].maxValueInSfb = NULL;
+
+ hQC->qcChannel[i].scf = NULL;
+ }
+ }
+}
+
+/*********************************************************************************
+*
+* function name: QCNew
+* description: set QC to zero
+* returns: 0 if success
+*
+**********************************************************************************/
+Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
+{
+ pMemOP->Set(VO_INDEX_ENC_AAC, hQC,0,sizeof(QC_STATE));
+
+ return (0);
+}
+
+/*********************************************************************************
+*
+* function name: QCDelete
+* description: unint qcout parameter
+*
+**********************************************************************************/
+void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
+{
+
+ /*
+ nothing to do
+ */
+ hQC=NULL;
+}
+
+/*********************************************************************************
+*
+* function name: QCInit
+* description: init QD parameter
+* returns: 0 if success
+*
+**********************************************************************************/
+Word16 QCInit(QC_STATE *hQC,
+ struct QC_INIT *init)
+{
+ 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->padding.paddingRest = init->padding.paddingRest;
+
+ hQC->globStatBits = 3; /* for ID_END */
+
+ /* channel elements init */
+ InitElementBits(&hQC->elementBits,
+ *init->elInfo,
+ init->bitrate,
+ init->averageBits,
+ hQC->globStatBits);
+
+ /* threshold parameter init */
+ AdjThrInit(&hQC->adjThr,
+ init->meanPe,
+ hQC->elementBits.chBitrate);
+
+ return 0;
+}
+
+
+/*********************************************************************************
+*
+* function name: QCMain
+* description: quantization and coding the spectrum
+* returns: 0 if success
+*
+**********************************************************************************/
+Word16 QCMain(QC_STATE* hQC,
+ ELEMENT_BITS* elBits,
+ ATS_ELEMENT* adjThrStateElement,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
+ PSY_OUT_ELEMENT* psyOutElement,
+ QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
+ QC_OUT_ELEMENT* qcOutElement,
+ Word16 nChannels,
+ Word16 ancillaryDataBytes)
+{
+ Word16 maxChDynBits[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,
+ qcOutElement->adtsUsed);
+
+
+ if (ancillaryDataBytes) {
+ qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
+
+ if (ancillaryDataBytes >= 15)
+ qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
+ }
+ else {
+ qcOutElement->ancBitsUsed = 0;
+ }
+
+ CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
+
+ /*adjust thresholds for the desired bitrate */
+ AdjustThresholds(&hQC->adjThr,
+ adjThrStateElement,
+ psyOutChannel,
+ psyOutElement,
+ chBitDistribution,
+ hQC->logSfbEnergy,
+ hQC->sfbNRelevantLines,
+ qcOutElement,
+ elBits,
+ nChannels,
+ hQC->maxBitFac);
+
+ /*estimate scale factors */
+ EstimateScaleFactors(psyOutChannel,
+ qcOutChannel,
+ hQC->logSfbEnergy,
+ hQC->logSfbFormFactor,
+ hQC->sfbNRelevantLines,
+ nChannels);
+
+ /* condition to prevent empty bitreservoir */
+ for (ch = 0; ch < nChannels; ch++) {
+ Word32 maxDynBits;
+ maxDynBits = elBits->averageBits + elBits->bitResLevel - 7; /* -7 bec. of align bits */
+ maxDynBits = maxDynBits - qcOutElement->staticBitsUsed + qcOutElement->ancBitsUsed;
+ maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
+ }
+
+ qcOutElement->dynBitsUsed = 0;
+ for (ch = 0; ch < nChannels; ch++) {
+ Word32 chDynBits;
+ Flag constraintsFulfilled;
+ Word32 iter;
+ iter = 0;
+ do {
+ constraintsFulfilled = 1;
+
+ QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
+ psyOutChannel[ch].maxSfbPerGroup,
+ psyOutChannel[ch].sfbPerGroup,
+ psyOutChannel[ch].sfbOffsets,
+ psyOutChannel[ch].mdctSpectrum,
+ 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;
+ }
+
+ chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
+ qcOutChannel[ch].maxValueInSfb,
+ qcOutChannel[ch].scf,
+ psyOutChannel[ch].windowSequence,
+ psyOutChannel[ch].sfbCnt,
+ psyOutChannel[ch].maxSfbPerGroup,
+ psyOutChannel[ch].sfbPerGroup,
+ psyOutChannel[ch].sfbOffsets,
+ &qcOutChannel[ch].sectionData);
+
+ if (chDynBits >= maxChDynBits[ch]) {
+ 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;
+ }
+
+ /* save dynBitsUsed for correction of bits2pe relation */
+ AdjThrUpdate(adjThrStateElement, qcOutElement->dynBitsUsed);
+
+ {
+ Word16 bitResSpace = elBits->maxBitResBits - elBits->bitResLevel;
+ Word16 deltaBitRes = elBits->averageBits -
+ (qcOutElement->staticBitsUsed +
+ qcOutElement->dynBitsUsed + qcOutElement->ancBitsUsed);
+
+ qcOutElement->fillBits = max(0, (deltaBitRes - bitResSpace));
+ }
+
+ return 0; /* OK */
+}
+
+
+/*********************************************************************************
+*
+* function name: calcMaxValueInSfb
+* description: search the max Spectrum in one sfb
+*
+**********************************************************************************/
+static Word16 calcMaxValueInSfb(Word16 sfbCnt,
+ Word16 maxSfbPerGroup,
+ Word16 sfbPerGroup,
+ Word16 sfbOffset[MAX_GROUPED_SFB],
+ Word16 quantSpectrum[FRAME_LEN_LONG],
+ UWord16 maxValue[MAX_GROUPED_SFB])
+{
+ Word16 sfbOffs, sfb;
+ Word16 maxValueAll;
+
+ maxValueAll = 0;
+
+ for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
+ for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
+ Word16 line;
+ Word16 maxThisSfb;
+ maxThisSfb = 0;
+
+ for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
+ Word16 absVal;
+ absVal = abs_s(quantSpectrum[line]);
+ maxThisSfb = max(maxThisSfb, absVal);
+ }
+
+ maxValue[sfbOffs+sfb] = maxThisSfb;
+ maxValueAll = max(maxValueAll, maxThisSfb);
+ }
+ }
+ return maxValueAll;
+}
+
+
+/*********************************************************************************
+*
+* function name: updateBitres
+* description: update bitreservoir
+*
+**********************************************************************************/
+void updateBitres(QC_STATE* qcKernel,
+ QC_OUT* qcOut)
+
+{
+ ELEMENT_BITS *elBits;
+
+ qcKernel->bitResTot = 0;
+
+ elBits = &qcKernel->elementBits;
+
+
+ if (elBits->averageBits > 0) {
+ /* constant bitrate */
+ Word16 bitsUsed;
+ bitsUsed = (qcOut->qcElement.staticBitsUsed + qcOut->qcElement.dynBitsUsed) +
+ (qcOut->qcElement.ancBitsUsed + qcOut->qcElement.fillBits);
+ elBits->bitResLevel = elBits->bitResLevel + (elBits->averageBits - bitsUsed);
+ qcKernel->bitResTot = qcKernel->bitResTot + elBits->bitResLevel;
+ }
+ else {
+ /* variable bitrate */
+ elBits->bitResLevel = elBits->maxBits;
+ qcKernel->bitResTot = qcKernel->maxBitsTot;
+ }
+}
+
+/*********************************************************************************
+*
+* function name: FinalizeBitConsumption
+* description: count bits used
+*
+**********************************************************************************/
+Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
+ QC_OUT* qcOut)
+{
+ Word32 nFullFillElem;
+ Word32 totFillBits;
+ Word16 diffBits;
+ Word16 bitsUsed;
+
+ totFillBits = 0;
+
+ 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 + nFullFillElem;
+
+ /* now distribute extra fillbits and alignbits over channel elements */
+ qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
+ 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;
+ }
+ return bitsUsed;
+}
+
+
+/*********************************************************************************
+*
+* function name: AdjustBitrate
+* description: adjusts framelength via padding on a frame to frame basis,
+* to achieve a bitrate that demands a non byte aligned
+* framelength
+* return: errorcode
+*
+**********************************************************************************/
+Word16 AdjustBitrate(QC_STATE *hQC,
+ Word32 bitRate, /* total bitrate */
+ Word32 sampleRate) /* output sampling rate */
+{
+ Word16 paddingOn;
+ Word16 frameLen;
+ Word16 codeBits;
+ Word16 codeBitsLast;
+
+ /* Do we need a extra padding byte? */
+ paddingOn = framePadding(bitRate,
+ sampleRate,
+ &hQC->padding.paddingRest);
+
+ /* frame length */
+ frameLen = paddingOn + calcFrameLen(bitRate,
+ sampleRate,
+ FRAME_LEN_BYTES_INT);
+
+ frameLen = frameLen << 3;
+ codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
+ codeBits = frameLen - hQC->globStatBits;
+
+ /* calculate bits for every channel element */
+ if (codeBits != codeBitsLast) {
+ Word16 totalBits = 0;
+
+ hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
+ totalBits += hQC->elementBits.averageBits;
+
+ hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
+ }
+
+ hQC->averageBitsTot = frameLen;
+
+ return 0;
+}
diff --git a/media/libstagefright/codecs/aacenc/src/quantize.c b/media/libstagefright/codecs/aacenc/src/quantize.c
new file mode 100644
index 0000000..205f167
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/quantize.c
@@ -0,0 +1,445 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: quantize.c
+
+ Content: quantization functions
+
+*******************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "quantize.h"
+#include "aac_rom.h"
+
+#define MANT_DIGITS 9
+#define MANT_SIZE (1<<MANT_DIGITS)
+
+static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0.5f) */
+
+
+/*****************************************************************************
+*
+* 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 */
+ 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)
+*
+*****************************************************************************/
+static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
+{
+ Word32 e, minusFinalExp, finalShift;
+ Word32 x;
+ Word16 qua = 0;
+
+
+ if (absSpectrum) {
+ e = norm_l(absSpectrum);
+ x = pow34(absSpectrum << e);
+
+ /* calculate the final fractional exponent times 16 (was 3*(4*e + gain) + (INT_BITS-1)*16) */
+ minusFinalExp = (e << 2) + gain;
+ minusFinalExp = (minusFinalExp << 1) + minusFinalExp;
+ minusFinalExp = minusFinalExp + ((INT_BITS-1) << 4);
+
+ /* separate the exponent into a shift, and a multiply */
+ finalShift = minusFinalExp >> 4;
+
+ if (finalShift < INT_BITS) {
+ x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
+
+ x += XROUND >> (INT_BITS - finalShift);
+
+ /* shift and quantize */
+ finalShift--;
+
+ if(finalShift >= 0)
+ x >>= finalShift;
+ else
+ x <<= (-finalShift);
+
+ qua = saturate(x);
+ }
+ }
+
+ return qua;
+}
+
+/*****************************************************************************
+*
+* 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
+*
+*****************************************************************************/
+static void quantizeLines(const Word16 gain,
+ const Word16 noOfLines,
+ const Word32 *mdctSpectrum,
+ Word16 *quaSpectrum)
+{
+ Word32 line;
+ Word32 m = gain&3;
+ Word32 g = (gain >> 2) + 4;
+ Word32 mdctSpeL;
+ Word16 *pquat;
+ /* gain&3 */
+
+ pquat = quantBorders[m];
+
+ g += 16;
+
+ if(g >= 0)
+ {
+ for (line=0; line<noOfLines; line++) {
+ Word32 qua;
+ qua = 0;
+
+ mdctSpeL = mdctSpectrum[line];
+
+ if (mdctSpeL) {
+ Word32 sa;
+ Word32 saShft;
+
+ sa = L_abs(mdctSpeL);
+ //saShft = L_shr(sa, 16 + g);
+ saShft = sa >> g;
+
+ if (saShft > pquat[0]) {
+
+ if (saShft < pquat[1]) {
+
+ qua = mdctSpeL>0 ? 1 : -1;
+ }
+ else {
+
+ if (saShft < pquat[2]) {
+
+ qua = mdctSpeL>0 ? 2 : -2;
+ }
+ else {
+
+ if (saShft < pquat[3]) {
+
+ qua = mdctSpeL>0 ? 3 : -3;
+ }
+ else {
+ qua = quantizeSingleLine(gain, sa);
+ /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
+
+ if (mdctSpeL < 0)
+ qua = -qua;
+ }
+ }
+ }
+ }
+ }
+ quaSpectrum[line] = qua ;
+ }
+ }
+ else
+ {
+ for (line=0; line<noOfLines; line++) {
+ Word32 qua;
+ qua = 0;
+
+ mdctSpeL = mdctSpectrum[line];
+
+ if (mdctSpeL) {
+ Word32 sa;
+ Word32 saShft;
+
+ sa = L_abs(mdctSpeL);
+ saShft = sa << g;
+
+ if (saShft > pquat[0]) {
+
+ if (saShft < pquat[1]) {
+
+ qua = mdctSpeL>0 ? 1 : -1;
+ }
+ else {
+
+ if (saShft < pquat[2]) {
+
+ qua = mdctSpeL>0 ? 2 : -2;
+ }
+ else {
+
+ if (saShft < pquat[3]) {
+
+ qua = mdctSpeL>0 ? 3 : -3;
+ }
+ else {
+ qua = quantizeSingleLine(gain, sa);
+ /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
+
+ if (mdctSpeL < 0)
+ qua = -qua;
+ }
+ }
+ }
+ }
+ }
+ quaSpectrum[line] = qua ;
+ }
+ }
+
+}
+
+
+/*****************************************************************************
+*
+* 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
+* output: spectral data
+*
+*****************************************************************************/
+static void iquantizeLines(const Word16 gain,
+ const Word16 noOfLines,
+ const Word16 *quantSpectrum,
+ Word32 *mdctSpectrum)
+{
+ Word32 iquantizermod;
+ Word32 iquantizershift;
+ Word32 line;
+
+ iquantizermod = gain & 3;
+ iquantizershift = gain >> 2;
+
+ for (line=0; line<noOfLines; line++) {
+
+ if( quantSpectrum[line] != 0 ) {
+ Word32 accu;
+ Word32 ex;
+ Word32 tabIndex;
+ Word32 specExp;
+ Word32 s,t;
+
+ accu = quantSpectrum[line];
+
+ ex = norm_l(accu);
+ accu = accu << ex;
+ specExp = INT_BITS-1 - ex;
+
+ tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE);
+
+ /* calculate "mantissa" ^4/3 */
+ s = mTab_4_3[tabIndex];
+
+ /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */
+ 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 += iquantizershift + 1;
+ if(specExp >= 0)
+ mdctSpectrum[line] = accu << specExp;
+ else
+ mdctSpectrum[line] = accu >> (-specExp);
+ }
+ else {
+ mdctSpectrum[line] = 0;
+ }
+ }
+}
+
+/*****************************************************************************
+*
+* function name: QuantizeSpectrum
+* description: quantizes the entire spectrum
+* returns:
+* input: number of scalefactor bands to be quantized, ...
+* output: quantized spectrum
+*
+*****************************************************************************/
+void QuantizeSpectrum(Word16 sfbCnt,
+ Word16 maxSfbPerGroup,
+ Word16 sfbPerGroup,
+ Word16 *sfbOffset,
+ Word32 *mdctSpectrum,
+ Word16 globalGain,
+ Word16 *scalefactors,
+ Word16 *quantizedSpectrum)
+{
+ Word32 sfbOffs, sfb;
+
+ for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
+ Word32 sfbNext ;
+ for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
+ Word16 scalefactor = scalefactors[sfbOffs+sfb];
+ /* coalesce sfbs with the same scalefactor */
+ for (sfbNext = sfb+1;
+ sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext];
+ sfbNext++) ;
+
+ quantizeLines(globalGain - scalefactor,
+ sfbOffset[sfbOffs+sfbNext] - sfbOffset[sfbOffs+sfb],
+ mdctSpectrum + sfbOffset[sfbOffs+sfb],
+ quantizedSpectrum + sfbOffset[sfbOffs+sfb]);
+ }
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name:calcSfbDist
+* description: quantizes and requantizes lines to calculate distortion
+* input: number of lines to be quantized, ...
+* output: distortion
+*
+*****************************************************************************/
+Word32 calcSfbDist(const Word32 *spec,
+ Word16 sfbWidth,
+ Word16 gain)
+{
+ Word32 line;
+ Word32 dist;
+ Word32 m = gain&3;
+ Word32 g = (gain >> 2) + 4;
+ Word32 g2 = (g << 1) + 1;
+ Word16 *pquat, *repquat;
+ /* gain&3 */
+
+ pquat = quantBorders[m];
+ repquat = quantRecon[m];
+
+ dist = 0;
+ g += 16;
+ if(g2 < 0 && g >= 0)
+ {
+ g2 = -g2;
+ for(line=0; line<sfbWidth; line++) {
+ if (spec[line]) {
+ Word32 diff;
+ Word32 distSingle;
+ Word32 sa;
+ Word32 saShft;
+ sa = L_abs(spec[line]);
+ //saShft = round16(L_shr(sa, g));
+ //saShft = L_shr(sa, 16+g);
+ saShft = sa >> g;
+
+ if (saShft < pquat[0]) {
+ distSingle = (saShft * saShft) >> g2;
+ }
+ else {
+
+ if (saShft < pquat[1]) {
+ diff = saShft - repquat[0];
+ distSingle = (diff * diff) >> g2;
+ }
+ else {
+
+ if (saShft < pquat[2]) {
+ diff = saShft - repquat[1];
+ distSingle = (diff * diff) >> g2;
+ }
+ else {
+
+ if (saShft < pquat[3]) {
+ diff = saShft - repquat[2];
+ distSingle = (diff * diff) >> g2;
+ }
+ else {
+ Word16 qua = quantizeSingleLine(gain, sa);
+ Word32 iqval, diff32;
+ /* now that we have quantized x, re-quantize it. */
+ iquantizeLines(gain, 1, &qua, &iqval);
+ diff32 = sa - iqval;
+ distSingle = fixmul(diff32, diff32);
+ }
+ }
+ }
+ }
+
+ dist = L_add(dist, distSingle);
+ }
+ }
+ }
+ else
+ {
+ for(line=0; line<sfbWidth; line++) {
+ if (spec[line]) {
+ Word32 diff;
+ Word32 distSingle;
+ Word32 sa;
+ Word32 saShft;
+ sa = L_abs(spec[line]);
+ //saShft = round16(L_shr(sa, g));
+ saShft = L_shr(sa, g);
+
+ if (saShft < pquat[0]) {
+ distSingle = L_shl((saShft * saShft), g2);
+ }
+ else {
+
+ if (saShft < pquat[1]) {
+ diff = saShft - repquat[0];
+ distSingle = L_shl((diff * diff), g2);
+ }
+ else {
+
+ if (saShft < pquat[2]) {
+ diff = saShft - repquat[1];
+ distSingle = L_shl((diff * diff), g2);
+ }
+ else {
+
+ if (saShft < pquat[3]) {
+ diff = saShft - repquat[2];
+ distSingle = L_shl((diff * diff), g2);
+ }
+ else {
+ Word16 qua = quantizeSingleLine(gain, sa);
+ Word32 iqval, diff32;
+ /* now that we have quantized x, re-quantize it. */
+ iquantizeLines(gain, 1, &qua, &iqval);
+ diff32 = sa - iqval;
+ distSingle = fixmul(diff32, diff32);
+ }
+ }
+ }
+ }
+ dist = L_add(dist, distSingle);
+ }
+ }
+ }
+
+ return dist;
+}
diff --git a/media/libstagefright/codecs/aacenc/src/sf_estim.c b/media/libstagefright/codecs/aacenc/src/sf_estim.c
new file mode 100644
index 0000000..d34b365
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/sf_estim.c
@@ -0,0 +1,882 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: sf_estim.c
+
+ Content: Scale factor estimation functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "sf_estim.h"
+#include "quantize.h"
+#include "bit_cnt.h"
+#include "aac_rom.h"
+
+static const Word16 MAX_SCF_DELTA = 60;
+
+/*!
+constants reference in comments
+
+ C0 = 6.75f;
+ 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
+
+*/
+
+#define FF_SQRT_BITS 7
+#define FF_SQRT_TABLE_SIZE (1<<FF_SQRT_BITS - 1<<(FF_SQRT_BITS-2))
+#define COEF08_31 0x66666666 /* 0.8*(1 << 31) */
+#define PE_C1_8 24 /* PE_C1*8 */
+#define PE_C2_16 21 /* PE_C2*8/PE_C3 */
+#define PE_SCALE 0x059a /* 0.7 * (1 << (15 - 1 - 3))*/
+
+#define SCALE_ESTIMATE_COEF 0x5555 /* (8.8585/(4*log2(10))) * (1 << 15)*/
+
+/*********************************************************************************
+*
+* function name: formfac_sqrt
+* 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;
+ preshift = postshift << 1;
+ postshift = postshift + 8; /* sqrt/256 */
+ if(preshift >= 0)
+ y = x << preshift; /* now 1/4 <= y < 1 */
+ else
+ y = x >> (-preshift);
+ y = formfac_sqrttable[y-32];
+
+ if(postshift >= 0)
+ y = y >> postshift;
+ else
+ y = y << (-postshift);
+
+ return y;
+}
+
+
+/*********************************************************************************
+*
+* function name: CalcFormFactorChannel
+* description: calculate the form factor one channel
+* ffac(n) = sqrt(abs(X(k)) + sqrt(abs(X(k+1)) + ....
+*
+**********************************************************************************/
+static void
+CalcFormFactorChannel(Word16 *logSfbFormFactor,
+ Word16 *sfbNRelevantLines,
+ Word16 *logSfbEnergy,
+ PSY_OUT_CHANNEL *psyOutChan)
+{
+ 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;
+
+ 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;
+ /* calc sum of sqrt(spec) */
+ for (j=sfbw; j; j--) {
+ accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
+ }
+ logSfbFormFactor[i] = iLog4(accu);
+ logSfbEnergy[i] = iLog4(psyOutChan->sfbEnergy[i]);
+ avgFormFactor = fixmul(rsqrt(psyOutChan->sfbEnergy[i],INT_BITS), iSfbWidth);
+ avgFormFactor = rsqrt((Word32)avgFormFactor,INT_BITS) >> 10;
+ /* result is multiplied by 4 */
+ if(avgFormFactor)
+ sfbNRelevantLines[i] = accu / avgFormFactor;
+ else
+ sfbNRelevantLines[i] = 0x7fff;
+ }
+ else {
+ /* set number of lines to zero */
+ sfbNRelevantLines[i] = 0;
+ }
+ }
+ }
+}
+
+/*********************************************************************************
+*
+* function name: improveScf
+* description: find better scalefactor with analysis by synthesis
+*
+**********************************************************************************/
+static Word16 improveScf(Word32 *spec,
+ Word16 sfbWidth,
+ Word32 thresh,
+ Word16 scf,
+ Word16 minScf,
+ Word32 *dist,
+ Word16 *minScfCalculated)
+{
+ Word32 cnt;
+ Word32 sfbDist;
+ Word32 scfBest;
+ Word32 thresh125 = L_add(thresh, (thresh >> 2));
+
+ scfBest = scf;
+
+ /* calc real distortion */
+ sfbDist = calcSfbDist(spec, sfbWidth, scf);
+ *minScfCalculated = scf;
+ if(!sfbDist)
+ return scfBest;
+
+ if (sfbDist > thresh125) {
+ Word32 scfEstimated;
+ Word32 sfbDistBest;
+ 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;
+ }
+ cnt = cnt + 1;
+ }
+ 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;
+ }
+ *minScfCalculated = scf;
+ cnt = cnt + 1;
+ }
+ *dist = sfbDistBest;
+ }
+ else {
+ Word32 sfbDistBest;
+ Word32 sfbDistAllowed;
+ Word32 thresh08 = fixmul(COEF08_31, thresh);
+ sfbDistBest = sfbDist;
+
+ if (sfbDist < thresh08)
+ sfbDistAllowed = sfbDist;
+ else
+ sfbDistAllowed = thresh08;
+ 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;
+ }
+ }
+ *dist = sfbDistBest;
+ }
+
+ /* return best scalefactor */
+ return scfBest;
+}
+
+/*********************************************************************************
+*
+* function name: countSingleScfBits
+* description: count single scf bits in huffum
+*
+**********************************************************************************/
+static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
+{
+ Word16 scfBits;
+
+ scfBits = bitCountScalefactorDelta(scfLeft - scf) +
+ bitCountScalefactorDelta(scf - scfRight);
+
+ return scfBits;
+}
+
+/*********************************************************************************
+*
+* 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
+*
+**********************************************************************************/
+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*/
+ ldRatio = (ldRatio + PE_C2_16) >> 1;
+ }
+ specPe = nLines * ldRatio;
+ specPe = (specPe * PE_SCALE) >> 14;
+
+ return saturate(specPe);
+}
+
+
+/*********************************************************************************
+*
+* function name: countScfBitsDiff
+* description: count different scf bits used
+*
+**********************************************************************************/
+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;
+
+ /* search for first relevant sfb */
+ 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;
+ }
+ }
+ /* search for next relevant sfb and count diff */
+ 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);
+}
+
+static Word16 calcSpecPeDiff(Word16 *scfOld,
+ Word16 *scfNew,
+ Word16 *sfbConstPePart,
+ Word16 *logSfbEnergy,
+ Word16 *logSfbFormFactor,
+ Word16 *sfbNRelevantLines,
+ Word16 startSfb,
+ Word16 stopSfb)
+{
+ Word32 specPeDiff;
+ Word32 sfb;
+
+ 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);
+}
+
+
+/*********************************************************************************
+*
+* function name: assimilateSingleScf
+* description: searched for single scalefactor bands, where the number of bits gained
+* by using a smaller scfgain(n) is greater than the estimated increased
+* bit demand
+*
+**********************************************************************************/
+static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
+ Word16 *scf,
+ Word16 *minScf,
+ Word32 *sfbDist,
+ Word16 *sfbConstPePart,
+ Word16 *logSfbEnergy,
+ Word16 *logSfbFormFactor,
+ Word16 *sfbNRelevantLines,
+ Word16 *minScfCalculated,
+ Flag restartOnSuccess)
+{
+ Word32 sfbLast, sfbAct, sfbNext, scfAct, scfMin;
+ Word16 *scfLast, *scfNext;
+ Word32 sfbPeOld, sfbPeNew;
+ Word32 sfbDistNew;
+ Word32 j;
+ Flag success;
+ Word16 deltaPe, deltaPeNew, deltaPeTmp;
+ Word16 *prevScfLast = psyOutChan->prevScfLast;
+ Word16 *prevScfNext = psyOutChan->prevScfNext;
+ Word16 *deltaPeLast = psyOutChan->deltaPeLast;
+ Flag updateMinScfCalculated;
+
+ success = 0;
+ deltaPe = 0;
+
+ for(j=0;j<psyOutChan->sfbCnt;j++){
+ prevScfLast[j] = MAX_16;
+ prevScfNext[j] = MAX_16;
+ deltaPeLast[j] = MAX_16;
+ }
+
+ sfbLast = -1;
+ sfbAct = -1;
+ sfbNext = -1;
+ scfLast = 0;
+ scfNext = 0;
+ 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];
+ 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];
+ scfLast = &scfAct;
+ scfNext = scf + sfbNext;
+ scfMin = *scfNext;
+ }
+ else {
+
+ if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
+ /* last relevant scf */
+ scfAct = scf[sfbAct];
+ scfLast = scf + sfbLast;
+ scfNext = &scfAct;
+ 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] ||
+ deltaPe < deltaPeLast[sfbAct])) {
+ 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;
+ 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
+ quantization error is smaller */
+ deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
+
+ if (deltaPeTmp < 10) {
+ sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
+ psyOutChan->sfbOffsets[sfbAct],
+ (psyOutChan->sfbOffsets[sfbAct+1] - psyOutChan->sfbOffsets[sfbAct]),
+ scfAct);
+ if (sfbDistNew < sfbDist[sfbAct]) {
+ /* success, replace scf by new one */
+ scf[sfbAct] = scfAct;
+ sfbDist[sfbAct] = sfbDistNew;
+ deltaPeNew = deltaPeTmp;
+ success = 1;
+ }
+ /* mark as already checked */
+
+ if (updateMinScfCalculated) {
+ minScfCalculated[sfbAct] = scfAct;
+ }
+ }
+ else {
+ updateMinScfCalculated = 0;
+ }
+ }
+
+ } while (scfAct > scfMin);
+ deltaPe = deltaPeNew;
+ /* save parameters to avoid multiple computations of the same sfb */
+ prevScfLast[sfbAct] = *scfLast;
+ prevScfNext[sfbAct] = *scfNext;
+ deltaPeLast[sfbAct] = deltaPe;
+ }
+
+ if (success && restartOnSuccess) {
+ /* start again at first sfb */
+ sfbLast = -1;
+ sfbAct = -1;
+ sfbNext = -1;
+ scfLast = 0;
+ scfNext = 0;
+ scfMin = MAX_16;
+ success = 0;
+ }
+ else {
+ /* shift sfbs for next band */
+ sfbLast = sfbAct;
+ sfbAct = sfbNext;
+ }
+
+ } while (sfbNext < psyOutChan->sfbCnt);
+}
+
+
+/*********************************************************************************
+*
+* function name: assimilateMultipleScf
+* description: scalefactor difference reduction
+*
+**********************************************************************************/
+static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
+ Word16 *scf,
+ Word16 *minScf,
+ Word32 *sfbDist,
+ Word16 *sfbConstPePart,
+ Word16 *logSfbEnergy,
+ Word16 *logSfbFormFactor,
+ Word16 *sfbNRelevantLines)
+{
+ Word32 sfb, startSfb, stopSfb, scfMin, scfMax, scfAct;
+ Flag possibleRegionFound;
+ Word32 deltaScfBits;
+ Word32 deltaSpecPe;
+ Word32 deltaPe, deltaPeNew;
+ Word32 sfbCnt;
+ Word32 *sfbDistNew = psyOutChan->sfbDistNew;
+ Word16 *scfTmp = psyOutChan->prevScfLast;
+
+ deltaPe = 0;
+ sfbCnt = psyOutChan->sfbCnt;
+
+ /* calc min and max scalfactors */
+ 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;
+
+ do {
+ scfAct = scfAct - 1;
+ for (sfb=0; sfb<sfbCnt; sfb++) {
+ scfTmp[sfb] = scf[sfb];
+ }
+ stopSfb = 0;
+ do {
+ sfb = stopSfb;
+
+ while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
+ sfb = sfb + 1;
+ }
+ startSfb = sfb;
+ sfb = sfb + 1;
+
+ while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
+ sfb = sfb + 1;
+ }
+ stopSfb = sfb;
+
+ possibleRegionFound = 0;
+
+ if (startSfb < sfbCnt) {
+ possibleRegionFound = 1;
+ for (sfb=startSfb; sfb<stopSfb; sfb++) {
+
+ if (scf[sfb]!=MIN_16) {
+
+ if (scfAct < minScf[sfb]) {
+ 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;
+ }
+
+ /* estimate change in bit demand for new scfs */
+ deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
+ deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
+ 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;
+ 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+1] - psyOutChan->sfbOffsets[sfb]),
+ scfAct);
+
+
+ if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
+ distNewSum = distOldSum << 1;
+ break;
+ }
+ distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
+ }
+ }
+
+ if (distNewSum < distOldSum) {
+ deltaPe = deltaPeNew;
+ for (sfb=startSfb; sfb<stopSfb; sfb++) {
+
+ if (scf[sfb]!=MIN_16) {
+ scf[sfb] = scfAct;
+ sfbDist[sfb] = sfbDistNew[sfb];
+ }
+ }
+ }
+ }
+ }
+ } while (stopSfb <= sfbCnt);
+ } while (scfAct > scfMin);
+ }
+}
+
+/*********************************************************************************
+*
+* function name: EstimateScaleFactorsChannel
+* description: estimate scale factors for one channel
+*
+**********************************************************************************/
+static void
+EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
+ Word16 *scf,
+ Word16 *globalGain,
+ Word16 *logSfbEnergy,
+ Word16 *logSfbFormFactor,
+ Word16 *sfbNRelevantLines)
+{
+ Word32 i, j;
+ Word32 thresh, energy;
+ Word32 energyPart, thresholdPart;
+ Word32 scfInt, minScf, maxScf, maxAllowedScf, lastSf;
+ Word32 maxSpec;
+ 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];
+
+ sbfStart = psyOutChan->sfbOffsets[i];
+ sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
+ mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
+
+ maxSpec = 0;
+ /* maximum of spectrum */
+ for (j=sbfwith; j; j-- ) {
+ Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
+ maxSpec |= absSpec;
+ }
+
+ /* scfs without energy or with thresh>energy are marked with MIN_16 */
+ scf[i] = MIN_16;
+ minSfMaxQuant[i] = MIN_16;
+
+ if ((maxSpec > 0) && (energy > 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];
+ }
+
+ /* find better scalefactor with analysis by synthesis */
+ scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
+ sbfwith,
+ thresh, scfInt, minSfMaxQuant[i],
+ &sfbDist[i], &minScfCalculated[i]);
+
+ scf[i] = scfInt;
+ }
+ }
+
+
+ /* scalefactor differece reduction */
+ {
+ Word16 sfbConstPePart[MAX_GROUPED_SFB];
+ for(i=0;i<psyOutChan->sfbCnt;i++) {
+ sfbConstPePart[i] = MIN_16;
+ }
+
+ assimilateSingleScf(psyOutChan, scf,
+ minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
+ logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
+
+ assimilateMultipleScf(psyOutChan, scf,
+ minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
+ logSfbFormFactor, sfbNRelevantLines);
+ }
+
+ /* get max scalefac for global gain */
+ maxScf = MIN_16;
+ minScf = MAX_16;
+ for (i=0; i<psyOutChan->sfbCnt; i++) {
+
+ if (maxScf < scf[i]) {
+ maxScf = scf[i];
+ }
+
+ if ((scf[i] != MIN_16) && (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;
+ }
+ }
+ /* new maxScf if any scf has been limited */
+
+ if (maxAllowedScf < maxScf) {
+ maxScf = maxAllowedScf;
+ }
+
+ /* calc loop scalefactors */
+
+ if (maxScf > MIN_16) {
+ *globalGain = maxScf;
+ lastSf = 0;
+
+ for(i=0; i<psyOutChan->sfbCnt; i++) {
+
+ if (scf[i] == MIN_16) {
+ scf[i] = lastSf;
+ /* set band explicitely to zero */
+ for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
+ psyOutChan->mdctSpectrum[j] = 0;
+ }
+ }
+ else {
+ scf[i] = maxScf - scf[i];
+ lastSf = scf[i];
+ }
+ }
+ }
+ else{
+ *globalGain = 0;
+ /* set spectrum explicitely to zero */
+ for(i=0; i<psyOutChan->sfbCnt; i++) {
+ scf[i] = 0;
+ for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
+ psyOutChan->mdctSpectrum[j] = 0;
+ }
+ }
+ }
+}
+
+/*********************************************************************************
+*
+* function name: CalcFormFactor
+* description: estimate Form factors for all channel
+*
+**********************************************************************************/
+void
+CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ const Word16 nChannels)
+{
+ Word16 j;
+
+ for (j=0; j<nChannels; j++) {
+ CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
+ }
+}
+
+/*********************************************************************************
+*
+* function name: EstimateScaleFactors
+* description: estimate scale factors for all channel
+*
+**********************************************************************************/
+void
+EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
+ Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
+ Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
+ const Word16 nChannels)
+{
+ Word16 j;
+
+ for (j=0; j<nChannels; j++) {
+ EstimateScaleFactorsChannel(&psyOutChannel[j],
+ qcOutChannel[j].scf,
+ &(qcOutChannel[j].globalGain),
+ logSfbEnergy[j],
+ logSfbFormFactor[j],
+ sfbNRelevantLines[j]);
+ }
+}
+
diff --git a/media/libstagefright/codecs/aacenc/src/spreading.c b/media/libstagefright/codecs/aacenc/src/spreading.c
new file mode 100644
index 0000000..e6fc7da
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/spreading.c
@@ -0,0 +1,52 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: spreading.c
+
+ Content: Spreading of energy function
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "spreading.h"
+
+/*********************************************************************************
+*
+* function name: SpreadingMax
+* description: spreading the energy
+* higher frequencies thr(n) = max(thr(n), sh(n)*thr(n-1))
+* lower frequencies thr(n) = max(thr(n), sl(n)*thr(n+1))
+*
+**********************************************************************************/
+void SpreadingMax(const Word16 pbCnt,
+ const Word16 *maskLowFactor,
+ const Word16 *maskHighFactor,
+ Word32 *pbSpreadedEnergy)
+{
+ Word32 i;
+
+ /* slope to higher frequencies */
+ for (i=1; i<pbCnt; i++) {
+ pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
+ L_mpy_ls(pbSpreadedEnergy[i-1], maskHighFactor[i]));
+ }
+ /* slope to lower frequencies */
+ for (i=pbCnt - 2; i>=0; i--) {
+ pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
+ L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i]));
+ }
+}
diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c
new file mode 100644
index 0000000..556104e
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/stat_bits.c
@@ -0,0 +1,237 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: stat_bits.c
+
+ Content: Static bit counter functions
+
+*******************************************************************************/
+
+#include "stat_bits.h"
+#include "bitenc.h"
+#include "tns.h"
+
+
+typedef enum {
+ SI_ID_BITS =(3),
+ SI_FILL_COUNT_BITS =(4),
+ SI_FILL_ESC_COUNT_BITS =(8),
+ SI_FILL_EXTENTION_BITS =(4),
+ SI_FILL_NIBBLE_BITS =(4),
+ SI_SCE_BITS =(4),
+ SI_CPE_BITS =(5),
+ SI_CPE_MS_MASK_BITS =(2) ,
+ SI_ICS_INFO_BITS_LONG =(1+2+1+6+1),
+ SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7),
+ SI_ICS_BITS =(8+1+1+1)
+} SI_BITS;
+
+
+/*********************************************************************************
+*
+* function name: countMsMaskBits
+* description: count ms stereo bits demand
+*
+**********************************************************************************/
+static Word16 countMsMaskBits(Word16 sfbCnt,
+ Word16 sfbPerGroup,
+ Word16 maxSfbPerGroup,
+ struct TOOLSINFO *toolsInfo)
+{
+ Word16 msBits, sfbOff, sfb;
+ msBits = 0;
+
+
+ switch(toolsInfo->msDigest) {
+ case MS_NONE:
+ case MS_ALL:
+ break;
+
+ case MS_SOME:
+ for(sfbOff=0; sfbOff<sfbCnt; sfbOff+=sfbPerGroup)
+ for(sfb=0; sfb<maxSfbPerGroup; sfb++)
+ msBits += 1;
+ break;
+ }
+ return(msBits);
+}
+
+/*********************************************************************************
+*
+* function name: tnsCount
+* description: count tns bit demand core function
+*
+**********************************************************************************/
+static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
+{
+
+ Word32 i, k;
+ Flag tnsPresent;
+ Word32 numOfWindows;
+ Word32 count;
+ Word32 coefBits;
+ Word16 *ptcoef;
+
+ count = 0;
+
+ if (blockType == 2)
+ numOfWindows = 8;
+ else
+ numOfWindows = 1;
+ tnsPresent = 0;
+
+ for (i=0; i<numOfWindows; i++) {
+
+ if (tnsInfo->tnsActive[i]!=0) {
+ 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;
+ }
+ else {
+ count += 6;
+ count += 5;
+ }
+
+ if (tnsInfo->order[i]) {
+ count += 1; /*direction*/
+ count += 1; /*coef_compression */
+
+ if (tnsInfo->coefRes[i] == 4) {
+ ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
+ coefBits = 3;
+ for(k=0; k<tnsInfo->order[i]; k++) {
+
+ if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
+ coefBits = 4;
+ break;
+ }
+ }
+ }
+ else {
+ 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;
+ break;
+ }
+ }
+ }
+ for (k=0; k<tnsInfo->order[i]; k++ ) {
+ count += coefBits;
+ }
+ }
+ }
+ }
+ }
+
+ return count;
+}
+
+/**********************************************************************************
+*
+* function name: countTnsBits
+* description: count tns bit demand
+*
+**********************************************************************************/
+static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
+{
+ return(tnsCount(tnsInfo, blockType));
+}
+
+/*********************************************************************************
+*
+* function name: countStaticBitdemand
+* description: count static bit demand include tns
+*
+**********************************************************************************/
+Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+ PSY_OUT_ELEMENT *psyOutElement,
+ Word16 channels,
+ Word16 adtsUsed)
+{
+ Word32 statBits;
+ Word32 ch;
+
+ 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:
+ case STOP_WINDOW:
+ statBits += SI_ICS_INFO_BITS_LONG;
+ break;
+ case SHORT_WINDOW:
+ statBits += SI_ICS_INFO_BITS_SHORT;
+ break;
+ }
+ break;
+ case 2:
+ statBits += SI_ID_BITS+SI_CPE_BITS+2*SI_ICS_BITS;
+
+ statBits += SI_CPE_MS_MASK_BITS;
+ statBits += countMsMaskBits(psyOutChannel[0].sfbCnt,
+ psyOutChannel[0].sfbPerGroup,
+ psyOutChannel[0].maxSfbPerGroup,
+ &psyOutElement->toolsInfo);
+
+ switch (psyOutChannel[0].windowSequence) {
+ case LONG_WINDOW:
+ case START_WINDOW:
+ case STOP_WINDOW:
+ statBits += SI_ICS_INFO_BITS_LONG;
+ break;
+ case SHORT_WINDOW:
+ statBits += SI_ICS_INFO_BITS_SHORT;
+ break;
+ }
+ for(ch=0; ch<2; ch++)
+ statBits += countTnsBits(&(psyOutChannel[ch].tnsInfo),
+ psyOutChannel[ch].windowSequence);
+ break;
+ }
+
+ return statBits;
+}
+
diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c
new file mode 100644
index 0000000..96d890e
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/tns.c
@@ -0,0 +1,932 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: tns.c
+
+ Content: Definition TNS tools functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "assert.h"
+#include "aac_rom.h"
+#include "psy_const.h"
+#include "tns.h"
+#include "tns_param.h"
+#include "psy_configuration.h"
+#include "tns_func.h"
+
+#define TNS_MODIFY_BEGIN 2600 /* Hz */
+#define RATIO_PATCH_LOWER_BORDER 380 /* Hz */
+#define TNS_GAIN_THRESH 141 /* 1.41*100 */
+#define NORM_COEF 0x028f5c28
+
+static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */
+/* Limit bands to > 2.0 kHz */
+static unsigned short tnsMinBandNumberLong[12] =
+{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 };
+static unsigned short tnsMinBandNumberShort[12] =
+{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 };
+
+/**************************************/
+/* Main/Low Profile TNS Parameters */
+/**************************************/
+static unsigned short tnsMaxBandsLongMainLow[12] =
+{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 };
+
+static unsigned short tnsMaxBandsShortMainLow[12] =
+{ 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 };
+
+
+static void CalcWeightedSpectrum(const Word32 spectrum[],
+ Word16 weightedSpectrum[],
+ Word32* sfbEnergy,
+ const Word16* sfbOffset, Word16 lpcStartLine,
+ Word16 lpcStopLine, Word16 lpcStartBand,Word16 lpcStopBand,
+ Word32 *pWork32);
+
+
+
+void AutoCorrelation(const Word16 input[], Word32 corr[],
+ Word16 samples, Word16 corrCoeff);
+static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOfCoeff);
+
+static Word16 CalcTnsFilter(const Word16* signal, const Word32 window[], Word16 numOfLines,
+ Word16 tnsOrder, Word32 parcor[]);
+
+
+static void Parcor2Index(const Word32 parcor[], Word16 index[], Word16 order,
+ Word16 bitsPerCoeff);
+
+static void Index2Parcor(const Word16 index[], Word32 parcor[], Word16 order,
+ Word16 bitsPerCoeff);
+
+
+
+static void AnalysisFilterLattice(const Word32 signal[], Word16 numOfLines,
+ const Word32 parCoeff[], Word16 order,
+ Word32 output[]);
+
+
+/**
+*
+* function name: FreqToBandWithRounding
+* description: Retrieve index of nearest band border
+* returnt: index
+*
+*/
+static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequency in Hertz */
+ Word32 fs, /*!< Sampling frequency in Hertz */
+ Word16 numOfBands, /*!< total number of bands */
+ const Word16 *bandStartOffset) /*!< table of band borders */
+{
+ Word32 lineNumber, band;
+ Word32 temp, shift;
+
+ /* 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] ;
+ if (temp >= 0)
+ return numOfBands;
+
+ /* find band the line number lies in */
+ for (band=0; band<numOfBands; band++) {
+ temp = bandStartOffset[band + 1] - lineNumber;
+ if (temp > 0) break;
+ }
+
+ temp = (lineNumber - bandStartOffset[band]);
+ temp = (temp - (bandStartOffset[band + 1] - lineNumber));
+ if ( temp > 0 )
+ {
+ band = band + 1;
+ }
+
+ return extract_l(band);
+}
+
+
+/**
+*
+* function name: InitTnsConfigurationLong
+* description: Fill TNS_CONFIG structure with sensible content for long blocks
+* returns: 0 if success
+*
+*/
+Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
+ Word32 sampleRate, /*!< Sampling frequency */
+ Word16 channels, /*!< number of channels */
+ TNS_CONFIG *tC, /*!< TNS Config struct (modified) */
+ PSY_CONFIGURATION_LONG *pC, /*!< psy config struct */
+ Word16 active) /*!< tns active flag */
+{
+
+ Word32 bitratePerChannel;
+ tC->maxOrder = TNS_MAX_ORDER;
+ tC->tnsStartFreq = 1275;
+ tC->coefRes = 4;
+
+ /* to avoid integer division */
+ if ( sub(channels,2) == 0 ) {
+ bitratePerChannel = bitRate >> 1;
+ }
+ else {
+ bitratePerChannel = bitRate;
+ }
+
+ tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
+
+ tC->tnsActive = active;
+
+ /* now calc band and line borders */
+ tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
+ tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
+
+ tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
+ pC->sfbCnt, (const Word16*)pC->sfbOffset);
+
+ tC->tnsModifyBeginCb = FreqToBandWithRounding(TNS_MODIFY_BEGIN,
+ sampleRate,
+ pC->sfbCnt,
+ (const Word16*)pC->sfbOffset);
+
+ tC->tnsRatioPatchLowestCb = FreqToBandWithRounding(RATIO_PATCH_LOWER_BORDER,
+ sampleRate,
+ pC->sfbCnt,
+ (const Word16*)pC->sfbOffset);
+
+
+ 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->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
+
+ tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
+
+ tC->threshold = TNS_GAIN_THRESH;
+
+
+ return(0);
+}
+
+/**
+*
+* function name: InitTnsConfigurationShort
+* description: Fill TNS_CONFIG structure with sensible content for short blocks
+* returns: 0 if success
+*
+*/
+Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
+ Word32 sampleRate, /*!< Sampling frequency */
+ Word16 channels, /*!< number of channels */
+ TNS_CONFIG *tC, /*!< TNS Config struct (modified) */
+ PSY_CONFIGURATION_SHORT *pC, /*!< psy config struct */
+ Word16 active) /*!< tns active flag */
+{
+ Word32 bitratePerChannel;
+ tC->maxOrder = TNS_MAX_ORDER_SHORT;
+ tC->tnsStartFreq = 2750;
+ tC->coefRes = 3;
+
+ /* to avoid integer division */
+ if ( sub(channels,2) == 0 ) {
+ bitratePerChannel = L_shr(bitRate,1);
+ }
+ else {
+ bitratePerChannel = bitRate;
+ }
+
+ tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
+
+ tC->tnsActive = active;
+
+ /* now calc band and line borders */
+ tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
+ tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
+
+ tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
+ pC->sfbCnt, (const Word16*)pC->sfbOffset);
+
+ tC->tnsModifyBeginCb = FreqToBandWithRounding(TNS_MODIFY_BEGIN,
+ sampleRate,
+ pC->sfbCnt,
+ (const Word16*)pC->sfbOffset);
+
+ tC->tnsRatioPatchLowestCb = FreqToBandWithRounding(RATIO_PATCH_LOWER_BORDER,
+ sampleRate,
+ pC->sfbCnt,
+ (const Word16*)pC->sfbOffset);
+
+
+ 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->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
+
+ tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
+
+ tC->threshold = TNS_GAIN_THRESH;
+
+ return(0);
+}
+
+/**
+*
+* function name: TnsDetect
+* description: Calculate TNS filter and decide on TNS usage
+* returns: 0 if success
+*
+*/
+Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
+ TNS_CONFIG tC, /*!< tns config structure */
+ Word32* pScratchTns, /*!< pointer to scratch space */
+ const Word16 sfbOffset[], /*!< scalefactor size and table */
+ Word32* spectrum, /*!< spectral data */
+ Word16 subBlockNumber, /*!< subblock num */
+ Word16 blockType, /*!< blocktype (long or short) */
+ Word32 * sfbEnergy) /*!< sfb-wise energy */
+{
+
+ Word32 predictionGain;
+ Word32 temp;
+ Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
+ Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
+
+
+ if (tC.tnsActive) {
+ CalcWeightedSpectrum(spectrum,
+ pWeightedSpectrum,
+ sfbEnergy,
+ sfbOffset,
+ tC.lpcStartLine,
+ tC.lpcStopLine,
+ tC.lpcStartBand,
+ tC.lpcStopBand,
+ pWork32);
+
+ temp = blockType - SHORT_WINDOW;
+ if ( temp != 0 ) {
+ predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
+ tC.acfWindow,
+ tC.lpcStopLine - tC.lpcStartLine,
+ tC.maxOrder,
+ tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
+
+
+ temp = predictionGain - tC.threshold;
+ if ( temp > 0 ) {
+ tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
+ }
+ else {
+ tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
+ }
+
+ tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain;
+ }
+ else{
+
+ predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
+ tC.acfWindow,
+ tC.lpcStopLine - tC.lpcStartLine,
+ tC.maxOrder,
+ tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
+
+ temp = predictionGain - tC.threshold;
+ if ( temp > 0 ) {
+ tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
+ }
+ else {
+ tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
+ }
+
+ tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain;
+ }
+
+ }
+ else{
+
+ temp = blockType - SHORT_WINDOW;
+ if ( temp != 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;
+ }
+ }
+
+ return(0);
+}
+
+
+/*****************************************************************************
+*
+* function name: TnsSync
+* description: update tns parameter
+*
+*****************************************************************************/
+void TnsSync(TNS_DATA *tnsDataDest,
+ const TNS_DATA *tnsDataSrc,
+ const TNS_CONFIG tC,
+ const Word16 subBlockNumber,
+ const Word16 blockType)
+{
+ TNS_SUBBLOCK_INFO *sbInfoDest;
+ const TNS_SUBBLOCK_INFO *sbInfoSrc;
+ Word32 i, temp;
+
+ temp = blockType - SHORT_WINDOW;
+ if ( temp != 0 ) {
+ sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
+ sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
+ }
+ else {
+ 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;
+ for ( i=0; i< tC.maxOrder; i++) {
+ sbInfoDest->parcor[i] = sbInfoSrc->parcor[i];
+ }
+ }
+}
+
+/*****************************************************************************
+*
+* function name: TnsEncode
+* description: do TNS filtering
+* returns: 0 if success
+*
+*****************************************************************************/
+Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
+ TNS_DATA* tnsData, /*!< tns data structure (modified) */
+ Word16 numOfSfb, /*!< number of scale factor bands */
+ TNS_CONFIG tC, /*!< tns config structure */
+ Word16 lowPassLine, /*!< lowpass line */
+ Word32* spectrum, /*!< spectral data (modified) */
+ Word16 subBlockNumber, /*!< subblock num */
+ Word16 blockType) /*!< blocktype (long or short) */
+{
+ Word32 i;
+ Word32 temp_s;
+ Word32 temp;
+ TNS_SUBBLOCK_INFO *psubBlockInfo;
+
+ temp_s = blockType - SHORT_WINDOW;
+ if ( temp_s != 0) {
+ psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
+ if (psubBlockInfo->tnsActive == 0) {
+ tnsInfo->tnsActive[subBlockNumber] = 0;
+ return(0);
+ }
+ else {
+
+ Parcor2Index(psubBlockInfo->parcor,
+ tnsInfo->coef,
+ tC.maxOrder,
+ tC.coefRes);
+
+ Index2Parcor(tnsInfo->coef,
+ psubBlockInfo->parcor,
+ tC.maxOrder,
+ tC.coefRes);
+
+ for (i=tC.maxOrder - 1; i>=0; i--) {
+ temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
+ if ( temp > 0 )
+ break;
+ temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
+ if ( temp < 0 )
+ break;
+ }
+ tnsInfo->order[subBlockNumber] = i + 1;
+
+
+ tnsInfo->tnsActive[subBlockNumber] = 1;
+ for (i=subBlockNumber+1; i<TRANS_FAC; i++) {
+ tnsInfo->tnsActive[i] = 0;
+ }
+ tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
+ tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
+
+
+ AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
+ (min(tC.tnsStopLine,lowPassLine) - tC.tnsStartLine),
+ psubBlockInfo->parcor,
+ tnsInfo->order[subBlockNumber],
+ &(spectrum[tC.tnsStartLine]));
+
+ }
+ } /* if (blockType!=SHORT_WINDOW) */
+ else /*short block*/ {
+ psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
+ if (psubBlockInfo->tnsActive == 0) {
+ tnsInfo->tnsActive[subBlockNumber] = 0;
+ return(0);
+ }
+ else {
+
+ Parcor2Index(psubBlockInfo->parcor,
+ &tnsInfo->coef[subBlockNumber*TNS_MAX_ORDER_SHORT],
+ tC.maxOrder,
+ tC.coefRes);
+
+ Index2Parcor(&tnsInfo->coef[subBlockNumber*TNS_MAX_ORDER_SHORT],
+ psubBlockInfo->parcor,
+ tC.maxOrder,
+ tC.coefRes);
+ for (i=(tC.maxOrder - 1); i>=0; i--) {
+ temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
+ if ( temp > 0 )
+ break;
+
+ temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
+ if ( temp < 0 )
+ break;
+ }
+ tnsInfo->order[subBlockNumber] = i + 1;
+
+ tnsInfo->tnsActive[subBlockNumber] = 1;
+ tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
+ tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
+
+
+ AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
+ psubBlockInfo->parcor,
+ tnsInfo->order[subBlockNumber],
+ &(spectrum[tC.tnsStartLine]));
+
+ }
+ }
+
+ return(0);
+}
+
+
+/*****************************************************************************
+*
+* function name: m_pow2_cordic
+* description: Iterative power function
+*
+* Calculates pow(2.0,x-1.0*(scale+1)) with INT_BITS bit precision
+* using modified cordic algorithm
+* returns: the result of pow2
+*
+*****************************************************************************/
+static Word32 m_pow2_cordic(Word32 x, Word16 scale)
+{
+ Word32 k;
+
+ 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];
+
+ while(L_sub(x,z) >= 0) {
+
+ x = L_sub(x, z);
+ accu_y = L_add(accu_y, (accu_y >> k));
+ }
+ }
+ return(accu_y);
+}
+
+
+/*****************************************************************************
+*
+* function name: CalcWeightedSpectrum
+* description: Calculate weighted spectrum for LPC calculation
+*
+*****************************************************************************/
+static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input spectrum */
+ Word16 weightedSpectrum[],
+ Word32 *sfbEnergy, /*!< sfb energies */
+ const Word16 *sfbOffset,
+ Word16 lpcStartLine,
+ Word16 lpcStopLine,
+ Word16 lpcStartBand,
+ Word16 lpcStopBand,
+ Word32 *pWork32)
+{
+ #define INT_BITS_SCAL 1<<(INT_BITS/2)
+
+ Word32 i, sfb, shift;
+ Word32 maxShift;
+ Word32 tmp_s, tmp2_s;
+ Word32 tmp, tmp2;
+ Word32 maxWS;
+ Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
+
+ maxWS = 0;
+
+ /* calc 1.0*2^-INT_BITS/2/sqrt(en) */
+ for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
+
+ tmp2 = sfbEnergy[sfb] - 2;
+ if( tmp2 > 0) {
+ tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
+ if(tmp > INT_BITS_SCAL)
+ {
+ shift = norm_l(tmp);
+ tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
+ }
+ else
+ {
+ tmp = 0x7fffffff;
+ }
+ }
+ else {
+ tmp = 0x7fffffff;
+ }
+ tnsSfbMean[sfb] = tmp;
+ }
+
+ /* spread normalized values from sfbs to lines */
+ sfb = lpcStartBand;
+ tmp = tnsSfbMean[sfb];
+ for ( i=lpcStartLine; i<lpcStopLine; i++){
+ tmp_s = sfbOffset[sfb + 1] - i;
+ if ( tmp_s == 0 ) {
+ sfb = sfb + 1;
+ tmp2_s = sfb + 1 - lpcStopBand;
+ if (tmp2_s <= 0) {
+ tmp = tnsSfbMean[sfb];
+ }
+ }
+ pWork32[i] = tmp;
+ }
+ /*filter down*/
+ for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
+ pWork32[i] = (pWork32[i] + pWork32[i + 1]) >> 1;
+ }
+ /* filter up */
+ for (i=(lpcStartLine + 1); i<lpcStopLine; i++){
+ pWork32[i] = (pWork32[i] + pWork32[i - 1]) >> 1;
+ }
+
+ /* weight and normalize */
+ for (i=lpcStartLine; i<lpcStopLine; i++){
+ pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
+ maxWS |= L_abs(pWork32[i]);
+ }
+ maxShift = norm_l(maxWS);
+
+ maxShift = 16 - maxShift;
+ if(maxShift >= 0)
+ {
+ for (i=lpcStartLine; i<lpcStopLine; i++){
+ weightedSpectrum[i] = pWork32[i] >> maxShift;
+ }
+ }
+ else
+ {
+ maxShift = -maxShift;
+ for (i=lpcStartLine; i<lpcStopLine; i++){
+ weightedSpectrum[i] = saturate(pWork32[i] << maxShift);
+ }
+ }
+}
+
+
+
+
+/*****************************************************************************
+*
+* function name: CalcTnsFilter
+* description: LPC calculation for one TNS filter
+* returns: prediction gain
+* input: signal spectrum, acf window, no. of spectral lines,
+* max. TNS order, ptr. to reflection ocefficients
+* output: reflection coefficients
+*(half) window size must be larger than tnsOrder !!*
+******************************************************************************/
+
+static Word16 CalcTnsFilter(const Word16 *signal,
+ const Word32 window[],
+ Word16 numOfLines,
+ Word16 tnsOrder,
+ Word32 parcor[])
+{
+ Word32 parcorWorkBuffer[2*TNS_MAX_ORDER+1];
+ Word32 predictionGain;
+ Word32 i;
+ Word32 tnsOrderPlus1 = tnsOrder + 1;
+
+ assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
+
+ for(i=0;i<tnsOrder;i++) {
+ parcor[i] = 0;
+ }
+
+ AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
+
+ /* early return if signal is very low: signal prediction off, with zero parcor coeffs */
+ if (parcorWorkBuffer[0] == 0)
+ return 0;
+
+ predictionGain = AutoToParcor(parcorWorkBuffer, parcor, tnsOrder);
+
+ return(predictionGain);
+}
+
+/*****************************************************************************
+*
+* function name: AutoCorrelation
+* description: calc. autocorrelation (acf)
+* returns: -
+* input: input values, no. of input values, no. of acf values
+* output: acf values
+*
+*****************************************************************************/
+#ifndef ARMV5E
+void AutoCorrelation(const Word16 input[],
+ Word32 corr[],
+ Word16 samples,
+ Word16 corrCoeff) {
+ Word32 i, j, isamples;
+ Word32 accu;
+ Word32 scf;
+
+ scf = 10 - 1;
+
+ isamples = samples;
+ /* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
+ accu = 0;
+ for(j=0; j<isamples; j++) {
+ accu = L_add(accu, ((input[j] * input[j]) >> scf));
+ }
+ corr[0] = accu;
+
+ /* early termination if all corr coeffs are likely going to be zero */
+ if(corr[0] == 0) return ;
+
+ /* 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;
+ for(j=0; j<isamples; j++) {
+ accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
+ }
+ corr[i] = accu;
+ }
+}
+#endif
+
+/*****************************************************************************
+*
+* function name: AutoToParcor
+* description: conversion autocorrelation to reflection coefficients
+* returns: prediction gain
+* input: <order+1> input values, no. of output values (=order),
+* ptr. to workbuffer (required size: 2*order)
+* output: <order> reflection coefficients
+*
+*****************************************************************************/
+static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOfCoeff) {
+
+ Word32 i, j, shift;
+ Word32 *pWorkBuffer; /* temp pointer */
+ Word32 predictionGain = 0;
+ Word32 num, denom;
+ Word32 temp, workBuffer0;
+
+
+ num = workBuffer[0];
+ temp = workBuffer[numOfCoeff];
+
+ for(i=0; i<numOfCoeff-1; i++) {
+ workBuffer[i + numOfCoeff] = workBuffer[i + 1];
+ }
+ workBuffer[i + numOfCoeff] = temp;
+
+ for(i=0; i<numOfCoeff; i++) {
+ Word32 refc;
+
+
+ if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
+ return 0 ;
+ }
+ shift = norm_l(workBuffer[0]);
+ workBuffer0 = Div_32(1 << shift, workBuffer[0] << shift);
+ /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
+ refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
+
+ reflCoeff[i] = refc;
+
+ 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;
+ }
+ }
+
+ denom = MULHIGH(workBuffer[0], NORM_COEF);
+
+ if (denom != 0) {
+ Word32 temp;
+ shift = norm_l(denom);
+ temp = Div_32(1 << shift, denom << shift);
+ predictionGain = fixmul(num, temp);
+ }
+
+ return extract_l(predictionGain);
+}
+
+
+
+static Word16 Search3(Word32 parcor)
+{
+ Word32 index = 0;
+ Word32 i;
+ Word32 temp;
+
+ for (i=0;i<8;i++) {
+ temp = L_sub( parcor, tnsCoeff3Borders[i]);
+ if (temp > 0)
+ index=i;
+ }
+ return extract_l(index - 4);
+}
+
+static Word16 Search4(Word32 parcor)
+{
+ Word32 index = 0;
+ Word32 i;
+ Word32 temp;
+
+
+ for (i=0;i<16;i++) {
+ temp = L_sub(parcor, tnsCoeff4Borders[i]);
+ if (temp > 0)
+ index=i;
+ }
+ return extract_l(index - 8);
+}
+
+
+
+/*****************************************************************************
+*
+* functionname: Parcor2Index
+* description: quantization index for reflection coefficients
+*
+*****************************************************************************/
+static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */
+ Word16 index[], /*!< quantized coeff indices */
+ Word16 order, /*!< filter order */
+ Word16 bitsPerCoeff) { /*!< quantizer resolution */
+ Word32 i;
+ Word32 temp;
+
+ for(i=0; i<order; i++) {
+ temp = bitsPerCoeff - 3;
+ if (temp == 0) {
+ index[i] = Search3(parcor[i]);
+ }
+ else {
+ index[i] = Search4(parcor[i]);
+ }
+ }
+}
+
+/*****************************************************************************
+*
+* functionname: Index2Parcor
+* description: Inverse quantization for reflection coefficients
+*
+*****************************************************************************/
+static void Index2Parcor(const Word16 index[], /*!< quantized values */
+ Word32 parcor[], /*!< ptr. to reflection coefficients (output) */
+ Word16 order, /*!< no. of coefficients */
+ Word16 bitsPerCoeff) /*!< quantizer resolution */
+{
+ Word32 i;
+ Word32 temp;
+
+ for (i=0; i<order; i++) {
+ temp = bitsPerCoeff - 4;
+ if ( temp == 0 ) {
+ parcor[i] = tnsCoeff4[index[i] + 8];
+ }
+ else {
+ parcor[i] = tnsCoeff3[index[i] + 4];
+ }
+ }
+}
+
+/*****************************************************************************
+*
+* functionname: FIRLattice
+* description: in place lattice filtering of spectral data
+* returns: pointer to modified data
+*
+*****************************************************************************/
+static Word32 FIRLattice(Word16 order, /*!< filter order */
+ Word32 x, /*!< spectral data */
+ Word32 *state_par, /*!< filter states */
+ const Word32 *coef_par) /*!< filter coefficients */
+{
+ Word32 i;
+ Word32 accu,tmp,tmpSave;
+
+ x = x >> 1;
+ 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;
+ }
+
+ /* last stage: only need half operations */
+ accu = fixmul(state_par[order - 1], coef_par[(order - 1)]);
+ state_par[(order - 1)] = tmpSave;
+
+ x = L_add(accu, x);
+ x = L_add(x, x);
+
+ return x;
+}
+
+/*****************************************************************************
+*
+* functionname: AnalysisFilterLattice
+* description: filters spectral lines with TNS filter
+*
+*****************************************************************************/
+static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum */
+ Word16 numOfLines, /*!< no. of lines */
+ const Word32 parCoeff[],/*!< PARC coefficients */
+ Word16 order, /*!< filter order */
+ Word32 output[]) /*!< filtered signal values */
+{
+
+ Word32 state_par[TNS_MAX_ORDER];
+ Word32 j;
+
+ for ( j=0; j<TNS_MAX_ORDER; j++ ) {
+ state_par[j] = 0;
+ }
+
+ for(j=0; j<numOfLines; j++) {
+ output[j] = FIRLattice(order,signal[j],state_par,parCoeff);
+ }
+}
+
+/*****************************************************************************
+*
+* functionname: ApplyTnsMultTableToRatios
+* description: Change thresholds according to tns
+*
+*****************************************************************************/
+void ApplyTnsMultTableToRatios(Word16 startCb,
+ Word16 stopCb,
+ TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */
+ Word32 *thresholds) /*!< thresholds (modified) */
+{
+ Word32 i;
+ if (subInfo.tnsActive) {
+ for(i=startCb; i<stopCb; i++) {
+ /* thresholds[i] * 0.25 */
+ thresholds[i] = (thresholds[i] >> 2);
+ }
+ }
+}
diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c
new file mode 100644
index 0000000..af17b5a
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/transform.c
@@ -0,0 +1,672 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: transform.c
+
+ Content: MDCT Transform functionss
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "psy_const.h"
+#include "transform.h"
+#include "aac_rom.h"
+
+
+#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */
+#define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */
+#define swap2(p0,p1) \
+ t = p0; t1 = *(&(p0)+1); \
+ p0 = p1; *(&(p0)+1) = *(&(p1)+1); \
+ p1 = t; *(&(p1)+1) = t1
+
+/*********************************************************************************
+*
+* function name: Shuffle
+* description: Shuffle points prepared function for fft
+*
+**********************************************************************************/
+static void Shuffle(int *buf, int num, const unsigned char* bitTab)
+{
+ int *part0, *part1;
+ int i, j;
+ int t, t1;
+
+ part0 = buf;
+ part1 = buf + num;
+
+ while ((i = *bitTab++) != 0) {
+ j = *bitTab++;
+
+ swap2(part0[4*i+0], part0[4*j+0]);
+ swap2(part0[4*i+2], part1[4*j+0]);
+ swap2(part1[4*i+0], part0[4*j+2]);
+ swap2(part1[4*i+2], part1[4*j+2]);
+ }
+
+ do {
+ swap2(part0[4*i+2], part1[4*i+0]);
+ } while ((i = *bitTab++) != 0);
+}
+
+#if !defined(ARMV5E) && !defined(ARMV7Neon)
+
+/*****************************************************************************
+*
+* function name: Radix4First
+* description: Radix 4 point prepared function for fft
+*
+**********************************************************************************/
+static void Radix4First(int *buf, int num)
+{
+ int r0, r1, r2, r3;
+ int r4, r5, r6, r7;
+
+ for (; num != 0; num--)
+ {
+ r0 = buf[0] + buf[2];
+ r1 = buf[1] + buf[3];
+ r2 = buf[0] - buf[2];
+ r3 = buf[1] - buf[3];
+ r4 = buf[4] + buf[6];
+ r5 = buf[5] + buf[7];
+ r6 = buf[4] - buf[6];
+ r7 = buf[5] - buf[7];
+
+ buf[0] = r0 + r4;
+ buf[1] = r1 + r5;
+ buf[4] = r0 - r4;
+ buf[5] = r1 - r5;
+ buf[2] = r2 + r7;
+ buf[3] = r3 - r6;
+ buf[6] = r2 - r7;
+ buf[7] = r3 + r6;
+
+ buf += 8;
+ }
+}
+
+/*****************************************************************************
+*
+* function name: Radix8First
+* description: Radix 8 point prepared function for fft
+*
+**********************************************************************************/
+static void Radix8First(int *buf, int num)
+{
+ int r0, r1, r2, r3;
+ int i0, i1, i2, i3;
+ int r4, r5, r6, r7;
+ int i4, i5, i6, i7;
+ int t0, t1, t2, t3;
+
+ for ( ; num != 0; num--)
+ {
+ r0 = buf[0] + buf[2];
+ i0 = buf[1] + buf[3];
+ r1 = buf[0] - buf[2];
+ i1 = buf[1] - buf[3];
+ r2 = buf[4] + buf[6];
+ i2 = buf[5] + buf[7];
+ r3 = buf[4] - buf[6];
+ i3 = buf[5] - buf[7];
+
+ r4 = (r0 + r2) >> 1;
+ i4 = (i0 + i2) >> 1;
+ r5 = (r0 - r2) >> 1;
+ i5 = (i0 - i2) >> 1;
+ r6 = (r1 - i3) >> 1;
+ i6 = (i1 + r3) >> 1;
+ r7 = (r1 + i3) >> 1;
+ i7 = (i1 - r3) >> 1;
+
+ r0 = buf[ 8] + buf[10];
+ i0 = buf[ 9] + buf[11];
+ r1 = buf[ 8] - buf[10];
+ i1 = buf[ 9] - buf[11];
+ r2 = buf[12] + buf[14];
+ i2 = buf[13] + buf[15];
+ r3 = buf[12] - buf[14];
+ i3 = buf[13] - buf[15];
+
+ t0 = (r0 + r2) >> 1;
+ t1 = (i0 + i2) >> 1;
+ t2 = (r0 - r2) >> 1;
+ t3 = (i0 - i2) >> 1;
+
+ buf[ 0] = r4 + t0;
+ buf[ 1] = i4 + t1;
+ buf[ 8] = r4 - t0;
+ buf[ 9] = i4 - t1;
+ buf[ 4] = r5 + t3;
+ buf[ 5] = i5 - t2;
+ buf[12] = r5 - t3;
+ buf[13] = i5 + t2;
+
+ r0 = r1 - i3;
+ i0 = i1 + r3;
+ r2 = r1 + i3;
+ i2 = i1 - r3;
+
+ t0 = MULHIGH(SQRT1_2, r0 - i0);
+ t1 = MULHIGH(SQRT1_2, r0 + i0);
+ t2 = MULHIGH(SQRT1_2, r2 - i2);
+ t3 = MULHIGH(SQRT1_2, r2 + i2);
+
+ buf[ 6] = r6 - t0;
+ buf[ 7] = i6 - t1;
+ buf[14] = r6 + t0;
+ buf[15] = i6 + t1;
+ buf[ 2] = r7 + t3;
+ buf[ 3] = i7 - t2;
+ buf[10] = r7 - t3;
+ buf[11] = i7 + t2;
+
+ buf += 16;
+ }
+}
+
+/*****************************************************************************
+*
+* function name: Radix4FFT
+* description: Radix 4 point fft core function
+*
+**********************************************************************************/
+static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
+{
+ int r0, r1, r2, r3;
+ int r4, r5, r6, r7;
+ int t0, t1;
+ int sinx, cosx;
+ int i, j, step;
+ int *xptr, *csptr;
+
+ for (num >>= 2; num != 0; num >>= 2)
+ {
+ step = 2*bgn;
+ xptr = buf;
+
+ for (i = num; i != 0; i--)
+ {
+ csptr = twidTab;
+
+ for (j = bgn; j != 0; j--)
+ {
+ r0 = xptr[0];
+ r1 = xptr[1];
+ xptr += step;
+
+ t0 = xptr[0];
+ t1 = xptr[1];
+ cosx = csptr[0];
+ sinx = csptr[1];
+ r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */
+ r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*bi - sin*br */
+ xptr += step;
+
+ t0 = r0 >> 2;
+ t1 = r1 >> 2;
+ r0 = t0 - r2;
+ r1 = t1 - r3;
+ r2 = t0 + r2;
+ r3 = t1 + r3;
+
+ t0 = xptr[0];
+ t1 = xptr[1];
+ cosx = csptr[2];
+ sinx = csptr[3];
+ r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
+ r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
+ xptr += step;
+
+ t0 = xptr[0];
+ t1 = xptr[1];
+ cosx = csptr[4];
+ sinx = csptr[5];
+ r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
+ r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
+ csptr += 6;
+
+ t0 = r4;
+ t1 = r5;
+ r4 = t0 + r6;
+ r5 = r7 - t1;
+ r6 = t0 - r6;
+ r7 = r7 + t1;
+
+ xptr[0] = r0 + r5;
+ xptr[1] = r1 + r6;
+ xptr -= step;
+
+ xptr[0] = r2 - r4;
+ xptr[1] = r3 - r7;
+ xptr -= step;
+
+ xptr[0] = r0 - r5;
+ xptr[1] = r1 - r6;
+ xptr -= step;
+
+ xptr[0] = r2 + r4;
+ xptr[1] = r3 + r7;
+ xptr += 2;
+ }
+ xptr += 3*step;
+ }
+ twidTab += 3*step;
+ bgn <<= 2;
+ }
+}
+
+/*********************************************************************************
+*
+* function name: PreMDCT
+* description: prepare MDCT process for next FFT compute
+*
+**********************************************************************************/
+static void PreMDCT(int *buf0, int num, const int *csptr)
+{
+ int i;
+ int tr1, ti1, tr2, ti2;
+ int cosa, sina, cosb, sinb;
+ int *buf1;
+
+ buf1 = buf0 + num - 1;
+
+ for(i = num >> 2; i != 0; i--)
+ {
+ cosa = *csptr++;
+ sina = *csptr++;
+ cosb = *csptr++;
+ sinb = *csptr++;
+
+ tr1 = *(buf0 + 0);
+ ti2 = *(buf0 + 1);
+ tr2 = *(buf1 - 1);
+ ti1 = *(buf1 + 0);
+
+ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
+ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
+
+ *buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
+ *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
+ }
+}
+
+/*********************************************************************************
+*
+* function name: PostMDCT
+* description: post MDCT process after next FFT for MDCT
+*
+**********************************************************************************/
+static void PostMDCT(int *buf0, int num, const int *csptr)
+{
+ int i;
+ int tr1, ti1, tr2, ti2;
+ int cosa, sina, cosb, sinb;
+ int *buf1;
+
+ buf1 = buf0 + num - 1;
+
+ for(i = num >> 2; i != 0; i--)
+ {
+ cosa = *csptr++;
+ sina = *csptr++;
+ cosb = *csptr++;
+ sinb = *csptr++;
+
+ tr1 = *(buf0 + 0);
+ ti1 = *(buf0 + 1);
+ ti2 = *(buf1 + 0);
+ tr2 = *(buf1 - 1);
+
+ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
+ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
+
+ *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
+ *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
+ }
+}
+#endif
+
+
+/**********************************************************************************
+*
+* function name: Mdct_Long
+* description: the long block mdct, include long_start block, end_long block
+*
+**********************************************************************************/
+void Mdct_Long(int *buf)
+{
+ PreMDCT(buf, 1024, cossintab + 128);
+
+ Shuffle(buf, 512, bitrevTab + 17);
+ Radix8First(buf, 512 >> 3);
+ Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
+
+ PostMDCT(buf, 1024, cossintab + 128);
+}
+
+
+/**********************************************************************************
+*
+* function name: Mdct_Short
+* description: the short block mdct
+*
+**********************************************************************************/
+void Mdct_Short(int *buf)
+{
+ PreMDCT(buf, 128, cossintab);
+
+ Shuffle(buf, 64, bitrevTab);
+ Radix4First(buf, 64 >> 2);
+ Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
+
+ PostMDCT(buf, 128, cossintab);
+}
+
+
+/*****************************************************************************
+*
+* function name: shiftMdctDelayBuffer
+* description: the mdct delay buffer has a size of 1600,
+* 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
+*
+**********************************************************************************/
+static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct delay buffer */
+ Word16 *timeSignal, /*! pointer to new time signal samples, interleaved */
+ Word16 chIncrement /*! number of channels */
+ )
+{
+ Word32 i;
+ Word16 *srBuf = mdctDelayBuffer;
+ Word16 *dsBuf = mdctDelayBuffer+FRAME_LEN_LONG;
+
+ for(i = 0; i < BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; i+= 8)
+ {
+ *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
+ *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
+ *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
+ *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
+ }
+
+ srBuf = mdctDelayBuffer + BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG;
+ dsBuf = timeSignal;
+
+ for(i=0; i<FRAME_LEN_LONG; i+=8)
+ {
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ *srBuf++ = *dsBuf; dsBuf += chIncrement;
+ }
+}
+
+
+/*****************************************************************************
+*
+* function name: getScalefactorOfShortVectorStride
+* description: Calculate max possible scale factor for input vector of shorts
+* returns: Maximum scale factor
+*
+**********************************************************************************/
+static Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
+ Word16 len, /*!< Length of input vector */
+ Word16 stride) /*!< Stride of input vector */
+{
+ Word16 maxVal = 0;
+ Word16 absVal;
+ Word16 i;
+
+ for(i=0; i<len; i++){
+ absVal = abs_s(vector[i*stride]);
+ maxVal |= absVal;
+ }
+
+ return( maxVal ? norm_s(maxVal) : 15);
+}
+
+
+/*****************************************************************************
+*
+* function name: Transform_Real
+* description: Calculate transform filter for input vector of shorts
+* returns: TRUE if success
+*
+**********************************************************************************/
+void Transform_Real(Word16 *mdctDelayBuffer,
+ Word16 *timeSignal,
+ Word16 chIncrement,
+ Word32 *realOut,
+ Word16 *mdctScale,
+ Word16 blockType
+ )
+{
+ Word32 i,w;
+ Word32 timeSignalSample;
+ Word32 ws1,ws2;
+ Word16 *dctIn0, *dctIn1;
+ Word32 *outData0, *outData1;
+ Word32 *winPtr;
+
+ 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
+ and get the biggest scale factor for next calculate more precise
+ */
+ delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
+ 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;
+ ws1 = timeSignalSample * (*winPtr >> 16);
+ timeSignalSample = (*dctIn1--) << minSf;
+ ws2 = timeSignalSample * (*winPtr & 0xffff);
+ winPtr ++;
+ /* 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;
+ winPtr = (int *)LongWindowKBD;
+ 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));
+ }
+
+ Mdct_Long(realOut);
+ /* update scale factor */
+ minSf = 14 - minSf;
+ *mdctScale=minSf;
+ break;
+
+ case START_WINDOW:
+ /*
+ we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
+ and get the biggest scale factor for next calculate more precise
+ */
+ minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
+ minSf = min(minSf,14);
+
+ dctIn0 = mdctDelayBuffer;
+ dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
+ outData0 = realOut + FRAME_LEN_LONG/2;
+ winPtr = (int *)LongWindowKBD;
+
+ /* add windows and pre add for mdct to last buffer*/
+ for(i=0;i<FRAME_LEN_LONG/2;i++){
+ timeSignalSample = (*dctIn0++) << minSf;
+ ws1 = timeSignalSample * (*winPtr >> 16);
+ timeSignalSample = (*dctIn1--) << minSf;
+ ws2 = timeSignalSample * (*winPtr & 0xffff);
+ winPtr ++;
+ *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
+ }
+
+ shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
+
+ outData0 = realOut + FRAME_LEN_LONG/2 - 1;
+ for(i=0;i<LS_TRANS;i++){
+ *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;
+ winPtr = (int *)ShortWindowSine;
+ for(i=0;i<FRAME_LEN_SHORT/2;i++){
+ timeSignalSample= (*dctIn0++) << minSf;
+ ws1 = timeSignalSample * (*winPtr & 0xffff);
+ timeSignalSample= (*dctIn1--) << minSf;
+ ws2 = timeSignalSample * (*winPtr >> 16);
+ winPtr++;
+ *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
+ }
+
+ Mdct_Long(realOut);
+ /* update scale factor */
+ 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
+ and get the biggest scale factor for next calculate more precise
+ */
+ 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(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);
+ }
+
+ /* 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;
+ winPtr = (int *)ShortWindowSine;
+ for(i=0;i<FRAME_LEN_SHORT/2;i++){
+ timeSignalSample = (*dctIn0++) << minSf;
+ ws1 = timeSignalSample * (*winPtr >> 16);
+ timeSignalSample= (*dctIn1--) << minSf;
+ ws2 = timeSignalSample * (*winPtr & 0xffff);
+ 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;
+ winPtr = (int *)LongWindowKBD;
+ for(i=0;i<FRAME_LEN_LONG/2;i++){
+ timeSignalSample= (*dctIn0++) << minSf;
+ ws1 = timeSignalSample *(*winPtr & 0xffff);
+ timeSignalSample= (*dctIn1--) << minSf;
+ ws2 = timeSignalSample * (*winPtr >> 16);
+ *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;
+
+ winPtr = (int *)ShortWindowSine;
+ for(i=0;i<FRAME_LEN_SHORT/2;i++){
+ timeSignalSample= *dctIn0 << minSf;
+ ws1 = timeSignalSample * (*winPtr >> 16);
+ 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;
+ ws2 = timeSignalSample * (*winPtr >> 16);
+ *outData1-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
+
+ winPtr++;
+ dctIn0++;
+ dctIn1--;
+ }
+
+ Mdct_Short(realOut);
+ realOut += FRAME_LEN_SHORT;
+ }
+
+ minSf = 11 - minSf;
+ *mdctScale = minSf; /* update scale factor */
+
+ shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
+ break;
+ }
+}
+
diff --git a/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp b/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
index f3496717..cb680ba 100644
--- a/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
+++ b/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
@@ -29,8 +29,9 @@
static const int32_t kNumSamplesPerFrame = 160;
static const int32_t kSampleRate = 8000;
-AMRNBEncoder::AMRNBEncoder(const sp<MediaSource> &source)
+AMRNBEncoder::AMRNBEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta)
: mSource(source),
+ mMeta(meta),
mStarted(false),
mBufferGroup(NULL),
mEncState(NULL),
@@ -119,28 +120,16 @@
sp<MetaData> AMRNBEncoder::getFormat() {
sp<MetaData> srcFormat = mSource->getFormat();
- int32_t numChannels;
- int32_t sampleRate;
-
- CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
- CHECK_EQ(numChannels, 1);
-
- CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
- CHECK_EQ(sampleRate, kSampleRate);
-
- sp<MetaData> meta = new MetaData;
- meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_NB);
- meta->setInt32(kKeyChannelCount, numChannels);
- meta->setInt32(kKeySampleRate, sampleRate);
+ mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_NB);
int64_t durationUs;
if (srcFormat->findInt64(kKeyDuration, &durationUs)) {
- meta->setInt64(kKeyDuration, durationUs);
+ mMeta->setInt64(kKeyDuration, durationUs);
}
- meta->setCString(kKeyDecoderComponent, "AMRNBEncoder");
+ mMeta->setCString(kKeyDecoderComponent, "AMRNBEncoder");
- return meta;
+ return mMeta;
}
status_t AMRNBEncoder::read(
diff --git a/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp b/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
new file mode 100644
index 0000000..0d12925
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
@@ -0,0 +1,282 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "AMRWBEncoder"
+#include <utils/Log.h>
+
+#include "AMRWBEncoder.h"
+#include "voAMRWB.h"
+#include "cmnMemory.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+static const int32_t kNumSamplesPerFrame = 320;
+static const int32_t kBitsPerSample = 16;
+static const int32_t kInputBufferSize = (kBitsPerSample / 8) * kNumSamplesPerFrame;
+static const int32_t kSampleRate = 16000;
+static const int32_t kNumChannels = 1;
+
+AMRWBEncoder::AMRWBEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta)
+ : mSource(source),
+ mMeta(meta),
+ mStarted(false),
+ mBufferGroup(NULL),
+ mInputBuffer(NULL),
+ mEncoderHandle(NULL),
+ mApiHandle(NULL),
+ mMemOperator(NULL),
+ mAnchorTimeUs(0),
+ mNumFramesOutput(0),
+ mNumInputSamples(0) {
+}
+
+static VOAMRWBMODE pickModeFromBitRate(int32_t bps) {
+ CHECK(bps >= 0);
+ if (bps <= 6600) {
+ return VOAMRWB_MD66;
+ } else if (bps <= 8850) {
+ return VOAMRWB_MD885;
+ } else if (bps <= 12650) {
+ return VOAMRWB_MD1265;
+ } else if (bps <= 14250) {
+ return VOAMRWB_MD1425;
+ } else if (bps <= 15850) {
+ return VOAMRWB_MD1585;
+ } else if (bps <= 18250) {
+ return VOAMRWB_MD1825;
+ } else if (bps <= 19850) {
+ return VOAMRWB_MD1985;
+ } else if (bps <= 23050) {
+ return VOAMRWB_MD2305;
+ }
+ return VOAMRWB_MD2385;
+}
+
+status_t AMRWBEncoder::initCheck() {
+ CHECK(mApiHandle == NULL && mEncoderHandle == NULL);
+ CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate));
+
+ mApiHandle = new VO_AUDIO_CODECAPI;
+ CHECK(mApiHandle);
+
+ if (VO_ERR_NONE != voGetAMRWBEncAPI(mApiHandle)) {
+ LOGE("Failed to get api handle");
+ return UNKNOWN_ERROR;
+ }
+
+ mMemOperator = new VO_MEM_OPERATOR;
+ CHECK(mMemOperator != NULL);
+ mMemOperator->Alloc = cmnMemAlloc;
+ mMemOperator->Copy = cmnMemCopy;
+ mMemOperator->Free = cmnMemFree;
+ mMemOperator->Set = cmnMemSet;
+ mMemOperator->Check = cmnMemCheck;
+
+ VO_CODEC_INIT_USERDATA userData;
+ memset(&userData, 0, sizeof(userData));
+ userData.memflag = VO_IMF_USERMEMOPERATOR;
+ userData.memData = (VO_PTR) mMemOperator;
+ if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAMRWB, &userData)) {
+ LOGE("Failed to init AMRWB encoder");
+ return UNKNOWN_ERROR;
+ }
+
+ // Configure AMRWB encoder$
+ VOAMRWBMODE mode = pickModeFromBitRate(mBitRate);
+ if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_MODE, &mode)) {
+ LOGE("Failed to set AMRWB encoder mode to %d", mode);
+ return UNKNOWN_ERROR;
+ }
+
+ VOAMRWBFRAMETYPE type = VOAMRWB_RFC3267;
+ if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &type)) {
+ LOGE("Failed to set AMRWB encoder frame type to %d", type);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+AMRWBEncoder::~AMRWBEncoder() {
+ if (mStarted) {
+ stop();
+ }
+}
+
+status_t AMRWBEncoder::start(MetaData *params) {
+ CHECK(!mStarted);
+
+ mBufferGroup = new MediaBufferGroup;
+
+ // The largest buffer size is header + 477 bits
+ mBufferGroup->add_buffer(new MediaBuffer(1024));
+
+ CHECK_EQ(OK, initCheck());
+
+ mNumFramesOutput = 0;
+ mSource->start();
+
+ mStarted = true;
+
+ return OK;
+}
+
+status_t AMRWBEncoder::stop() {
+ CHECK(mStarted);
+
+
+ if (mInputBuffer) {
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+ }
+
+ delete mBufferGroup;
+ mBufferGroup = NULL;
+
+
+ CHECK_EQ(VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle));
+ mEncoderHandle = NULL;
+
+ delete mApiHandle;
+ mApiHandle = NULL;
+
+ delete mMemOperator;
+ mMemOperator;
+
+ mStarted = false;
+
+ mSource->stop();
+ return OK;
+}
+
+sp<MetaData> AMRWBEncoder::getFormat() {
+ sp<MetaData> srcFormat = mSource->getFormat();
+
+ mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_WB);
+
+ int64_t durationUs;
+ if (srcFormat->findInt64(kKeyDuration, &durationUs)) {
+ mMeta->setInt64(kKeyDuration, durationUs);
+ }
+
+ mMeta->setCString(kKeyDecoderComponent, "AMRWBEncoder");
+
+ return mMeta;
+}
+
+status_t AMRWBEncoder::read(
+ MediaBuffer **out, const ReadOptions *options) {
+ status_t err;
+
+ *out = NULL;
+
+ int64_t seekTimeUs;
+ CHECK(options == NULL || !options->getSeekTo(&seekTimeUs));
+
+ while (mNumInputSamples < kNumSamplesPerFrame) {
+ if (mInputBuffer == NULL) {
+ err = mSource->read(&mInputBuffer, options);
+
+ if (err != OK) {
+ if (mNumInputSamples == 0) {
+ return ERROR_END_OF_STREAM;
+ }
+ memset(&mInputFrame[mNumInputSamples],
+ 0,
+ sizeof(int16_t)
+ * (kNumSamplesPerFrame - mNumInputSamples));
+ mNumInputSamples = 0;
+ break;
+ }
+
+ size_t align = mInputBuffer->range_length() % sizeof(int16_t);
+ CHECK_EQ(align, 0);
+
+ int64_t timeUs;
+ if (mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) {
+ mAnchorTimeUs = timeUs;
+ }
+ }
+
+ size_t copy =
+ (kNumSamplesPerFrame - mNumInputSamples) * sizeof(int16_t);
+
+ if (copy > mInputBuffer->range_length()) {
+ copy = mInputBuffer->range_length();
+ }
+
+ memcpy(&mInputFrame[mNumInputSamples],
+ (const uint8_t *)mInputBuffer->data()
+ + mInputBuffer->range_offset(),
+ copy);
+
+ mInputBuffer->set_range(
+ mInputBuffer->range_offset() + copy,
+ mInputBuffer->range_length() - copy);
+
+ if (mInputBuffer->range_length() == 0) {
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+ }
+
+ mNumInputSamples += copy / sizeof(int16_t);
+ if (mNumInputSamples >= kNumSamplesPerFrame) {
+ mNumInputSamples %= kNumSamplesPerFrame;
+ break; // Get a whole input frame 640 bytes
+ }
+ }
+
+ VO_CODECBUFFER inputData;
+ memset(&inputData, 0, sizeof(inputData));
+ inputData.Buffer = (unsigned char*) mInputFrame;
+ inputData.Length = kInputBufferSize;
+ CHECK(VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData));
+
+ MediaBuffer *buffer;
+ CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+ uint8_t *outPtr = (uint8_t *)buffer->data();
+
+ VO_CODECBUFFER outputData;
+ memset(&outputData, 0, sizeof(outputData));
+ VO_AUDIO_OUTPUTINFO outputInfo;
+ memset(&outputInfo, 0, sizeof(outputInfo));
+
+ VO_U32 ret = VO_ERR_NONE;
+ outputData.Buffer = outPtr;
+ outputData.Length = buffer->size();
+ ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo);
+ CHECK(ret == VO_ERR_NONE || ret == VO_ERR_INPUT_BUFFER_SMALL);
+
+ buffer->set_range(0, outputData.Length);
+ ++mNumFramesOutput;
+
+ // XXX: fix timestamp calculation
+ int64_t timestampUs = mNumFramesOutput * 20000LL;
+
+ buffer->meta_data()->setInt64(kKeyTime, timestampUs);
+
+ *out = buffer;
+ return OK;
+}
+
+} // namespace android
diff --git a/media/libstagefright/codecs/amrwbenc/Android.mk b/media/libstagefright/codecs/amrwbenc/Android.mk
new file mode 100644
index 0000000..4293287
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/Android.mk
@@ -0,0 +1,120 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+include frameworks/base/media/libstagefright/codecs/common/Config.mk
+
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_SRC_FILES := \
+ AMRWBEncoder.cpp \
+ src/autocorr.c \
+ src/az_isp.c \
+ src/bits.c \
+ src/c2t64fx.c \
+ src/c4t64fx.c \
+ src/convolve.c \
+ src/cor_h_x.c \
+ src/decim54.c \
+ src/deemph.c \
+ src/dtx.c \
+ src/g_pitch.c \
+ src/gpclip.c \
+ src/homing.c \
+ src/hp400.c \
+ src/hp50.c \
+ src/hp6k.c \
+ src/hp_wsp.c \
+ src/int_lpc.c \
+ src/isp_az.c \
+ src/isp_isf.c \
+ src/lag_wind.c \
+ src/levinson.c \
+ src/log2.c \
+ src/lp_dec2.c \
+ src/math_op.c \
+ src/oper_32b.c \
+ src/p_med_ol.c \
+ src/pit_shrp.c \
+ src/pitch_f4.c \
+ src/pred_lt4.c \
+ src/preemph.c \
+ src/q_gain2.c \
+ src/q_pulse.c \
+ src/qisf_ns.c \
+ src/qpisf_2s.c \
+ src/random.c \
+ src/residu.c \
+ src/scale.c \
+ src/stream.c \
+ src/syn_filt.c \
+ src/updt_tar.c \
+ src/util.c \
+ src/voAMRWBEnc.c \
+ src/voicefac.c \
+ src/wb_vad.c \
+ src/weight_a.c \
+ src/mem_align.c
+
+
+ifeq ($(VOTT), v5)
+LOCAL_SRC_FILES += \
+ src/asm/ARMV5E/convolve_opt.s \
+ src/asm/ARMV5E/cor_h_vec_opt.s \
+ src/asm/ARMV5E/Deemph_32_opt.s \
+ src/asm/ARMV5E/Dot_p_opt.s \
+ src/asm/ARMV5E/Filt_6k_7k_opt.s \
+ src/asm/ARMV5E/Norm_Corr_opt.s \
+ src/asm/ARMV5E/pred_lt4_1_opt.s \
+ src/asm/ARMV5E/residu_asm_opt.s \
+ src/asm/ARMV5E/scale_sig_opt.s \
+ src/asm/ARMV5E/Syn_filt_32_opt.s \
+ src/asm/ARMV5E/syn_filt_opt.s
+
+endif
+
+ifeq ($(VOTT), v7)
+LOCAL_SRC_FILES += \
+ src/asm/ARMV7/convolve_neon.s \
+ src/asm/ARMV7/cor_h_vec_neon.s \
+ src/asm/ARMV7/Deemph_32_neon.s \
+ src/asm/ARMV7/Dot_p_neon.s \
+ src/asm/ARMV7/Filt_6k_7k_neon.s \
+ src/asm/ARMV7/Norm_Corr_neon.s \
+ src/asm/ARMV7/pred_lt4_1_neon.s \
+ src/asm/ARMV7/residu_asm_neon.s \
+ src/asm/ARMV7/scale_sig_neon.s \
+ src/asm/ARMV7/Syn_filt_32_neon.s \
+ src/asm/ARMV7/syn_filt_neon.s
+
+endif
+
+LOCAL_MODULE := libstagefright_amrwbenc
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_SHARED_LIBRARIES :=
+
+LOCAL_C_INCLUDES := \
+ frameworks/base/media/libstagefright/include \
+ frameworks/base/media/libstagefright/codecs/common/include \
+ frameworks/base/include \
+ $(LOCAL_PATH)/src \
+ $(LOCAL_PATH)/inc
+
+LOCAL_CFLAGS := $(VO_CFLAGS)
+
+ifeq ($(VOTT), v5)
+LOCAL_CFLAGS += -DARM -DASM_OPT
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+endif
+
+ifeq ($(VOTT), v7)
+LOCAL_CFLAGS += -DARM -DARMV7 -DASM_OPT
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
+endif
+
+include $(BUILD_STATIC_LIBRARY)
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
new file mode 100644
index 0000000..792d3cc
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
@@ -0,0 +1,364 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+#ifdef LINUX
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include "voAMRWB.h"
+#include "cmnMemory.h"
+
+#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"
+
+#define INPUT_SIZE 640
+#define OUTPUT_SIZE 1024
+unsigned char InputBuf[INPUT_SIZE];
+unsigned char OutputBuf[OUTPUT_SIZE];
+
+void usage (void) {
+ printf ("AMR_WB Encoder HELP Displays this text\n");
+ printf ("\n");
+ printf ("Usage:\n");
+ printf ("AMRWBEnc [options] Input_file output_file \n");
+ printf ("\n");
+ printf ("Options +M* +F* +DTX \n");
+ printf ("Support \n");
+ printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n");
+ printf (" +M0 = 6.6kbps \n");
+ printf (" +M1 = 8.85kbps \n");
+ printf (" +M2 = 12.65kbps \n");
+ printf (" +M3 = 14.25kbps \n");
+ printf (" +M4 = 15.58kbps \n");
+ printf (" +M5 = 18.25kbps \n");
+ printf (" +M6 = 19.85kbps \n");
+ printf (" +M7 = 23.05kbps \n");
+ printf (" +M8 = 23.85kbps \n");
+ printf ("\n");
+ printf ("Options +F* for setting output frame Type, default is RFC3267 \n");
+ printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n");
+ printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n");
+ printf ("+F2 for RFC3267\n ");
+ printf ("\n");
+ printf ("Options +DTX enable DTX mode, default is disable.\n");
+ printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n");
+ printf ("\n");
+}
+
+int GetNextBuf(FILE* inFile,unsigned char* dst,int size)
+{
+ int size2 = (int)fread(dst, sizeof(signed char), size,inFile);
+ return size2;
+}
+
+typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
+
+int encode(
+ int mode,
+ short allow_dtx,
+ VOAMRWBFRAMETYPE frameType,
+ const char* srcfile,
+ const char* dstfile
+ )
+{
+ int ret = 0;
+ int returnCode;
+ FILE *fsrc = NULL;
+ FILE *fdst = NULL;
+ int framenum = 0;
+ int eofFile = 0;
+ int size1 = 0;
+ int Relens;
+
+ VO_AUDIO_CODECAPI AudioAPI;
+ VO_MEM_OPERATOR moper;
+ VO_CODEC_INIT_USERDATA useData;
+ VO_HANDLE hCodec;
+ VO_CODECBUFFER inData;
+ VO_CODECBUFFER outData;
+ VO_AUDIO_OUTPUTINFO outFormat;
+
+ unsigned char *inBuf = InputBuf;
+ unsigned char *outBuf = OutputBuf;
+
+
+#ifdef LINUX
+ void *handle = NULL;
+ void *pfunc;
+ VOGETAUDIOENCAPI pGetAPI;
+#endif
+
+ clock_t start, finish;
+ double duration = 0.0;
+
+ if ((fsrc = fopen (srcfile, "rb")) == NULL)
+ {
+ ret = -1;
+ goto safe_exit;
+ }
+
+ if ((fdst = fopen (dstfile, "wb")) == NULL)
+ {
+ ret = -1;
+ goto safe_exit;
+ }
+
+ moper.Alloc = cmnMemAlloc;
+ moper.Copy = cmnMemCopy;
+ moper.Free = cmnMemFree;
+ moper.Set = cmnMemSet;
+ moper.Check = cmnMemCheck;
+
+ useData.memflag = VO_IMF_USERMEMOPERATOR;
+ useData.memData = (VO_PTR)(&moper);
+
+#ifdef LINUX
+ handle = dlopen("/data/local/tmp/voAMRWBEnc.so", RTLD_NOW);
+ if(handle == 0)
+ {
+ printf("open dll error......");
+ return -1;
+ }
+
+ pfunc = dlsym(handle, "voGetAMRWBEncAPI");
+ if(pfunc == 0)
+ {
+ printf("open function error......");
+ return -1;
+ }
+
+ pGetAPI = (VOGETAUDIOENCAPI)pfunc;
+
+ returnCode = pGetAPI(&AudioAPI);
+ if(returnCode)
+ {
+ printf("get APIs error......");
+ return -1;
+ }
+#else
+ ret = voGetAMRWBEncAPI(&AudioAPI);
+ if(ret)
+ {
+ ret = -1;
+ printf("get APIs error......");
+ goto safe_exit;
+ }
+#endif
+
+ //####################################### Init Encoding Section #########################################
+ ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
+
+ if(ret)
+ {
+ ret = -1;
+ printf("APIs init error......");
+ goto safe_exit;
+ }
+
+ Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);
+ if(Relens!=INPUT_SIZE && !feof(fsrc))
+ {
+ ret = -1; //Invalid magic number
+ printf("get next buffer error......");
+ goto safe_exit;
+ }
+
+ //###################################### set encode Mode ##################################################
+ ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType);
+ ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode);
+ ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx);
+
+ if(frameType == VOAMRWB_RFC3267)
+ {
+ /* write RFC3267 Header info to indicate single channel AMR file storage format */
+ size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO);
+ memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1);
+ outBuf += size1;
+ }
+
+ //####################################### Encoding Section #########################################
+ printf(" \n ---------------- Running -------------------------\n ");
+
+ do{
+ inData.Buffer = (unsigned char *)inBuf;
+ inData.Length = Relens;
+ outData.Buffer = outBuf;
+
+ start = clock();
+
+ /* decode one amr block */
+ returnCode = AudioAPI.SetInputData(hCodec,&inData);
+
+ do {
+ returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);
+ if(returnCode == 0)
+ {
+ framenum++;
+ printf(" Frames processed: %hd\r", framenum);
+ if(framenum == 1)
+ {
+ fwrite(OutputBuf, 1, outData.Length + size1, fdst);
+ fflush(fdst);
+ }
+ else
+ {
+ fwrite(outData.Buffer, 1, outData.Length, fdst);
+ fflush(fdst);
+ }
+ }
+ else if(returnCode == VO_ERR_LICENSE_ERROR)
+ {
+ printf("Encoder time reach upper limit......");
+ goto safe_exit;
+ }
+ } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL);
+
+ finish = clock();
+ duration += finish - start;
+
+ if (!eofFile) {
+ Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);
+ inBuf = InputBuf;
+ if (feof(fsrc) && Relens == 0)
+ eofFile = 1;
+ }
+ } while (!eofFile && returnCode);
+ //####################################### End Encoding Section #########################################
+
+safe_exit:
+ returnCode = AudioAPI.Uninit(hCodec);
+
+ printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);
+
+ if (fsrc)
+ fclose(fsrc);
+ if (fdst)
+ fclose(fdst);
+
+#ifdef LINUX
+ dlclose(handle);
+#endif
+
+ return ret;
+}
+
+int main(int argc, char **argv) // for gcc compiler;
+{
+ int mode, r;
+ int arg, filename=0;
+ char *inFileName = NULL;
+ char *outFileName = NULL;
+ short allow_dtx;
+ VOAMRWBFRAMETYPE frameType;
+
+ printf("\n");
+ printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n");
+ printf("***********************************DEFINITIONS:*******************************************************\n");
+ printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n");
+ printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n");
+ printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n");
+ printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n");
+ printf("\n");
+
+ /*Encoder Default setting */
+ mode = VOAMRWB_MD2385;
+ allow_dtx = 0;
+ frameType = VOAMRWB_RFC3267;
+
+ if(argc < 3){
+ usage();
+ return 0;
+ }else{
+ for (arg = 1; arg < argc; arg++) {
+ if (argv [arg] [0] == '+') {
+ if(argv[arg][1] == 'M')
+ {
+ switch(argv[arg][2])
+ {
+ case '0': mode = VOAMRWB_MD66;
+ break;
+ case '1': mode = VOAMRWB_MD885;
+ break;
+ case '2': mode = VOAMRWB_MD1265;
+ break;
+ case '3': mode = VOAMRWB_MD1425;
+ break;
+ case '4': mode = VOAMRWB_MD1585;
+ break;
+ case '5': mode = VOAMRWB_MD1825;
+ break;
+ case '6': mode = VOAMRWB_MD1985;
+ break;
+ case '7': mode = VOAMRWB_MD2305;
+ break;
+ case '8': mode = VOAMRWB_MD2385;
+ break;
+ default:
+ usage();
+ printf ("Invalid parameter '%s'.\n", argv [arg]);
+ break;
+ }
+ }else if(argv[arg][1] == 'F')
+ {
+ switch(argv[arg][2])
+ {
+ case '0': frameType = VOAMRWB_DEFAULT;
+ break;
+ case '1': frameType = VOAMRWB_ITU;
+ break;
+ case '2': frameType = VOAMRWB_RFC3267 ;
+ break;
+ default:
+ usage();
+ printf ("Invalid parameter '%s'.\n", argv [arg]);
+ break;
+
+
+ }
+ }else if(strcmp (argv[arg], "+DTX") == 0)
+ {
+ allow_dtx = 1;
+ }
+
+ } else {
+ switch (filename) {
+ case 0:
+ inFileName = argv[arg];
+ break;
+ case 1:
+ outFileName = argv[arg];
+ break;
+ default:
+ usage ();
+ fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);
+ return 0;
+ }
+ filename++;
+ }
+ }
+ }
+
+ r = encode(mode, allow_dtx, frameType, inFileName, outFileName);
+ if(r)
+ {
+ fprintf(stderr, "error: %d\n", r);
+ }
+ return r;
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk b/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk
new file mode 100644
index 0000000..7edb166
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c
+
+LOCAL_SRC_FILES += \
+ ../../../Common/cmnMemory.c
+
+LOCAL_MODULE := TestvoAMRWBEnc
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/ \
+ $(LOCAL_PATH)/../../../Common \
+ $(LOCAL_PATH)/../../../Include \
+
+LOCAL_CFLAGS := $(VO_CFLAGS)
+
+include $(BUILD_EXECUTABLE)
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/eclair/Makefile b/media/libstagefright/codecs/amrwbenc/SampleCode/eclair/Makefile
new file mode 100644
index 0000000..55b876a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/eclair/Makefile
@@ -0,0 +1,56 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+
+# target6
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v6
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= exe
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+# e.g. -DVISUALON, macro VISUALON defined for your module
+VOMM:= #ARMV5E
+
+
+
+# please specify the name of your module
+VOTARGET:= voAMRWBEnc_Test
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=-ldl
+
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../
+
+
+# please modify here to be sure to see the doit.mk
+include ../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/ms.mk b/media/libstagefright/codecs/amrwbenc/SampleCode/ms.mk
new file mode 100644
index 0000000..74e8913
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/ms.mk
@@ -0,0 +1,24 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+# please list all objects needed by your target here
+OBJS:=AMRWB_E_SAMPLE.o cmnMemory.o
+
+# please list all directories that all source files relative with your module(.h .c .cpp) locate
+VOSRCDIR:=../ \
+ ../../../../Common \
+ ../../../../Include
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV5E/Makefile b/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV5E/Makefile
new file mode 100644
index 0000000..58fda29
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV5E/Makefile
@@ -0,0 +1,53 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+
+# target type
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v5
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= lib
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+ifeq ($(VOTT), v5)
+VOMM:=-DARM -DASM_OPT
+endif
+
+# please specify the name of your module
+VOTARGET:= libvoAMRWBEncv5
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=-ldl -lstdc++ -lcutils
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../../../../../../Release
+
+# please modify here to be sure to see the doit.mk
+include ../../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV7/Makefile b/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV7/Makefile
new file mode 100644
index 0000000..5686411
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/build/eclair/ARMV7/Makefile
@@ -0,0 +1,53 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+
+# target type
+# available: pc, v4(armv4), v5(armv5), v5x(armv5 xscale), v6(armv6), v7(cortex-a8 neon)
+VOTT:= v7
+
+
+# module type
+# please specify the type of your module: lib or exe
+VOMT:= lib
+
+
+# module macros
+# please append the additional macro definitions here for your module if necessary.
+ifeq ($(VOTT), v7)
+VOMM:=-DARM -DARMV7 -DASM_OPT
+endif
+
+# please specify the name of your module
+VOTARGET:= libvoAMRWBEncv7
+
+
+# please modify here to be sure to see the g1.mk
+include ../../../../../Tools/eclair.mk
+
+# dependent libraries.
+VODEPLIBS:=-ldl -lstdc++ -lcutils
+
+# module source
+# please modify here to be sure to see the ms.mk which specifies all source info of your module
+include ../ms.mk
+
+
+# please specify where is the voRelease on your PC, relative path is suggested
+VORELDIR:=../../../../../../Release
+
+# please modify here to be sure to see the doit.mk
+include ../../../../../Tools/doit.mk
+
diff --git a/media/libstagefright/codecs/amrwbenc/build/eclair/makefile b/media/libstagefright/codecs/amrwbenc/build/eclair/makefile
new file mode 100644
index 0000000..3473a1a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/build/eclair/makefile
@@ -0,0 +1,39 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+# Just acting as Father Makefile of Modules
+# please keep the name 'makefile' unchanged
+
+# Module Subdirs
+VOMSD:=$(dir $(shell find . -name 'Makefile'))
+
+all:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir; \
+ done
+
+.PHONY:clean devel
+clean:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir clean; \
+ done
+
+devel:
+ for dir in $(VOMSD); \
+ do \
+ $(MAKE) -C $$dir devel; \
+ done
diff --git a/media/libstagefright/codecs/amrwbenc/build/eclair/ms.mk b/media/libstagefright/codecs/amrwbenc/build/eclair/ms.mk
new file mode 100644
index 0000000..bd6620c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/build/eclair/ms.mk
@@ -0,0 +1,43 @@
+#/*
+# ** Copyright 2003-2010, VisualOn, Inc.
+# **
+# ** Licensed under the Apache License, Version 2.0 (the "License");
+# ** you may not use this file except in compliance with the License.
+# ** You may obtain a copy of the License at
+# **
+# ** http://www.apache.org/licenses/LICENSE-2.0
+# **
+# ** Unless required by applicable law or agreed to in writing, software
+# ** distributed under the License is distributed on an "AS IS" BASIS,
+# ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# ** See the License for the specific language governing permissions and
+# ** limitations under the License.
+# */
+# please list all directories that all source files relative with your module(.h .c .cpp) locate
+VOSRCDIR:=../../../inc \
+ ../../../src \
+ ../../../../../Include
+
+# please list all objects needed by your target here
+OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim54.o \
+ deemph.o dtx.o g_pitch.o gpclip.o homing.o hp400.o hp50.o hp6k.o hp_wsp.o \
+ int_lpc.o isp_az.o isp_isf.o lag_wind.o levinson.o log2.o lp_dec2.o math_op.o mem_align.o \
+ oper_32b.o p_med_ol.o pit_shrp.o pitch_f4.o pred_lt4.o preemph.o q_gain2.o q_pulse.o \
+ qisf_ns.o qpisf_2s.o random.o residu.o scale.o stream.o syn_filt.o updt_tar.o util.o \
+ voAMRWBEnc.o voicefac.o wb_vad.o weight_a.o
+
+
+ifeq ($(VOTT), v5)
+OBJS += cor_h_vec_opt.o Deemph_32_opt.o Dot_p_opt.o Filt_6k_7k_opt.o residu_asm_opt.o \
+ scale_sig_opt.o Syn_filt_32_opt.o syn_filt_opt.o pred_lt4_1_opt.o convolve_opt.o \
+ Norm_Corr_opt.o
+VOSRCDIR+= ../../../src/asm/ARMV5E
+endif
+
+ifeq ($(VOTT), v7)
+OBJS+= cor_h_vec_neon.o Deemph_32_neon.o Dot_p_neon.o Filt_6k_7k_neon.o residu_asm_neon.o \
+ scale_sig_neon.o Syn_filt_32_neon.o syn_filt_neon.o pred_lt4_1_neon.o convolve_neon.o \
+ Norm_Corr_neon.o
+VOSRCDIR+= ../../../src/asm/ARMV7
+endif
+
diff --git a/media/libstagefright/codecs/amrwbenc/doc/voAMRWBEncoderSDK.pdf b/media/libstagefright/codecs/amrwbenc/doc/voAMRWBEncoderSDK.pdf
new file mode 100644
index 0000000..5bade44
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/doc/voAMRWBEncoderSDK.pdf
Binary files differ
diff --git a/media/libstagefright/codecs/amrwbenc/inc/acelp.h b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
new file mode 100644
index 0000000..4cb38a1
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
@@ -0,0 +1,521 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * ACELP.H *
+ *--------------------------------------------------------------------------*
+ * Function *
+ *--------------------------------------------------------------------------*/
+#ifndef __ACELP_H__
+#define __ACELP_H__
+
+#include "typedef.h"
+#include "cod_main.h"
+
+/*-----------------------------------------------------------------*
+ * LPC prototypes *
+ *-----------------------------------------------------------------*/
+
+Word16 median5(Word16 x[]);
+
+void Autocorr(
+ Word16 x[], /* (i) : Input signal */
+ Word16 m, /* (i) : LPC order */
+ Word16 r_h[], /* (o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (o) : Autocorrelations (lsb) */
+ );
+
+void Lag_window(
+ Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
+ );
+
+void Init_Levinson(
+ Word16 * mem /* output :static memory (18 words) */
+ );
+
+void Levinson(
+ Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
+ Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
+ Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
+ Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
+ Word16 * mem /* (i/o) :static memory (18 words) */
+ );
+
+void Az_isp(
+ Word16 a[], /* (i) Q12 : predictor coefficients */
+ Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
+ Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
+ );
+
+void Isp_Az(
+ Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
+ Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
+ Word16 m,
+ Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
+ /* 1 : adaptive scaling enabled */
+ );
+
+void Isp_isf(
+ Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 m /* (i) : LPC order */
+ );
+
+void Isf_isp(
+ Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 m /* (i) : LPC order */
+ );
+
+void Int_isp(
+ Word16 isp_old[], /* input : isps from past frame */
+ Word16 isp_new[], /* input : isps from present frame */
+ Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
+ Word16 Az[] /* output: LP coefficients in 4 subframes */
+ );
+
+void Weight_a(
+ Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
+ Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
+ Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
+ Word16 m /* (i) : LPC order. */
+ );
+
+
+/*-----------------------------------------------------------------*
+ * isf quantizers *
+ *-----------------------------------------------------------------*/
+
+void Qpisf_2s_46b(
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ );
+
+void Qpisf_2s_36b(
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ );
+
+void Dpisf_2s_46b(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ );
+
+void Dpisf_2s_36b(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ );
+
+void Qisf_ns(
+ Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* output: quantized ISF */
+ Word16 * indice /* output: quantization indices */
+ );
+
+void Disf_ns(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
+ );
+
+Word16 Sub_VQ( /* output: return quantization index */
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word32 * distance /* output: error of quantization */
+ );
+
+void Reorder_isf(
+ Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+ Word16 min_dist, /* (i) Q15 : minimum distance to keep */
+ Word16 n /* (i) : number of ISF */
+ );
+
+/*-----------------------------------------------------------------*
+ * filter prototypes *
+ *-----------------------------------------------------------------*/
+
+void Init_Decim_12k8(
+ Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
+ );
+void Decim_12k8(
+ Word16 sig16k[], /* input: signal to downsampling */
+ Word16 lg, /* input: length of input */
+ Word16 sig12k8[], /* output: decimated signal */
+ Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
+ );
+
+void Init_HP50_12k8(Word16 mem[]);
+void HP50_12k8(
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ );
+void Init_HP400_12k8(Word16 mem[]);
+void HP400_12k8(
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ );
+
+void Init_Filt_6k_7k(Word16 mem[]);
+void Filt_6k_7k(
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ );
+void Filt_6k_7k_asm(
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ );
+
+void LP_Decim2(
+ Word16 x[], /* in/out: signal to process */
+ Word16 l, /* input : size of filtering */
+ Word16 mem[] /* in/out: memory (size=3) */
+ );
+
+void Preemph(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ );
+void Preemph2(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ );
+void Deemph(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
+void Deemph2(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
+void Deemph_32(
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
+
+void Deemph_32_asm(
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
+
+void Convolve(
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) Q15 : impulse response */
+ Word16 y[], /* (o) 12 bits: output vector */
+ Word16 L /* (i) : vector size */
+ );
+
+void Convolve_asm(
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) Q15 : impulse response */
+ Word16 y[], /* (o) 12 bits: output vector */
+ Word16 L /* (i) : vector size */
+ );
+
+void Residu(
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ );
+
+void Residu_opt(
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ );
+
+void Syn_filt(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 lg, /* (i) : size of filtering */
+ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+ Word16 update /* (i) : 0=no update, 1=update of memory. */
+ );
+
+void Syn_filt_asm(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 mem[] /* (i/o) : memory associated with this filtering. */
+ );
+
+void Syn_filt_32(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ );
+
+void Syn_filt_32_asm(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ );
+/*-----------------------------------------------------------------*
+ * pitch prototypes *
+ *-----------------------------------------------------------------*/
+
+Word16 Pitch_ol( /* output: open loop pitch lag */
+ Word16 signal[], /* input : signal used to compute the open loop pitch */
+/* signal[-pit_max] to signal[-1] should be known */
+ Word16 pit_min, /* input : minimum pitch lag */
+ Word16 pit_max, /* input : maximum pitch lag */
+ Word16 L_frame /* input : length of frame to compute pitch */
+);
+
+Word16 Pitch_med_ol( /* output: open loop pitch lag */
+ Word16 wsp[], /* input : signal used to compute the open loop pitch */
+ /* wsp[-pit_max] to wsp[-1] should be known */
+ Coder_State *st, /* i/o : global codec structure */
+ Word16 L_frame /* input : length of frame to compute pitch */
+);
+
+Word16 Med_olag( /* output : median of 5 previous open-loop lags */
+ Word16 prev_ol_lag, /* input : previous open-loop lag */
+ Word16 old_ol_lag[5]
+);
+
+void Init_Hp_wsp(Word16 mem[]);
+void scale_mem_Hp_wsp(Word16 mem[], Word16 exp);
+void Hp_wsp(
+ Word16 wsp[], /* i : wsp[] signal */
+ Word16 hp_wsp[], /* o : hypass wsp[] */
+ Word16 lg, /* i : lenght of signal */
+ Word16 mem[] /* i/o : filter memory [9] */
+);
+
+Word16 Pitch_fr4( /* (o) : pitch period. */
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 t0_min, /* (i) : minimum value in the searched range. */
+ Word16 t0_max, /* (i) : maximum value in the searched range. */
+ Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */
+ Word16 i_subfr, /* (i) : indicator for first subframe. */
+ Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */
+ Word16 t0_fr1, /* (i) : minimum value for resolution 1 */
+ Word16 L_subfr /* (i) : Length of subframe */
+);
+void Pred_lt4(
+ Word16 exc[], /* in/out: excitation buffer */
+ Word16 T0, /* input : integer pitch lag */
+ Word16 frac, /* input : fraction of lag */
+ Word16 L_subfr /* input : subframe size */
+);
+
+void pred_lt4_asm(
+ Word16 exc[], /* in/out: excitation buffer */
+ Word16 T0, /* input : integer pitch lag */
+ Word16 frac, /* input : fraction of lag */
+ Word16 L_subfr /* input : subframe size */
+);
+
+/*-----------------------------------------------------------------*
+ * gain prototypes *
+ *-----------------------------------------------------------------*/
+
+Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */
+ Word16 xn[], /* (i) : Pitch target. */
+ Word16 y1[], /* (i) : filtered adaptive codebook. */
+ Word16 g_coeff[], /* : Correlations need for gain quantization. */
+ Word16 L_subfr /* : Length of subframe. */
+);
+void Init_Q_gain2(
+ Word16 * mem /* output :static memory (2 words) */
+);
+Word16 Q_gain2( /* Return index of quantization. */
+ Word16 xn[], /* (i) Q_xn:Target vector. */
+ Word16 y1[], /* (i) Q_xn:Adaptive codebook. */
+ Word16 Q_xn, /* (i) :xn and y1 format */
+ Word16 y2[], /* (i) Q9 :Filtered innovative vector. */
+ Word16 code[], /* (i) Q9 :Innovative vector. */
+ Word16 g_coeff[], /* (i) :Correlations <xn y1> <y1 y1> */
+/* Compute in G_pitch(). */
+ Word16 L_subfr, /* (i) :Subframe lenght. */
+ Word16 nbits, /* (i) : number of bits (6 or 7) */
+ Word16 * gain_pit, /* (i/o)Q14:Pitch gain. */
+ Word32 * gain_cod, /* (o) Q16 :Code gain. */
+ Word16 gp_clip, /* (i) : Gp Clipping flag */
+ Word16 * mem /* (i/o) :static memory (2 words) */
+);
+
+void Init_D_gain2(
+ Word16 * mem /* output :static memory (4 words) */
+);
+void D_gain2(
+ Word16 index, /* (i) :index of quantization. */
+ Word16 nbits, /* (i) : number of bits (6 or 7) */
+ Word16 code[], /* (i) Q9 :Innovative vector. */
+ Word16 L_subfr, /* (i) :Subframe lenght. */
+ Word16 * gain_pit, /* (o) Q14 :Pitch gain. */
+ Word32 * gain_cod, /* (o) Q16 :Code gain. */
+ Word16 bfi, /* (i) :bad frame indicator */
+ Word16 prev_bfi, /* (i) : Previous BF indicator */
+ Word16 state, /* (i) : State of BFH */
+ Word16 unusable_frame, /* (i) : UF indicator */
+ Word16 vad_hist, /* (i) :number of non-speech frames */
+ Word16 * mem /* (i/o) :static memory (4 words) */
+);
+
+/*-----------------------------------------------------------------*
+ * acelp prototypes *
+ *-----------------------------------------------------------------*/
+
+void cor_h_x(
+ Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */
+ Word16 x[], /* (i) Q0 : target vector */
+ Word16 dn[] /* (o) <12bit : correlation between target and h[] */
+);
+void ACELP_2t64_fx(
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
+);
+
+void ACELP_4t64_fx(
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
+ Word16 ser_size, /* (i) : bit rate */
+ Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */
+ /* (o) : index (36): 9+9+9+9 = 36 bits. */
+ /* (o) : index (44): 13+9+13+9 = 44 bits. */
+ /* (o) : index (52): 13+13+13+13 = 52 bits. */
+ /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
+ /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
+ /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+);
+
+void Pit_shrp(
+ Word16 * x, /* in/out: impulse response (or algebraic code) */
+ Word16 pit_lag, /* input : pitch lag */
+ Word16 sharp, /* input : pitch sharpening factor (Q15) */
+ Word16 L_subfr /* input : subframe size */
+);
+
+
+/*-----------------------------------------------------------------*
+ * others prototypes *
+ *-----------------------------------------------------------------*/
+
+void Copy(
+ Word16 x[], /* (i) : input vector */
+ Word16 y[], /* (o) : output vector */
+ Word16 L /* (i) : vector length */
+);
+void Set_zero(
+ Word16 x[], /* (o) : vector to clear */
+ Word16 L /* (i) : length of vector */
+);
+void Updt_tar(
+ Word16 * x, /* (i) Q0 : old target (for pitch search) */
+ Word16 * x2, /* (o) Q0 : new target (for codebook search) */
+ Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */
+ Word16 gain, /* (i) Q14 : adaptive codebook gain */
+ Word16 L /* (i) : subframe size */
+);
+Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
+ Word16 exc[], /* (i) Q_exc: pitch excitation */
+ Word16 Q_exc, /* (i) : exc format */
+ Word16 gain_pit, /* (i) Q14 : gain of pitch */
+ Word16 code[], /* (i) Q9 : Fixed codebook excitation */
+ Word16 gain_code, /* (i) Q0 : gain of code */
+ Word16 L_subfr /* (i) : subframe length */
+);
+void Scale_sig(
+ Word16 x[], /* (i/o) : signal to scale */
+ Word16 lg, /* (i) : size of x[] */
+ Word16 exp /* (i) : exponent: x = round(x << exp) */
+);
+
+void Scale_sig_opt(
+ Word16 x[], /* (i/o) : signal to scale */
+ Word16 lg, /* (i) : size of x[] */
+ Word16 exp /* (i) : exponent: x = round(x << exp) */
+);
+
+Word16 Random(Word16 * seed);
+
+void Init_gp_clip(
+ Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */
+);
+Word16 Gp_clip(
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+void Gp_clip_test_isf(
+ Word16 isf[], /* (i) : isf values (in frequency domain) */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+void Gp_clip_test_gain_pit(
+ Word16 gain_pit, /* (i) : gain of quantized pitch */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+
+
+#endif //__ACELP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
new file mode 100644
index 0000000..6a2f860
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
@@ -0,0 +1,1094 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+#ifndef __BASIC_OP_H__
+#define __BASIC_OP_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+
+#define MAX_32 (Word32)0x7fffffffL
+#define MIN_32 (Word32)0x80000000L
+
+#define MAX_16 (Word16)+32767 /* 0x7fff */
+#define MIN_16 (Word16)-32768 /* 0x8000 */
+
+
+#ifdef LINUX
+#define static_vo static __inline__
+#else
+#define static_vo static __inline
+#endif
+
+#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))
+
+#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */
+#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */
+#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */
+#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/
+#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/
+#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/
+
+
+#define extract_h(a) ((Word16)(a >> 16))
+#define extract_l(x) (Word16)((x))
+#define add1(a,b) (a + b)
+#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) )
+#define vo_mult32(a, b) ((a) * (b))
+#define vo_mult(a,b) (( a * b ) >> 15 )
+#define vo_L_mult(a,b) (((a) * (b)) << 1)
+#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2)
+#define vo_sub(a,b) (a - b)
+#define vo_L_deposit_h(a) ((Word32)((a) << 16))
+#define vo_round(a) ((a + 0x00008000) >> 16)
+#define vo_extract_l(a) ((Word16)(a))
+#define vo_L_add(a,b) (a + b)
+#define vo_L_sub(a,b) (a - b)
+#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 )
+#define vo_negate(a) (-a)
+#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2)
+
+
+/*___________________________________________________________________________
+| |
+| Prototypes for basic arithmetic operators |
+|___________________________________________________________________________|
+*/
+static_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */
+static_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */
+static_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */
+static_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */
+static_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */
+static_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */
+static_vo Word16 voround (Word32 L_var1); /* Round, 1 */
+static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */
+static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */
+static_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */
+static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */
+static_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */
+static_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/
+static_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */
+static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/
+static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
+static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
+static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
+static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
+
+/*___________________________________________________________________________
+| |
+| Functions |
+|___________________________________________________________________________|
+*/
+/*___________________________________________________________________________
+| |
+| Function Name : add |
+| |
+| Purpose : |
+| |
+| Performs the addition (var1+var2) with overflow control and saturation;|
+| the 16 bit result is set at +32767 when overflow occurs or at -32768 |
+| when underflow occurs. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+static_vo Word16 add (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_sum;
+ L_sum = (Word32) var1 + var2;
+ var_out = saturate (L_sum);
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : sub |
+| |
+| Purpose : |
+| |
+| Performs the subtraction (var1+var2) with overflow control and satu- |
+| ration; the 16 bit result is set at +32767 when overflow occurs or at |
+| -32768 when underflow occurs. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 sub (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_diff;
+ L_diff = (Word32) var1 - var2;
+ var_out = saturate (L_diff);
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : shl |
+| |
+| Purpose : |
+| |
+| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
+| the var2 LSB of the result. If var2 is negative, arithmetically shift |
+| var1 right by -var2 with sign extension. Saturate the result in case of |
+| underflows or overflows. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 shl (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 result;
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = var1 >> ((Word16)-var2);
+ }
+ else
+ {
+ result = (Word32) var1 *((Word32) 1 << var2);
+ if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+ {
+ var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+ }
+ else
+ {
+ var_out = extract_l (result);
+ }
+ }
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : shr |
+| |
+| Purpose : |
+| |
+| Arithmetically shift the 16 bit input var1 right var2 positions with |
+| sign extension. If var2 is negative, arithmetically shift var1 left by |
+| -var2 with sign extension. Saturate the result in case of underflows or |
+| overflows. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 shr (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = shl(var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 15)
+ {
+ var_out = (Word16)((var1 < 0) ? -1 : 0);
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var_out = (Word16)(~((~var1) >> var2));
+ }
+ else
+ {
+ var_out = (Word16)(var1 >> var2);
+ }
+ }
+ }
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : mult |
+| |
+| Purpose : |
+| |
+| Performs the multiplication of var1 by var2 and gives a 16 bit result |
+| which is scaled i.e.: |
+| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and |
+| mult(-32768,-32768) = 32767. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 mult (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_product;
+ L_product = (Word32) var1 *(Word32) var2;
+ L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+ if (L_product & (Word32) 0x00010000L)
+ L_product = L_product | (Word32) 0xffff0000L;
+ var_out = saturate (L_product);
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_mult |
+| |
+| Purpose : |
+| |
+| L_mult is the 32 bit result of the multiplication of var1 times var2 |
+| with one shift left i.e.: |
+| L_mult(var1,var2) = L_shl((var1 times var2),1) and |
+| L_mult(-32768,-32768) = 2147483647. |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_mult (Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+ L_var_out = (Word32) var1 *(Word32) var2;
+ if (L_var_out != (Word32) 0x40000000L)
+ {
+ L_var_out *= 2;
+ }
+ else
+ {
+ L_var_out = MAX_32;
+ }
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : round |
+| |
+| Purpose : |
+| |
+| Round the lower 16 bits of the 32 bit input number into the MS 16 bits |
+| with saturation. Shift the resulting bits right by 16 and return the 16 |
+| bit number: |
+| round(L_var1) = extract_h(L_add(L_var1,32768)) |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| L_var1 |
+| 32 bit long signed integer (Word32 ) whose value falls in the |
+| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 voround (Word32 L_var1)
+{
+ Word16 var_out;
+ Word32 L_rounded;
+ L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+ var_out = extract_h (L_rounded);
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_mac |
+| |
+| Purpose : |
+| |
+| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
+| result to L_var3 with saturation, return a 32 bit result: |
+| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| L_var3 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+ Word32 L_product;
+ L_product = ((var1 * var2) << 1);
+ L_var_out = L_add (L_var3, L_product);
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_msu |
+| |
+| Purpose : |
+| |
+| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
+| bit result to L_var3 with saturation, return a 32 bit result: |
+| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). |
+| |
+| Complexity weight : 1 |
+| |
+| Inputs : |
+| |
+| L_var3 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+ Word32 L_var_out;
+ Word32 L_product;
+ L_product = (var1 * var2)<<1;
+ L_var_out = L_sub (L_var3, L_product);
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_add |
+| |
+| Purpose : |
+| |
+| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with |
+| overflow control and saturation; the result is set at +2147483647 when |
+| overflow occurs or at -2147483648 when underflow occurs. |
+| |
+| Complexity weight : 2 |
+| |
+| Inputs : |
+| |
+| L_var1 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| L_var2 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+ Word32 L_var_out;
+ L_var_out = L_var1 + L_var2;
+ if (((L_var1 ^ L_var2) & MIN_32) == 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+ }
+ }
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_sub |
+| |
+| Purpose : |
+| |
+| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with |
+| overflow control and saturation; the result is set at +2147483647 when |
+| overflow occurs or at -2147483648 when underflow occurs. |
+| |
+| Complexity weight : 2 |
+| |
+| Inputs : |
+| |
+| L_var1 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| L_var2 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)
+{
+ Word32 L_var_out;
+ L_var_out = L_var1 - L_var2;
+ if (((L_var1 ^ L_var2) & MIN_32) != 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+ }
+ }
+ return (L_var_out);
+}
+
+
+/*___________________________________________________________________________
+| |
+| Function Name : mult_r |
+| |
+| Purpose : |
+| |
+| Same as mult with rounding, i.e.: |
+| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and |
+| mult_r(-32768,-32768) = 32767. |
+| |
+| Complexity weight : 2 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 mult_r (Word16 var1, Word16 var2)
+{
+ Word16 var_out;
+ Word32 L_product_arr;
+ L_product_arr = (Word32) var1 *(Word32) var2; /* product */
+ L_product_arr += (Word32) 0x00004000L; /* round */
+ L_product_arr &= (Word32) 0xffff8000L;
+ L_product_arr >>= 15; /* shift */
+ if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */
+ {
+ L_product_arr |= (Word32) 0xffff0000L;
+ }
+ var_out = saturate (L_product_arr);
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_shl |
+| |
+| Purpose : |
+| |
+| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero |
+| fill the var2 LSB of the result. If var2 is negative, arithmetically |
+| shift L_var1 right by -var2 with sign extension. Saturate the result in |
+| case of underflows or overflows. |
+| |
+| Complexity weight : 2 |
+| |
+| Inputs : |
+| |
+| L_var1 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shl (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out = 0L;
+ if (var2 <= 0)
+ {
+ if (var2 < -32)
+ var2 = -32;
+ L_var_out = (L_var1 >> (Word16)-var2);
+ }
+ else
+ {
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ L_var_out = MAX_32;
+ break;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ //Overflow = 1;
+ L_var_out = MIN_32;
+ break;
+ }
+ }
+ L_var1 *= 2;
+ L_var_out = L_var1;
+ }
+ }
+ return (L_var_out);
+}
+
+static_vo Word32 L_shl2(Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out = 0L;
+
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ L_var_out = MAX_32;
+ break;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ L_var_out = MIN_32;
+ break;
+ }
+ }
+ L_var1 <<=1 ;
+ L_var_out = L_var1;
+ }
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_shr |
+| |
+| Purpose : |
+| |
+| Arithmetically shift the 32 bit input L_var1 right var2 positions with |
+| sign extension. If var2 is negative, arithmetically shift L_var1 left |
+| by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+| in case of underflows or overflows. |
+| |
+| Complexity weight : 2 |
+| |
+| Inputs : |
+| |
+| L_var1 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out;
+ if (var2 < 0)
+ {
+ if (var2 < -32)
+ var2 = -32;
+ L_var_out = L_shl2(L_var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 31)
+ {
+ L_var_out = (L_var1 < 0L) ? -1 : 0;
+ }
+ else
+ {
+ if (L_var1 < 0)
+ {
+ L_var_out = ~((~L_var1) >> var2);
+ }
+ else
+ {
+ L_var_out = L_var1 >> var2;
+ }
+ }
+ }
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : L_shr_r |
+| |
+| Purpose : |
+| |
+| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in |
+| case of underflows or overflows : |
+| - If var2 is greater than zero : |
+| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
+| is equal to zero |
+| then |
+| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) |
+| else |
+| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) |
+| - If var2 is less than or equal to zero : |
+| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). |
+| |
+| Complexity weight : 3 |
+| |
+| Inputs : |
+| |
+| L_var1 |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| L_var_out |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= var_out <= 0x7fff ffff. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+ Word32 L_var_out;
+ if (var2 > 31)
+ {
+ L_var_out = 0;
+ }
+ else
+ {
+ L_var_out = L_shr (L_var1, var2);
+ if (var2 > 0)
+ {
+ if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+ {
+ L_var_out++;
+ }
+ }
+ }
+ return (L_var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : norm_s |
+| |
+| Purpose : |
+| |
+| Produces the number of left shift needed to normalize the 16 bit varia- |
+| ble var1 for positive values on the interval with minimum of 16384 and |
+| maximum of 32767, and for negative values on the interval with minimum |
+| of -32768 and maximum of -16384; in order to normalize the result, the |
+| following operation must be done : |
+| norm_var1 = shl(var1,norm_s(var1)). |
+| |
+| Complexity weight : 15 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0x0000 0000 <= var_out <= 0x0000 000f. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 norm_s (Word16 var1)
+{
+ Word16 var_out = 0;
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == -1)
+ {
+ var_out = 15;
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var1 = (Word16)~var1;
+ }
+ for (var_out = 0; var1 < 0x4000; var_out++)
+ {
+ var1 <<= 1;
+ }
+ }
+ }
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : div_s |
+| |
+| Purpose : |
+| |
+| Produces a result which is the fractional integer division of var1 by |
+| var2; var1 and var2 must be positive and var2 must be greater or equal |
+| to var1; the result is positive (leading bit equal to 0) and truncated |
+| to 16 bits. |
+| If var1 = var2 then div(var1,var2) = 32767. |
+| |
+| Complexity weight : 18 |
+| |
+| Inputs : |
+| |
+| var1 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. |
+| |
+| var2 |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
+| It's a Q15 value (point between b15 and b14). |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 div_s (Word16 var1, Word16 var2)
+{
+ Word16 var_out = 0;
+ Word16 iteration;
+ Word32 L_num;
+ Word32 L_denom;
+ if ((var1 < 0) || (var2 < 0))
+ {
+ var_out = MAX_16;
+ return var_out;
+ }
+ if (var2 == 0)
+ {
+ var_out = MAX_16;
+ return var_out;
+ }
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == var2)
+ {
+ var_out = MAX_16;
+ }
+ else
+ {
+ L_num = L_deposit_l (var1);
+ L_denom = L_deposit_l(var2);
+ for (iteration = 0; iteration < 15; iteration++)
+ {
+ var_out <<= 1;
+ L_num <<= 1;
+ if (L_num >= L_denom)
+ {
+ L_num -= L_denom;
+ var_out += 1;
+ }
+ }
+ }
+ }
+ return (var_out);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : norm_l |
+| |
+| Purpose : |
+| |
+| Produces the number of left shifts needed to normalize the 32 bit varia-|
+| ble L_var1 for positive values on the interval with minimum of |
+| 1073741824 and maximum of 2147483647, and for negative values on the in-|
+| terval with minimum of -2147483648 and maximum of -1073741824; in order |
+| to normalize the result, the following operation must be done : |
+| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). |
+| |
+| Complexity weight : 30 |
+| |
+| Inputs : |
+| |
+| L_var1 |
+| 32 bit long signed integer (Word32) whose value falls in the |
+| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
+| |
+| Outputs : |
+| |
+| none |
+| |
+| Return Value : |
+| |
+| var_out |
+| 16 bit short signed integer (Word16) whose value falls in the |
+| range : 0x0000 0000 <= var_out <= 0x0000 001f. |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 norm_l (Word32 L_var1)
+{
+ Word16 var_out = 0;
+ if (L_var1 != 0)
+ {
+ var_out = 31;
+ if (L_var1 != (Word32) 0xffffffffL)
+ {
+ L_var1 ^= (L_var1 >>31);
+ for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+ {
+ L_var1 <<= 1;
+ }
+ }
+ }
+ return (var_out);
+}
+
+#endif //__BASIC_OP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/bits.h b/media/libstagefright/codecs/amrwbenc/inc/bits.h
new file mode 100644
index 0000000..77146de
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/bits.h
@@ -0,0 +1,92 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+* BITS.H *
+*--------------------------------------------------------------------------*
+* Number of bits for different modes *
+*--------------------------------------------------------------------------*/
+
+#ifndef __BITS_H__
+#define __BITS_H__
+
+#include <stdio.h>
+#include "typedef.h"
+#include "cnst.h"
+#include "cod_main.h"
+
+#define NBBITS_7k 132 /* 6.60k */
+#define NBBITS_9k 177 /* 8.85k */
+#define NBBITS_12k 253 /* 12.65k */
+#define NBBITS_14k 285 /* 14.25k */
+#define NBBITS_16k 317 /* 15.85k */
+#define NBBITS_18k 365 /* 18.25k */
+#define NBBITS_20k 397 /* 19.85k */
+#define NBBITS_23k 461 /* 23.05k */
+#define NBBITS_24k 477 /* 23.85k */
+
+#define NBBITS_SID 35
+#define NB_BITS_MAX NBBITS_24k
+
+#define BIT_0 (Word16)-127
+#define BIT_1 (Word16)127
+#define BIT_0_ITU (Word16)0x007F
+#define BIT_1_ITU (Word16)0x0081
+
+#define SIZE_MAX1 (3+NB_BITS_MAX) /* serial size max */
+#define TX_FRAME_TYPE (Word16)0x6b21
+#define RX_FRAME_TYPE (Word16)0x6b20
+
+static const Word16 nb_of_bits[NUM_OF_MODES] = {
+ NBBITS_7k,
+ NBBITS_9k,
+ NBBITS_12k,
+ NBBITS_14k,
+ NBBITS_16k,
+ NBBITS_18k,
+ NBBITS_20k,
+ NBBITS_23k,
+ NBBITS_24k,
+ NBBITS_SID
+};
+
+/*typedef struct
+{
+Word16 sid_update_counter;
+Word16 sid_handover_debt;
+Word16 prev_ft;
+} TX_State;
+*/
+
+//typedef struct
+//{
+// Word16 prev_ft;
+// Word16 prev_mode;
+//} RX_State;
+
+int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st);
+
+
+void Parm_serial(
+ Word16 value, /* input : parameter value */
+ Word16 no_of_bits, /* input : number of bits */
+ Word16 ** prms
+ );
+
+
+#endif //__BITS_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/cnst.h b/media/libstagefright/codecs/amrwbenc/inc/cnst.h
new file mode 100644
index 0000000..ffdbd88
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/cnst.h
@@ -0,0 +1,81 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * CNST.H *
+ *--------------------------------------------------------------------------*
+ * Codec constant parameters (coder and decoder) *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __CNST_H__
+#define __CNST_H__
+
+#define L_FRAME16k 320 /* Frame size at 16kHz */
+#define L_FRAME 256 /* Frame size */
+#define L_SUBFR16k 80 /* Subframe size at 16kHz */
+
+#define L_SUBFR 64 /* Subframe size */
+#define NB_SUBFR 4 /* Number of subframe per frame */
+
+#define L_NEXT 64 /* Overhead in LP analysis */
+#define L_WINDOW 384 /* window size in LP analysis */
+#define L_TOTAL 384 /* Total size of speech buffer. */
+#define M 16 /* Order of LP filter */
+#define M16k 20
+
+#define L_FILT16k 15 /* Delay of down-sampling filter */
+#define L_FILT 12 /* Delay of up-sampling filter */
+
+#define GP_CLIP 15565 /* Pitch gain clipping = 0.95 Q14 */
+#define PIT_SHARP 27853 /* pitch sharpening factor = 0.85 Q15 */
+
+#define PIT_MIN 34 /* Minimum pitch lag with resolution 1/4 */
+#define PIT_FR2 128 /* Minimum pitch lag with resolution 1/2 */
+#define PIT_FR1_9b 160 /* Minimum pitch lag with resolution 1 */
+#define PIT_FR1_8b 92 /* Minimum pitch lag with resolution 1 */
+#define PIT_MAX 231 /* Maximum pitch lag */
+#define L_INTERPOL (16+1) /* Length of filter for interpolation */
+
+#define OPL_DECIM 2 /* Decimation in open-loop pitch analysis */
+
+#define PREEMPH_FAC 22282 /* preemphasis factor (0.68 in Q15) */
+#define GAMMA1 30147 /* Weighting factor (numerator) (0.92 in Q15) */
+#define TILT_FAC 22282 /* tilt factor (denominator) (0.68 in Q15) */
+
+#define Q_MAX 8 /* scaling max for signal (see syn_filt_32) */
+
+#define RANDOM_INITSEED 21845 /* own random init value */
+
+#define L_MEANBUF 3
+#define ONE_PER_MEANBUF 10923
+
+#define MODE_7k 0
+#define MODE_9k 1
+#define MODE_12k 2
+#define MODE_14k 3
+#define MODE_16k 4
+#define MODE_18k 5
+#define MODE_20k 6
+#define MODE_23k 7
+#define MODE_24k 8
+#define MRDTX 9
+#define NUM_OF_MODES 10 /* see bits.h for bits definition */
+
+#define EHF_MASK (Word16)0x0008 /* homing frame pattern */
+
+#endif //__CNST_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
new file mode 100644
index 0000000..1fd5787
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
@@ -0,0 +1,103 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * COD_MAIN.H *
+ *--------------------------------------------------------------------------*
+ * Static memory in the encoder *
+ *--------------------------------------------------------------------------*/
+#ifndef __COD_MAIN_H__
+#define __COD_MAIN_H__
+
+#include "cnst.h" /* coder constant parameters */
+
+#include "wb_vad.h"
+#include "dtx.h"
+#include "stream.h"
+#include "voAMRWB.h"
+
+typedef struct
+{
+ Word16 mem_decim[2 * L_FILT16k]; /* speech decimated filter memory */
+ Word16 mem_sig_in[6]; /* hp50 filter memory */
+ Word16 mem_preemph; /* speech preemph filter memory */
+ Word16 old_speech[L_TOTAL - L_FRAME]; /* old speech vector at 12.8kHz */
+ Word16 old_wsp[PIT_MAX / OPL_DECIM]; /* old decimated weighted speech vector */
+ Word16 old_exc[PIT_MAX + L_INTERPOL]; /* old excitation vector */
+ Word16 mem_levinson[M + 2]; /* levinson routine memory */
+ Word16 ispold[M]; /* old isp (immittance spectral pairs) */
+ Word16 ispold_q[M]; /* quantized old isp */
+ Word16 past_isfq[M]; /* past isf quantizer */
+ Word16 mem_wsp; /* wsp vector memory */
+ Word16 mem_decim2[3]; /* wsp decimation filter memory */
+ Word16 mem_w0; /* target vector memory */
+ Word16 mem_syn[M]; /* synthesis memory */
+ Word16 tilt_code; /* tilt of code */
+ Word16 old_wsp_max; /* old wsp maximum value */
+ Word16 old_wsp_shift; /* old wsp shift */
+ Word16 Q_old; /* old scaling factor */
+ Word16 Q_max[2]; /* old maximum scaling factor */
+ Word16 gp_clip[2]; /* gain of pitch clipping memory */
+ Word16 qua_gain[4]; /* gain quantizer memory */
+
+ Word16 old_T0_med;
+ Word16 ol_gain;
+ Word16 ada_w;
+ Word16 ol_wght_flg;
+ Word16 old_ol_lag[5];
+ Word16 hp_wsp_mem[9];
+ Word16 old_hp_wsp[L_FRAME / OPL_DECIM + (PIT_MAX / OPL_DECIM)];
+ VadVars *vadSt;
+ dtx_encState *dtx_encSt;
+ Word16 first_frame;
+ Word16 isfold[M]; /* old isf (frequency domain) */
+ Word32 L_gc_thres; /* threshold for noise enhancer */
+ Word16 mem_syn_hi[M]; /* modified synthesis memory (MSB) */
+ Word16 mem_syn_lo[M]; /* modified synthesis memory (LSB) */
+ Word16 mem_deemph; /* speech deemph filter memory */
+ Word16 mem_sig_out[6]; /* hp50 filter memory for synthesis */
+ Word16 mem_hp400[6]; /* hp400 filter memory for synthesis */
+ Word16 mem_oversamp[2 * L_FILT]; /* synthesis oversampled filter memory */
+ Word16 mem_syn_hf[M]; /* HF synthesis memory */
+ Word16 mem_hf[2 * L_FILT16k]; /* HF band-pass filter memory */
+ Word16 mem_hf2[2 * L_FILT16k]; /* HF band-pass filter memory */
+ Word16 seed2; /* random memory for HF generation */
+ Word16 vad_hist;
+ Word16 gain_alpha;
+ /* TX_State structure */
+ Word16 sid_update_counter;
+ Word16 sid_handover_debt;
+ Word16 prev_ft;
+ Word16 allow_dtx;
+ /*some input/output buffer parameters */
+ unsigned char *inputStream;
+ int inputSize;
+ VOAMRWBMODE mode;
+ VOAMRWBFRAMETYPE frameType;
+ unsigned short *outputStream;
+ int outputSize;
+ FrameStream *stream;
+ VO_MEM_OPERATOR *pvoMemop;
+ VO_MEM_OPERATOR voMemoprator;
+ VO_PTR hCheck;
+} Coder_State;
+
+typedef void* HAMRENC;
+
+#endif //__COD_MAIN_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/dtx.h b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
new file mode 100644
index 0000000..e52c2d0
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
@@ -0,0 +1,115 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * DTX.H *
+ *--------------------------------------------------------------------------*
+ * Static memory, constants and frametypes for the DTX *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __DTX_H__
+#define __DTX_H__
+
+#define DTX_MAX_EMPTY_THRESH 50
+#define DTX_HIST_SIZE 8
+#define DTX_HIST_SIZE_MIN_ONE 7
+#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1)
+#define DTX_HANG_CONST 7 /* yields eight frames of SP HANGOVER */
+#define INV_MED_THRESH 14564
+#define ISF_GAP 128 /* 50 */
+#define ONE_MINUS_ISF_GAP 16384 - ISF_GAP
+#define ISF_GAP 128
+#define ISF_DITH_GAP 448
+#define ISF_FACTOR_LOW 256
+#define ISF_FACTOR_STEP 2
+#define GAIN_THR 180
+#define GAIN_FACTOR 75
+
+typedef struct
+{
+ Word16 isf_hist[M * DTX_HIST_SIZE];
+ Word16 log_en_hist[DTX_HIST_SIZE];
+ Word16 hist_ptr;
+ Word16 log_en_index;
+ Word16 cng_seed;
+ /* DTX handler stuff */
+ Word16 dtxHangoverCount;
+ Word16 decAnaElapsedCount;
+ Word32 D[28];
+ Word32 sumD[DTX_HIST_SIZE];
+} dtx_encState;
+
+#define SPEECH 0
+#define DTX 1
+#define DTX_MUTE 2
+
+#define TX_SPEECH 0
+#define TX_SID_FIRST 1
+#define TX_SID_UPDATE 2
+#define TX_NO_DATA 3
+
+#define RX_SPEECH_GOOD 0
+#define RX_SPEECH_PROBABLY_DEGRADED 1
+#define RX_SPEECH_LOST 2
+#define RX_SPEECH_BAD 3
+#define RX_SID_FIRST 4
+#define RX_SID_UPDATE 5
+#define RX_SID_BAD 6
+#define RX_NO_DATA 7
+
+/*****************************************************************************
+ *
+ * DEFINITION OF DATA TYPES
+ *****************************************************************************/
+
+Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP);
+Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]);
+void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP);
+
+Word16 dtx_enc(
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf[M], /* o : CN ISF vector */
+ Word16 * exc2, /* o : CN excitation */
+ Word16 ** prms
+);
+
+Word16 dtx_buffer(
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf_new[], /* i : isf vector */
+ Word32 enr, /* i : residual energy (in L_FRAME) */
+ Word16 codec_mode
+);
+
+void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */
+ Word16 vad_flag, /* i : vad decision */
+ Word16 * usedMode /* i/o : mode changed or not */
+);
+
+void Qisf_ns(
+ Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* output: quantized ISF */
+ Word16 * indice /* output: quantization indices */
+);
+
+
+void Disf_ns(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
+);
+
+#endif //__DTX_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/grid100.tab b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab
new file mode 100644
index 0000000..efee18d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab
@@ -0,0 +1,53 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+/*-------------------------------------------------------------*
+ * Table for az_isp() *
+ * *
+ * Vector grid[] is in Q15 *
+ * *
+ * grid[0] = 1.0; *
+ * grid[grid_points+1] = -1.0; *
+ * for (i = 1; i < grid_points; i++) *
+ * grid[i] = cos((6.283185307*i)/(2.0*grid_points)); *
+ * *
+ *-------------------------------------------------------------*/
+
+/* Version 101 points */
+
+#define GRID_POINTS 100
+
+const Word16 vogrid[GRID_POINTS+1] ={
+ 32767, 32751, 32703, 32622, 32509, 32364,
+ 32187, 31978, 31738, 31466, 31164, 30830,
+ 30466, 30072, 29649, 29196, 28714, 28204,
+ 27666, 27101, 26509, 25891, 25248, 24579,
+ 23886, 23170, 22431, 21669, 20887, 20083,
+ 19260, 18418, 17557, 16680, 15786, 14876,
+ 13951, 13013, 12062, 11099, 10125, 9141,
+ 8149, 7148, 6140, 5126, 4106, 3083,
+ 2057, 1029, 0, -1029, -2057, -3083,
+ -4106, -5126, -6140, -7148, -8149, -9141,
+ -10125, -11099, -12062, -13013, -13951, -14876,
+ -15786, -16680, -17557, -18418, -19260, -20083,
+ -20887, -21669, -22431, -23170, -23886, -24579,
+ -25248, -25891, -26509, -27101, -27666, -28204,
+ -28714, -29196, -29649, -30072, -30466, -30830,
+ -31164, -31466, -31738, -31978, -32187, -32364,
+ -32509, -32622, -32703, -32751, -32760};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab
new file mode 100644
index 0000000..91f8690
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab
@@ -0,0 +1,73 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/* Hamming_cos window for LPC analysis. */
+/* Create with function hamm_cos(window,384-128,128) */
+
+#define L_WINDOW 384
+
+const Word16 vo_window[L_WINDOW] = {
+ 2621, 2622, 2626, 2632, 2640, 2650, 2662, 2677,
+ 2694, 2714, 2735, 2759, 2785, 2814, 2844, 2877,
+ 2912, 2949, 2989, 3031, 3075, 3121, 3169, 3220,
+ 3273, 3328, 3385, 3444, 3506, 3569, 3635, 3703,
+ 3773, 3845, 3919, 3996, 4074, 4155, 4237, 4321,
+ 4408, 4496, 4587, 4680, 4774, 4870, 4969, 5069,
+ 5171, 5275, 5381, 5489, 5599, 5710, 5824, 5939,
+ 6056, 6174, 6295, 6417, 6541, 6666, 6793, 6922,
+ 7052, 7185, 7318, 7453, 7590, 7728, 7868, 8009,
+ 8152, 8296, 8442, 8589, 8737, 8887, 9038, 9191,
+ 9344, 9499, 9655, 9813, 9971, 10131, 10292, 10454,
+ 10617, 10781, 10946, 11113, 11280, 11448, 11617, 11787,
+ 11958, 12130, 12303, 12476, 12650, 12825, 13001, 13178,
+ 13355, 13533, 13711, 13890, 14070, 14250, 14431, 14612,
+ 14793, 14975, 15158, 15341, 15524, 15708, 15891, 16076,
+ 16260, 16445, 16629, 16814, 16999, 17185, 17370, 17555,
+ 17740, 17926, 18111, 18296, 18481, 18666, 18851, 19036,
+ 19221, 19405, 19589, 19773, 19956, 20139, 20322, 20504,
+ 20686, 20867, 21048, 21229, 21408, 21588, 21767, 21945,
+ 22122, 22299, 22475, 22651, 22825, 22999, 23172, 23344,
+ 23516, 23686, 23856, 24025, 24192, 24359, 24525, 24689,
+ 24853, 25016, 25177, 25337, 25496, 25654, 25811, 25967,
+ 26121, 26274, 26426, 26576, 26725, 26873, 27019, 27164,
+ 27308, 27450, 27590, 27729, 27867, 28003, 28137, 28270,
+ 28401, 28531, 28659, 28785, 28910, 29033, 29154, 29274,
+ 29391, 29507, 29622, 29734, 29845, 29953, 30060, 30165,
+ 30268, 30370, 30469, 30566, 30662, 30755, 30847, 30936,
+ 31024, 31109, 31193, 31274, 31354, 31431, 31506, 31579,
+ 31651, 31719, 31786, 31851, 31914, 31974, 32032, 32088,
+ 32142, 32194, 32243, 32291, 32336, 32379, 32419, 32458,
+ 32494, 32528, 32560, 32589, 32617, 32642, 32664, 32685,
+ 32703, 32719, 32733, 32744, 32753, 32760, 32764, 32767,
+ 32767, 32765, 32757, 32745, 32727, 32705, 32678, 32646,
+ 32609, 32567, 32520, 32468, 32411, 32349, 32283, 32211,
+ 32135, 32054, 31968, 31877, 31781, 31681, 31575, 31465,
+ 31351, 31231, 31107, 30978, 30844, 30706, 30563, 30415,
+ 30263, 30106, 29945, 29779, 29609, 29434, 29255, 29071,
+ 28883, 28691, 28494, 28293, 28087, 27878, 27664, 27446,
+ 27224, 26997, 26767, 26533, 26294, 26052, 25806, 25555,
+ 25301, 25043, 24782, 24516, 24247, 23974, 23698, 23418,
+ 23134, 22847, 22557, 22263, 21965, 21665, 21361, 21054,
+ 20743, 20430, 20113, 19794, 19471, 19146, 18817, 18486,
+ 18152, 17815, 17476, 17134, 16789, 16442, 16092, 15740,
+ 15385, 15028, 14669, 14308, 13944, 13579, 13211, 12841,
+ 12470, 12096, 11721, 11344, 10965, 10584, 10202, 9819,
+ 9433, 9047, 8659, 8270, 7879, 7488, 7095, 6701,
+ 6306, 5910, 5514, 5116, 4718, 4319, 3919, 3519,
+ 3118, 2716, 2315, 1913, 1510, 1108, 705, 302};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/homing.tab b/media/libstagefright/codecs/amrwbenc/inc/homing.tab
new file mode 100644
index 0000000..2963da7
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/homing.tab
@@ -0,0 +1,123 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+#define DHF_PARMS_MAX 32 /* homing frame pattern */
+#define NUM_OF_SPMODES 9
+
+#define PRML 15
+#define PRMN_7k NBBITS_7k/PRML + 1
+#define PRMN_9k NBBITS_9k/PRML + 1
+#define PRMN_12k NBBITS_12k/PRML + 1
+#define PRMN_14k NBBITS_14k/PRML + 1
+#define PRMN_16k NBBITS_16k/PRML + 1
+#define PRMN_18k NBBITS_18k/PRML + 1
+#define PRMN_20k NBBITS_20k/PRML + 1
+#define PRMN_23k NBBITS_23k/PRML + 1
+#define PRMN_24k NBBITS_24k/PRML + 1
+
+static const Word16 dfh_M7k[PRMN_7k] =
+{
+ 3168, 29954, 29213, 16121,
+ 64, 13440, 30624, 16430,
+ 19008
+};
+
+static const Word16 dfh_M9k[PRMN_9k] =
+{
+ 3168, 31665, 9943, 9123,
+ 15599, 4358, 20248, 2048,
+ 17040, 27787, 16816, 13888
+};
+
+static const Word16 dfh_M12k[PRMN_12k] =
+{
+ 3168, 31665, 9943, 9128,
+ 3647, 8129, 30930, 27926,
+ 18880, 12319, 496, 1042,
+ 4061, 20446, 25629, 28069,
+ 13948
+};
+
+static const Word16 dfh_M14k[PRMN_14k] =
+{
+ 3168, 31665, 9943, 9131,
+ 24815, 655, 26616, 26764,
+ 7238, 19136, 6144, 88,
+ 4158, 25733, 30567, 30494,
+ 221, 20321, 17823
+};
+
+static const Word16 dfh_M16k[PRMN_16k] =
+{
+ 3168, 31665, 9943, 9131,
+ 24815, 700, 3824, 7271,
+ 26400, 9528, 6594, 26112,
+ 108, 2068, 12867, 16317,
+ 23035, 24632, 7528, 1752,
+ 6759, 24576
+};
+
+static const Word16 dfh_M18k[PRMN_18k] =
+{
+ 3168, 31665, 9943, 9135,
+ 14787, 14423, 30477, 24927,
+ 25345, 30154, 916, 5728,
+ 18978, 2048, 528, 16449,
+ 2436, 3581, 23527, 29479,
+ 8237, 16810, 27091, 19052,
+ 0
+};
+
+static const Word16 dfh_M20k[PRMN_20k] =
+{
+ 3168, 31665, 9943, 9129,
+ 8637, 31807, 24646, 736,
+ 28643, 2977, 2566, 25564,
+ 12930, 13960, 2048, 834,
+ 3270, 4100, 26920, 16237,
+ 31227, 17667, 15059, 20589,
+ 30249, 29123, 0
+};
+
+static const Word16 dfh_M23k[PRMN_23k] =
+{
+ 3168, 31665, 9943, 9132,
+ 16748, 3202, 28179, 16317,
+ 30590, 15857, 19960, 8818,
+ 21711, 21538, 4260, 16690,
+ 20224, 3666, 4194, 9497,
+ 16320, 15388, 5755, 31551,
+ 14080, 3574, 15932, 50,
+ 23392, 26053, 31216
+};
+
+static const Word16 dfh_M24k[PRMN_24k] =
+{
+ 3168, 31665, 9943, 9134,
+ 24776, 5857, 18475, 28535,
+ 29662, 14321, 16725, 4396,
+ 29353, 10003, 17068, 20504,
+ 720, 0, 8465, 12581,
+ 28863, 24774, 9709, 26043,
+ 7941, 27649, 13965, 15236,
+ 18026, 22047, 16681, 3968
+};
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab
new file mode 100644
index 0000000..ff20e38
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab
@@ -0,0 +1,62 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Tables for function Isf_isp() and Isp_isf() |
+ *-----------------------------------------------------*/
+
+/* table of cos(x) in Q15 */
+
+const static Word16 table[129] = {
+ 32767,
+ 32758, 32729, 32679, 32610, 32522, 32413, 32286, 32138,
+ 31972, 31786, 31581, 31357, 31114, 30853, 30572, 30274,
+ 29957, 29622, 29269, 28899, 28511, 28106, 27684, 27246,
+ 26791, 26320, 25833, 25330, 24812, 24279, 23732, 23170,
+ 22595, 22006, 21403, 20788, 20160, 19520, 18868, 18205,
+ 17531, 16846, 16151, 15447, 14733, 14010, 13279, 12540,
+ 11793, 11039, 10279, 9512, 8740, 7962, 7180, 6393,
+ 5602, 4808, 4011, 3212, 2411, 1608, 804, 0,
+ -804, -1608, -2411, -3212, -4011, -4808, -5602, -6393,
+ -7180, -7962, -8740, -9512, -10279, -11039, -11793, -12540,
+ -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205,
+ -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170,
+ -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246,
+ -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274,
+ -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138,
+ -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768};
+
+/* slope in Q11 used to compute y = acos(x) */
+
+const static Word16 slope[128] = {
+ -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,
+ -1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
+ -827, -783, -743, -708, -676, -647, -621, -599,
+ -576, -557, -538, -521, -506, -492, -479, -466,
+ -456, -445, -435, -426, -417, -410, -402, -395,
+ -389, -383, -377, -372, -367, -363, -359, -355,
+ -351, -348, -345, -342, -340, -337, -335, -333,
+ -331, -330, -329, -328, -327, -326, -326, -326,
+ -326, -326, -326, -327, -328, -329, -330, -331,
+ -333, -335, -337, -340, -342, -345, -348, -351,
+ -355, -359, -363, -367, -372, -377, -383, -389,
+ -395, -402, -410, -417, -426, -435, -445, -456,
+ -466, -479, -492, -506, -521, -538, -557, -576,
+ -599, -621, -647, -676, -708, -743, -783, -827,
+ -880, -933, -1004, -1079, -1170, -1279, -1409, -1579,
+ -1771, -2064, -2405, -2979, -3799, -5243, -9039, -26214};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab
new file mode 100644
index 0000000..4175d66
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab
@@ -0,0 +1,81 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Table of lag_window for autocorrelation. |
+ | noise floor = 1.0001 = (0.9999 on r[1] ..r[16]) |
+ | Bandwidth expansion = 60 Hz |
+ | Sampling frequency = 12800 Hz |
+ | |
+ | Special double precision format. See "math_op.c" |
+ | |
+ | lag_wind[0] = 1.00000000 (not stored) |
+ | lag_wind[1] = 0.99946642 |
+ | lag_wind[2] = 0.99816680 |
+ | lag_wind[3] = 0.99600452 |
+ | lag_wind[4] = 0.99298513 |
+ | lag_wind[5] = 0.98911655 |
+ | lag_wind[6] = 0.98440880 |
+ | lag_wind[7] = 0.97887397 |
+ | lag_wind[8] = 0.97252619 |
+ | lag_wind[9] = 0.96538186 |
+ | lag_wind[10]= 0.95745903 |
+ | lag_wind[11]= 0.94877797 |
+ | lag_wind[12]= 0.93936038 |
+ | lag_wind[13]= 0.92922986 |
+ | lag_wind[14]= 0.91841155 |
+ | lag_wind[15]= 0.90693212 |
+ | lag_wind[16]= 0.89481968 |
+ ------------------------------------------------------*/
+
+#define M 16
+
+static Word16 volag_h[M] = {
+ 32750,
+ 32707,
+ 32637,
+ 32538,
+ 32411,
+ 32257,
+ 32075,
+ 31867,
+ 31633,
+ 31374,
+ 31089,
+ 30780,
+ 30449,
+ 30094,
+ 29718,
+ 29321};
+
+static Word16 volag_l[M] = {
+ 16896,
+ 30464,
+ 2496,
+ 4480,
+ 12160,
+ 3520,
+ 24320,
+ 24192,
+ 20736,
+ 576,
+ 18240,
+ 31488,
+ 128,
+ 16704,
+ 11520,
+ 14784};
diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2.h b/media/libstagefright/codecs/amrwbenc/inc/log2.h
new file mode 100644
index 0000000..91bdbec
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/log2.h
@@ -0,0 +1,62 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/********************************************************************************
+*
+* File : log2.h
+* Purpose : Computes log2(L_x)
+*
+********************************************************************************
+*/
+#ifndef __LOG2_H__
+#define __LOG2_H__
+
+/*
+********************************************************************************
+* INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+/*
+********************************************************************************
+* DEFINITION OF DATA TYPES
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+* DECLARATION OF PROTOTYPES
+********************************************************************************
+*/
+void Log2 (
+ Word32 L_x, /* (i) : input value */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1)*/
+ );
+
+void Log2_norm (
+ Word32 L_x, /* (i) : input value (normalized) */
+ Word16 exp, /* (i) : norm_l (L_x) */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ );
+
+#endif //__LOG2_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h
new file mode 100644
index 0000000..7761ae6
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h
@@ -0,0 +1,35 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+/*******************************************************************************
+*
+* File : log2.tab
+* Purpose : Table for routine Log2().
+* $Id $
+*
+********************************************************************************
+*/
+static const Word16 table[33] =
+{
+ 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716,
+ 12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033,
+ 22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497,
+ 31266, 32023, 32767
+};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/main.h b/media/libstagefright/codecs/amrwbenc/inc/main.h
new file mode 100644
index 0000000..d7e7c67
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/main.h
@@ -0,0 +1,45 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * MAIN.H *
+ *--------------------------------------------------------------------------*
+ * Main functions *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+void coder(
+ Word16 * mode, /* input : used mode */
+ Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */
+ Word16 prms[], /* output: output parameters */
+ Word16 * ser_size, /* output: bit rate of the used mode */
+ void *spe_state, /* i/o : State structure */
+ Word16 allow_dtx /* input : DTX ON/OFF */
+);
+
+
+
+void Reset_encoder(void *st, Word16 reset_all);
+
+
+Word16 encoder_homing_frame_test(Word16 input_frame[]);
+
+#endif //__MAIN_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/math_op.h b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
new file mode 100644
index 0000000..25e29f7
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
@@ -0,0 +1,55 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * MATH_OP.H *
+ *--------------------------------------------------------------------------*
+ * Mathematical operations *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __MATH_OP_H__
+#define __MATH_OP_H__
+
+Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */
+ Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
+ );
+
+void Isqrt_n(
+ Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+ Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
+ );
+
+Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */
+ Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
+ Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
+ );
+
+Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ );
+
+Word32 Dot_product12_asm( /* (o) Q31: normalized result (1 < val <= -1) */
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ );
+#endif //__MATH_OP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
new file mode 100644
index 0000000..d6ddec3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
@@ -0,0 +1,35 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: mem_align.h
+
+ Content: Memory alloc alignments functions
+
+*******************************************************************************/
+
+#ifndef __VO_MEM_ALIGN_H__
+#define __VO_MEM_ALIGN_H__
+
+#include "voMem.h"
+#include "typedef.h"
+
+extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
+extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
+
+#endif /* __VO_MEM_ALIGN_H__ */
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab
new file mode 100644
index 0000000..ffc86a1
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab
@@ -0,0 +1,368 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include <stdio.h>
+#include "typedef.h"
+
+static UWord8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
+ 0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C};
+
+/* number of speech bits for all modes */
+static Word16 unpacked_size[16] = {132, 177, 253, 285, 317, 365, 397, 461,
+ 477, 35, 0, 0, 0, 0, 0, 0};
+
+/* size of packed frame for each mode, excluding TOC byte */
+static Word16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58,
+ 60, 5, 0, 0, 0, 0, 0, 0};
+
+/* number of unused speech bits in packed format for each mode */
+static Word16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0};
+
+/* sorting tables for all modes */
+
+static Word16 sort_660[132] = {
+ 0, 5, 6, 7, 61, 84, 107, 130, 62, 85,
+ 8, 4, 37, 38, 39, 40, 58, 81, 104, 127,
+ 60, 83, 106, 129, 108, 131, 128, 41, 42, 80,
+ 126, 1, 3, 57, 103, 82, 105, 59, 2, 63,
+ 109, 110, 86, 19, 22, 23, 64, 87, 18, 20,
+ 21, 17, 13, 88, 43, 89, 65, 111, 14, 24,
+ 25, 26, 27, 28, 15, 16, 44, 90, 66, 112,
+ 9, 11, 10, 12, 67, 113, 29, 30, 31, 32,
+ 34, 33, 35, 36, 45, 51, 68, 74, 91, 97,
+ 114, 120, 46, 69, 92, 115, 52, 75, 98, 121,
+ 47, 70, 93, 116, 53, 76, 99, 122, 48, 71,
+ 94, 117, 54, 77, 100, 123, 49, 72, 95, 118,
+ 55, 78, 101, 124, 50, 73, 96, 119, 56, 79,
+ 102, 125
+};
+
+static Word16 sort_885[177] = {
+ 0, 4, 6, 7, 5, 3, 47, 48, 49, 112,
+ 113, 114, 75, 106, 140, 171, 80, 111, 145, 176,
+ 77, 108, 142, 173, 78, 109, 143, 174, 79, 110,
+ 144, 175, 76, 107, 141, 172, 50, 115, 51, 2,
+ 1, 81, 116, 146, 19, 21, 12, 17, 18, 20,
+ 16, 25, 13, 10, 14, 24, 23, 22, 26, 8,
+ 15, 52, 117, 31, 82, 147, 9, 33, 11, 83,
+ 148, 53, 118, 28, 27, 84, 149, 34, 35, 29,
+ 46, 32, 30, 54, 119, 37, 36, 39, 38, 40,
+ 85, 150, 41, 42, 43, 44, 45, 55, 60, 65,
+ 70, 86, 91, 96, 101, 120, 125, 130, 135, 151,
+ 156, 161, 166, 56, 87, 121, 152, 61, 92, 126,
+ 157, 66, 97, 131, 162, 71, 102, 136, 167, 57,
+ 88, 122, 153, 62, 93, 127, 158, 67, 98, 132,
+ 163, 72, 103, 137, 168, 58, 89, 123, 154, 63,
+ 94, 128, 159, 68, 99, 133, 164, 73, 104, 138,
+ 169, 59, 90, 124, 155, 64, 95, 129, 160, 69,
+ 100, 134, 165, 74, 105, 139, 170
+};
+
+static Word16 sort_1265[253] = {
+ 0, 4, 6, 93, 143, 196, 246, 7, 5, 3,
+ 47, 48, 49, 50, 51, 150, 151, 152, 153, 154,
+ 94, 144, 197, 247, 99, 149, 202, 252, 96, 146,
+ 199, 249, 97, 147, 200, 250, 100, 203, 98, 148,
+ 201, 251, 95, 145, 198, 248, 52, 2, 1, 101,
+ 204, 155, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 156, 31, 102, 205, 9, 33, 11, 103, 206, 54,
+ 157, 28, 27, 104, 207, 34, 35, 29, 46, 32,
+ 30, 55, 158, 37, 36, 39, 38, 40, 105, 208,
+ 41, 42, 43, 44, 45, 56, 106, 159, 209, 57,
+ 66, 75, 84, 107, 116, 125, 134, 160, 169, 178,
+ 187, 210, 219, 228, 237, 58, 108, 161, 211, 62,
+ 112, 165, 215, 67, 117, 170, 220, 71, 121, 174,
+ 224, 76, 126, 179, 229, 80, 130, 183, 233, 85,
+ 135, 188, 238, 89, 139, 192, 242, 59, 109, 162,
+ 212, 63, 113, 166, 216, 68, 118, 171, 221, 72,
+ 122, 175, 225, 77, 127, 180, 230, 81, 131, 184,
+ 234, 86, 136, 189, 239, 90, 140, 193, 243, 60,
+ 110, 163, 213, 64, 114, 167, 217, 69, 119, 172,
+ 222, 73, 123, 176, 226, 78, 128, 181, 231, 82,
+ 132, 185, 235, 87, 137, 190, 240, 91, 141, 194,
+ 244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
+ 120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
+ 232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
+ 142, 195, 245
+};
+
+static Word16 sort_1425[285] = {
+ 0, 4, 6, 101, 159, 220, 278, 7, 5, 3,
+ 47, 48, 49, 50, 51, 166, 167, 168, 169, 170,
+ 102, 160, 221, 279, 107, 165, 226, 284, 104, 162,
+ 223, 281, 105, 163, 224, 282, 108, 227, 106, 164,
+ 225, 283, 103, 161, 222, 280, 52, 2, 1, 109,
+ 228, 171, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 172, 31, 110, 229, 9, 33, 11, 111, 230, 54,
+ 173, 28, 27, 112, 231, 34, 35, 29, 46, 32,
+ 30, 55, 174, 37, 36, 39, 38, 40, 113, 232,
+ 41, 42, 43, 44, 45, 56, 114, 175, 233, 62,
+ 120, 181, 239, 75, 133, 194, 252, 57, 115, 176,
+ 234, 63, 121, 182, 240, 70, 128, 189, 247, 76,
+ 134, 195, 253, 83, 141, 202, 260, 92, 150, 211,
+ 269, 84, 142, 203, 261, 93, 151, 212, 270, 85,
+ 143, 204, 262, 94, 152, 213, 271, 86, 144, 205,
+ 263, 95, 153, 214, 272, 64, 122, 183, 241, 77,
+ 135, 196, 254, 65, 123, 184, 242, 78, 136, 197,
+ 255, 87, 145, 206, 264, 96, 154, 215, 273, 58,
+ 116, 177, 235, 66, 124, 185, 243, 71, 129, 190,
+ 248, 79, 137, 198, 256, 88, 146, 207, 265, 97,
+ 155, 216, 274, 59, 117, 178, 236, 67, 125, 186,
+ 244, 72, 130, 191, 249, 80, 138, 199, 257, 89,
+ 147, 208, 266, 98, 156, 217, 275, 60, 118, 179,
+ 237, 68, 126, 187, 245, 73, 131, 192, 250, 81,
+ 139, 200, 258, 90, 148, 209, 267, 99, 157, 218,
+ 276, 61, 119, 180, 238, 69, 127, 188, 246, 74,
+ 132, 193, 251, 82, 140, 201, 259, 91, 149, 210,
+ 268, 100, 158, 219, 277
+};
+
+static Word16 sort_1585[317] = {
+ 0, 4, 6, 109, 175, 244, 310, 7, 5, 3,
+ 47, 48, 49, 50, 51, 182, 183, 184, 185, 186,
+ 110, 176, 245, 311, 115, 181, 250, 316, 112, 178,
+ 247, 313, 113, 179, 248, 314, 116, 251, 114, 180,
+ 249, 315, 111, 177, 246, 312, 52, 2, 1, 117,
+ 252, 187, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 188, 31, 118, 253, 9, 33, 11, 119, 254, 54,
+ 189, 28, 27, 120, 255, 34, 35, 29, 46, 32,
+ 30, 55, 190, 37, 36, 39, 38, 40, 121, 256,
+ 41, 42, 43, 44, 45, 56, 122, 191, 257, 63,
+ 129, 198, 264, 76, 142, 211, 277, 89, 155, 224,
+ 290, 102, 168, 237, 303, 57, 123, 192, 258, 70,
+ 136, 205, 271, 83, 149, 218, 284, 96, 162, 231,
+ 297, 62, 128, 197, 263, 75, 141, 210, 276, 88,
+ 154, 223, 289, 101, 167, 236, 302, 58, 124, 193,
+ 259, 71, 137, 206, 272, 84, 150, 219, 285, 97,
+ 163, 232, 298, 59, 125, 194, 260, 64, 130, 199,
+ 265, 67, 133, 202, 268, 72, 138, 207, 273, 77,
+ 143, 212, 278, 80, 146, 215, 281, 85, 151, 220,
+ 286, 90, 156, 225, 291, 93, 159, 228, 294, 98,
+ 164, 233, 299, 103, 169, 238, 304, 106, 172, 241,
+ 307, 60, 126, 195, 261, 65, 131, 200, 266, 68,
+ 134, 203, 269, 73, 139, 208, 274, 78, 144, 213,
+ 279, 81, 147, 216, 282, 86, 152, 221, 287, 91,
+ 157, 226, 292, 94, 160, 229, 295, 99, 165, 234,
+ 300, 104, 170, 239, 305, 107, 173, 242, 308, 61,
+ 127, 196, 262, 66, 132, 201, 267, 69, 135, 204,
+ 270, 74, 140, 209, 275, 79, 145, 214, 280, 82,
+ 148, 217, 283, 87, 153, 222, 288, 92, 158, 227,
+ 293, 95, 161, 230, 296, 100, 166, 235, 301, 105,
+ 171, 240, 306, 108, 174, 243, 309
+};
+
+static Word16 sort_1825[365] = {
+ 0, 4, 6, 121, 199, 280, 358, 7, 5, 3,
+ 47, 48, 49, 50, 51, 206, 207, 208, 209, 210,
+ 122, 200, 281, 359, 127, 205, 286, 364, 124, 202,
+ 283, 361, 125, 203, 284, 362, 128, 287, 126, 204,
+ 285, 363, 123, 201, 282, 360, 52, 2, 1, 129,
+ 288, 211, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 212, 31, 130, 289, 9, 33, 11, 131, 290, 54,
+ 213, 28, 27, 132, 291, 34, 35, 29, 46, 32,
+ 30, 55, 214, 37, 36, 39, 38, 40, 133, 292,
+ 41, 42, 43, 44, 45, 56, 134, 215, 293, 198,
+ 299, 136, 120, 138, 60, 279, 58, 62, 357, 139,
+ 140, 295, 156, 57, 219, 297, 63, 217, 137, 170,
+ 300, 222, 64, 106, 61, 78, 294, 92, 142, 141,
+ 135, 221, 296, 301, 343, 59, 298, 184, 329, 315,
+ 220, 216, 265, 251, 218, 237, 352, 223, 157, 86,
+ 171, 87, 164, 351, 111, 302, 65, 178, 115, 323,
+ 72, 192, 101, 179, 93, 73, 193, 151, 337, 309,
+ 143, 274, 69, 324, 165, 150, 97, 338, 110, 310,
+ 330, 273, 68, 107, 175, 245, 114, 79, 113, 189,
+ 246, 259, 174, 71, 185, 96, 344, 100, 322, 83,
+ 334, 316, 333, 252, 161, 348, 147, 82, 269, 232,
+ 260, 308, 353, 347, 163, 231, 306, 320, 188, 270,
+ 146, 177, 266, 350, 256, 85, 149, 116, 191, 160,
+ 238, 258, 336, 305, 255, 88, 224, 99, 339, 230,
+ 228, 227, 272, 242, 241, 319, 233, 311, 102, 74,
+ 180, 275, 66, 194, 152, 325, 172, 247, 244, 261,
+ 117, 158, 166, 354, 75, 144, 108, 312, 94, 186,
+ 303, 80, 234, 89, 195, 112, 340, 181, 345, 317,
+ 326, 276, 239, 167, 118, 313, 70, 355, 327, 253,
+ 190, 176, 271, 104, 98, 153, 103, 90, 76, 267,
+ 277, 248, 225, 262, 182, 84, 154, 235, 335, 168,
+ 331, 196, 341, 249, 162, 307, 148, 349, 263, 321,
+ 257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
+ 240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
+ 105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
+ 169, 268, 226, 236, 264
+};
+
+static Word16 sort_1985[397] = {
+ 0, 4, 6, 129, 215, 304, 390, 7, 5, 3,
+ 47, 48, 49, 50, 51, 222, 223, 224, 225, 226,
+ 130, 216, 305, 391, 135, 221, 310, 396, 132, 218,
+ 307, 393, 133, 219, 308, 394, 136, 311, 134, 220,
+ 309, 395, 131, 217, 306, 392, 52, 2, 1, 137,
+ 312, 227, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 228, 31, 138, 313, 9, 33, 11, 139, 314, 54,
+ 229, 28, 27, 140, 315, 34, 35, 29, 46, 32,
+ 30, 55, 230, 37, 36, 39, 38, 40, 141, 316,
+ 41, 42, 43, 44, 45, 56, 142, 231, 317, 63,
+ 73, 92, 340, 82, 324, 149, 353, 159, 334, 165,
+ 338, 178, 163, 254, 77, 168, 257, 153, 343, 57,
+ 248, 238, 79, 252, 166, 67, 80, 201, 101, 267,
+ 143, 164, 341, 255, 339, 187, 376, 318, 78, 328,
+ 362, 115, 232, 242, 253, 290, 276, 62, 58, 158,
+ 68, 93, 179, 319, 148, 169, 154, 72, 385, 329,
+ 333, 344, 102, 83, 144, 233, 323, 124, 243, 192,
+ 354, 237, 64, 247, 202, 209, 150, 116, 335, 268,
+ 239, 299, 188, 196, 298, 94, 195, 258, 123, 363,
+ 384, 109, 325, 371, 170, 370, 84, 110, 295, 180,
+ 74, 210, 191, 106, 291, 205, 367, 381, 377, 206,
+ 355, 122, 119, 120, 383, 160, 105, 108, 277, 380,
+ 294, 284, 285, 345, 208, 269, 249, 366, 386, 300,
+ 297, 259, 125, 369, 197, 97, 194, 286, 211, 281,
+ 280, 183, 372, 87, 155, 283, 59, 348, 327, 184,
+ 76, 111, 330, 203, 349, 69, 98, 152, 145, 189,
+ 66, 320, 337, 173, 358, 251, 198, 174, 263, 262,
+ 126, 241, 193, 88, 388, 117, 95, 387, 112, 359,
+ 287, 244, 103, 272, 301, 171, 162, 234, 273, 127,
+ 373, 181, 292, 85, 378, 302, 121, 107, 364, 346,
+ 356, 212, 278, 213, 65, 382, 288, 207, 113, 175,
+ 99, 296, 374, 368, 199, 260, 185, 336, 331, 161,
+ 270, 264, 250, 240, 75, 350, 151, 60, 89, 321,
+ 156, 274, 360, 326, 70, 282, 167, 146, 352, 81,
+ 91, 389, 266, 245, 177, 235, 190, 256, 204, 342,
+ 128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
+ 293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
+ 261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
+ 71, 332, 61, 265, 157, 246, 236
+};
+
+static Word16 sort_2305[461] = {
+ 0, 4, 6, 145, 247, 352, 454, 7, 5, 3,
+ 47, 48, 49, 50, 51, 254, 255, 256, 257, 258,
+ 146, 248, 353, 455, 151, 253, 358, 460, 148, 250,
+ 355, 457, 149, 251, 356, 458, 152, 359, 150, 252,
+ 357, 459, 147, 249, 354, 456, 52, 2, 1, 153,
+ 360, 259, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 260, 31, 154, 361, 9, 33, 11, 155, 362, 54,
+ 261, 28, 27, 156, 363, 34, 35, 29, 46, 32,
+ 30, 55, 262, 37, 36, 39, 38, 40, 157, 364,
+ 41, 42, 43, 44, 45, 56, 158, 263, 365, 181,
+ 192, 170, 79, 57, 399, 90, 159, 297, 377, 366,
+ 275, 68, 183, 388, 286, 194, 299, 92 , 70, 182,
+ 401, 172, 59, 91, 58, 400, 368, 161, 81, 160,
+ 264, 171, 80, 389, 390, 378, 379, 193, 298, 69,
+ 266, 265, 367, 277, 288, 276, 287, 184, 60, 195,
+ 82, 93, 71, 369, 402, 173, 162, 444, 300, 391,
+ 98, 76, 278, 61, 267, 374, 135, 411, 167, 102,
+ 380, 200, 87, 178, 65, 94, 204, 124, 72, 342,
+ 189, 305, 381, 396, 433, 301, 226, 407, 289, 237,
+ 113, 215, 185, 128, 309, 403, 116, 320, 196, 331,
+ 370, 422, 174, 64, 392, 83, 425, 219, 134, 188,
+ 432, 112, 427, 139, 279, 163, 436, 208, 447, 218,
+ 236, 229, 97, 294, 385, 230, 166, 268, 177, 443,
+ 225, 426, 101, 272, 138, 127, 290, 117, 347, 199,
+ 414, 95, 140, 240, 410, 395, 209, 129, 283, 346,
+ 105, 241, 437, 86, 308, 448, 203, 345, 186, 107,
+ 220, 415, 334, 319, 106, 313, 118, 123, 73, 207,
+ 421, 214, 384, 373, 438, 62, 371, 341, 75, 449,
+ 168, 323, 164, 242, 416, 324, 304, 197, 335, 404,
+ 271, 63, 191, 325, 96, 169, 231, 280, 312, 187,
+ 406, 84, 201, 100, 67, 382, 175, 336, 202, 330,
+ 269, 393, 376, 383, 293, 307, 409, 179, 285, 314,
+ 302, 372, 398, 190, 180, 89, 99, 103, 232, 78,
+ 88, 77, 136, 387, 165, 198, 394, 125, 176, 428,
+ 74, 375, 238, 227, 66, 273, 282, 141, 306, 412,
+ 114, 85, 130, 348, 119, 291, 296, 386, 233, 397,
+ 303, 405, 284, 445, 423, 221, 210, 205, 450, 108,
+ 274, 434, 216, 343, 337, 142, 243, 321, 408, 451,
+ 310, 292, 120, 109, 281, 439, 270, 429, 332, 295,
+ 418, 211, 315, 222, 326, 131, 430, 244, 327, 349,
+ 417, 316, 143, 338, 440, 234, 110, 212, 452, 245,
+ 121, 419, 350, 223, 132, 441, 328, 413, 317, 339,
+ 126, 104, 137, 446, 344, 239, 435, 115, 333, 206,
+ 322, 217, 228, 424, 453, 311, 351, 111, 442, 224,
+ 213, 122, 431, 340, 235, 246, 133, 144, 420, 329,
+ 318
+};
+
+static Word16 sort_2385[477] = {
+ 0, 4, 6, 145, 251, 360, 466, 7, 5, 3,
+ 47, 48, 49, 50, 51, 262, 263, 264, 265, 266,
+ 146, 252, 361, 467, 151, 257, 366, 472, 148, 254,
+ 363, 469, 149, 255, 364, 470, 156, 371, 150, 256,
+ 365, 471, 147, 253, 362, 468, 52, 2, 1, 157,
+ 372, 267, 19, 21, 12, 17, 18, 20, 16, 25,
+ 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
+ 268, 31, 152, 153, 154, 155, 258, 259, 260, 261,
+ 367, 368, 369, 370, 473, 474, 475, 476, 158, 373,
+ 9, 33, 11, 159, 374, 54, 269, 28, 27, 160,
+ 375, 34, 35, 29, 46, 32, 30, 55, 270, 37,
+ 36, 39, 38, 40, 161, 376, 41, 42, 43, 44,
+ 45, 56, 162, 271, 377, 185, 196, 174, 79, 57,
+ 411, 90, 163, 305, 389, 378, 283, 68, 187, 400,
+ 294, 198, 307, 92, 70, 186, 413, 176, 59, 91,
+ 58, 412, 380, 165, 81, 164, 272, 175, 80, 401,
+ 402, 390, 391, 197, 306, 69, 274, 273, 379, 285,
+ 296, 284, 295, 188, 60, 199, 82, 93, 71, 381,
+ 414, 177, 166, 456, 308, 403, 98, 76, 286, 61,
+ 275, 386, 135, 423, 171, 102, 392, 204, 87, 182,
+ 65, 94, 208, 124, 72, 350, 193, 313, 393, 408,
+ 445, 309, 230, 419, 297, 241, 113, 219, 189, 128,
+ 317, 415, 116, 328, 200, 339, 382, 434, 178, 64,
+ 404, 83, 437, 223, 134, 192, 444, 112, 439, 139,
+ 287, 167, 448, 212, 459, 222, 240, 233, 97, 302,
+ 397, 234, 170, 276, 181, 455, 229, 438, 101, 280,
+ 138, 127, 298, 117, 355, 203, 426, 95, 140, 244,
+ 422, 407, 213, 129, 291, 354, 105, 245, 449, 86,
+ 316, 460, 207, 353, 190, 107, 224, 427, 342, 327,
+ 106, 321, 118, 123, 73, 211, 433, 218, 396, 385,
+ 450, 62, 383, 349, 75, 461, 172, 331, 168, 246,
+ 428, 332, 312, 201, 343, 416, 279, 63, 195, 333,
+ 96, 173, 235, 288, 320, 191, 418, 84, 205, 100,
+ 67, 394, 179, 344, 206, 338, 277, 405, 388, 395,
+ 301, 315, 421, 183, 293, 322, 310, 384, 410, 194,
+ 184, 89, 99, 103, 236, 78, 88, 77, 136, 399,
+ 169, 202, 406, 125, 180, 440, 74, 387, 242, 231,
+ 66, 281, 290, 141, 314, 424, 114, 85, 130, 356,
+ 119, 299, 304, 398, 237, 409, 311, 417, 292, 457,
+ 435, 225, 214, 209, 462, 108, 282, 446, 220, 351,
+ 345, 142, 247, 329, 420, 463, 318, 300, 120, 109,
+ 289, 451, 278, 441, 340, 303, 430, 215, 323, 226,
+ 334, 131, 442, 248, 335, 357, 429, 324, 143, 346,
+ 452, 238, 110, 216, 464, 249, 121, 431, 358, 227,
+ 132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
+ 352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
+ 465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
+ 239, 250, 133, 144, 432, 337, 326
+};
+
+static Word16 sort_SID[35] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34
+};
+
+/* pointer table for bit sorting tables */
+static Word16 *sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305,
+ sort_2385, sort_SID, NULL, NULL, NULL, NULL, NULL, NULL};
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h
new file mode 100644
index 0000000..4159d84
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h
@@ -0,0 +1,31 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/* Double precision operations */
+/* $Id$ */
+
+#ifndef __OPER_32B_H__
+#define __OPER_32B_H__
+
+void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);
+Word32 L_Comp (Word16 hi, Word16 lo);
+Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);
+Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);
+Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo);
+
+#endif //__OPER_32B_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
new file mode 100644
index 0000000..27c4c7e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
@@ -0,0 +1,52 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*--------------------------------------------------------------------------*
+ * P_MED_O.H *
+ *--------------------------------------------------------------------------*
+ * Median open-loop lag search *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __P_MED_O_H__
+#define __P_MED_O_H__
+
+Word16 Pitch_med_ol( /* output: open loop pitch lag */
+ Word16 wsp[], /* input : signal used to compute the open loop pitch */
+ /* wsp[-pit_max] to wsp[-1] should be known */
+ Word16 L_min, /* input : minimum pitch lag */
+ Word16 L_max, /* input : maximum pitch lag */
+ Word16 L_frame, /* input : length of frame to compute pitch */
+ Word16 L_0, /* input : old_ open-loop pitch */
+ Word16 * gain, /* output: normalize correlation of hp_wsp for the Lag */
+ Word16 * hp_wsp_mem, /* i:o : memory of the hypass filter for hp_wsp[] (lg=9) */
+ Word16 * old_hp_wsp, /* i:o : hypass wsp[] */
+ Word16 wght_flg /* input : is weighting function used */
+ );
+
+Word16 Med_olag( /* output : median of 5 previous open-loop lags */
+ Word16 prev_ol_lag, /* input : previous open-loop lag */
+ Word16 old_ol_lag[5]
+ );
+
+void Hp_wsp(
+ Word16 wsp[], /* i : wsp[] signal */
+ Word16 hp_wsp[], /* o : hypass wsp[] */
+ Word16 lg, /* i : lenght of signal */
+ Word16 mem[] /* i/o : filter memory [9] */
+ );
+
+#endif //__P_MED_O_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab
new file mode 100644
index 0000000..14bd1d5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab
@@ -0,0 +1,47 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Table for function Pitch_med_ol() |
+ *-----------------------------------------------------*/
+
+ static Word16 corrweight[199]= {
+
+ 10772, 10794, 10816, 10839, 10862, 10885, 10908, 10932, 10955, 10980,
+ 11004, 11029, 11054, 11079, 11105, 11131, 11157, 11183, 11210, 11238,
+ 11265, 11293, 11322, 11350, 11379, 11409, 11439, 11469, 11500, 11531,
+ 11563, 11595, 11628, 11661, 11694, 11728, 11763, 11798, 11834, 11870,
+ 11907, 11945, 11983, 12022, 12061, 12101, 12142, 12184, 12226, 12270,
+ 12314, 12358, 12404, 12451, 12498, 12547, 12596, 12647, 12699, 12751,
+ 12805, 12861, 12917, 12975, 13034, 13095, 13157, 13221, 13286, 13353,
+ 13422, 13493, 13566, 13641, 13719, 13798, 13880, 13965, 14053, 14143,
+ 14237, 14334, 14435, 14539, 14648, 14761, 14879, 15002, 15130, 15265,
+ 15406, 15554, 15710, 15874, 16056, 16384, 16384, 16384, 16384, 16384,
+ 16384, 16384, 16056, 15874, 15710, 15554, 15406, 15265, 15130, 15002,
+ 14879, 14761, 14648, 14539, 14435, 14334, 14237, 14143, 14053, 13965,
+ 13880, 13798, 13719, 13641, 13566, 13493, 13422, 13353, 13286, 13221,
+ 13157, 13095, 13034, 12975, 12917, 12861, 12805, 12751, 12699, 12647,
+ 12596, 12547, 12498, 12451, 12404, 12358, 12314, 12270, 12226, 12184,
+ 12142, 12101, 12061, 12022, 11983, 11945, 11907, 11870, 11834, 11798,
+ 11763, 11728, 11694, 11661, 11628, 11595, 11563, 11531, 11500, 11469,
+ 11439, 11409, 11379, 11350, 11322, 11293, 11265, 11238, 11210, 11183,
+ 11157, 11131, 11105, 11079, 11054, 11029, 11004, 10980, 10955, 10932,
+ 10908, 10885, 10862, 10839, 10816, 10794, 10772, 10750, 10728};
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab
new file mode 100644
index 0000000..1a0deee
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab
@@ -0,0 +1,228 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*------------------------------------------------------*
+ * Tables for function q_gain2() *
+ * *
+ * g_pitch(Q14), g_code(Q11) *
+ * *
+ * pitch gain are ordered in table to reduce complexity *
+ * during quantization of gains. *
+ *------------------------------------------------------*/
+
+#define nb_qua_gain6b 64 /* Number of quantization level */
+#define nb_qua_gain7b 128 /* Number of quantization level */
+
+
+static Word16 t_qua_gain6b[64*2] = {
+ 1566, 1332,
+ 1577, 3557,
+ 3071, 6490,
+ 4193, 10163,
+ 4496, 2534,
+ 5019, 4488,
+ 5586, 15614,
+ 5725, 1422,
+ 6453, 580,
+ 6724, 6831,
+ 7657, 3527,
+ 8072, 2099,
+ 8232, 5319,
+ 8827, 8775,
+ 9740, 2868,
+ 9856, 1465,
+ 10087, 12488,
+ 10241, 4453,
+ 10859, 6618,
+ 11321, 3587,
+ 11417, 1800,
+ 11643, 2428,
+ 11718, 988,
+ 12312, 5093,
+ 12523, 8413,
+ 12574, 26214,
+ 12601, 3396,
+ 13172, 1623,
+ 13285, 2423,
+ 13418, 6087,
+ 13459, 12810,
+ 13656, 3607,
+ 14111, 4521,
+ 14144, 1229,
+ 14425, 1871,
+ 14431, 7234,
+ 14445, 2834,
+ 14628, 10036,
+ 14860, 17496,
+ 15161, 3629,
+ 15209, 5819,
+ 15299, 2256,
+ 15518, 4722,
+ 15663, 1060,
+ 15759, 7972,
+ 15939, 11964,
+ 16020, 2996,
+ 16086, 1707,
+ 16521, 4254,
+ 16576, 6224,
+ 16894, 2380,
+ 16906, 681,
+ 17213, 8406,
+ 17610, 3418,
+ 17895, 5269,
+ 18168, 11748,
+ 18230, 1575,
+ 18607, 32767,
+ 18728, 21684,
+ 19137, 2543,
+ 19422, 6577,
+ 19446, 4097,
+ 19450, 9056,
+ 20371, 14885};
+
+static Word16 t_qua_gain7b[128*2] = {
+ 204, 441,
+ 464, 1977,
+ 869, 1077,
+ 1072, 3062,
+ 1281, 4759,
+ 1647, 1539,
+ 1845, 7020,
+ 1853, 634,
+ 1995, 2336,
+ 2351, 15400,
+ 2661, 1165,
+ 2702, 3900,
+ 2710, 10133,
+ 3195, 1752,
+ 3498, 2624,
+ 3663, 849,
+ 3984, 5697,
+ 4214, 3399,
+ 4415, 1304,
+ 4695, 2056,
+ 5376, 4558,
+ 5386, 676,
+ 5518, 23554,
+ 5567, 7794,
+ 5644, 3061,
+ 5672, 1513,
+ 5957, 2338,
+ 6533, 1060,
+ 6804, 5998,
+ 6820, 1767,
+ 6937, 3837,
+ 7277, 414,
+ 7305, 2665,
+ 7466, 11304,
+ 7942, 794,
+ 8007, 1982,
+ 8007, 1366,
+ 8326, 3105,
+ 8336, 4810,
+ 8708, 7954,
+ 8989, 2279,
+ 9031, 1055,
+ 9247, 3568,
+ 9283, 1631,
+ 9654, 6311,
+ 9811, 2605,
+ 10120, 683,
+ 10143, 4179,
+ 10245, 1946,
+ 10335, 1218,
+ 10468, 9960,
+ 10651, 3000,
+ 10951, 1530,
+ 10969, 5290,
+ 11203, 2305,
+ 11325, 3562,
+ 11771, 6754,
+ 11839, 1849,
+ 11941, 4495,
+ 11954, 1298,
+ 11975, 15223,
+ 11977, 883,
+ 11986, 2842,
+ 12438, 2141,
+ 12593, 3665,
+ 12636, 8367,
+ 12658, 1594,
+ 12886, 2628,
+ 12984, 4942,
+ 13146, 1115,
+ 13224, 524,
+ 13341, 3163,
+ 13399, 1923,
+ 13549, 5961,
+ 13606, 1401,
+ 13655, 2399,
+ 13782, 3909,
+ 13868, 10923,
+ 14226, 1723,
+ 14232, 2939,
+ 14278, 7528,
+ 14439, 4598,
+ 14451, 984,
+ 14458, 2265,
+ 14792, 1403,
+ 14818, 3445,
+ 14899, 5709,
+ 15017, 15362,
+ 15048, 1946,
+ 15069, 2655,
+ 15405, 9591,
+ 15405, 4079,
+ 15570, 7183,
+ 15687, 2286,
+ 15691, 1624,
+ 15699, 3068,
+ 15772, 5149,
+ 15868, 1205,
+ 15970, 696,
+ 16249, 3584,
+ 16338, 1917,
+ 16424, 2560,
+ 16483, 4438,
+ 16529, 6410,
+ 16620, 11966,
+ 16839, 8780,
+ 17030, 3050,
+ 17033, 18325,
+ 17092, 1568,
+ 17123, 5197,
+ 17351, 2113,
+ 17374, 980,
+ 17566, 26214,
+ 17609, 3912,
+ 17639, 32767,
+ 18151, 7871,
+ 18197, 2516,
+ 18202, 5649,
+ 18679, 3283,
+ 18930, 1370,
+ 19271, 13757,
+ 19317, 4120,
+ 19460, 1973,
+ 19654, 10018,
+ 19764, 6792,
+ 19912, 5135,
+ 20040, 2841,
+ 21234, 19833};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
new file mode 100644
index 0000000..baf5525
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
@@ -0,0 +1,66 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ * Q_PULSE.H *
+ *--------------------------------------------------------------------------*
+ * Coding and decoding of algebraic codebook *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __Q_PULSE_H__
+#define __Q_PULSE_H__
+
+#include "typedef.h"
+
+Word32 quant_1p_N1( /* (o) return (N+1) bits */
+ Word16 pos, /* (i) position of the pulse */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 pos4, /* (i) position of the pulse 4 */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_4p_4N( /* (o) return 4*N bits */
+ Word16 pos[], /* (i) position of the pulse 1..4 */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_5p_5N( /* (o) return 5*N bits */
+ Word16 pos[], /* (i) position of the pulse 1..5 */
+ Word16 N); /* (i) number of bits for position */
+
+Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */
+ Word16 pos[], /* (i) position of the pulse 1..6 */
+ Word16 N); /* (i) number of bits for position */
+
+
+#endif //__Q_PULSE_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab
new file mode 100644
index 0000000..52f0daf
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab
@@ -0,0 +1,347 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ * qisf_ns.h
+ *-------------------------------------------------------------------*
+ * Quantization tables for split by 5 VQ of ISFs for a background noise database
+ * Version whith no prediction
+ *-------------------------------------------------------------------*/
+
+#define ORDER 16 /* order of linear prediction filter */
+#define ISF_GAP 128
+
+#define SIZE_BK_NOISE1 64
+#define SIZE_BK_NOISE2 64
+#define SIZE_BK_NOISE3 64
+#define SIZE_BK_NOISE4 32
+#define SIZE_BK_NOISE5 32
+
+
+/* means of ISFs */
+ static Word16 mean_isf_noise[ORDER] = {
+
+ 478, 1100, 2213, 3267, 4219, 5222, 6198, 7240,
+ 8229, 9153, 10098, 11108, 12144, 13184, 14165, 3803};
+
+
+/* 28 bits */
+/*-------------------------------------------------------------------*
+ * isf codebooks: split-by-5 VQ *
+ * *
+ * codebook vector dimension number of vectors *
+ * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ *
+ * 1 2 64 *
+ * 2 3 64 *
+ * 3 3 64 *
+ * 4 4 32 *
+ * 5 4 32 *
+ *-------------------------------------------------------------------*/
+
+/*------------------------------------------------*
+ * 1st split: isf0 to isf1
+ *------------------------------------------------*/
+
+
+ static Word16 dico1_isf_noise[SIZE_BK_NOISE1*2] = {
+
+ -269, -673,
+ -222, -537,
+ -233, -430,
+ -138, -451,
+ -212, -331,
+ -192, -241,
+ -87, -231,
+ -191, -128,
+ -70, -106,
+ -164, -6,
+ 74, -179,
+ 27, -33,
+ -102, 74,
+ -162, 115,
+ -94, 172,
+ -6, 130,
+ -143, 234,
+ 14, 218,
+ -65, 270,
+ 88, 182,
+ -124, 341,
+ -44, 381,
+ 38, 335,
+ 117, 274,
+ -112, 454,
+ 74, 431,
+ -5, 488,
+ 175, 384,
+ -83, 561,
+ 122, 529,
+ 21, 601,
+ 229, 481,
+ 231, 303,
+ 226, 608,
+ 300, 372,
+ 210, 187,
+ 306, 265,
+ 328, 473,
+ 382, 331,
+ 371, 132,
+ 139, 58,
+ 365, 21,
+ 250, -82,
+ 443, 218,
+ 483, 110,
+ 426, 415,
+ 579, 222,
+ 518, 333,
+ 573, 448,
+ 455, 529,
+ 685, 329,
+ 332, 580,
+ 595, 593,
+ 468, 645,
+ 762, 517,
+ 326, 709,
+ 485, 793,
+ 130, 684,
+ 671, 737,
+ 354, 876,
+ 88, 806,
+ -65, 706,
+ -35, 1016,
+ 266, 1123};
+
+
+/*------------------------------------------------*
+ * 2nd split: isf2 to isf4
+ *------------------------------------------------*/
+
+ static Word16 dico2_isf_noise[SIZE_BK_NOISE2*3] = {
+
+ -824, -884, -949,
+ -805, -456, -418,
+ -442, -438, -541,
+ -217, -578, -793,
+ -168, -444, -582,
+ -287, -492, -274,
+ -552, -297, -300,
+ -163, -333, -358,
+ -370, -232, -232,
+ -175, -358, -159,
+ -381, -21, -357,
+ -184, -159, -162,
+ -53, -191, -280,
+ 18, -267, -215,
+ -138, 61, -283,
+ 71, -95, -294,
+ 13, -156, -546,
+ 0, -83, -79,
+ 44, 97, -316,
+ 178, -52, -213,
+ 222, -261, -422,
+ 237, -118, -44,
+ 141, 145, -132,
+ 363, 81, -287,
+ 213, 65, 34,
+ -107, 94, -5,
+ 91, -29, 126,
+ -355, 51, -41,
+ -219, -76, 145,
+ -63, 100, 244,
+ -719, 44, 27,
+ -572, -124, 155,
+ -423, 133, 315,
+ -917, 71, 224,
+ -268, 318, 131,
+ -93, -190, 420,
+ -97, 122, 491,
+ -79, 317, 355,
+ 130, 100, 325,
+ 86, -293, 210,
+ 133, 258, 161,
+ 176, -73, 465,
+ 195, 300, 384,
+ 348, 22, 221,
+ 376, 183, 409,
+ 377, 286, 202,
+ 242, 213, 659,
+ 257, 565, 248,
+ 344, 408, -76,
+ 405, 440, 509,
+ 612, 385, 379,
+ 536, 607, 216,
+ -56, 582, 192,
+ 100, 517, 567,
+ -365, 448, 445,
+ 728, 347, 10,
+ 505, 357, 759,
+ 636, 582, 658,
+ 335, 517, 852,
+ 378, 809, 572,
+ -195, 878, 829,
+ 529, 707, 987,
+ 918, 726, 392,
+ 1250, 997, 1063};
+
+/*------------------------------------------------*
+ * 3rd split: isf5 to isf7
+ *------------------------------------------------*/
+
+ static Word16 dico3_isf_noise[SIZE_BK_NOISE3*3] = {
+
+ -805, -838, -774,
+ -522, -627, -828,
+ -477, -486, -603,
+ -295, -481, -634,
+ -366, -384, -393,
+ -186, -414, -396,
+ -237, -394, -106,
+ -252, -202, -275,
+ -61, -177, -442,
+ -84, -198, -199,
+ -179, -125, -31,
+ -72, -47, -163,
+ -298, -220, 215,
+ -64, -168, 251,
+ -133, 156, -59,
+ -30, -2, 127,
+ 54, 66, -61,
+ -233, 21, 251,
+ 209, -50, 32,
+ 33, 194, 136,
+ -117, -18, 475,
+ 202, 46, 309,
+ 256, 185, 53,
+ 35, 200, 390,
+ 200, 263, 242,
+ -216, 302, 294,
+ 128, 358, 0,
+ 19, 431, 287,
+ 224, 447, 280,
+ 367, 165, 213,
+ 397, 314, 319,
+ 383, 379, 75,
+ 277, 325, 462,
+ 394, 505, 334,
+ 251, 98, -213,
+ 450, 153, 448,
+ 565, 226, 76,
+ 470, 383, 502,
+ 635, 390, 278,
+ 237, 135, 620,
+ 342, 401, 649,
+ 331, 551, 518,
+ 130, 418, 592,
+ 531, 306, 737,
+ 729, 389, 580,
+ 497, 557, 699,
+ 296, 383, 874,
+ 283, 624, 759,
+ 126, 622, 476,
+ 559, 595, 472,
+ 382, 770, 616,
+ 719, 613, 745,
+ 540, 639, 928,
+ 517, 826, 801,
+ 684, 811, 604,
+ 752, 786, 857,
+ 933, 661, 350,
+ 694, 450, 1061,
+ 562, 911, 1051,
+ 824, 813, 1104,
+ 758, 1047, 882,
+ 1140, 917, 889,
+ 1039, 1246, 1426,
+ 1483, 1666, 1876};
+
+/*------------------------------------------------*
+ * 4th split: isf8 to isf11
+ *------------------------------------------------*/
+
+ static Word16 dico4_isf_noise[SIZE_BK_NOISE4*4] = {
+
+ -776, -854, -891, -920,
+ -552, -610, -663, -741,
+ -321, -370, -476, -565,
+ 274, -160, -456, 201,
+ 265, 67, -160, -306,
+ -8, -210, 79, 272,
+ 163, 236, 307, 308,
+ 578, 317, 64, 298,
+ -9, 197, 342, 620,
+ 343, 232, 314, 622,
+ 173, 149, 548, 527,
+ 356, 370, 481, 376,
+ 135, 444, 488, 556,
+ 391, 471, 487, 653,
+ 228, 424, 576, 835,
+ 422, 372, 722, 682,
+ 295, 673, 693, 635,
+ 539, 596, 590, 449,
+ 475, 618, 659, 818,
+ 735, 517, 491, 673,
+ 602, 346, 257, 877,
+ 625, 635, 849, 720,
+ 727, 818, 698, 595,
+ 653, 481, 690, 1139,
+ 814, 762, 704, 908,
+ 507, 747, 898, 936,
+ 848, 855, 924, 785,
+ 646, 1037, 882, 795,
+ 772, 845, 1024, 1151,
+ 1133, 983, 818, 921,
+ 940, 1068, 1252, 1302,
+ 1588, 1767, 1718, 1513};
+
+/*------------------------------------------------*
+ * 5th split: isf12 to isf15
+ *------------------------------------------------*/
+
+ static Word16 dico5_isf_noise[SIZE_BK_NOISE5*4] = {
+ -810, -879, -945, -254,
+ 248, 184, 671, 128,
+ 288, 703, 918, 99,
+ 658, 558, 662, 219,
+ 552, 585, 910, 208,
+ 559, 804, 759, 119,
+ 606, 774, 921, -139,
+ 782, 761, 748, 208,
+ 756, 708, 983, 56,
+ 544, 864, 1010, 152,
+ 737, 698, 987, 299,
+ 771, 924, 879, 103,
+ 536, 785, 961, 405,
+ 667, 916, 801, 328,
+ 738, 705, 773, 439,
+ 823, 871, 992, 355,
+ 640, 1004, 1052, 369,
+ 724, 822, 949, 597,
+ 415, 655, 729, 482,
+ 1009, 896, 793, 363,
+ 908, 803, 687, -25,
+ 1016, 838, 1011, 189,
+ 947, 1112, 942, 222,
+ 914, 1049, 981, 527,
+ 956, 987, 1011, -120,
+ 781, 1049, 1121, 92,
+ 1178, 1053, 884, 47,
+ 1123, 1059, 1182, 118,
+ 933, 972, 1277, 357,
+ 1109, 918, 1101, 503,
+ 1039, 1286, 1220, 317,
+ 1351, 1207, 1010, 326};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab
new file mode 100644
index 0000000..4d869a4
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab
@@ -0,0 +1,1360 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ * qpisf_2s.h
+ *-------------------------------------------------------------------*
+ * Quantization tables for two-stage of ISFs (split by 2 in 1st stage)
+ * Version whith prediction MU = 0.25
+ *-------------------------------------------------------------------*/
+
+#define ORDER 16 /* order of linear prediction filter */
+#define ISF_GAP 128 /* 50 Hz */
+#define N_SURV 4
+
+#define SIZE_BK1 256
+#define SIZE_BK2 256
+#define SIZE_BK21 64
+#define SIZE_BK22 128
+#define SIZE_BK23 128
+#define SIZE_BK24 32
+#define SIZE_BK25 32
+
+#define SIZE_BK21_36b 128
+#define SIZE_BK22_36b 128
+#define SIZE_BK23_36b 64
+
+/* means of ISFs */
+static Word16 mean_isf[ORDER] = {
+
+ 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730,
+ 8750, 9753, 10705, 11728, 12833, 13971, 15043, 4037};
+
+/* 46 bits */
+/*-------------------------------------------------------------------*
+ * isf codebooks: two-stage VQ with split-by-5 in 2nd stage *
+ * *
+ * codebook vector dimension number of vectors *
+ * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ *
+ * 1_1 9 256 *
+ * 1_2 7 256 *
+ * 2_1 3 64 *
+ * 2_2 3 128 *
+ * 2_3 3 128 *
+ * 2_4 3 32 *
+ * 2_5 4 32 *
+ *-------------------------------------------------------------------*/
+
+/*------------------------------------------------*
+ * 1st stage codebook; 1st split: isf0 to isf8
+ *------------------------------------------------*/
+
+static Word16 dico1_isf[SIZE_BK1*9] = {
+
+ 579, 1081, 1035, 390, 3, -263, -198, -82, 38,
+ 18, -68, -12, 313, 761, 405, 249, 111, -76,
+ 740, 1263, 1292, 1006, 997, 1019, 1017, 976, 923,
+ -91, 827, 948, 648, 613, 535, 522, 490, 421,
+ 41, -44, -281, -472, 652, 534, 193, 135, -90,
+ 41, -121, -356, -60, 663, 307, 61, -48, -344,
+ 557, 946, 1049, 867, 846, 990, 1112, 1262, 1241,
+ -118, -204, 328, 512, 870, 793, 610, 402, 186,
+ 156, 293, 74, -338, -475, -897, -594, -161, -497,
+ 226, 131, -138, 307, 169, -271, -164, -387, -624,
+ 62, -32, -61, -252, -541, -828, -1027, -523, -662,
+ 102, -61, 141, 112, -270, -251, -541, 25, -150,
+ 6, -132, -356, -686, -96, -322, -522, -31, -326,
+ -36, -209, -521, -229, 307, -132, -5, -99, -384,
+ 60, -51, -237, -668, -973, -407, -708, -75, -172,
+ 26, -138, -266, 111, -302, 43, -278, -356, -359,
+ 570, 822, 496, -154, -312, -92, 137, 279, 371,
+ -146, 368, 409, 68, 6, 77, 167, 202, 162,
+ 633, 898, 996, 756, 662, 683, 783, 909, 996,
+ -103, 294, 607, 415, 483, 462, 480, 431, 408,
+ -120, -338, -612, -524, 584, 331, 92, 433, 276,
+ -178, -293, -154, -41, 269, 100, -9, 213, 160,
+ 830, 736, 278, 820, 1254, 686, 712, 1039, 473,
+ -218, -304, 463, 454, 397, 273, 202, 286, 273,
+ -232, 7, 6, -388, -472, -427, -378, -167, -100,
+ -294, -183, 134, -47, 101, -88, -84, -117, -3,
+ 57, 17, -202, -634, -989, -1119, -533, 176, -36,
+ 120, -28, 23, 111, -319, 318, -22, -77, 266,
+ -271, -464, -434, -658, -640, -385, -385, -99, -69,
+ -198, -259, -266, -44, -39, -139, -137, 171, 66,
+ 9, -145, -377, -846, -1000, -111, -325, 342, 135,
+ -81, -286, -380, 192, -57, 307, 76, -24, -140,
+ 677, 702, 247, 56, 249, 141, -105, -236, -99,
+ 36, -39, -69, 348, 198, -93, 322, 91, -72,
+ 503, 885, 1508, 1307, 1282, 1172, 1119, 1209, 1061,
+ 416, 719, 989, 1227, 1001, 1052, 954, 741, 1044,
+ -127, -376, -657, 139, 623, 223, 501, 306, 220,
+ -113, -384, -796, 504, 438, 85, 213, -83, -194,
+ 585, 1132, 1233, 1091, 1247, 1433, 1512, 1448, 1314,
+ -174, -422, 7, 1155, 1089, 1182, 1003, 945, 806,
+ 8, -126, -317, -103, -351, -695, -98, -268, -537,
+ 33, -103, -290, 167, -39, -407, 44, -208, -375,
+ 104, -23, -64, -291, -637, -851, -1084, -61, -112,
+ -75, -306, -434, 218, -148, -354, -680, -133, -216,
+ -121, -377, -718, -97, -130, -361, -156, -379, -599,
+ -56, -254, -586, 235, 157, -214, 11, -260, -149,
+ -124, -267, -397, -580, -593, -527, -805, -385, 346,
+ -193, -440, -708, -351, -141, -255, -499, -147, -185,
+ 448, 660, 494, 208, 509, 461, 338, 291, 149,
+ -223, 88, 335, 159, 212, 191, 286, 308, 205,
+ -31, 469, 803, 659, 619, 658, 843, 987, 1113,
+ -171, -242, 514, 362, 295, 524, 552, 694, 585,
+ -64, -308, -448, -21, 284, 786, 446, 289, 92,
+ -218, -390, -7, 169, 206, 330, 352, 408, 358,
+ -36, 702, 959, 859, 861, 1115, 1269, 1357, 1305,
+ -133, -341, -65, 678, 417, 440, 486, 518, 780,
+ 33, -44, -191, -344, -461, -755, -201, 217, -31,
+ -353, -547, -44, 123, -61, -68, -79, 29, 60,
+ 73, -57, -406, -766, -1243, -1203, 240, 400, 165,
+ -73, -282, -601, -213, -171, -375, 332, 35, -103,
+ -29, -207, -553, -476, -638, -908, 172, -22, -135,
+ -192, -239, -164, -103, -111, -47, 153, 125, 110,
+ -1, -203, -570, -1030, -1424, -535, 155, 1, 147,
+ -333, -653, -865, -197, -158, -21, -44, 95, 108,
+ 389, 588, 490, 33, -237, -524, -628, -136, -260,
+ 40, -177, -462, 453, 862, 380, 131, -130, -405,
+ 842, 1678, 1841, 1549, 1474, 1256, 1082, 905, 742,
+ 370, 1216, 1768, 1633, 1212, 636, 22, -330, 71,
+ -76, -281, -741, -742, 898, 619, 277, 71, -222,
+ -32, -265, -556, -25, 994, 682, 305, 126, -165,
+ 73, 738, 893, 968, 993, 1768, 2273, 1840, 1391,
+ -69, -349, -585, 234, 1158, 903, 626, 510, 251,
+ -1, -99, -272, -210, -603, -351, -540, -811, -383,
+ -16, -230, -504, 410, 149, -205, -343, -651, -639,
+ 103, -9, -227, -205, -562, -781, -1079, -1208, -156,
+ 143, 63, -135, -67, -317, -602, -784, -1154, -640,
+ -144, -391, -674, -622, -200, -254, -660, -947, -395,
+ -40, -250, -625, 27, 543, 94, -131, -386, -673,
+ -123, -371, -757, -451, -564, -614, -415, -711, -35,
+ -116, -309, -593, -268, 239, -33, -338, -650, -135,
+ 94, 251, 554, 57, -312, -423, -154, -57, 235,
+ -268, -71, 381, 114, -44, -87, 125, 173, 133,
+ 1513, 1714, 1238, 534, 276, 315, 461, 459, 508,
+ -131, -19, 1149, 670, 486, 356, 309, 369, 296,
+ -223, -501, -899, -722, -70, 6, 131, 310, 394,
+ -99, -303, -517, 249, 64, -53, 135, -11, 453,
+ -147, -399, -730, -401, 817, 738, 802, 749, 575,
+ -154, -435, -739, 800, 593, 366, 529, 318, 326,
+ -224, 45, -39, -387, -515, -518, -608, -384, -321,
+ -315, -377, 143, -101, -113, -377, -177, -144, -12,
+ 117, 40, -239, -651, -1051, -581, -737, -990, -328,
+ 26, -50, -157, -23, -453, -283, -531, -546, 192,
+ -252, -501, -743, -589, -627, -499, -328, -118, -72,
+ -324, -494, -244, -306, -144, -177, -262, -135, -78,
+ -36, -234, -519, -961, -1290, -314, -479, -371, -45,
+ -95, -292, -535, -8, -300, 112, -164, -277, 198,
+ -99, -128, 880, 836, 579, 351, 23, -95, -217,
+ -27, -258, 124, 1011, 597, 425, 144, 7, -73,
+ 421, 1293, 1640, 1623, 1742, 1617, 1499, 1284, 1006,
+ -95, 752, 1680, 1569, 1618, 1436, 1200, 980, 712,
+ -69, -300, -683, -435, 1132, 899, 504, 332, 109,
+ -74, -323, -637, 563, 1074, 608, 371, 105, -49,
+ -78, 831, 1194, 1110, 1378, 1481, 1492, 1365, 1217,
+ -259, -121, 1440, 1334, 1628, 1490, 1438, 1223, 933,
+ -82, -306, -613, -222, -378, -675, -545, -671, -845,
+ 53, -124, -347, 422, 52, -125, -270, -529, 9,
+ 79, -89, -320, -662, -999, -1199, -1243, -676, -297,
+ -68, -273, -611, 137, -146, -397, -627, -845, -220,
+ -112, -346, -797, -826, 234, -132, -188, -278, -522,
+ -159, -405, -734, -419, 293, 74, -167, -167, 184,
+ -153, -437, -833, -1080, -336, -472, -561, -340, -253,
+ -169, -423, -820, -904, -131, -19, -346, -604, 31,
+ 33, -31, 312, 62, -148, 49, -59, 564, 486,
+ -306, -333, 194, -44, 67, 72, 147, 205, 243,
+ -207, -49, 1360, 983, 969, 991, 1014, 1110, 973,
+ -211, -172, 883, 627, 711, 674, 705, 798, 746,
+ -88, -325, -763, -974, 687, 908, 514, 382, 172,
+ -292, -612, -805, 63, 131, 270, 259, 352, 348,
+ -235, -84, 955, 818, 1120, 1289, 1559, 1480, 1285,
+ -180, -461, -614, 657, 691, 745, 854, 783, 713,
+ -97, -309, -477, -614, -777, -734, -768, -526, -472,
+ -344, -476, -35, -169, 49, -77, -150, -240, -141,
+ -52, -268, -639, -919, -1278, -1113, -342, -333, -151,
+ -68, -242, -585, -73, -209, -478, -159, -429, 133,
+ -197, -499, -1005, -1268, -272, -224, -105, -67, 17,
+ -363, -618, -414, -116, -62, 20, 10, 116, 108,
+ -195, -475, -906, -1260, -891, -441, -277, -142, -28,
+ -226, -519, -950, -700, -275, -266, -116, -105, 82,
+ 404, 511, 520, 327, 17, -194, -333, -536, -586,
+ -114, -130, 276, 237, 204, 342, 135, -16, -111,
+ 670, 1208, 1168, 860, 742, 601, 528, 403, 309,
+ 397, 621, 966, 752, 579, 398, 400, 329, 252,
+ 191, 180, -137, -467, 272, 106, -95, 17, -192,
+ -80, -290, -626, 194, 598, 196, 21, -281, 77,
+ 510, 864, 1108, 807, 939, 902, 925, 717, 481,
+ 137, 367, 534, 764, 670, 382, 296, 153, 84,
+ 303, 497, 144, -85, -125, -539, -482, -464, -764,
+ 233, 347, 68, -147, 169, -210, -242, -226, -482,
+ 307, 422, 154, -175, -386, -722, -724, -904, -1015,
+ 309, 308, 160, -60, -470, -420, -598, -791, -219,
+ 68, 121, -137, -560, -146, -446, -515, -494, -729,
+ 130, 53, -227, 46, 474, 32, -161, -192, -490,
+ 213, 164, -71, -465, -876, -161, -456, -587, -48,
+ 218, 117, 39, 177, -194, -88, -226, -418, 50,
+ 210, 547, 569, 279, 121, -44, -50, 10, -84,
+ 58, 140, 182, -5, 267, 117, 106, 211, 198,
+ 539, 835, 913, 719, 617, 544, 591, 565, 642,
+ 153, 559, 872, 460, 222, 108, 188, 180, 183,
+ 158, 119, 284, -153, -271, 229, 87, 110, -57,
+ -183, 82, 118, 21, 13, 40, 118, 191, 185,
+ 162, 889, 654, 108, -34, 244, 488, 561, 532,
+ 163, 56, 609, 341, 50, 329, 68, 266, 218,
+ 100, 206, 18, -304, -107, -436, -487, -65, -306,
+ -86, 154, 134, -30, -45, -73, -104, -80, -96,
+ 245, 330, 10, -440, -849, -1082, 79, 40, -265,
+ 196, 372, 272, -181, -493, -389, 275, 80, -59,
+ 2, -12, -246, -505, -100, -436, 21, -187, -431,
+ -221, -48, 36, -271, -186, -147, -109, 26, 71,
+ 213, 140, 72, -351, -620, -84, -363, 69, 46,
+ 91, 167, -3, -95, -99, -105, -48, 114, 147,
+ 259, 249, 172, 607, 406, 52, 59, -189, -320,
+ 115, -85, -54, 574, 128, 226, -59, -253, 130,
+ -62, 1033, 1308, 1035, 1127, 1098, 1029, 961, 823,
+ 39, 364, 757, 940, 728, 660, 659, 583, 770,
+ -115, -338, -760, -471, 394, 37, 441, 178, 6,
+ -57, -305, -525, 796, 453, 188, -4, -114, 248,
+ 71, 444, 797, 731, 1096, 1157, 1222, 1029, 811,
+ 135, 359, 551, 425, 749, 815, 874, 704, 502,
+ 132, 247, 0, -206, -449, -750, -258, -514, -633,
+ 248, 249, 91, 121, -195, -499, -90, -282, -435,
+ 78, 20, -277, -623, -983, -1224, -415, -458, -639,
+ 347, 509, 208, -179, -464, -728, -76, -237, -486,
+ -103, -343, -756, -713, -265, -609, -191, -398, -636,
+ -121, -383, -749, 567, 252, -36, -354, -417, -50,
+ 204, 100, -149, -650, -1081, -47, -7, -263, 111,
+ -46, -180, -267, -324, -562, -394, -692, 398, 292,
+ 482, 670, 683, 624, 442, 165, 116, 36, -149,
+ 108, 247, 291, 247, 355, 122, 109, 224, 296,
+ -14, 945, 990, 801, 755, 815, 847, 913, 892,
+ 292, 349, 725, 482, 388, 329, 429, 620, 667,
+ -34, 197, 213, -127, 84, 494, 620, 575, 375,
+ 126, 207, 172, 167, 362, 202, 296, 395, 455,
+ -6, 250, 539, 467, 636, 801, 1149, 1287, 1118,
+ 27, 240, 369, 280, 440, 411, 634, 892, 953,
+ 159, 170, -58, -395, -797, -690, 77, -211, -334,
+ -5, -28, -13, -74, -335, -603, 300, 88, -205,
+ 82, -33, -364, -698, -1203, -1153, 110, -146, -289,
+ 113, 1, -243, -588, -994, -496, 414, 160, 42,
+ -56, -247, -440, -693, -996, -479, 11, -178, -357,
+ -151, -353, -327, -211, -340, 141, 65, 425, 453,
+ 34, -169, -455, -932, -1215, 138, 499, 256, 324,
+ 68, 139, -15, -547, -478, 17, 306, 502, 481,
+ -32, -134, 445, 129, -143, -244, -503, -507, -599,
+ 61, -140, -345, 496, 458, -2, 20, -227, -514,
+ 394, 1765, 1666, 1339, 1117, 806, 642, 479, 380,
+ 215, 519, 920, 1053, 1090, 791, 528, 290, 155,
+ -54, -233, -647, -602, 639, 294, -2, -167, -442,
+ -78, -315, -791, -113, 820, 403, 158, -116, -356,
+ 529, 1851, 2003, 1228, 622, -41, -416, 344, 819,
+ -105, -379, -236, 1224, 893, 749, 568, 356, 214,
+ -17, -199, -144, 50, -283, -247, -578, -846, -1087,
+ 69, -11, -381, -206, 209, -284, -387, -416, -716,
+ 39, -5, -145, -374, -682, -909, -1074, -1169, -1066,
+ 287, 226, 67, -221, -662, -171, -421, -642, -707,
+ -132, -348, -538, -448, -20, -4, -354, -748, -933,
+ 4, -75, -289, -598, 317, 52, -208, -297, -559,
+ -88, -264, -358, -589, -631, -248, -523, -822, -1071,
+ 70, -8, 54, -314, -515, 92, -146, -274, -493,
+ 199, 62, 391, 158, -141, 71, -219, -203, -207,
+ 152, 40, 329, 162, -29, 48, -149, 108, 127,
+ 635, 1058, 883, 492, 372, 312, 317, 274, 241,
+ 267, 722, 1256, 882, 625, 248, 8, -81, -60,
+ -58, -138, -291, -600, -12, -2, -39, 147, 117,
+ -107, -345, -513, 459, 76, 92, -272, 388, 262,
+ 362, 516, 203, -409, -716, -831, -331, 185, 209,
+ -117, -391, -298, 671, 292, 538, 257, 166, -38,
+ -102, -319, -194, -283, -573, -262, -579, -219, -444,
+ -235, 78, 11, -168, -101, -229, -263, -321, -123,
+ 70, 50, -170, -599, -996, -588, -263, -516, -455,
+ 394, 363, 229, -136, -538, 21, -183, -348, -201,
+ -124, -368, -640, -879, -847, -209, -409, -494, -515,
+ -127, -341, -541, -425, -510, -10, -252, -473, -291,
+ 84, -69, -201, -676, -868, 103, -311, -132, -320,
+ 5, -173, -188, -297, -628, 197, -57, 7, -11,
+ 49, -160, 56, 558, 111, 33, -311, -440, -463,
+ -1, -246, -307, 862, 453, 139, -170, -355, -232,
+ 279, 966, 1642, 1478, 1463, 1123, 795, 525, 339,
+ -197, -38, 1702, 1331, 1252, 950, 692, 504, 426,
+ -108, -344, -861, -1172, 444, 354, 88, -46, -220,
+ -53, -321, -494, 1113, 744, 364, 198, -34, -75,
+ 457, 955, 1177, 1214, 1427, 1457, 1345, 917, 539,
+ -69, 199, 897, 1140, 1343, 1183, 977, 742, 522,
+ 122, 44, -269, 27, -155, -562, -307, -590, -773,
+ 154, 42, -160, 252, -129, -305, -471, -733, -371,
+ 135, 185, -82, -416, -722, -913, -504, -743, -880,
+ 149, 214, -84, -329, -680, -835, -426, -661, -81,
+ -128, -380, -735, -998, -337, 17, -182, -467, -697,
+ -84, -290, -510, -592, 13, 440, 154, -38, -279,
+ 70, -61, -246, -727, -1047, -80, -381, -535, -704,
+ 178, -2, -146, -670, -938, 482, 138, 63, 65,
+ -11, 15, 772, 443, 142, -20, -209, -126, -161,
+ -32, -249, 95, 552, 124, 30, -343, 82, -86,
+ 148, 751, 1515, 1105, 867, 606, 474, 448, 399,
+ -163, -257, 899, 1097, 906, 751, 502, 390, 294,
+ -51, -258, -447, -806, -368, 763, 464, 364, 183,
+ -166, -374, -367, 87, 35, 399, 418, 856, 833,
+ -205, -310, 588, 778, 785, 1065, 1118, 1245, 1157,
+ -173, -312, 107, 345, 400, 790, 870, 1113, 1001,
+ -7, -120, -387, -410, -614, -943, -226, -384, -491,
+ -203, -288, -51, -331, -90, -178, -408, -573, -338,
+ 56, -29, -273, -627, -1041, -798, -247, -467, 148,
+ 66, -2, -205, -205, -575, -349, -57, -352, -58,
+ -45, -225, -471, -924, -497, 77, -32, 44, -135,
+ -277, -491, -497, -502, -424, -202, -137, 77, 96,
+ 26, -179, -469, -1008, -1260, 262, -35, -132, -259,
+ -66, -232, -447, -533, -789, -191, -100, -267, 364};
+
+/*------------------------------------------------*
+ * 1st stage codebook; 2nd split: isf9 to isf15
+ *------------------------------------------------*/
+
+static Word16 dico2_isf[SIZE_BK2*7] = {
+
+ 1357, 1313, 1136, 784, 438, 181, 145,
+ 636, 648, 667, 568, 442, 217, 362,
+ 427, 440, 674, 524, 332, 117, -417,
+ 121, 295, 468, 465, 230, 44, -221,
+ -147, -240, 149, 80, 390, 278, 106,
+ -418, -556, 552, 511, 235, 144, -95,
+ 43, 193, 274, 150, 67, 34, -273,
+ -43, -126, 171, 416, 282, 63, -354,
+ -372, -86, -344, -108, -94, -182, -89,
+ -600, -840, -200, 465, 258, -11, -253,
+ -48, 329, 97, -290, -543, -795, -354,
+ -570, -117, 187, 10, -133, -416, -76,
+ -618, -129, -247, -371, 45, -76, 277,
+ -1022, -1079, 126, 474, 254, 127, 52,
+ -281, 76, -167, -361, -283, -551, -283,
+ -119, -52, -1, 134, -32, -204, -415,
+ 1064, 827, 637, 684, 464, 209, 12,
+ 482, 416, 449, 371, 335, 294, 194,
+ 719, 576, 365, 135, 113, 91, -199,
+ 298, 176, 493, 366, 194, 163, 36,
+ -35, -236, -259, -36, -4, 99, 152,
+ -98, -306, -27, 228, 90, 111, -86,
+ 91, 13, -211, -258, -106, 86, -64,
+ 73, -35, -57, -31, 162, 35, -192,
+ -109, -335, -629, -66, -61, -128, 322,
+ -495, -669, -728, 193, 31, -220, 122,
+ 324, 95, -89, -91, -409, -710, -154,
+ 0, -234, 92, 33, -343, -609, -220,
+ -343, -408, -476, -655, -153, 82, 222,
+ -490, -745, -255, 49, -48, 135, -127,
+ 119, -67, -328, -390, -272, -545, -56,
+ -57, -130, -10, -7, -164, -47, -22,
+ 984, 1064, 961, 568, 210, -27, 16,
+ 811, 691, 754, 514, 224, -35, 166,
+ 662, 704, 618, 386, 57, -211, -257,
+ 510, 359, 418, 393, 91, -144, -18,
+ -193, -31, -27, 223, 89, -143, 24,
+ -112, -98, 471, 319, 185, 3, 175,
+ 252, 146, -47, 272, 48, -211, -234,
+ 146, 69, 203, 364, 68, -52, 51,
+ -259, -478, -697, -349, -758, -501, 63,
+ -501, -769, -289, 79, -311, -497, -106,
+ 251, 53, -235, -469, -895, -884, 145,
+ -416, -551, 140, -133, -523, -775, 44,
+ -326, -423, -713, -497, -86, -431, 99,
+ -757, -772, -160, -76, -46, -32, 379,
+ 85, -35, -200, -401, -663, -1040, -247,
+ -180, -330, -92, -376, 27, -183, -110,
+ 1279, 1086, 781, 502, 324, 164, 157,
+ 682, 466, 449, 277, 146, 28, 409,
+ 635, 472, 390, 107, -232, -538, -139,
+ 196, 396, 332, 213, 209, -29, -81,
+ 150, -95, -312, 76, -77, -320, -50,
+ 46, 9, 47, 175, 139, 30, 384,
+ 218, 206, -24, -250, -96, -276, -183,
+ 26, 119, 38, 14, -4, -133, -52,
+ -477, -614, -987, -715, -631, -813, 200,
+ -744, -1009, -1065, -745, -631, -171, 18,
+ -137, -251, -483, -613, -980, -1203, 12,
+ -605, -767, -562, -686, -1088, -515, 58,
+ -202, -428, -782, -1072, -96, -234, -179,
+ -480, -709, -1070, -897, -131, -92, 321,
+ -145, -193, -512, -729, -572, -765, -210,
+ -331, -585, -525, -631, -281, -208, -303,
+ 1165, 1104, 939, 828, 716, 426, 155,
+ 6, -109, 820, 778, 415, 113, -27,
+ 381, 339, 314, 265, 121, -9, -474,
+ -373, 47, 584, 442, 99, -231, -113,
+ -496, -38, -285, 262, 305, 170, 4,
+ -587, -556, 69, 66, 471, 354, 13,
+ -138, 70, -18, 106, 67, 167, -302,
+ -445, -141, 185, 191, 151, 83, -133,
+ -257, -521, -720, -198, 134, -46, -182,
+ -819, -1168, -777, 512, 359, 95, -113,
+ 137, -2, -74, -138, -401, -114, -371,
+ -242, -466, 204, 223, -31, -212, -192,
+ -532, -637, -466, -686, 256, 277, -139,
+ -1141, -1244, -381, -75, -54, 14, 88,
+ -311, 115, -143, -499, -343, 124, -416,
+ -616, -147, -135, 43, -4, 121, -369,
+ 835, 783, 641, 390, 355, 350, 64,
+ 72, 194, 443, 467, 436, 219, 372,
+ 464, 369, 192, 4, -156, -72, -226,
+ 57, 206, 303, 205, 188, 101, 265,
+ -40, -205, -488, -184, 276, 64, -26,
+ -217, -433, -297, 137, 328, 308, -289,
+ 378, 81, -308, -465, 57, -37, 227,
+ -100, 24, -36, -151, 199, 8, 143,
+ -426, -697, -1059, -133, 388, 161, 321,
+ -644, -1023, -1271, 39, 66, -123, 70,
+ 372, 177, -173, -556, -553, -304, -189,
+ -117, -369, -425, -122, -462, -152, -73,
+ -649, -850, -1189, -767, 497, 360, 222,
+ -798, -1139, -1455, -190, 430, 234, 179,
+ 42, -94, -405, -692, 38, -202, -246,
+ -169, -366, -290, -88, -64, 32, -292,
+ 1010, 923, 938, 710, 465, 230, 342,
+ 217, 300, 1054, 675, 68, -458, -179,
+ 78, 453, 316, 18, -237, -496, -243,
+ 167, 21, 424, 215, -91, -303, -170,
+ -290, -81, -70, -67, 40, 54, -59,
+ -353, -427, -90, 53, 94, 9, 54,
+ -28, 318, 283, 15, -240, -58, 79,
+ -75, -121, 229, 35, 58, 6, -133,
+ -351, -514, -744, -834, -705, -137, 164,
+ -1124, -1388, -1055, -230, -73, 40, 36,
+ -163, -233, -532, -785, -1170, -697, 96,
+ -788, -959, -246, -430, -624, -165, -8,
+ -856, -540, -630, -907, -337, -70, 76,
+ -937, -1042, -659, -733, -208, 199, -26,
+ -523, 78, -98, -501, -869, -890, -81,
+ -624, -703, -45, -348, -25, 87, -186,
+ 1005, 823, 546, 249, 90, -22, 207,
+ 298, 397, 381, 319, 200, 62, 303,
+ 473, 379, 133, -247, -632, -441, 75,
+ 284, 208, 391, 115, -25, 44, 95,
+ -72, 79, -95, -63, -129, -293, 203,
+ -164, -349, 115, 122, 69, -1, 378,
+ 348, 170, 99, 58, -179, -302, 188,
+ -190, -2, 150, 23, -51, -11, 216,
+ -615, -863, -1090, -1427, -802, -48, -6,
+ -961, -1276, -1548, -727, -58, 56, 223,
+ -124, -255, -561, -988, -1277, -148, -82,
+ -480, -660, -891, -1191, -1339, -325, 20,
+ -621, -917, -1296, -1350, 264, 289, 50,
+ -844, -1022, -1345, -1329, -293, 46, 278,
+ -260, -468, -829, -1176, -533, -560, -78,
+ -215, -484, -822, -1233, -791, 15, -138,
+ 1301, 1317, 1262, 1048, 716, 357, -64,
+ 578, 824, 925, 802, 630, 362, 102,
+ 470, 925, 767, 514, 327, 190, -112,
+ 225, 492, 495, 437, 598, 384, -45,
+ 43, 82, -42, 175, 519, 342, -64,
+ -304, -154, 159, 576, 403, 221, 327,
+ 214, 244, 122, -62, 312, 92, -160,
+ 218, 208, 310, 268, 306, 323, -199,
+ -285, -269, -79, -124, -143, -153, 236,
+ -205, -384, -426, 344, 59, -185, -184,
+ -272, 247, 126, -210, -518, -468, 78,
+ -99, -120, 502, 160, -280, -557, 304,
+ -423, -17, -283, -443, 215, 212, -140,
+ -564, -684, -228, 510, 361, 130, 323,
+ -428, 335, 98, -65, 36, -215, -246,
+ -362, 51, 364, -16, -234, 150, -165,
+ 914, 883, 751, 653, 676, 464, -153,
+ 631, 545, 535, 720, 596, 360, -81,
+ 783, 712, 512, 439, 341, 251, -391,
+ 497, 417, 249, 372, 295, 173, -193,
+ 128, -110, -385, 93, 39, 173, -231,
+ 216, -59, -253, 462, 389, 154, 69,
+ 455, 270, -4, -337, -49, 233, -322,
+ 307, 143, 53, 218, 128, 236, -156,
+ -37, -186, -240, -411, -110, 9, 399,
+ -140, -365, -628, 258, 380, 214, 277,
+ 131, 454, 177, -285, -520, 108, -214,
+ 77, -141, 201, -123, -490, -131, 60,
+ -14, -194, -521, -741, 273, 362, -33,
+ -362, -566, -287, -228, 161, 237, 317,
+ -269, 195, -75, -375, -204, 11, 77,
+ -128, -264, -156, -223, -475, 265, 27,
+ 1238, 1147, 916, 689, 432, 210, -280,
+ 800, 664, 879, 726, 411, 160, -164,
+ 454, 686, 536, 275, 147, 46, 111,
+ 303, 486, 512, 355, 241, 181, -69,
+ 79, 92, 29, 147, 233, 52, 17,
+ -171, 289, 131, 439, 271, 3, -10,
+ 413, 241, 144, 174, 155, -2, 14,
+ 58, 217, 247, 219, 149, 175, -18,
+ 228, -8, -240, -206, -513, -191, 202,
+ -96, -272, -454, 33, -300, -575, 46,
+ -10, -108, -246, -347, -770, -535, 9,
+ -326, -430, -61, -321, -704, -299, 201,
+ -1, -280, -603, -419, -185, 18, -36,
+ -516, -522, -379, -291, -181, -97, 27,
+ -159, -313, -525, -224, -510, -831, -197,
+ -292, -459, -59, -310, -562, -143, -351,
+ 1066, 912, 631, 389, 207, 86, -224,
+ 596, 512, 596, 505, 314, 122, -48,
+ 787, 861, 441, -93, -303, 33, -190,
+ 257, 469, 337, 51, 15, 298, -93,
+ 295, 73, -119, 25, 36, 23, 108,
+ -28, -3, -32, 114, 21, 185, 107,
+ 482, 305, 15, -279, -319, 52, 96,
+ 226, 46, 115, 72, -136, 133, -125,
+ 18, -207, -559, -590, -503, -482, 321,
+ -571, -789, -951, -172, -441, -538, 113,
+ 181, 14, -310, -641, -1001, -202, 159,
+ -136, -393, -433, -513, -911, -144, -22,
+ 72, -265, -706, -954, -159, 53, 332,
+ -338, -591, -852, -383, -395, 56, 44,
+ 43, -158, -464, -897, -631, -157, -294,
+ -161, -128, -328, -573, -483, -125, 11,
+ 1017, 906, 1051, 1005, 679, 341, -102,
+ 359, 334, 1567, 1314, 723, 105, 10,
+ -65, 726, 529, 301, 220, 43, -273,
+ -510, 436, 719, 566, 358, 179, 114,
+ -560, 298, 133, -120, 342, 225, 14,
+ -899, -101, 217, 617, 400, 146, -58,
+ -41, 352, 82, -196, 39, 121, -167,
+ -212, 59, 447, 284, 423, 250, -169,
+ -371, -484, -596, 30, -41, 249, 22,
+ -372, -650, -794, 477, 445, 216, -79,
+ -352, 275, 17, -443, -929, 92, 19,
+ -699, -696, 431, 264, -49, -310, 182,
+ -978, -217, -430, -400, 101, 261, 72,
+ -929, -889, -357, -13, 463, 378, 236,
+ -826, 56, 30, -299, -360, -128, -51,
+ -878, -299, -111, 75, 65, 36, 3,
+ 817, 368, -25, 354, 697, 591, -173,
+ 309, 212, 222, 751, 484, 140, -56,
+ 593, 379, 70, -8, 258, 180, 110,
+ 165, -46, 255, 297, 219, 273, 105,
+ 160, -70, -358, -181, 379, 330, 319,
+ -238, -369, -198, 740, 580, 319, -143,
+ 201, 109, -202, -456, 328, 276, -141,
+ 203, 170, 111, 42, 207, 360, 188,
+ -345, -399, -513, -233, 650, 422, 81,
+ -635, -961, -1220, 463, 539, 204, 209,
+ 202, -25, -194, -498, -787, 193, -143,
+ -449, -538, 195, -106, -331, 68, 62,
+ -228, -477, -840, -576, 317, 128, 283,
+ -671, -937, -807, -114, 391, 335, -62,
+ 246, 2, -314, -679, -303, 180, -88,
+ -107, -272, 90, -198, -28, 290, -112,
+ 885, 1149, 1021, 712, 496, 281, -83,
+ 269, 492, 787, 643, 347, 70, 124,
+ 336, 636, 499, 92, -229, -179, 191,
+ 26, 402, 564, 340, 149, -11, 135,
+ -440, 561, 470, 204, -72, -186, 140,
+ -720, 14, 355, 229, 68, -133, 465,
+ 110, 310, 103, 12, 106, 29, 158,
+ -178, 113, 161, 142, 121, 115, 27,
+ -651, -414, -645, -152, -164, -13, -429,
+ -639, -944, -681, -104, -81, 52, -189,
+ -663, -164, -316, -683, -954, -205, -83,
+ -609, -669, -172, -517, -694, 283, -80,
+ -646, -152, -383, -678, -246, -40, -143,
+ -747, -796, -745, -390, -98, 43, 275,
+ -599, -199, -398, -433, -436, -538, 31,
+ -1107, -568, -376, -265, -126, -21, 1,
+ 847, 573, 308, 392, 305, 101, 55,
+ 273, 293, 201, 267, 346, 201, 123,
+ 727, 480, 226, 2, -65, -138, 164,
+ 273, 208, 173, 292, 12, 253, 174,
+ 340, 207, 180, 88, 116, 46, 475,
+ -460, -166, -30, 13, 110, 173, 396,
+ 137, 88, 43, -137, -94, 34, 284,
+ 96, -14, 226, 40, 63, 70, 130,
+ -467, -735, -1012, -1174, -307, 305, -67,
+ -612, -920, -1146, -567, -8, 92, -25,
+ -182, -271, -492, -754, -857, 287, -75,
+ -494, -787, -689, -683, -709, 137, -326,
+ -288, -550, -903, -1105, 334, 321, -62,
+ -354, -653, -834, -445, 1, 377, -152,
+ -162, -306, -608, -937, -297, 247, -192,
+ -234, -477, -244, -488, -266, 342, -332};
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 1st split: isf2_0 to isf2_2
+ *---------------------------------------------------*/
+
+
+static Word16 dico21_isf[SIZE_BK21*3] = {
+
+ 329, 409, 249,
+ -33, 505, 160,
+ -29, -14, 582,
+ -262, 127, 354,
+ 145, 237, 175,
+ -152, 245, 122,
+ 27, 42, 340,
+ -84, -93, 311,
+ 285, 222, -156,
+ 47, -43, -504,
+ 234, 121, 385,
+ 104, -317, 45,
+ 176, 195, 8,
+ 104, -59, -94,
+ 177, 53, 192,
+ -34, -127, 152,
+ 570, 277, -34,
+ -67, -329, -639,
+ -157, -272, 462,
+ -177, -462, 198,
+ 322, 179, 115,
+ -386, 171, 19,
+ 19, -12, 195,
+ -120, -252, 201,
+ 304, 36, -336,
+ -128, -221, -380,
+ 171, -185, 296,
+ -242, -312, 23,
+ 198, 39, 16,
+ -3, -177, -111,
+ 111, -93, 76,
+ -92, -223, 4,
+ 177, 406, -44,
+ -168, 380, -149,
+ -4, 273, 331,
+ -420, 513, 277,
+ 21, 247, 47,
+ -58, 131, -2,
+ -3, 134, 180,
+ -145, 40, 175,
+ 189, 74, -145,
+ -27, -45, -325,
+ 370, -114, -21,
+ -83, -415, -173,
+ 77, 95, -51,
+ -40, -30, -67,
+ 71, 88, 86,
+ -35, -98, 14,
+ 69, 197, -334,
+ -196, 79, -231,
+ -348, -137, 218,
+ -352, -89, -85,
+ 47, 201, -130,
+ -165, 37, -15,
+ -43, 3, 86,
+ -161, -108, 79,
+ 83, 21, -237,
+ -81, -149, -238,
+ 150, -186, -251,
+ -186, -249, -162,
+ -19, 66, -139,
+ -26, -50, -181,
+ 24, 11, 0,
+ -130, -105, -98};
+
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 2nd split: isf2_3 to isf2_5
+ *---------------------------------------------------*/
+
+
+static Word16 dico22_isf[SIZE_BK22*3] = {
+
+ -127, 310, 42,
+ -242, 197, 5,
+ -151, 84, -17,
+ -214, 127, -149,
+ -247, -131, 159,
+ -268, -267, -95,
+ -217, 1, -79,
+ -271, -80, -185,
+ -45, 436, 159,
+ 165, 199, 391,
+ -33, 81, 187,
+ -66, -42, 355,
+ -298, -57, 343,
+ -108, -537, 226,
+ -144, -23, 193,
+ 176, -402, 87,
+ 53, 296, 25,
+ -84, 253, -104,
+ -58, 105, -126,
+ -169, 174, -314,
+ -48, 44, -294,
+ -164, -417, -242,
+ -139, 3, -194,
+ -155, -207, -211,
+ 119, 322, 213,
+ 333, 50, 380,
+ 237, 247, -2,
+ 466, -16, 201,
+ 238, -255, -107,
+ 67, -440, -149,
+ 122, -88, -139,
+ 88, -247, -73,
+ -41, 231, 167,
+ -62, 155, 16,
+ -65, 16, 77,
+ -68, -2, -63,
+ -151, -300, 160,
+ -18, -333, 54,
+ -56, -94, 5,
+ 2, -190, 14,
+ 92, 148, 209,
+ 108, 9, 272,
+ 108, 35, 110,
+ 142, -85, 145,
+ 47, -157, 279,
+ 3, -320, 246,
+ 43, -72, 68,
+ 86, -217, 135,
+ 36, 140, 79,
+ 56, 175, -49,
+ 26, 45, 3,
+ 73, 55, -101,
+ 109, -183, -242,
+ -4, -283, -242,
+ 48, -68, -48,
+ -6, -153, -122,
+ 161, 196, 96,
+ 232, 80, 190,
+ 165, 97, 11,
+ 258, -31, 71,
+ 267, -77, -91,
+ 311, -209, 87,
+ 152, -14, -22,
+ 150, -149, 9,
+ -324, 557, 187,
+ -384, 307, 46,
+ -251, 27, 77,
+ -365, 77, -52,
+ -482, -84, 160,
+ -424, -515, -64,
+ -294, -120, -4,
+ -476, -116, -109,
+ -97, 318, 365,
+ 106, 627, 445,
+ -190, 120, 287,
+ -146, 65, 619,
+ -427, 242, 363,
+ -361, -371, 432,
+ -347, 102, 168,
+ -629, 195, -14,
+ -65, 476, -47,
+ -297, 320, -168,
+ -55, 356, -264,
+ -391, 82, -286,
+ -51, -31, -556,
+ -178, -399, -586,
+ -205, -49, -360,
+ -343, -238, -337,
+ 220, 457, 58,
+ 561, 467, 259,
+ 340, 270, -168,
+ 450, 77, -280,
+ 60, 167, -413,
+ 133, -252, -492,
+ 216, 157, -290,
+ 282, 0, -495,
+ -226, 293, 183,
+ -157, 135, 122,
+ -158, -59, 39,
+ -133, -118, -97,
+ -332, -309, 113,
+ -160, -425, -6,
+ -149, -211, 24,
+ -80, -277, -90,
+ -11, 125, 338,
+ 130, -71, 465,
+ 5, -45, 184,
+ 237, -95, 253,
+ -139, -197, 297,
+ -19, -300, 511,
+ -63, -152, 139,
+ 250, -289, 336,
+ 124, 339, -150,
+ 34, 176, -208,
+ 171, 166, -116,
+ 94, 38, -229,
+ 75, -65, -339,
+ -78, -205, -385,
+ 0, -30, -163,
+ -56, -110, -242,
+ 321, 244, 194,
+ 505, 238, -1,
+ 317, 116, 65,
+ 309, 88, -74,
+ 452, -51, -50,
+ 334, -217, -290,
+ 211, 41, -152,
+ 238, -55, -260};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 3rd split: isf2_6 to isf2_8
+ *---------------------------------------------------*/
+
+
+static Word16 dico23_isf[SIZE_BK23*3] = {
+
+ -10, 151, 359,
+ 136, 298, 223,
+ 255, -104, 290,
+ 423, 6, 183,
+ -270, -269, -98,
+ -52, -82, 13,
+ -82, -274, -97,
+ 90, -246, -72,
+ -299, -70, 421,
+ -88, 365, 430,
+ 187, -318, 381,
+ 380, 37, 488,
+ -373, -316, 79,
+ -308, -101, 5,
+ -135, -451, 8,
+ 72, -421, -154,
+ 180, 170, -121,
+ 62, 177, -40,
+ 326, 80, -105,
+ 248, 263, -5,
+ -168, -181, -221,
+ -2, -23, -158,
+ -14, -149, -121,
+ 119, -91, -147,
+ 119, 332, -153,
+ 49, 303, 34,
+ 442, -55, -69,
+ 217, 454, 58,
+ -359, -187, -375,
+ -42, 50, -274,
+ -8, -267, -249,
+ 85, -86, -346,
+ -77, -40, 345,
+ 89, 134, 219,
+ 156, -80, 160,
+ 108, 40, 116,
+ -158, -206, 29,
+ 5, -32, 175,
+ -65, -158, 146,
+ 55, -78, 73,
+ -114, -222, 353,
+ -47, 81, 211,
+ 49, -151, 268,
+ 105, 4, 302,
+ -263, -132, 183,
+ -151, -28, 201,
+ -177, -307, 166,
+ 101, -221, 130,
+ 74, 58, -98,
+ 32, 44, 13,
+ 194, 30, -142,
+ 170, 96, 8,
+ -136, -119, -91,
+ -65, 8, -55,
+ 3, -188, 12,
+ 45, -63, -49,
+ 149, -21, -19,
+ 24, 144, 95,
+ 254, -22, 60,
+ 161, 196, 96,
+ -158, -61, 48,
+ -70, 33, 82,
+ -23, -321, 58,
+ 155, -147, 5,
+ -364, 328, 77,
+ -21, 453, 173,
+ -108, 82, 630,
+ 367, 263, 208,
+ -300, -62, -176,
+ -205, 143, -158,
+ -169, -410, -264,
+ 257, -269, -100,
+ -636, 289, -2,
+ -292, 627, 173,
+ -382, -363, 387,
+ 248, 524, 447,
+ -521, -111, -107,
+ -395, 118, -274,
+ -343, -680, -125,
+ -172, -447, -663,
+ 75, 148, -367,
+ -79, 263, -94,
+ 249, 148, -286,
+ 380, 271, -162,
+ -142, -4, -186,
+ -57, 111, -125,
+ -35, -108, -254,
+ 100, 29, -242,
+ -80, 303, -264,
+ -78, 464, -57,
+ 248, -22, -494,
+ 661, 662, 44,
+ -193, -40, -330,
+ -178, 145, -337,
+ -90, -199, -400,
+ -40, -23, -498,
+ -192, 114, 315,
+ -41, 244, 190,
+ 88, -97, 485,
+ 241, 80, 212,
+ -246, 40, 87,
+ -156, 147, 134,
+ -2, -334, 239,
+ 308, -203, 110,
+ -459, 251, 422,
+ -218, 310, 228,
+ -86, -346, 654,
+ 184, 175, 425,
+ -481, -63, 169,
+ -349, 117, 188,
+ -125, -560, 310,
+ 158, -416, 94,
+ 46, 171, -192,
+ -63, 157, 14,
+ 256, -35, -271,
+ 322, 123, 53,
+ -214, 4, -76,
+ -156, 86, -18,
+ 128, -197, -232,
+ 265, -90, -98,
+ -308, 332, -145,
+ -131, 308, 58,
+ 509, 59, -339,
+ 562, 196, -14,
+ -378, 100, -47,
+ -234, 202, 1,
+ 104, -270, -493,
+ 319, -210, -325};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 4th split: isf2_9 to isf2_11
+ *---------------------------------------------------*/
+
+static Word16 dico24_isf[SIZE_BK24*3] = {
+
+ -79, -89, -4,
+ -171, 77, -211,
+ 160, -193, 98,
+ 120, -103, 323,
+ 32, -22, -129,
+ 72, 78, -268,
+ 182, -76, -66,
+ 309, 99, -145,
+ -229, -157, -84,
+ -383, 98, -71,
+ -90, -352, 12,
+ -284, -178, 178,
+ -65, -125, -166,
+ -87, -175, -351,
+ 42, -198, -48,
+ 154, -140, -243,
+ -77, 18, 108,
+ -39, 355, 91,
+ 87, 8, 155,
+ -4, 158, 239,
+ 128, 95, -54,
+ 7, 246, -124,
+ 258, 15, 89,
+ 206, 216, 98,
+ -201, 9, 18,
+ -312, 233, 204,
+ -39, -174, 155,
+ -144, -9, 284,
+ -57, 70, -69,
+ -157, 187, 18,
+ 54, -30, 23,
+ 24, 135, 55};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 5th split: isf2_12 to isf2_15
+ *---------------------------------------------------*/
+
+static Word16 dico25_isf[SIZE_BK25*4] = {
+
+ 169, 142, -119, 115,
+ 206, -20, 94, 226,
+ -106, 313, -21, 16,
+ -62, 161, 71, 255,
+ -89, 101, -185, 125,
+ 72, -30, -201, 344,
+ -258, 33, -8, 81,
+ -104, -154, 72, 296,
+ 144, -68, -268, -25,
+ 81, -78, -87, 106,
+ 22, 155, -186, -119,
+ -46, -28, 27, 91,
+ -114, -37, -175, -33,
+ -94, -222, -189, 122,
+ -132, -119, -191, -270,
+ -172, -173, 18, -43,
+ 279, 135, -42, -128,
+ 187, -86, 229, -138,
+ 159, 240, 140, 46,
+ 69, 25, 227, 77,
+ 21, 115, 13, 8,
+ 68, -248, 126, 81,
+ -150, 137, 207, -9,
+ -154, -133, 289, 67,
+ 143, -37, -86, -326,
+ 180, -32, 19, -23,
+ 26, 168, 116, -233,
+ -32, -26, 118, -78,
+ 3, -8, -45, -115,
+ 57, -215, -54, -83,
+ -209, 112, -22, -167,
+ -91, -151, 168, -262};
+
+
+
+ /* 36 bit */
+/*-------------------------------------------------------------------*
+ * isf codebooks: two-stage VQ with split-by-3 in 2nd stage *
+ * 1st stage is kept the same as the 46 bit quantizer *
+ * *
+ * codebook vector dimension number of vectors *
+ * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ *
+ * 1_1 9 256 *
+ * 1_2 7 256 *
+ * 2_1 5 128 *
+ * 2_2 4 128 *
+ * 2_3 7 64 *
+ *-------------------------------------------------------------------*/
+
+static Word16 dico21_isf_36b[SIZE_BK21_36b*5] = {
+
+ -52, -96, 212, 315, -73,
+ 82, -204, 363, 136, -197,
+ -126, -331, 183, 218, 143,
+ -49, -41, 557, 230, 72,
+ 2, -73, 163, 377, 221,
+ 133, 111, 278, 215, -110,
+ -102, -20, 284, 113, 273,
+ 84, 319, 290, 18, 85,
+ -25, -5, 125, 132, -204,
+ -38, -5, 286, -9, -356,
+ -140, -256, 92, 117, -189,
+ -144, 191, 313, 51, -98,
+ 167, -10, 44, 247, 36,
+ 381, 197, 238, 74, 6,
+ 38, -408, 29, -3, -85,
+ 92, 266, 157, -25, -200,
+ 161, -121, 70, 84, -140,
+ -16, -86, 112, -94, -189,
+ -269, -270, 351, 107, -24,
+ -68, -67, 492, -103, -155,
+ -53, -131, 62, 122, 10,
+ 135, 84, 283, -55, -120,
+ -12, -219, 331, -81, 167,
+ 220, -136, 147, -172, -42,
+ 140, -95, -109, -88, -194,
+ 0, -2, -4, -33, -381,
+ -66, -217, 152, -186, -402,
+ 244, 108, 156, -140, -395,
+ 113, -136, -196, 110, -24,
+ 214, 118, 11, -64, -131,
+ -110, -286, -6, -332, 16,
+ 94, 97, 79, -291, -205,
+ -5, -39, -20, 252, -96,
+ 76, 174, 101, 163, 61,
+ -69, -239, -55, 399, 6,
+ -115, 319, 164, 275, 196,
+ -15, 36, -47, 331, 121,
+ 226, 209, 271, 325, 184,
+ 13, -80, -218, 471, 353,
+ 288, 378, 16, -51, 251,
+ 174, 116, 52, 149, -279,
+ 235, 276, 39, 120, -48,
+ 0, -108, -108, 241, -339,
+ -93, 534, 45, 33, -87,
+ 194, 149, -71, 405, -44,
+ 409, 370, 81, -186, -154,
+ 25, -102, -448, 124, -173,
+ 22, 408, -110, -310, -214,
+ -26, 23, -83, 114, 14,
+ -110, 164, 52, 223, -82,
+ 37, -25, -263, 306, -15,
+ -466, 415, 292, 165, -18,
+ 29, -19, -171, 155, 182,
+ 179, 144, -27, 231, 258,
+ -103, -247, -396, 238, 113,
+ 375, -154, -109, -4, 156,
+ 98, 85, -292, -5, -124,
+ 116, 139, -116, -98, -294,
+ -14, -83, -278, -117, -378,
+ 106, 33, -106, -344, -484,
+ 119, 17, -412, 138, 166,
+ 384, 101, -204, 88, -156,
+ -121, -284, -300, -1, -166,
+ 280, 33, -152, -313, -81,
+ -37, 22, 229, 153, 37,
+ -60, -83, 236, -8, -41,
+ -169, -228, 126, -20, 363,
+ -235, 17, 364, -156, 156,
+ -25, -30, 72, 144, 156,
+ 153, -26, 256, 97, 144,
+ -21, -37, 48, -65, 250,
+ 63, 77, 273, -128, 124,
+ -129, -26, 40, 9, -115,
+ -6, 82, 38, -90, -182,
+ -336, -13, 28, 158, 91,
+ -30, 241, 137, -170, -17,
+ 146, 14, -11, 33, 61,
+ 192, 197, 54, -84, 85,
+ 23, -200, -78, -29, 140,
+ 122, 237, 106, -341, 136,
+ -57, -142, -85, -16, -74,
+ -59, -90, -8, -187, -20,
+ -211, -267, 216, -179, -110,
+ -50, -7, 220, -267, -70,
+ -57, -42, -17, -15, 71,
+ 32, 21, 63, -137, 33,
+ -137, -175, 104, -68, 97,
+ -67, -43, 133, -301, 221,
+ -116, -200, -81, -92, -272,
+ -64, -41, -54, -244, -220,
+ -287, -242, -50, -87, -89,
+ -245, 236, 102, -166, -295,
+ 66, 24, -162, -71, 95,
+ 66, 136, -90, -220, -36,
+ -98, -161, -222, -188, 29,
+ -18, 18, -19, -415, 9,
+ 49, 61, 100, 39, -56,
+ -111, 82, 135, -31, 52,
+ -90, -153, -93, 189, 182,
+ -214, 295, 119, -74, 284,
+ 2, 137, 37, 47, 182,
+ 92, 117, 184, -53, 373,
+ -21, -14, -35, 136, 391,
+ 146, 129, -164, -28, 333,
+ 92, 80, -84, 100, -134,
+ -8, 217, -32, 3, -47,
+ -151, 251, -215, 142, 92,
+ -224, 310, -172, -275, 98,
+ 159, 155, -177, 112, 53,
+ 205, 27, 8, -240, 192,
+ 169, 120, -319, -201, 106,
+ 11, 36, -86, -237, 455,
+ -109, -154, -163, 174, -55,
+ -38, 32, -101, -78, -59,
+ -205, -321, -97, 69, 79,
+ -310, 44, 18, -185, 34,
+ -115, -20, -148, -39, 203,
+ -29, 154, -30, -158, 166,
+ -45, -131, -317, -24, 363,
+ -165, -205, -112, -222, 265,
+ -32, -44, -150, 54, -193,
+ -6, -38, -255, -169, -115,
+ -266, 87, -189, -36, -169,
+ -60, -87, -266, -436, -170,
+ -68, -81, -278, 24, 38,
+ -23, -19, -155, -256, 141,
+ -61, -226, -565, -175, 71,
+ 9, -29, -237, -515, 263};
+
+static Word16 dico22_isf_36b[SIZE_BK22_36b*4] = {
+
+ -298, -6, 95, 31,
+ -213, -87, -122, 261,
+ 4, -49, 208, 14,
+ -129, -110, 30, 118,
+ -214, 258, 110, -235,
+ -41, -18, -126, 120,
+ 103, 65, 127, -37,
+ 126, -36, -24, 25,
+ -138, -67, -278, -186,
+ -164, -194, -201, 78,
+ -211, -87, -51, -221,
+ -174, -79, -94, -39,
+ 23, -6, -157, -240,
+ 22, -110, -153, -68,
+ 148, -5, -2, -149,
+ -1, -135, -39, -179,
+ 68, 360, -117, -15,
+ 137, 47, -278, 146,
+ 136, 260, 135, 65,
+ 61, 116, -45, 97,
+ 231, 379, 87, -120,
+ 338, 177, -272, 3,
+ 266, 156, 28, -69,
+ 260, 84, -85, 86,
+ -266, 154, -256, -182,
+ -17, -65, -304, -6,
+ -40, 175, -151, -180,
+ -27, 27, -87, -63,
+ 121, 114, -166, -469,
+ 159, -66, -323, -231,
+ 214, 152, -141, -212,
+ 137, 36, -184, -51,
+ -282, -237, 40, 10,
+ -48, -235, -37, 251,
+ -54, -323, 136, 29,
+ -88, -174, 213, 198,
+ -390, 99, -63, -375,
+ 107, -169, -164, 424,
+ 69, -111, 141, -167,
+ 74, -129, 65, 144,
+ -353, -207, -205, -109,
+ -160, -386, -355, 98,
+ -176, -493, -20, -143,
+ -252, -432, -2, 216,
+ -90, -174, -168, -411,
+ 13, -284, -229, -160,
+ -87, -279, 34, -251,
+ -75, -263, -58, -42,
+ 420, 53, -211, -358,
+ 384, -35, -374, 396,
+ 68, -228, 323, -2,
+ 167, -307, 192, 194,
+ 459, 329, -5, -332,
+ 375, 79, -7, 313,
+ 282, -124, 200, -92,
+ 271, -162, -70, 180,
+ -157, -298, -514, -309,
+ 58, -163, -546, 18,
+ 124, -364, 167, -238,
+ 83, -411, -117, 96,
+ 140, -112, -388, -624,
+ 259, -133, -317, 41,
+ 163, -130, -64, -334,
+ 226, -165, -124, -110,
+ -466, -61, 6, 229,
+ -153, 205, -145, 242,
+ -159, 48, 195, 148,
+ -58, 28, 31, 279,
+ -303, 185, 279, -4,
+ -61, 197, 59, 86,
+ -114, 123, 168, -52,
+ 35, 36, 100, 126,
+ -407, 102, -77, -40,
+ -338, -1, -342, 156,
+ -179, 105, -34, -97,
+ -185, 84, -35, 108,
+ -133, 107, -91, -357,
+ -180, 54, -229, 24,
+ -44, 47, 47, -182,
+ -66, 13, 45, 4,
+ -339, 251, 64, 226,
+ -42, 101, -350, 275,
+ -99, 398, 142, 121,
+ 111, 12, -102, 260,
+ 0, 505, 260, -94,
+ 161, 285, -96, 224,
+ -4, 206, 314, 33,
+ 167, 139, 88, 204,
+ -235, 316, -60, -25,
+ -8, -150, -312, 201,
+ -36, 292, 61, -104,
+ -40, 174, -162, 42,
+ -21, 402, -29, -351,
+ 21, 152, -360, -93,
+ 57, 191, 212, -196,
+ 76, 158, -21, -69,
+ -328, -185, 331, 119,
+ -53, 285, 56, 337,
+ -107, -24, 405, 29,
+ -18, 137, 272, 277,
+ -255, 22, 173, -191,
+ 295, 322, 325, 302,
+ 21, -27, 332, -178,
+ 119, 13, 271, 129,
+ -455, -180, 116, -191,
+ -227, 62, -148, 524,
+ -176, -287, 282, -157,
+ -243, 13, 199, 430,
+ -59, -49, 115, -365,
+ 72, -172, -137, 93,
+ -138, -126, 141, -84,
+ 5, -124, 38, -20,
+ -258, 311, 601, 213,
+ 94, 130, -61, 502,
+ -1, -157, 485, 313,
+ 146, -74, 158, 345,
+ 276, 135, 280, -57,
+ 490, 252, 99, 43,
+ 267, -74, 429, 105,
+ 278, -23, 119, 94,
+ -542, 488, 257, -115,
+ -84, -244, -438, 478,
+ -113, -545, 387, 101,
+ -95, -306, 111, 498,
+ 95, 166, 22, -301,
+ 420, -15, -58, -78,
+ 270, 29, 122, -282,
+ 160, -240, 50, -38};
+
+static Word16 dico23_isf_36b[SIZE_BK23_36b*7] = {
+
+ 81, -18, 68, -27, -122, -280, -4,
+ 45, -177, 209, -30, -136, -74, 131,
+ -44, 101, -75, -88, -48, -137, -54,
+ -245, -28, 63, -18, -112, -103, 58,
+ -79, -6, 220, -65, 114, -35, -50,
+ 109, -65, 143, -114, 129, 76, 125,
+ 166, 90, -61, -242, 186, -74, -43,
+ -46, -92, 49, -227, 24, -155, 39,
+ 67, 85, 99, -42, 53, -184, -281,
+ 142, -122, 0, 21, -142, -15, -17,
+ 223, 92, -21, -48, -82, -14, -167,
+ 51, -37, -243, -30, -90, 18, -56,
+ 54, 105, 74, 86, 69, 13, -101,
+ 196, 72, -89, 43, 65, 19, 39,
+ 121, 34, 131, -82, 25, 213, -156,
+ 101, -102, -136, -21, 57, 214, 22,
+ 36, -124, 205, 204, 58, -156, -83,
+ 83, -117, 137, 137, 85, 116, 44,
+ -92, -148, -68, 11, -102, -197, -220,
+ -76, -185, -58, 132, -26, -183, 85,
+ -7, -31, -2, 23, 205, -151, 10,
+ -27, -37, -5, -18, 292, 131, 1,
+ 117, -168, 9, -93, 80, -59, -125,
+ -182, -244, 98, -24, 135, -22, 94,
+ 221, 97, 106, 42, 43, -160, 83,
+ 25, -64, -21, 6, 14, -15, 154,
+ 126, 15, -140, 150, -10, -207, -114,
+ 79, -63, -211, -70, -28, -217, 165,
+ 46, 38, -22, 281, 132, -62, 109,
+ 112, 54, -112, -93, 208, 27, 296,
+ 115, 10, -147, 41, 216, 42, -276,
+ 50, -115, -254, 167, 117, -2, 61,
+ 17, 144, 34, -72, -186, -150, 272,
+ -29, -66, -89, -95, -149, 129, 251,
+ 122, 0, -50, -234, -91, 36, 26,
+ -105, -102, -88, -121, -236, -7, -11,
+ -204, 109, 5, -191, 105, -15, 163,
+ -80, 32, -24, -209, 41, 294, 70,
+ -106, -94, -204, -118, 120, -50, -37,
+ -82, -241, 46, -131, -29, 150, -55,
+ 33, 155, 120, -89, -8, 7, 62,
+ 213, 82, 61, 18, -161, 144, 152,
+ 30, 131, 65, -87, -255, -17, -107,
+ -8, 85, -64, 51, -162, 223, -53,
+ -134, 261, 69, -56, 218, 72, -111,
+ 2, 155, -113, -87, 49, 85, -28,
+ -163, 42, -1, -196, 7, 39, -245,
+ 14, -137, -79, 11, -160, 202, -293,
+ -94, 33, 208, 100, 56, -44, 326,
+ -78, -41, 232, 13, -142, 227, 80,
+ -16, -87, 201, 33, -133, 15, -183,
+ -58, -192, -47, 184, -128, 133, 99,
+ -205, 11, -155, 78, 52, 72, 141,
+ -246, 26, 99, 151, 59, 115, -64,
+ -79, -47, -16, -14, 6, 47, -43,
+ -72, -178, -27, 162, 112, 43, -174,
+ -175, 238, 186, 71, -54, -188, -76,
+ -225, 233, 39, -39, -158, 122, 44,
+ -26, 43, 84, 130, -93, -51, 22,
+ 3, 92, -150, 136, -182, -57, 97,
+ -131, 179, -78, 80, 91, -165, 90,
+ -2, 148, 15, 130, 65, 175, 117,
+ -138, 114, -137, 132, 3, -10, -186,
+ 140, -4, -37, 254, -62, 92, -109};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/stream.h b/media/libstagefright/codecs/amrwbenc/inc/stream.h
new file mode 100644
index 0000000..edbc13a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/stream.h
@@ -0,0 +1,47 @@
+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/***********************************************************************
+File: stream.h
+
+Contains: VOME API Buffer Operator Implement Header
+
+************************************************************************/
+#ifndef __STREAM_H__
+#define __STREAM_H__
+
+#include "voMem.h"
+#define Frame_Maxsize 1024 * 2 //Work Buffer 10K
+#define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes
+#define MIN(a,b) ((a) < (b)? (a) : (b))
+
+typedef struct{
+ unsigned char *set_ptr;
+ unsigned char *frame_ptr;
+ unsigned char *frame_ptr_bk;
+ int set_len;
+ int framebuffer_len;
+ int frame_storelen;
+ int used_len;
+}FrameStream;
+
+void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP);
+void voAWB_InitFrameBuffer(FrameStream *stream);
+void voAWB_FlushFrameBuffer(FrameStream *stream);
+#endif //__STREAM_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedef.h b/media/libstagefright/codecs/amrwbenc/inc/typedef.h
new file mode 100644
index 0000000..aa8c098
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/typedef.h
@@ -0,0 +1,65 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*
+* File : typedef.c
+* Purpose : Basic types.
+*
+************************************************************************/
+
+#ifndef __TYPEDEF_H__
+#define __TYPEDEF_H__
+
+#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version
+ of typedef.h */
+
+#ifdef ORIGINAL_TYPEDEF_H
+/*
+ * this is the original code from the ETSI file typedef.h
+ */
+
+#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__sun)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__unix__) || defined(__unix)
+typedef signed char Word8;
+typedef short Word16;
+typedef int Word32;
+typedef int Flag;
+
+#endif
+#else /* not original typedef.h */
+
+/*
+ * use (improved) type definition file typdefs.h and add a "Flag" type
+ */
+#include "typedefs.h"
+typedef int Flag;
+
+#endif
+
+#endif //__TYPEDEF_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h
new file mode 100644
index 0000000..28b657e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h
@@ -0,0 +1,211 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*
+*
+* File : typedefs.h
+* Description : Definition of platform independent data
+* types and constants
+*
+*
+* The following platform independent data types and corresponding
+* preprocessor (#define) constants are defined:
+*
+* defined type meaning corresponding constants
+* ----------------------------------------------------------
+* Char character (none)
+* Bool boolean true, false
+* Word8 8-bit signed minWord8, maxWord8
+* UWord8 8-bit unsigned minUWord8, maxUWord8
+* Word16 16-bit signed minWord16, maxWord16
+* UWord16 16-bit unsigned minUWord16, maxUWord16
+* Word32 32-bit signed minWord32, maxWord32
+* UWord32 32-bit unsigned minUWord32, maxUWord32
+* Float floating point minFloat, maxFloat
+*
+*
+* The following compile switches are #defined:
+*
+* PLATFORM string indicating platform progam is compiled on
+* possible values: "OSF", "PC", "SUN"
+*
+* OSF only defined if the current platform is an Alpha
+* PC only defined if the current platform is a PC
+* SUN only defined if the current platform is a Sun
+*
+* LSBFIRST is defined if the byte order on this platform is
+* "least significant byte first" -> defined on DEC Alpha
+* and PC, undefined on Sun
+*
+********************************************************************************
+*/
+
+#ifndef __TYPEDEFS_H__
+#define __TYPEDEFS_H__
+
+/*
+********************************************************************************
+* INCLUDE FILES
+********************************************************************************
+*/
+#include <float.h>
+#include <limits.h>
+
+
+
+/*
+********************************************************************************
+* DEFINITION OF CONSTANTS
+********************************************************************************
+*/
+/*
+ ********* define char type
+ */
+typedef char Char;
+
+/*
+ ********* define 8 bit signed/unsigned types & constants
+ */
+#if SCHAR_MAX == 127
+typedef signed char Word8;
+#define minWord8 SCHAR_MIN
+#define maxWord8 SCHAR_MAX
+
+typedef unsigned char UWord8;
+#define minUWord8 0
+#define maxUWord8 UCHAR_MAX
+#else
+#error cannot find 8-bit type
+#endif
+
+
+/*
+ ********* define 16 bit signed/unsigned types & constants
+ */
+#if INT_MAX == 32767
+typedef int Word16;
+#define minWord16 INT_MIN
+#define maxWord16 INT_MAX
+typedef unsigned int UWord16;
+#define minUWord16 0
+#define maxUWord16 UINT_MAX
+#elif SHRT_MAX == 32767
+typedef short Word16;
+#define minWord16 SHRT_MIN
+#define maxWord16 SHRT_MAX
+typedef unsigned short UWord16;
+#define minUWord16 0
+#define maxUWord16 USHRT_MAX
+#else
+#error cannot find 16-bit type
+#endif
+
+
+/*
+ ********* define 32 bit signed/unsigned types & constants
+ */
+#if INT_MAX == 2147483647
+typedef int Word32;
+#define minWord32 INT_MIN
+#define maxWord32 INT_MAX
+typedef unsigned int UWord32;
+#define minUWord32 0
+#define maxUWord32 UINT_MAX
+#elif LONG_MAX == 2147483647
+typedef long Word32;
+#define minWord32 LONG_MIN
+#define maxWord32 LONG_MAX
+typedef unsigned long UWord32;
+#define minUWord32 0
+#define maxUWord32 ULONG_MAX
+#else
+#error cannot find 32-bit type
+#endif
+
+/*
+ ********* define floating point type & constants
+ */
+/* use "#if 0" below if Float should be double;
+ use "#if 1" below if Float should be float
+ */
+#if 0
+typedef float Float;
+#define maxFloat FLT_MAX
+#define minFloat FLT_MIN
+#else
+typedef double Float;
+#define maxFloat DBL_MAX
+#define minFloat DBL_MIN
+#endif
+
+/*
+ ********* define complex type
+ */
+typedef struct {
+ Float r; /* real part */
+ Float i; /* imaginary part */
+} CPX;
+
+/*
+ ********* define boolean type
+ */
+typedef int Bool;
+#define false 0
+#define true 1
+
+/* ******Avoid function multiple definition****** */
+#define Autocorr voAWB_Autocorr
+#define Convolve voAWB_Convolve
+#define cor_h_x voAWB_cor_h_x
+#define dtx_enc_init voAWB_dtx_enc_init
+#define dtx_enc_reset voAWB_dtx_enc_reset
+#define dtx_enc_exit voAWB_dtx_enc_exit
+#define dtx_enc voAWB_dtx_enc
+#define dtx_buffer voAWB_dtx_buffer
+#define tx_dtx_handler voAWB_tx_dtx_handler
+#define G_pitch voAWB_G_pitch
+#define Isp_Az voAWB_Isp_Az
+#define Lag_window voAWB_Lag_window
+#define Log2_norm voAWB_Log2_norm
+#define Log2 voAWB_Log2
+#define Pow2 voAWB_Pow2
+#define L_Comp voAWB_L_Comp
+#define Mpy_32 voAWB_Mpy_32
+#define Mpy_32_16 voAWB_Mpy_32_16
+#define Div_32 voAWB_Div_32
+#define Pit_shrp voAWB_Pit_shrp
+#define Qisf_ns voAWB_Qisf_ns
+#define Disf_ns voAWB_Disf_ns
+#define Residu voAWB_Residu
+#define Syn_filt voAWB_Syn_filt
+#define Set_zero voAWB_Set_zero
+#define Copy voAWB_Copy
+#define voice_factor voAWB_voice_factor
+#define Syn_filt_32 voAWB_Syn_filt_32
+#define Isf_isp voAWB_Isf_isp
+#define Levinson voAWB_Levinson
+#define median5 voAWB_median5
+#define Pred_lt4 voAWB_Pred_lt4
+#define Reorder_isf voAWB_Reorder_isf
+#define Dpisf_2s_36b voAWB_Dpisf_2s_36b
+#define Dpisf_2s_46b voAWB_Dpisf_2s_46b
+#define Dot_product12 voAWB_Dot_product12
+#define mem_malloc voAWB_mem_malloc
+#define mem_free voAWB_mem_free
+/******************************************************/
+
+#endif //#define __TYPEDEFS_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
new file mode 100644
index 0000000..b733afe
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
@@ -0,0 +1,78 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ * WB_VAD.H *
+ *-------------------------------------------------------------------*
+ * Functions and static memory for Voice Activity Detection. *
+ *-------------------------------------------------------------------*/
+
+#ifndef __WB_VAD_H__
+#define __WB_VAD_H__
+
+/******************************************************************************
+ * INCLUDE FILES
+ ******************************************************************************/
+#include "typedef.h"
+#include "wb_vad_c.h"
+#include "voMem.h"
+
+/******************************************************************************
+ * DEFINITION OF DATA TYPES
+ ******************************************************************************/
+
+typedef struct
+{
+ Word16 bckr_est[COMPLEN]; /* background noise estimate */
+ Word16 ave_level[COMPLEN]; /* averaged input components for stationary */
+ /* estimation */
+ Word16 old_level[COMPLEN]; /* input levels of the previous frame */
+ Word16 sub_level[COMPLEN]; /* input levels calculated at the end of a frame (lookahead) */
+ Word16 a_data5[F_5TH_CNT][2]; /* memory for the filter bank */
+ Word16 a_data3[F_3TH_CNT]; /* memory for the filter bank */
+
+ Word16 burst_count; /* counts length of a speech burst */
+ Word16 hang_count; /* hangover counter */
+ Word16 stat_count; /* stationary counter */
+
+ /* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the
+ * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */
+ Word16 vadreg; /* flags for intermediate VAD decisions */
+ Word16 tone_flag; /* tone detection flags */
+
+ Word16 sp_est_cnt; /* counter for speech level estimation */
+ Word16 sp_max; /* maximum level */
+ Word16 sp_max_cnt; /* counts frames that contains speech */
+ Word16 speech_level; /* estimated speech level */
+ Word32 prev_pow_sum; /* power of previous frame */
+
+} VadVars;
+
+/********************************************************************************
+ *
+ * DECLARATION OF PROTOTYPES
+ ********************************************************************************/
+
+Word16 wb_vad_init(VadVars ** st, VO_MEM_OPERATOR *pMemOP);
+Word16 wb_vad_reset(VadVars * st);
+void wb_vad_exit(VadVars ** st, VO_MEM_OPERATOR *pMemOP);
+void wb_vad_tone_detection(VadVars * st, Word16 p_gain);
+Word16 wb_vad(VadVars * st, Word16 in_buf[]);
+
+#endif //__WB_VAD_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
new file mode 100644
index 0000000..39ef506
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
@@ -0,0 +1,109 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ * WB_VAD_C.H *
+ *-------------------------------------------------------------------*
+ * Constants for Voice Activity Detection. *
+ *-------------------------------------------------------------------*/
+
+#ifndef __WB_VAD_C_H__
+#define __WB_VAD_C_H__
+
+#define FRAME_LEN 256 /* Length (samples) of the input frame */
+#define COMPLEN 12 /* Number of sub-bands used by VAD */
+
+#define UNIRSHFT 7 /* = log2(MAX_16/UNITY), UNITY = 256 */
+#define SCALE 128 /* (UNITY*UNITY)/512 */
+
+#define TONE_THR (Word16)(0.65*MAX_16) /* Threshold for tone detection */
+
+/* constants for speech level estimation */
+#define SP_EST_COUNT 80
+#define SP_ACTIVITY_COUNT 25
+#define ALPHA_SP_UP (Word16)((1.0 - 0.85)*MAX_16)
+#define ALPHA_SP_DOWN (Word16)((1.0 - 0.85)*MAX_16)
+
+#define NOM_LEVEL 2050 /* about -26 dBov Q15 */
+#define SPEECH_LEVEL_INIT NOM_LEVEL /* initial speech level */
+#define MIN_SPEECH_LEVEL1 (Word16)(NOM_LEVEL * 0.063) /* NOM_LEVEL -24 dB */
+#define MIN_SPEECH_LEVEL2 (Word16)(NOM_LEVEL * 0.2) /* NOM_LEVEL -14 dB */
+#define MIN_SPEECH_SNR 4096 /* 0 dB, lowest SNR estimation, Q12 */
+
+/* Time constants for background spectrum update */
+#define ALPHA_UP1 (Word16)((1.0 - 0.95)*MAX_16) /* Normal update, upwards: */
+#define ALPHA_DOWN1 (Word16)((1.0 - 0.936)*MAX_16) /* Normal update, downwards */
+#define ALPHA_UP2 (Word16)((1.0 - 0.985)*MAX_16) /* Forced update, upwards */
+#define ALPHA_DOWN2 (Word16)((1.0 - 0.943)*MAX_16) /* Forced update, downwards */
+#define ALPHA3 (Word16)((1.0 - 0.95)*MAX_16) /* Update downwards */
+#define ALPHA4 (Word16)((1.0 - 0.9)*MAX_16) /* For stationary estimation */
+#define ALPHA5 (Word16)((1.0 - 0.5)*MAX_16) /* For stationary estimation */
+
+/* Constants for VAD threshold */
+#define THR_MIN (Word16)(1.6*SCALE) /* Minimum threshold */
+#define THR_HIGH (Word16)(6*SCALE) /* Highest threshold */
+#define THR_LOW (Word16)(1.7*SCALE) /* Lowest threshold */
+#define NO_P1 31744 /* ilog2(1), Noise level for highest threshold */
+#define NO_P2 19786 /* ilog2(0.1*MAX_16), Noise level for lowest threshold */
+#define NO_SLOPE (Word16)(MAX_16*(float)(THR_LOW-THR_HIGH)/(float)(NO_P2-NO_P1))
+
+#define SP_CH_MIN (Word16)(-0.75*SCALE)
+#define SP_CH_MAX (Word16)(0.75*SCALE)
+#define SP_P1 22527 /* ilog2(NOM_LEVEL/4) */
+#define SP_P2 17832 /* ilog2(NOM_LEVEL*4) */
+#define SP_SLOPE (Word16)(MAX_16*(float)(SP_CH_MAX-SP_CH_MIN)/(float)(SP_P2-SP_P1))
+
+/* Constants for hangover length */
+#define HANG_HIGH 12 /* longest hangover */
+#define HANG_LOW 2 /* shortest hangover */
+#define HANG_P1 THR_LOW /* threshold for longest hangover */
+#define HANG_P2 (Word16)(4*SCALE) /* threshold for shortest hangover */
+#define HANG_SLOPE (Word16)(MAX_16*(float)(HANG_LOW-HANG_HIGH)/(float)(HANG_P2-HANG_P1))
+
+/* Constants for burst length */
+#define BURST_HIGH 8 /* longest burst length */
+#define BURST_LOW 3 /* shortest burst length */
+#define BURST_P1 THR_HIGH /* threshold for longest burst */
+#define BURST_P2 THR_LOW /* threshold for shortest burst */
+#define BURST_SLOPE (Word16)(MAX_16*(float)(BURST_LOW-BURST_HIGH)/(float)(BURST_P2-BURST_P1))
+
+/* Parameters for background spectrum recovery function */
+#define STAT_COUNT 20 /* threshold of stationary detection counter */
+
+#define STAT_THR_LEVEL 184 /* Threshold level for stationarity detection */
+#define STAT_THR 1000 /* Threshold for stationarity detection */
+
+/* Limits for background noise estimate */
+#define NOISE_MIN 40 /* minimum */
+#define NOISE_MAX 20000 /* maximum */
+#define NOISE_INIT 150 /* initial */
+
+/* Thresholds for signal power (now calculated on 2 frames) */
+#define VAD_POW_LOW (Word32)30000L /* If input power is lower than this, VAD is set to 0 */
+#define POW_TONE_THR (Word32)686080L /* If input power is lower,tone detection flag is ignored */
+
+/* Constants for the filter bank */
+#define COEFF3 13363 /* coefficient for the 3rd order filter */
+#define COEFF5_1 21955 /* 1st coefficient the for 5th order filter */
+#define COEFF5_2 6390 /* 2nd coefficient the for 5th order filter */
+#define F_5TH_CNT 5 /* number of 5th order filters */
+#define F_3TH_CNT 6 /* number of 3th order filters */
+
+#endif //__WB_VAD_C_H__
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/patent_disclaimer.txt b/media/libstagefright/codecs/amrwbenc/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
new file mode 100644
index 0000000..0eb5e9f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
@@ -0,0 +1,104 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@void Deemph_32(
+@ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+@ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+@ Word16 y[], /* (o) : output signal (x16) */
+@ Word16 mu, /* (i) Q15 : deemphasis factor */
+@ Word16 L, /* (i) : vector size */
+@ Word16 * mem /* (i/o) : memory (y[-1]) */
+@ )
+
+@x_hi RN R0
+@x_lo RN R1
+@y[] RN R2
+@*mem RN R3
+
+ .section .text
+ .global Deemph_32_asm
+
+Deemph_32_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r4, #2 @i=0
+ LDRSH r6, [r0], #2 @load x_hi[0]
+ LDRSH r7, [r1], #2 @load x_lo[0]
+ LDR r5, =22282 @r5---mu
+ MOV r11, #0x8000
+
+ @y[0]
+ MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16
+ MOV r8, r5, ASR #1 @fac = mu >> 1
+ LDR r5, [r3]
+ ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
+ MOV r10, r12, LSL #3 @L_tmp <<= 3
+ MUL r9, r5, r8
+ LDRSH r6, [r0], #2 @load x_hi[1]
+ QDADD r10, r10, r9
+ LDRSH r7, [r1], #2 @load x_lo[1]
+ MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
+ QADD r10, r12, r11
+ MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
+
+
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ STRH r14, [r2], #2 @update y[0]
+ MOV r10, r12, LSL #3
+ MUL r9, r14, r8
+ QDADD r10, r10, r9
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ MOV r14, r10, ASR #16 @y[1] = round(L_tmp)
+
+LOOP:
+ LDRSH r6, [r0], #2 @load x_hi[]
+ LDRSH r7, [r1], #2
+ STRH r14, [r2], #2
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ MUL r9, r14, r8
+ MOV r10, r12, LSL #3
+ QDADD r10, r10, r9
+ LDRSH r6, [r0], #2 @load x_hi[]
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ LDRSH r7, [r1], #2
+ MOV r14, r10, ASR #16
+
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ STRH r14, [r2], #2
+ MUL r9, r14, r8
+ MOV r10, r12, LSL #3
+ QDADD r10, r10, r9
+ ADD r4, r4, #2
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ CMP r4, #64
+ MOV r14, r10, ASR #16
+
+ BLT LOOP
+ STR r14, [r3]
+ STRH r14, [r2]
+
+ LDMFD r13!, {r4 - r12, r15}
+
+ @ENDP
+ .END
+
+
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
new file mode 100644
index 0000000..0383269
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
@@ -0,0 +1,80 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
+@ Word16 x[], /* (i) 12bits: x vector */
+@ Word16 y[], /* (i) 12bits: y vector */
+@ Word16 lg, /* (i) : vector length */
+@ Word16 * exp /* (o) : exponent of result (0..+30) */
+@)
+@****************************************************************
+@ x[] --- r0
+@ y[] --- r1
+@ lg --- r2
+@ *exp --- r3
+
+ .section .text
+ .global Dot_product12_asm
+
+Dot_product12_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r4, #0 @ L_sum = 0
+ MOV r5, #0 @ i = 0
+
+LOOP:
+ LDR r6, [r0], #4
+ LDR r7, [r1], #4
+ LDR r8, [r0], #4
+ SMLABB r4, r6, r7, r4
+ LDR r9, [r1], #4
+ SMLATT r4, r6, r7, r4
+
+ LDR r6, [r0], #4
+ SMLABB r4, r8, r9, r4
+
+ LDR r7, [r1], #4
+ SMLATT r4, r8, r9, r4
+ LDR r8, [r0], #4
+
+ SMLABB r4, r6, r7, r4
+ LDR r9, [r1], #4
+ SMLATT r4, r6, r7, r4
+ ADD r5, r5, #8
+ SMLABB r4, r8, r9, r4
+ CMP r5, r2
+ SMLATT r4, r8, r9, r4
+ BLT LOOP
+
+ MOV r12, r4, LSL #1
+ ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
+ MOV r4, r12
+
+ CMP r12, #0
+ RSBLT r4, r12, #0
+ CLZ r10, r4
+ SUB r10, r10, #1 @ sft = norm_l(L_sum)
+ MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
+ RSB r11, r10, #30 @ *exp = 30 - sft
+ STRH r11, [r3]
+
+Dot_product12_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
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
new file mode 100644
index 0000000..e6ebd73
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
@@ -0,0 +1,185 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@**********************************************************************/
+@void Filt_6k_7k(
+@ Word16 signal[], /* input: signal */
+@ Word16 lg, /* input: length of input */
+@ Word16 mem[] /* in/out: memory (size=30) */
+@)
+@******************************************************************
+@ r0 --- signal[]
+@ r1 --- lg
+@ r2 --- mem[]
+
+ .section .text
+ .global Filt_6k_7k_asm
+ .extern voAWB_Copy
+ .extern fir_6k_7k
+
+Filt_6k_7k_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
+ MOV r8, r0 @ copy signal[] address
+ MOV r4, r1 @ copy lg address
+ MOV r5, r2 @ copy mem[] address
+
+ MOV r1, r13
+ MOV r0, r2
+ MOV r2, #30 @ L_FIR - 1
+ BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1)
+
+ LDR r10, Lable1 @ get fir_7k address
+
+ MOV r14, #0
+ MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
+ ADD r6, r13, #60 @ get x[L_FIR - 1] address
+ MOV r7, r3 @ get signal[i]
+LOOP1:
+ LDRSH r8, [r7], #2
+ LDRSH r9, [r7], #2
+ MOV r8, r8, ASR #2
+ MOV r9, r9, ASR #2
+ LDRSH r11, [r7], #2
+ LDRSH r12, [r7], #2
+ MOV r11, r11, ASR #2
+ MOV r12, r12, ASR #2
+ STRH r8, [r6], #2
+ STRH r9, [r6], #2
+ STRH r11, [r6], #2
+ STRH r12, [r6], #2
+ LDRSH r8, [r7], #2
+ LDRSH r9, [r7], #2
+ MOV r8, r8, ASR #2
+ MOV r9, r9, ASR #2
+ LDRSH r11, [r7], #2
+ LDRSH r12, [r7], #2
+ MOV r11, r11, ASR #2
+ MOV r12, r12, ASR #2
+ STRH r8, [r6], #2
+ STRH r9, [r6], #2
+ STRH r11, [r6], #2
+ STRH r12, [r6], #2
+ ADD r14, r14, #8
+ CMP r14, #80
+ BLT LOOP1
+
+
+ STR r5, [sp, #-4] @ PUSH r5 to stack
+
+ @ not use registers: r4, r10, r12, r14, r5
+ MOV r4, r13
+ MOV r5, #0 @ i = 0
+LOOP2:
+ LDR r0, [r10]
+
+ LDRSH r1, [r4] @ load x[i]
+ LDRSH r2, [r4, #60] @ load x[i + 30]
+ LDRSH r6, [r4, #2] @ load x[i + 1]
+ LDRSH r7, [r4, #58] @ load x[i + 29]
+ ADD r1, r1, r2 @ x[i] + x[i + 30]
+ ADD r6, r6, r7 @ x[i + 1] + x[i + 29]
+ LDRSH r8, [r4, #4] @ load x[i + 2]
+ LDRSH r9, [r4, #56] @ load x[i + 28]
+
+ SMULBB r14, r1, r0 @ (x[i] + x[i + 30]) * fir_7k[0]
+ ADD r8, r8, r9 @ x[i + 2] + x[i + 28]
+ SMLABT r14, r6, r0, r14 @ (x[i + 1] + x[i + 29]) * fir_7k[1]
+
+ LDR r0, [r10, #4]
+ LDRSH r1, [r4, #6] @ load x[i+3]
+ LDRSH r2, [r4, #54] @ load x[i+27]
+ LDRSH r6, [r4, #8] @ load x[i+4]
+ LDRSH r7, [r4, #52] @ load x[i+26]
+ ADD r1, r1, r2 @ x[i+3] + x[i+27]
+ ADD r6, r6, r7 @ x[i+4] + x[i+26]
+ SMLABB r14, r8, r0, r14 @ (x[i + 2] + x[i + 28]) * fir_7k[2]
+ LDRSH r8, [r4, #10] @ load x[i+5]
+ LDRSH r9, [r4, #50] @ load x[i+25]
+ SMLABT r14, r1, r0, r14 @ (x[i+3] + x[i+27]) * fir_7k[3]
+ ADD r8, r8, r9 @ x[i+5] + x[i+25]
+
+ LDR r0, [r10, #8]
+ LDRSH r1, [r4, #12] @ x[i+6]
+ LDRSH r2, [r4, #48] @ x[i+24]
+ SMLABB r14, r6, r0, r14 @ (x[i+4] + x[i+26]) * fir_7k[4]
+ LDRSH r6, [r4, #14] @ x[i+7]
+ LDRSH r7, [r4, #46] @ x[i+23]
+ SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5]
+ LDR r0, [r10, #12]
+ ADD r1, r1, r2 @ (x[i+6] + x[i+24])
+ ADD r6, r6, r7 @ (x[i+7] + x[i+23])
+ SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6]
+ LDRSH r8, [r4, #16] @ x[i+8]
+ LDRSH r9, [r4, #44] @ x[i+22]
+ SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
+ LDR r0, [r10, #16]
+ LDRSH r1, [r4, #18] @ x[i+9]
+ LDRSH r2, [r4, #42] @ x[i+21]
+ LDRSH r6, [r4, #20] @ x[i+10]
+ LDRSH r7, [r4, #40] @ x[i+20]
+ ADD r8, r8, r9 @ (x[i+8] + x[i+22])
+ ADD r1, r1, r2 @ (x[i+9] + x[i+21])
+ ADD r6, r6, r7 @ (x[i+10] + x[i+20])
+ SMLABB r14, r8, r0, r14 @ (x[i+8] + x[i+22]) * fir_7k[8]
+ LDRSH r8, [r4, #22] @ x[i+11]
+ LDRSH r9, [r4, #38] @ x[i+19]
+ SMLABT r14, r1, r0, r14 @ (x[i+9] + x[i+21]) * fir_7k[9]
+ LDR r0, [r10, #20]
+ LDRSH r1, [r4, #24] @ x[i+12]
+ LDRSH r2, [r4, #36] @ x[i+18]
+ SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10]
+ LDRSH r6, [r4, #26] @ x[i+13]
+ ADD r8, r8, r9 @ (x[i+11] + x[i+19])
+ LDRSH r7, [r4, #34] @ x[i+17]
+ SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11]
+ LDR r0, [r10, #24]
+ ADD r1, r1, r2 @ x[i+12] + x[i+18]
+ LDRSH r8, [r4, #28] @ x[i+14]
+ SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12]
+ ADD r6, r6, r7 @ (x[i+13] + x[i+17])
+ LDRSH r9, [r4, #32] @ x[i+16]
+ SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13]
+ LDR r0, [r10, #28]
+ ADD r8, r8, r9 @ (x[i+14] + x[i+16])
+ LDRSH r1, [r4, #30] @ x[i+15]
+ SMLABB r14, r8, r0, r14 @ (x[i+14] + x[i+16]) * fir_7k[14]
+ SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15]
+
+ ADD r5, r5, #1
+ ADD r14, r14, #0x4000
+ ADD r4, r4, #2
+ MOV r1, r14, ASR #15
+ CMP r5, #80
+ STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15
+ BLT LOOP2
+
+ LDR r1, [sp, #-4] @mem address
+ ADD r0, r13, #160 @x + lg
+ MOV r2, #30
+ BL voAWB_Copy
+
+Filt_6k_7k_end:
+ ADD r13, r13, #240
+ LDMFD r13!, {r4 - r12, r15}
+
+Lable1:
+ .word fir_6k_7k
+ @ENDFUNC
+ .END
+
+
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
new file mode 100644
index 0000000..b440a31
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s
@@ -0,0 +1,231 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@static void Norm_Corr (Word16 exc[], /* (i) : excitation buffer */
+@ Word16 xn[], /* (i) : target vector */
+@ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+@ Word16 L_subfr, /* (i) : sub-frame length */
+@ Word16 t_min, /* (i) : minimum value of pitch lag. */
+@ Word16 t_max, /* (i) : maximum value of pitch lag. */
+@ Word16 corr_norm[]) /* (o) Q15 : normalized correlation */
+@
+
+@ r0 --- exc[]
+@ r1 --- xn[]
+@ r2 --- h[]
+@ r3 --- L_subfr
+@ r4 --- t_min
+@ r5 --- t_max
+@ r6 --- corr_norm[]
+
+
+ .section .text
+ .global Norm_corr_asm
+ .extern Convolve_asm
+ .extern Isqrt_n
+@******************************
+@ constant
+@******************************
+.equ EXC , 0
+.equ XN , 4
+.equ H , 8
+.equ L_SUBFR , 12
+.equ voSTACK , 172
+.equ T_MIN , 212
+.equ T_MAX , 216
+.equ CORR_NORM , 220
+
+Norm_corr_asm:
+
+ 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]
+
+ @transfer Convolve function
+ STMFD sp!, {r0 - r3}
+ MOV r0, r5
+ MOV r1, r2
+ MOV r2, r8 @r2 --- excf[]
+ BL Convolve_asm
+ LDMFD sp!, {r0 - r3}
+
+ @ r8 --- excf[]
+
+ MOV r14, r1 @copy xn[] address
+ MOV r5, #64
+ MOV r6, #0 @L_tmp = 0
+ MOV r7, #1
+
+LOOP1:
+ LDR r9, [r14], #4
+ LDR r10, [r14], #4
+ LDR r11, [r14], #4
+ LDR r12, [r14], #4
+ SMLABB r6, r9, r9, r6 @L_tmp += (xn[i] * xn[i])
+ SMLATT r6, r9, r9, r6 @L_tmp += (xn[i+1] * xn[i+1])
+ SMLABB r6, r10, r10, r6
+ SMLATT r6, r10, r10, r6
+ SMLABB r6, r11, r11, r6
+ SMLATT r6, r11, r11, r6
+ SMLABB r6, r12, r12, r6
+ SMLATT r6, r12, r12, r6
+ SUBS r5, r5, #8
+ BNE LOOP1
+
+ ADD r9, r7, r6, LSL #1 @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
+ 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:
+ MOV r5, #0 @L_tmp = 0
+ MOV r6, #0 @L_tmp1 = 0
+ 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]
+ SMLABB r6, r11, r11, r6 @L_tmp1 += excf[i] * excf[i]
+ SMLATT r6, r11, r11, r6 @L_tmp1 += excf[i+1] * excf[i+1]
+ SMLABB r5, r10, r11, r5 @L_tmp += xn[i] * excf[i]
+ SMLATT r5, r10, r11, r5 @L_tmp += xn[i+1] * excf[i+1]
+ LDR r11, [r14], #4 @load excf[i+2], excf[i+3]
+ LDR r10, [r12], #4 @load xn[i+2], xn[i+3]
+ SMLABB r6, r11, r11, r6
+ SMLATT r6, r11, r11, r6
+ SMLABB r5, r10, r11, r5
+ SMLATT r5, r10, r11, r5
+ SUBS r9, r9, #4
+ BNE LOOPi
+
+ @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
+ 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)
+
+ CLZ r5, r6
+ SUB r5, r5, #1
+ MOV r6, r6, LSL r5 @L_tmp = (L_tmp1 << exp)
+ RSB r5, r5, #30 @exp_norm = 30 - exp
+
+ @r10 --- exp_corr, r11 --- corr
+ @r6 --- L_tmp, r5 --- exp_norm
+
+ @Isqrt_n(&L_tmp, &exp_norm)
+
+ MOV r14, r0
+ MOV r12, r1
+
+ STMFD sp!, {r0 - r4, r7 - r12, r14}
+ ADD r1, sp, #4
+ ADD r0, sp, #0
+ STR r6, [sp]
+ STRH r5, [sp, #4]
+ BL Isqrt_n
+ LDR r6, [sp]
+ LDRSH r5, [sp, #4]
+ LDMFD sp!, {r0 - r4, r7 - r12, r14}
+ MOV r0, r14
+ MOV r1, r12
+
+
+ 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
+
+ CMP r6, #0
+ RSBLT r6, r6, #0
+ MOVLT r12, r12, ASR r6
+ MOVGT r12, r12, LSL r6 @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
+
+ ADD r12, r12, r8
+ MOV r12, r12, ASR #16 @vo_round(L_tmp)
+
+ LDR r5, [r13, #CORR_NORM] @ get corr_norm address
+ LDR r6, [r13, #T_MAX] @ get t_max
+ ADD r10, r5, r4, LSL #1 @ get corr_norm[t] address
+ STRH r12, [r10] @ corr_norm[t] = vo_round(L_tmp)
+
+ CMP r4, r6
+ BEQ Norm_corr_asm_end
+
+ ADD r4, r4, #1 @ t_min ++
+
+ RSB r5, r4, #0 @ k
+
+ MOV r6, #63 @ i = 63
+ MOV r8, r0 @ exc[]
+ MOV r9, r2 @ h[]
+ ADD r10, r13, #20 @ excf[]
+
+ ADD r8, r8, r5, LSL #1 @ exc[k] address
+ ADD r9, r9, r6, LSL #1 @ h[i] address
+ ADD r10, r10, r6, LSL #1 @ excf[i] address
+ LDRSH r11, [r8] @ tmp = exc[k]
+
+LOOPK:
+ LDRSH r8, [r9], #-2 @ load h[i]
+ LDRSH r12, [r10, #-2] @ load excf[i - 1]
+ MUL r14, r11, r8
+ MOV r8, r14, ASR #15
+ ADD r14, r8, r12
+ STRH r14, [r10], #-2
+ SUBS r6, r6, #1
+ BGT LOOPK
+
+ LDRSH r8, [r9] @ load h[0]
+ MUL r14, r11, r8
+ LDR r6, [r13, #T_MAX] @ get t_max
+ MOV r8, r14, ASR #15
+ STRH r8, [r10]
+
+ CMP r4, r6
+ BLE LOOPFOR
+
+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
new file mode 100644
index 0000000..6416634
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
@@ -0,0 +1,226 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Syn_filt_32(
+@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+@ Word16 m, /* (i) : order of LP filter */
+@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+@ Word16 sig_hi[], /* (o) /16 : synthesis high */
+@ Word16 sig_lo[], /* (o) /16 : synthesis low */
+@ Word16 lg /* (i) : size of filtering */
+@)
+@***************************************************************
+@
+@ a[] --- r0
+@ m --- r1
+@ exc[] --- r2
+@ Qnew --- r3
+@ sig_hi[] --- r4
+@ sig_lo[] --- r5
+@ lg --- r6
+
+ .section .text
+ .global Syn_filt_32_asm
+
+Syn_filt_32_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ LDR r4, [r13, #40] @ get sig_hi[] address
+ LDR r5, [r13, #44] @ get sig_lo[] address
+
+ LDRSH r6, [r0] @ load Aq[0]
+ ADD r7, r3, #4 @ 4 + Q_new
+ MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new)
+
+ LDR r14, =0xffff
+ LDRSH r6, [r0, #2] @ load Aq[1]
+ LDRSH r7, [r0, #4] @ load Aq[2]
+ LDRSH r8, [r0, #6] @ load Aq[3]
+ LDRSH r9, [r0, #8] @ load Aq[4]
+ AND r6, r6, r14
+ AND r8, r8, r14
+ ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1]
+ ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3]
+ STR r10, [r13, #-4]
+ STR r11, [r13, #-8]
+
+ LDRSH r6, [r0, #10] @ load Aq[5]
+ LDRSH r7, [r0, #12] @ load Aq[6]
+ LDRSH r8, [r0, #14] @ load Aq[7]
+ LDRSH r9, [r0, #16] @ load Aq[8]
+ AND r6, r6, r14
+ AND r8, r8, r14
+ ORR r10, r6, r7, LSL #16 @ Aq[6] -- Aq[5]
+ ORR r11, r8, r9, LSL #16 @ Aq[8] -- Aq[7]
+ STR r10, [r13, #-12]
+ STR r11, [r13, #-16]
+
+ LDRSH r6, [r0, #18] @ load Aq[9]
+ LDRSH r7, [r0, #20] @ load Aq[10]
+ LDRSH r8, [r0, #22] @ load Aq[11]
+ LDRSH r9, [r0, #24] @ load Aq[12]
+ AND r6, r6, r14
+ AND r8, r8, r14
+ ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9]
+ ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11]
+ STR r10, [r13, #-20]
+ STR r11, [r13, #-24]
+
+ LDRSH r6, [r0, #26] @ load Aq[13]
+ LDRSH r7, [r0, #28] @ load Aq[14]
+ LDRSH r8, [r0, #30] @ load Aq[15]
+ LDRSH r9, [r0, #32] @ load Aq[16]
+ AND r6, r6, r14
+ AND r8, r8, r14
+ ORR r10, r6, r7, LSL #16 @ Aq[14] -- Aq[13]
+ ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15]
+ STR r10, [r13, #-28]
+ STR r11, [r13, #-32]
+
+ MOV r8, #0 @ i = 0
+
+LOOP:
+ LDRSH r6, [r5, #-2] @ load sig_lo[i-1]
+ LDRSH r7, [r5, #-4] @ load sig_lo[i-2]
+
+ LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
+ LDRSH r9, [r5, #-6] @ load sig_lo[i-3]
+ LDRSH r10, [r5, #-8] @ load sig_lo[i-4]
+
+ SMULBB r12, r6, r11 @ sig_lo[i-1] * Aq[1]
+
+ LDRSH r6, [r5, #-10] @ load sig_lo[i-5]
+ SMLABT r12, r7, r11, r12 @ sig_lo[i-2] * Aq[2]
+ LDR r11, [r13, #-8] @ Aq[4] -- Aq[3]
+ LDRSH r7, [r5, #-12] @ load sig_lo[i-6]
+ SMLABB r12, r9, r11, r12 @ sig_lo[i-3] * Aq[3]
+ LDRSH r9, [r5, #-14] @ load sig_lo[i-7]
+ SMLABT r12, r10, r11, r12 @ sig_lo[i-4] * Aq[4]
+ LDR r11, [r13, #-12] @ Aq[6] -- Aq[5]
+ LDRSH r10, [r5, #-16] @ load sig_lo[i-8]
+ SMLABB r12, r6, r11, r12 @ sig_lo[i-5] * Aq[5]
+ LDRSH r6, [r5, #-18] @ load sig_lo[i-9]
+ SMLABT r12, r7, r11, r12 @ sig_lo[i-6] * Aq[6]
+ LDR r11, [r13, #-16] @ Aq[8] -- Aq[7]
+ LDRSH r7, [r5, #-20] @ load sig_lo[i-10]
+ SMLABB r12, r9, r11, r12 @ sig_lo[i-7] * Aq[7]
+ LDRSH r9, [r5, #-22] @ load sig_lo[i-11]
+ SMLABT r12, r10, r11, r12 @ sig_lo[i-8] * Aq[8]
+ LDR r11, [r13, #-20] @ Aq[10] -- Aq[9]
+ LDRSH r10,[r5, #-24] @ load sig_lo[i-12]
+ SMLABB r12, r6, r11, r12 @ sig_lo[i-9] * Aq[9]
+ LDRSH r6, [r5, #-26] @ load sig_lo[i-13]
+ SMLABT r12, r7, r11, r12 @ sig_lo[i-10] * Aq[10]
+ LDR r11, [r13, #-24] @ Aq[12] -- Aq[11]
+ LDRSH r7, [r5, #-28] @ load sig_lo[i-14]
+ SMLABB r12, r9, r11, r12 @ sig_lo[i-11] * Aq[11]
+ LDRSH r9, [r5, #-30] @ load sig_lo[i-15]
+ SMLABT r12, r10, r11, r12 @ sig_lo[i-12] * Aq[12]
+
+ LDR r11, [r13, #-28] @ Aq[14] -- Aq[13]
+ LDRSH r10, [r5, #-32] @ load sig_lo[i-16]
+ SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13]
+ SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14]
+
+ LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
+ LDRSH r6, [r2],#2 @ load exc[i]
+ SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15]
+ SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16]
+ MUL r7, r6, r3 @ exc[i] * a0
+ RSB r14, r12, #0 @ L_tmp
+ MOV r14, r14, ASR #11 @ L_tmp >>= 11
+ ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1
+
+
+ LDRSH r6, [r4, #-2] @ load sig_hi[i-1]
+ LDRSH r7, [r4, #-4] @ load sig_hi[i-2]
+
+ LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
+ LDRSH r9, [r4, #-6] @ load sig_hi[i-3]
+ LDRSH r10, [r4, #-8] @ load sig_hi[i-4]
+ SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1]
+ LDRSH r6, [r4, #-10] @ load sig_hi[i-5]
+ SMLABT r12, r7, r11, r12 @ sig_hi[i-2] * Aq[2]
+
+ LDR r11, [r13, #-8] @ Aq[4] -- Aq[3]
+ LDRSH r7, [r4, #-12] @ load sig_hi[i-6]
+
+ SMLABB r12, r9, r11, r12 @ sig_hi[i-3] * Aq[3]
+ LDRSH r9, [r4, #-14] @ load sig_hi[i-7]
+
+ SMLABT r12, r10, r11, r12 @ sig_hi[i-4] * Aq[4]
+
+ LDR r11, [r13, #-12] @ Aq[6] -- Aq[5]
+ LDRSH r10, [r4, #-16] @ load sig_hi[i-8]
+
+ SMLABB r12, r6, r11, r12 @ sig_hi[i-5] * Aq[5]
+
+ LDRSH r6, [r4, #-18] @ load sig_hi[i-9]
+ SMLABT r12, r7, r11, r12 @ sig_hi[i-6] * Aq[6]
+
+ LDR r11, [r13, #-16] @ Aq[8] -- Aq[7]
+ LDRSH r7, [r4, #-20] @ load sig_hi[i-10]
+
+ SMLABB r12, r9, r11, r12 @ sig_hi[i-7] * Aq[7]
+
+ LDRSH r9, [r4, #-22] @ load sig_hi[i-11]
+
+ SMLABT r12, r10, r11, r12 @ sig_hi[i-8] * Aq[8]
+
+ LDR r11, [r13, #-20] @ Aq[10] -- Aq[9]
+ LDRSH r10,[r4, #-24] @ load sig_hi[i-12]
+
+ SMLABB r12, r6, r11, r12 @ sig_hi[i-9] * Aq[9]
+ LDRSH r6, [r4, #-26] @ load sig_hi[i-13]
+ SMLABT r12, r7, r11, r12 @ sig_hi[i-10] * Aq[10]
+
+ LDR r11, [r13, #-24] @ Aq[12] -- Aq[11]
+ LDRSH r7, [r4, #-28] @ load sig_hi[i-14]
+ SMLABB r12, r9, r11, r12 @ sig_hi[i-11] * Aq[11]
+ LDRSH r9, [r4, #-30] @ load sig_hi[i-15]
+ SMLABT r12, r10, r11, r12 @ sig_hi[i-12] * Aq[12]
+
+ LDR r11, [r13, #-28] @ Aq[14] -- Aq[13]
+ LDRSH r10, [r4, #-32] @ load sig_hi[i-16]
+ SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13]
+ SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14]
+
+ LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
+ SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15]
+ SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16]
+ ADD r6, r12, r12 @ r12 << 1
+ SUB r14, r14, r6
+ MOV r14, r14, LSL #3 @ L_tmp <<=3
+
+ MOV r7, r14, ASR #16 @ L_tmp >> 16
+
+ MOV r14, r14, ASR #4 @ L_tmp >>=4
+ STRH r7, [r4], #2 @ sig_hi[i] = L_tmp >> 16
+ SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)
+
+ ADD r8, r8, #1
+ STRH r9, [r5], #2
+ CMP r8, #64
+ BLT LOOP
+
+Syn_filt_32_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s
new file mode 100644
index 0000000..0228bda
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s
@@ -0,0 +1,186 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+
+@*void Convolve (
+@* Word16 x[], /* (i) : input vector */
+@* Word16 h[], /* (i) : impulse response */
+@* Word16 y[], /* (o) : output vector */
+@* Word16 L /* (i) : vector size */
+@*)
+@ r0 --- x[]
+@ r1 --- h[]
+@ r2 --- y[]
+@ r3 --- L
+
+ .section .text
+ .global Convolve_asm
+
+Convolve_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r3, #0 @ n
+ MOV r11, #0x8000
+
+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
+
+LOOP1:
+ CMP r5, #0
+ BLE L1
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ LDRSH r12, [r6], #2 @ *tmpX++
+ LDRSH r14, [r4], #-2 @ *tmpH--
+ MLA r8, r9, r10, r8
+ MLA r8, r12, r14, r8
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ 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 LOOP1
+
+L1:
+
+ ADD r5, r11, r8, LSL #1
+ MOV r5, r5, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r5, [r2], #2 @y[n]
+
+
+ ADD r4, r1, r3, LSL #1 @tmpH address
+ ADD r5, r3, #1
+ MOV r6, r0
+ LDRSH r9, [r6], #2 @ *tmpX++
+ 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
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ LDRSH r12, [r6], #2 @ *tmpX++
+ LDRSH r14, [r4], #-2 @ *tmpH--
+ MLA r8, r9, r10, r8
+ MLA r8, r12, r14, r8
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ 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 LOOP2
+
+L2:
+ ADD r8, r11, r8, LSL #1
+ MOV r8, r8, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r8, [r2], #2 @y[n]
+
+ ADD r4, r1, r3, LSL #1
+ ADD r5, r3, #1
+ MOV r6, r0
+ LDRSH r9, [r6], #2
+ LDRSH r10, [r4], #-2
+ LDRSH r12, [r6], #2
+ LDRSH r14, [r4], #-2
+ MUL r8, r9, r10
+ LDRSH r9, [r6], #2
+ LDRSH r10, [r4], #-2
+ MLA r8, r12, r14, r8
+ SUB r5, r5, #3
+ MLA r8, r9, r10, r8
+
+LOOP3:
+ CMP r5, #0
+ BLE L3
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ LDRSH r12, [r6], #2 @ *tmpX++
+ LDRSH r14, [r4], #-2 @ *tmpH--
+ MLA r8, r9, r10, r8
+ MLA r8, r12, r14, r8
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ 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
+
+L3:
+ ADD r8, r11, r8, LSL #1
+ MOV r8, r8, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r8, [r2], #2 @y[n]
+
+ ADD r5, r3, #1 @ i = n + 1
+ ADD r4, r1, r3, LSL #1 @ tmpH address
+ MOV r6, r0
+ MOV r8, #0
+
+LOOP4:
+ CMP r5, #0
+ BLE L4
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ LDRSH r12, [r6], #2 @ *tmpX++
+ LDRSH r14, [r4], #-2 @ *tmpH--
+ MLA r8, r9, r10, r8
+ MLA r8, r12, r14, r8
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4], #-2 @ *tmpH--
+ 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:
+ 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:
+
+ 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
new file mode 100644
index 0000000..441b984
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
@@ -0,0 +1,151 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@static void cor_h_vec_012(
+@ Word16 h[], /* (i) scaled impulse response */
+@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+@ Word16 track, /* (i) track to use */
+@ Word16 sign[], /* (i) sign vector */
+@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+@)
+@r0 ---- h[]
+@r1 ---- vec[]
+@r2 ---- track
+@r3 ---- sign[]
+@r4 ---- rrixix[][NB_POS]
+@r5 ---- cor_1[]
+@r6 ---- cor_2[]
+
+
+ .section .text
+ .global cor_h_vec_012_asm
+
+cor_h_vec_012_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ LDR r4, [r13, #40] @load rrixix[][NB_POS]
+ ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track]
+ MOV r4, #0 @i=0
+
+ @r0 --- h[], r1 --- vec[], r2 --- pos
+ @r3 --- sign[], r4 --- i, r7 --- p0
+LOOPi:
+ MOV r5, #0 @L_sum1 = 0
+ MOV r6, #0 @L_sum2 = 0
+ ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
+ MOV r10, r0 @p1 = h
+ RSB r11, r2, #62 @j=62-pos
+
+LOOPj1:
+ LDRSH r12, [r10], #2
+ LDRSH r8, [r9], #2
+ LDRSH r14, [r9]
+ SUBS r11, r11, #1
+ MLA r5, r12, r8, r5
+ MLA r6, r12, r14, r6
+ BGE LOOPj1
+
+ LDRSH r12, [r10], #2 @*p1++
+ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2)
+ MLA r5, r12, r14, r5
+ MOV r14, #0x8000
+ MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
+ ADD r10, r6, r14
+ ADD r9, r5, r14
+ MOV r5, r9, ASR #16
+ MOV r6, r10, ASR #16
+ ADD r9, r3, r2, LSL #1 @address of sign[pos]
+ ADD r8, r7, #32
+ LDRSH r10, [r9], #2 @sign[pos]
+ LDRSH r11, [r9] @sign[pos + 1]
+ MUL r12, r5, r10
+ MUL r14, r6, r11
+ MOV r5, r12, ASR #15
+ MOV r6, r14, ASR #15
+ LDR r9, [r13, #44]
+ LDR r12, [r13, #48]
+ LDRSH r10, [r7], #2 @*p0++
+ LDRSH r11, [r8] @*p3++
+ ADD r9, r9, r4, LSL #1
+ ADD r12, r12, r4, LSL #1
+ ADD r5, r5, r10
+ ADD r6, r6, r11
+ STRH r5, [r9]
+ STRH r6, [r12]
+
+ ADD r2, r2, #4
+
+ MOV r5, #0 @L_sum1 = 0
+ MOV r6, #0 @L_sum2 = 0
+ ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
+ MOV r10, r0 @p1 = h
+ RSB r11, r2, #62 @j=62-pos
+ ADD r4, r4, #1 @i++
+
+LOOPj2:
+ LDRSH r12, [r10], #2
+ LDRSH r8, [r9], #2
+ LDRSH r14, [r9]
+ SUBS r11, r11, #1
+ MLA r5, r12, r8, r5
+ MLA r6, r12, r14, r6
+ BGE LOOPj2
+
+ LDRSH r12, [r10], #2 @*p1++
+ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2)
+ MLA r5, r12, r14, r5
+ MOV r14, #0x8000
+ MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
+ ADD r10, r6, r14
+ ADD r9, r5, r14
+
+ MOV r5, r9, ASR #16
+ MOV r6, r10, ASR #16
+ ADD r9, r3, r2, LSL #1 @address of sign[pos]
+ ADD r8, r7, #32
+ LDRSH r10, [r9], #2 @sign[pos]
+ LDRSH r11, [r9] @sign[pos + 1]
+ MUL r12, r5, r10
+ MUL r14, r6, r11
+ MOV r5, r12, ASR #15
+ MOV r6, r14, ASR #15
+ LDR r9, [r13, #44]
+ LDR r12, [r13, #48]
+ LDRSH r10, [r7], #2 @*p0++
+ LDRSH r11, [r8] @*p3++
+ ADD r9, r9, r4, LSL #1
+ ADD r12, r12, r4, LSL #1
+ ADD r5, r5, r10
+ ADD r6, r6, r11
+ STRH r5, [r9]
+ STRH r6, [r12]
+ ADD r4, r4, #1 @i+1
+ ADD r2, r2, #4 @pos += STEP
+ CMP r4, #16
+
+ BLT LOOPi
+
+the_end:
+ LDMFD r13!, {r4 - r12, r15}
+
+ @ENDFUNC
+ .END
+
+
+
+
+
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
new file mode 100644
index 0000000..d5dd8f0
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
@@ -0,0 +1,460 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Pred_lt4(
+@ Word16 exc[], /* in/out: excitation buffer */
+@ Word16 T0, /* input : integer pitch lag */
+@ Word16 frac, /* input : fraction of lag */
+@ Word16 L_subfr /* input : subframe size */
+@ )
+
+@******************************
+@ ARM Register
+@******************************
+@ r0 --- exc[]
+@ r1 --- T0
+@ r2 --- frac
+@ r3 --- L_subfr
+
+ .section .text
+ .global pred_lt4_asm
+ .extern inter4_2
+
+pred_lt4_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ RSB r4, r1, #0 @-T0
+ RSB r2, r2, #0 @frac = -frac
+ ADD r5, r0, r4, LSL #1 @x = exc - T0
+ CMP r2, #0
+ ADDLT r2, r2, #4 @frac += UP_SAMP
+ SUBLT r5, r5, #2 @x--
+ SUB r5, r5, #30 @x -= 15
+ RSB r4, r2, #3 @k = 3 - frac
+ LDR r6, Table
+ MOV r8, r4, LSL #6
+ @MOV r7, #0 @j = 0
+ ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0])
+
+ MOV r1, r5
+ MOV r5, #0x8000
+ MOV r14, #21
+@ used register
+ @r0 --- exc[] r1 --- x r7 --- j r8 --- ptr2 r5 --- 0x8000
+THREE_LOOP:
+
+ @MOV r1, r5 @ptr1 = x
+ MOV r2, r8 @ptr = ptr2
+ LDR r3, [r2], #4 @h[0], h[1]
+ LDRSH r4, [r1], #2 @x[0]
+ LDRSH r6, [r1], #2 @x[1]
+ LDRSH r9, [r1], #2 @x[2]
+
+ SMULBB r10, r4, r3 @x[0] * h[0]
+ SMULBB r11, r6, r3 @x[1] * h[0]
+ SMULBB r12, r9, r3 @x[2] * h[0]
+
+ LDRSH r4, [r1], #2 @x[3]
+ SMLABT r10, r6, r3, r10 @x[1] * h[1]
+ SMLABT r11, r9, r3, r11 @x[2] * h[1]
+ SMLABT r12, r4, r3, r12 @x[3] * h[1]
+
+ LDR r3, [r2], #4 @h[2], h[3]
+ LDRSH r6, [r1], #2 @x[4]
+ SMLABB r10, r9, r3, r10 @x[2] * h[2]
+ SMLABB r11, r4, r3, r11 @x[3] * h[2]
+ SMLABB r12, r6, r3, r12 @x[4] * h[2]
+
+ LDRSH r9, [r1], #2 @x[5]
+ SMLABT r10, r4, r3, r10 @x[3] * h[3]
+ SMLABT r11, r6, r3, r11 @x[4] * h[3]
+ SMLABT r12, r9, r3, r12 @x[5] * h[3]
+
+ LDR r3, [r2], #4 @h[4], h[5]
+ LDRSH r4, [r1], #2 @x[6]
+ SMLABB r10, r6, r3, r10 @x[4] * h[4]
+ SMLABB r11, r9, r3, r11 @x[5] * h[4]
+ SMLABB r12, r4, r3, r12 @x[6] * h[4]
+
+ LDRSH r6, [r1], #2 @x[7]
+ SMLABT r10, r9, r3, r10 @x[5] * h[5]
+ SMLABT r11, r4, r3, r11 @x[6] * h[5]
+ SMLABT r12, r6, r3, r12 @x[7] * h[5]
+
+ LDR r3, [r2], #4 @h[6], h[7]
+ LDRSH r9, [r1], #2 @x[8]
+ SMLABB r10, r4, r3, r10 @x[6] * h[6]
+ SMLABB r11, r6, r3, r11 @x[7] * h[6]
+ SMLABB r12, r9, r3, r12 @x[8] * h[6]
+
+ LDRSH r4, [r1], #2 @x[9]
+ SMLABT r10, r6, r3, r10 @x[7] * h[7]
+ SMLABT r11, r9, r3, r11 @x[8] * h[7]
+ SMLABT r12, r4, r3, r12 @x[9] * h[7]
+
+ LDR r3, [r2], #4 @h[8], h[9]
+ LDRSH r6, [r1], #2 @x[10]
+ SMLABB r10, r9, r3, r10 @x[8] * h[8]
+ SMLABB r11, r4, r3, r11 @x[9] * h[8]
+ SMLABB r12, r6, r3, r12 @x[10] * h[8]
+
+ LDRSH r9, [r1], #2 @x[11]
+ SMLABT r10, r4, r3, r10 @x[9] * h[9]
+ SMLABT r11, r6, r3, r11 @x[10] * h[9]
+ SMLABT r12, r9, r3, r12 @x[11] * h[9]
+
+ LDR r3, [r2], #4 @h[10], h[11]
+ LDRSH r4, [r1], #2 @x[12]
+ SMLABB r10, r6, r3, r10 @x[10] * h[10]
+ SMLABB r11, r9, r3, r11 @x[11] * h[10]
+ SMLABB r12, r4, r3, r12 @x[12] * h[10]
+
+ LDRSH r6, [r1], #2 @x[13]
+ SMLABT r10, r9, r3, r10 @x[11] * h[11]
+ SMLABT r11, r4, r3, r11 @x[12] * h[11]
+ SMLABT r12, r6, r3, r12 @x[13] * h[11]
+
+ LDR r3, [r2], #4 @h[12], h[13]
+ LDRSH r9, [r1], #2 @x[14]
+ SMLABB r10, r4, r3, r10 @x[12] * h[12]
+ SMLABB r11, r6, r3, r11 @x[13] * h[12]
+ SMLABB r12, r9, r3, r12 @x[14] * h[12]
+
+ LDRSH r4, [r1], #2 @x[15]
+ SMLABT r10, r6, r3, r10 @x[13] * h[13]
+ SMLABT r11, r9, r3, r11 @x[14] * h[13]
+ SMLABT r12, r4, r3, r12 @x[15] * h[13]
+
+ LDR r3, [r2], #4 @h[14], h[15]
+ LDRSH r6, [r1], #2 @x[16]
+ SMLABB r10, r9, r3, r10 @x[14] * h[14]
+ SMLABB r11, r4, r3, r11 @x[15] * h[14]
+ SMLABB r12, r6, r3, r12 @x[16] * h[14]
+
+ LDRSH r9, [r1], #2 @x[17]
+ SMLABT r10, r4, r3, r10 @x[15] * h[15]
+ SMLABT r11, r6, r3, r11 @x[16] * h[15]
+ SMLABT r12, r9, r3, r12 @x[17] * h[15]
+
+ LDR r3, [r2], #4 @h[16], h[17]
+ LDRSH r4, [r1], #2 @x[18]
+ SMLABB r10, r6, r3, r10 @x[16] * h[16]
+ SMLABB r11, r9, r3, r11 @x[17] * h[16]
+ SMLABB r12, r4, r3, r12 @x[18] * h[16]
+
+ LDRSH r6, [r1], #2 @x[19]
+ SMLABT r10, r9, r3, r10 @x[17] * h[17]
+ SMLABT r11, r4, r3, r11 @x[18] * h[17]
+ SMLABT r12, r6, r3, r12 @x[19] * h[17]
+
+ LDR r3, [r2], #4 @h[18], h[19]
+ LDRSH r9, [r1], #2 @x[20]
+ SMLABB r10, r4, r3, r10 @x[18] * h[18]
+ SMLABB r11, r6, r3, r11 @x[19] * h[18]
+ SMLABB r12, r9, r3, r12 @x[20] * h[18]
+
+ LDRSH r4, [r1], #2 @x[21]
+ SMLABT r10, r6, r3, r10 @x[19] * h[19]
+ SMLABT r11, r9, r3, r11 @x[20] * h[19]
+ SMLABT r12, r4, r3, r12 @x[21] * h[19]
+
+ LDR r3, [r2], #4 @h[20], h[21]
+ LDRSH r6, [r1], #2 @x[22]
+ SMLABB r10, r9, r3, r10 @x[20] * h[20]
+ SMLABB r11, r4, r3, r11 @x[21] * h[20]
+ SMLABB r12, r6, r3, r12 @x[22] * h[20]
+
+ LDRSH r9, [r1], #2 @x[23]
+ SMLABT r10, r4, r3, r10 @x[21] * h[21]
+ SMLABT r11, r6, r3, r11 @x[22] * h[21]
+ SMLABT r12, r9, r3, r12 @x[23] * h[21]
+
+ LDR r3, [r2], #4 @h[22], h[23]
+ LDRSH r4, [r1], #2 @x[24]
+ SMLABB r10, r6, r3, r10 @x[22] * h[22]
+ SMLABB r11, r9, r3, r11 @x[23] * h[22]
+ SMLABB r12, r4, r3, r12 @x[24] * h[22]
+
+ LDRSH r6, [r1], #2 @x[25]
+ SMLABT r10, r9, r3, r10 @x[23] * h[23]
+ SMLABT r11, r4, r3, r11 @x[24] * h[23]
+ SMLABT r12, r6, r3, r12 @x[25] * h[23]
+
+ LDR r3, [r2], #4 @h[24], h[25]
+ LDRSH r9, [r1], #2 @x[26]
+ SMLABB r10, r4, r3, r10 @x[24] * h[24]
+ SMLABB r11, r6, r3, r11 @x[25] * h[24]
+ SMLABB r12, r9, r3, r12 @x[26] * h[24]
+
+ LDRSH r4, [r1], #2 @x[27]
+ SMLABT r10, r6, r3, r10 @x[25] * h[25]
+ SMLABT r11, r9, r3, r11 @x[26] * h[25]
+ SMLABT r12, r4, r3, r12 @x[27] * h[25]
+
+ LDR r3, [r2], #4 @h[26], h[27]
+ LDRSH r6, [r1], #2 @x[28]
+ SMLABB r10, r9, r3, r10 @x[26] * h[26]
+ SMLABB r11, r4, r3, r11 @x[27] * h[26]
+ SMLABB r12, r6, r3, r12 @x[28] * h[26]
+
+ LDRSH r9, [r1], #2 @x[29]
+ SMLABT r10, r4, r3, r10 @x[27] * h[27]
+ SMLABT r11, r6, r3, r11 @x[28] * h[27]
+ SMLABT r12, r9, r3, r12 @x[29] * h[27]
+
+ LDR r3, [r2], #4 @h[28], h[29]
+ LDRSH r4, [r1], #2 @x[30]
+ SMLABB r10, r6, r3, r10 @x[28] * h[28]
+ SMLABB r11, r9, r3, r11 @x[29] * h[28]
+ SMLABB r12, r4, r3, r12 @x[30] * h[28]
+
+ LDRSH r6, [r1], #2 @x[31]
+ SMLABT r10, r9, r3, r10 @x[29] * h[29]
+ SMLABT r11, r4, r3, r11 @x[30] * h[29]
+ SMLABT r12, r6, r3, r12 @x[31] * h[29]
+
+ LDR r3, [r2], #4 @h[30], h[31]
+ LDRSH r9, [r1], #2 @x[32]
+ SMLABB r10, r4, r3, r10 @x[30] * h[30]
+ SMLABB r11, r6, r3, r11 @x[31] * h[30]
+ SMLABB r12, r9, r3, r12 @x[32] * h[30]
+
+ LDRSH r4, [r1], #-60 @x[33]
+ SMLABT r10, r6, r3, r10 @x[31] * h[31]
+ SMLABT r11, r9, r3, r11 @x[32] * h[31]
+ SMLABT r12, r4, r3, r12 @x[33] * h[31]
+
+ @SSAT r10, #32, r10, LSL #2
+ @SSAT r11, #32, r11, LSL #2
+ @SSAT r12, #32, r12, LSL #2
+
+ MOV r10, r10, LSL #1
+ MOV r11, r11, LSL #1
+ MOV r12, r12, LSL #1
+
+ QADD r10, r10, r10
+ QADD r11, r11, r11
+ QADD r12, r12, r12
+
+ QADD r10, r10, r5
+ QADD r11, r11, r5
+ QADD r12, r12, r5
+
+ SUBS r14, r14, #1
+
+ MOV r10, r10, ASR #16
+ MOV r11, r11, ASR #16
+ MOV r12, r12, ASR #16
+
+ STRH r10, [r0], #2
+ STRH r11, [r0], #2
+ STRH r12, [r0], #2
+ BNE THREE_LOOP
+
+ MOV r2, r8 @ptr = ptr2
+
+Last2LOOP:
+
+ LDR r3, [r2], #4 @h[0], h[1]
+ LDRSH r4, [r1], #2 @x[0]
+ LDRSH r6, [r1], #2 @x[1]
+ LDRSH r9, [r1], #2 @x[2]
+
+ SMULBB r10, r4, r3 @x[0] * h[0]
+ SMULBB r11, r6, r3 @x[1] * h[0]
+
+ SMLABT r10, r6, r3, r10 @x[1] * h[1]
+ SMLABT r11, r9, r3, r11 @x[2] * h[1]
+
+ LDR r3, [r2], #4 @h[2], h[3]
+ LDRSH r4, [r1], #2 @x[3]
+ LDRSH r6, [r1], #2 @x[4]
+
+ SMLABB r10, r9, r3, r10 @x[2] * h[2]
+ SMLABB r11, r4, r3, r11 @x[3] * h[2]
+
+ SMLABT r10, r4, r3, r10 @x[3] * h[3]
+ SMLABT r11, r6, r3, r11 @x[4] * h[3]
+
+ LDR r3, [r2], #4 @h[4], h[5]
+ LDRSH r9, [r1], #2 @x[5]
+ LDRSH r4, [r1], #2 @x[6]
+
+ SMLABB r10, r6, r3, r10 @x[4] * h[4]
+ SMLABB r11, r9, r3, r11 @x[5] * h[4]
+
+ SMLABT r10, r9, r3, r10 @x[5] * h[5]
+ SMLABT r11, r4, r3, r11 @x[6] * h[5]
+
+ LDR r3, [r2], #4 @h[6], h[7]
+ LDRSH r6, [r1], #2 @x[7]
+ LDRSH r9, [r1], #2 @x[8]
+
+ SMLABB r10, r4, r3, r10 @x[6] * h[6]
+ SMLABB r11, r6, r3, r11 @x[7] * h[6]
+
+ SMLABT r10, r6, r3, r10 @x[7] * h[7]
+ SMLABT r11, r9, r3, r11 @x[8] * h[7]
+
+ LDR r3, [r2], #4 @h[8], h[9]
+ LDRSH r4, [r1], #2 @x[9]
+ LDRSH r6, [r1], #2 @x[10]
+
+ SMLABB r10, r9, r3, r10 @x[8] * h[8]
+ SMLABB r11, r4, r3, r11 @x[9] * h[8]
+
+ SMLABT r10, r4, r3, r10 @x[9] * h[9]
+ SMLABT r11, r6, r3, r11 @x[10] * h[9]
+
+ LDR r3, [r2], #4 @h[10], h[11]
+ LDRSH r9, [r1], #2 @x[11]
+ LDRSH r4, [r1], #2 @x[12]
+
+ SMLABB r10, r6, r3, r10 @x[10] * h[10]
+ SMLABB r11, r9, r3, r11 @x[11] * h[10]
+
+ SMLABT r10, r9, r3, r10 @x[11] * h[11]
+ SMLABT r11, r4, r3, r11 @x[12] * h[11]
+
+ LDR r3, [r2], #4 @h[12], h[13]
+ LDRSH r6, [r1], #2 @x[13]
+ LDRSH r9, [r1], #2 @x[14]
+
+ SMLABB r10, r4, r3, r10 @x[12] * h[12]
+ SMLABB r11, r6, r3, r11 @x[13] * h[12]
+
+ SMLABT r10, r6, r3, r10 @x[13] * h[13]
+ SMLABT r11, r9, r3, r11 @x[14] * h[13]
+
+ LDR r3, [r2], #4 @h[14], h[15]
+ LDRSH r4, [r1], #2 @x[15]
+ LDRSH r6, [r1], #2 @x[16]
+
+ SMLABB r10, r9, r3, r10 @x[14] * h[14]
+ SMLABB r11, r4, r3, r11 @x[15] * h[14]
+
+ SMLABT r10, r4, r3, r10 @x[15] * h[15]
+ SMLABT r11, r6, r3, r11 @x[16] * h[15]
+
+ LDR r3, [r2], #4 @h[16], h[17]
+ LDRSH r9, [r1], #2 @x[17]
+ LDRSH r4, [r1], #2 @x[18]
+
+ SMLABB r10, r6, r3, r10 @x[16] * h[16]
+ SMLABB r11, r9, r3, r11 @x[17] * h[16]
+
+ SMLABT r10, r9, r3, r10 @x[17] * h[17]
+ SMLABT r11, r4, r3, r11 @x[18] * h[17]
+
+ LDR r3, [r2], #4 @h[18], h[19]
+ LDRSH r6, [r1], #2 @x[19]
+ LDRSH r9, [r1], #2 @x[20]
+
+ SMLABB r10, r4, r3, r10 @x[18] * h[18]
+ SMLABB r11, r6, r3, r11 @x[19] * h[18]
+
+ SMLABT r10, r6, r3, r10 @x[19] * h[19]
+ SMLABT r11, r9, r3, r11 @x[20] * h[19]
+
+ LDR r3, [r2], #4 @h[20], h[21]
+ LDRSH r4, [r1], #2 @x[21]
+ LDRSH r6, [r1], #2 @x[22]
+
+ SMLABB r10, r9, r3, r10 @x[20] * h[20]
+ SMLABB r11, r4, r3, r11 @x[21] * h[20]
+
+ SMLABT r10, r4, r3, r10 @x[21] * h[21]
+ SMLABT r11, r6, r3, r11 @x[22] * h[21]
+
+ LDR r3, [r2], #4 @h[22], h[23]
+ LDRSH r9, [r1], #2 @x[23]
+ LDRSH r4, [r1], #2 @x[24]
+
+ SMLABB r10, r6, r3, r10 @x[22] * h[22]
+ SMLABB r11, r9, r3, r11 @x[23] * h[22]
+
+ SMLABT r10, r9, r3, r10 @x[23] * h[23]
+ SMLABT r11, r4, r3, r11 @x[24] * h[23]
+
+ LDR r3, [r2], #4 @h[24], h[25]
+ LDRSH r6, [r1], #2 @x[25]
+ LDRSH r9, [r1], #2 @x[26]
+
+ SMLABB r10, r4, r3, r10 @x[24] * h[24]
+ SMLABB r11, r6, r3, r11 @x[25] * h[24]
+
+ SMLABT r10, r6, r3, r10 @x[25] * h[25]
+ SMLABT r11, r9, r3, r11 @x[26] * h[25]
+
+ LDR r3, [r2], #4 @h[26], h[27]
+ LDRSH r4, [r1], #2 @x[27]
+ LDRSH r6, [r1], #2 @x[28]
+
+ SMLABB r10, r9, r3, r10 @x[26] * h[26]
+ SMLABB r11, r4, r3, r11 @x[27] * h[26]
+
+ SMLABT r10, r4, r3, r10 @x[27] * h[27]
+ SMLABT r11, r6, r3, r11 @x[28] * h[27]
+
+ LDR r3, [r2], #4 @h[28], h[29]
+ LDRSH r9, [r1], #2 @x[29]
+ LDRSH r4, [r1], #2 @x[30]
+
+ SMLABB r10, r6, r3, r10 @x[28] * h[28]
+ SMLABB r11, r9, r3, r11 @x[29] * h[28]
+
+ SMLABT r10, r9, r3, r10 @x[29] * h[29]
+ SMLABT r11, r4, r3, r11 @x[30] * h[29]
+
+ LDR r3, [r2], #4 @h[30], h[31]
+ LDRSH r6, [r1], #2 @x[31]
+ LDRSH r9, [r1], #2 @x[32]
+
+ SMLABB r10, r4, r3, r10 @x[30] * h[30]
+ SMLABB r11, r6, r3, r11 @x[31] * h[30]
+
+ SMLABT r10, r6, r3, r10 @x[31] * h[31]
+ SMLABT r11, r9, r3, r11 @x[32] * h[31]
+
+ @SSAT r10, #32, r10, LSL #2
+ @SSAT r11, #32, r11, LSL #2
+ MOV r10, r10, LSL #1
+ MOV r11, r11, LSL #1
+
+ QADD r10, r10, r10
+ QADD r11, r11, r11
+
+ QADD r10, r10, r5
+ QADD r11, r11, r5
+
+ MOV r10, r10, ASR #16
+ MOV r11, r11, ASR #16
+
+ STRH r10, [r0], #2
+ STRH r11, [r0], #2
+
+
+pred_lt4_end:
+ LDMFD r13!, {r4 - r12, r15}
+
+Table:
+ .word inter4_2
+ @ENDFUNC
+ .END
+
+
+
+
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
new file mode 100644
index 0000000..060d9c7
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
@@ -0,0 +1,228 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Residu(
+@ Word16 a[], /* (i) Q12 : prediction coefficients */
+@ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+@ Word16 y[], /* (o) x2 : residual signal */
+@ Word16 lg /* (i) : size of filtering */
+@ )
+@a[] --- r0
+@x[] --- r1
+@y[] --- r2
+@lg --- r3
+
+ .section .text
+ .global Residu_opt
+
+Residu_opt:
+
+ STMFD r13!, {r4 - r12, r14}
+
+ LDRH r5, [r0], #2
+ LDRH r6, [r0], #2
+ ORR r5, r6, r5, LSL #16 @r5 --- a0, a1
+
+ LDRH r6, [r0], #2
+ LDRH r7, [r0], #2
+ ORR r6, r7, r6, LSL #16 @r6 --- a2, a3
+
+ LDRH r7, [r0], #2
+ LDRH r8, [r0], #2
+ ORR r7, r8, r7, LSL #16 @r7 --- a4, a5
+
+ LDRH r8, [r0], #2
+ LDRH r9, [r0], #2
+ ORR r8, r9, r8, LSL #16 @r8 --- a6, a7
+
+ LDRH r9, [r0], #2
+ LDRH r10, [r0], #2
+ ORR r9, r10, r9, LSL #16 @r9 --- a8, a9
+
+ LDRH r10, [r0], #2
+ LDRH r11, [r0], #2
+ ORR r10, r11, r10, LSL #16 @r10 --- a10, a11
+
+ LDRH r11, [r0], #2
+ LDRH r12, [r0], #2
+ ORR r11, r12, r11, LSL #16 @r11 --- a12, a13
+
+ LDRH r12, [r0], #2
+ LDRH r4, [r0], #2
+ ORR r12, r4, r12, LSL #16 @r12 --- a14, a15
+
+
+ STMFD r13!, {r8 - r12} @store r8-r12
+ LDRH r4, [r0], #2 @load a16
+ MOV r14, r3, ASR #2 @one loop get 4 outputs
+ ADD r1, r1, #4
+ MOV r0, r2
+ ORR r14, r4, r14, LSL #16 @r14 --- loopnum, a16
+
+residu_loop:
+
+ LDR r10, [r1], #-4 @r10 --- x[3], x[2]
+ LDR r2, [r1], #-4 @r2 --- x[1], x[0]
+
+ SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0
+ SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0
+ SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0
+ SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0
+
+ SMLABB r4, r5, r2, r4 @i2(1) --- r4 += x[0] * a1
+ SMLABT r11, r5, r2, r11 @i3(1) --- r11 += x[1] * a0
+ SMLABB r12, r5, r10, r12 @i4(1) --- r12 += x[2] * a1
+
+ SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2
+ SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2
+ SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3
+
+ LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2]
+
+ SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1
+ SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2
+ SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3
+ SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4
+ SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2
+
+ SMLABB r4, r6, r2, r4 @ i2 (3)
+ SMLATB r11,r7, r2, r11 @ i3 (4)
+ SMLABB r12,r7, r2, r12 @ i4 (5)
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r6, r2, r3 @ i1 (3)
+ SMLATT r4, r7, r2, r4 @ i2 (4)
+ SMLABT r11,r7, r2, r11 @ i3 (5)
+ SMLATT r12,r8, r2, r12 @ i4 (6)
+ SMLATB r3, r7, r2, r3 @ i1 (4)
+ SMLABB r4, r7, r2, r4 @ i2 (5)
+ SMLATB r11,r8, r2, r11 @ i3 (6)
+ SMLABB r12,r8, r2, r12 @ i4 (7)
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r7, r2, r3 @ i1 (5)
+ SMLATT r4, r8, r2, r4 @ i2 (6)
+ SMLABT r11,r8, r2, r11 @ i3 (7)
+ SMLATT r12,r9, r2, r12 @ i4 (8)
+ SMLATB r3, r8, r2, r3 @ i1 (6)
+ SMLABB r4, r8, r2, r4 @ i2 (7)
+ SMLATB r11,r9, r2, r11 @ i3 (8)
+ SMLABB r12,r9, r2, r12 @ i4 (9)
+ LDR r10, [r13, #8] @ [ a10 | a11]
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r8, r2, r3 @ i1 (7)
+ SMLATT r4, r9, r2, r4 @ i2 (8)
+ SMLABT r11,r9, r2, r11 @ i3 (9)
+ SMLATT r12,r10, r2, r12 @ i4 (10)
+ SMLATB r3, r9, r2, r3 @ i1 (8)
+ SMLABB r4, r9, r2, r4 @ i2 (9)
+ SMLATB r11,r10, r2, r11 @ i3 (10)
+ SMLABB r12,r10, r2, r12 @ i4 (11)
+ LDR r8, [r13, #12] @ [ a12 | a13 ]
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r9, r2, r3 @ i1 (9)
+ SMLATT r4, r10, r2, r4 @ i2 (10)
+ SMLABT r11,r10, r2, r11 @ i3 (11)
+ SMLATT r12,r8, r2, r12 @ i4 (12)
+ SMLATB r3, r10, r2, r3 @ i1 (10)
+ SMLABB r4, r10, r2, r4 @ i2 (11)
+ SMLATB r11,r8, r2, r11 @ i3 (12)
+ SMLABB r12,r8, r2, r12 @ i4 (13)
+ LDR r9, [r13, #16] @ [ a14 | a15 ]
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r10, r2, r3 @ i1 (11)
+ SMLATT r4, r8, r2, r4 @ i2 (12)
+ SMLABT r11,r8, r2, r11 @ i3 (13)
+ SMLATT r12,r9, r2, r12 @ i4 (14)
+ SMLATB r3, r8, r2, r3 @ i1 (12)
+ SMLABB r4, r8, r2, r4 @ i2 (13)
+ SMLATB r11,r9, r2, r11 @ i3 (14)
+ SMLABB r12,r9, r2, r12 @ i4 (15)
+
+
+ LDR r2,[r1],#-4
+ SMLABT r3, r8, r2, r3 @ i1 (13)
+ SMLATT r4, r9, r2, r4 @ i2 (14)
+ SMLABT r11,r9, r2, r11 @ i3 (15)
+ SMLABT r12,r14, r2, r12 @ i4 (16)
+ SMLATB r3, r9, r2, r3 @ i1 (14)
+ SMLABB r4, r9, r2, r4 @ i2 (15)
+ SMLABB r11,r14, r2, r11 @ i3 (16)
+ LDR r8, [r13] @ [ a6 | a7 ]
+
+ LDR r2,[r1],#44 @ Change
+ SMLABT r3, r9, r2, r3
+ SMLABB r3, r14, r2, r3
+ SMLABT r4, r14, r2, r4
+ LDR r9, [r13, #4] @ [ a8 | a9 ]
+
+
+ QADD r3,r3,r3
+ QADD r4,r4,r4
+ QADD r11,r11,r11
+ QADD r12,r12,r12
+
+ QADD r3,r3,r3
+ QADD r4,r4,r4
+ QADD r11,r11,r11
+ QADD r12,r12,r12
+
+ QADD r3,r3,r3
+ QADD r4,r4,r4
+ QADD r11,r11,r11
+ QADD r12,r12,r12
+
+ QADD r3,r3,r3
+ QADD r4,r4,r4
+ QADD r11,r11,r11
+ QADD r12,r12,r12
+
+ MOV r2,#32768
+
+ QDADD r3,r2,r3
+ QDADD r4,r2,r4
+ QDADD r11,r2,r11
+ QDADD r12,r2,r12
+
+
+ MOV r3,r3,asr #16
+ MOV r4,r4,asr #16
+ MOV r11,r11,asr #16
+ MOV r12,r12,asr #16
+
+ STRH r3,[r0],#2
+ STRH r4,[r0],#2
+ STRH r11,[r0],#2
+ STRH r12,[r0],#2
+
+ MOV r2,r14,asr #16
+ SUB r14, r14, #0x10000
+ SUBS r2,r2,#1
+ BNE residu_loop
+end:
+ LDMFD r13!, {r8 -r12}
+ LDMFD r13!, {r4 -r12,pc}
+
+ @ENDFUNC
+ .END
+
+
+
+
+
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
new file mode 100644
index 0000000..aa9f464
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
@@ -0,0 +1,75 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Scale_sig(
+@ Word16 x[], /* (i/o) : signal to scale */
+@ Word16 lg, /* (i) : size of x[] */
+@ Word16 exp /* (i) : exponent: x = round(x << exp) */
+@ )
+@
+@r0 --- x[]
+@r1 --- lg
+@r2 --- exp
+
+ .section .text
+ .global Scale_sig_opt
+
+Scale_sig_opt:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r3, r1, #1 @i = lg - 1
+ CMP r2, #0 @Compare exp and 0
+ RSB r7, r2, #0 @exp = -exp
+ ADD r10, r2, #16 @16 + exp
+ ADD r4, r0, r3, LSL #1 @x[i] address
+ MOV r8, #0x7fffffff
+ MOV r9, #0x8000
+ BLE LOOP2
+
+LOOP1:
+
+ LDRSH r5, [r4] @load x[i]
+ MOV r12, r5, LSL r10
+ TEQ r5, r12, ASR r10
+ EORNE r12, r8, r5, ASR #31
+ SUBS r3, r3, #1
+ QADD r11, r12, r9
+ MOV r12, r11, ASR #16
+ STRH r12, [r4], #-2
+ BGE LOOP1
+ BL The_end
+
+LOOP2:
+
+ LDRSH r5, [r4] @load x[i]
+ MOV r6, r5, LSL #16 @L_tmp = x[i] << 16
+ MOV r5, r6, ASR r7 @L_tmp >>= exp
+ QADD r11, r5, r9
+ MOV r12, r11, ASR #16
+ SUBS r3, r3, #1
+ STRH r12, [r4], #-2
+ BGE LOOP2
+
+The_end:
+ LDMFD r13!, {r4 - r12, r15}
+
+ @ENDFUNC
+ .END
+
+
+
+
+
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
new file mode 100644
index 0000000..e05e9e0
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
@@ -0,0 +1,238 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@**********************************************************************/
+@void Syn_filt(
+@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+@ Word16 x[], /* (i) : input signal */
+@ Word16 y[], /* (o) : output signal */
+@ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+@)
+@***********************************************************************
+@ a[] --- r0
+@ x[] --- r1
+@ y[] --- r2
+@ mem[] --- r3
+@ m --- 16 lg --- 80 update --- 1
+
+ .section .text
+ .global Syn_filt_asm
+ .extern voAWB_Copy
+
+Syn_filt_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
+
+ MOV r4, r3 @ copy mem[] address
+ MOV r5, r13 @ copy yy = y_buf address
+
+ @ for(i = 0@ i < m@ i++)
+ @{
+ @ *yy++ = mem[i]@
+ @}
+
+ LDRH r6, [r4], #2
+ LDRH r7, [r4], #2
+ LDRH r8, [r4], #2
+ LDRH r9, [r4], #2
+ LDRH r10, [r4], #2
+ LDRH r11, [r4], #2
+ LDRH r12, [r4], #2
+ LDRH r14, [r4], #2
+
+ STRH r6, [r5], #2
+ STRH r7, [r5], #2
+ STRH r8, [r5], #2
+ STRH r9, [r5], #2
+ STRH r10, [r5], #2
+ STRH r11, [r5], #2
+ STRH r12, [r5], #2
+ STRH r14, [r5], #2
+
+ LDRH r6, [r4], #2
+ LDRH r7, [r4], #2
+ LDRH r8, [r4], #2
+ LDRH r9, [r4], #2
+ LDRH r10, [r4], #2
+ LDRH r11, [r4], #2
+ LDRH r12, [r4], #2
+ LDRH r14, [r4], #2
+
+ STRH r6, [r5], #2
+ STRH r7, [r5], #2
+ STRH r8, [r5], #2
+ STRH r9, [r5], #2
+ STRH r10, [r5], #2
+ STRH r11, [r5], #2
+ STRH r12, [r5], #2
+ STRH r14, [r5], #2
+
+ LDRSH r5, [r0] @ load a[0]
+ MOV r8, #0 @ i = 0
+ MOV r5, r5, ASR #1 @ a0 = a[0] >> 1
+ @MOV r4, r13
+ @ load all a[]
+
+ LDR r14, =0xffff
+ LDRSH r6, [r0, #2] @ load a[1]
+ LDRSH r7, [r0, #4] @ load a[2]
+ LDRSH r9, [r0, #6] @ load a[3]
+ LDRSH r11,[r0, #8] @ load a[4]
+ AND r6, r6, r14
+ AND r9, r9, r14
+ ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
+ ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
+ STR r10, [r13, #-4]
+ STR r12, [r13, #-8]
+
+ LDRSH r6, [r0, #10] @ load a[5]
+ LDRSH r7, [r0, #12] @ load a[6]
+ LDRSH r9, [r0, #14] @ load a[7]
+ LDRSH r11,[r0, #16] @ load a[8]
+ AND r6, r6, r14
+ AND r9, r9, r14
+ ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
+ ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
+ STR r10, [r13, #-12]
+ STR r12, [r13, #-16]
+
+ LDRSH r6, [r0, #18] @ load a[9]
+ LDRSH r7, [r0, #20] @ load a[10]
+ LDRSH r9, [r0, #22] @ load a[11]
+ LDRSH r11,[r0, #24] @ load a[12]
+ AND r6, r6, r14
+ AND r9, r9, r14
+ ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
+ ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
+ STR r10, [r13, #-20]
+ STR r12, [r13, #-24]
+
+ LDRSH r6, [r0, #26] @ load a[13]
+ LDRSH r7, [r0, #28] @ load a[14]
+ LDRSH r9, [r0, #30] @ load a[15]
+ LDRSH r11,[r0, #32] @ load a[16]
+ AND r6, r6, r14
+ AND r9, r9, r14
+ ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
+ ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
+ STR r10, [r13, #-28]
+ STR r12, [r13, #-32]
+
+ ADD r4, r13, #32
+LOOP:
+ LDRSH r6, [r1], #2 @ load x[i]
+ ADD r10, r4, r8, LSL #1 @ temp_p = yy + i
+
+ MUL r0, r5, r6 @ L_tmp = x[i] * a0
+ @ for(j = 1@ j <= m, j+=8)
+ LDR r7, [r13, #-4] @ -a[2] -a[1]
+ LDRSH r9, [r10, #-2] @ *(temp_p - 1)
+ LDRSH r12, [r10, #-4] @ *(temp_p - 2)
+
+
+ SMULBB r14, r9, r7 @ -a[1] * (*(temp_p -1))
+
+ LDRSH r6, [r10, #-6] @ *(temp_p - 3)
+
+ SMLABT r14, r12, r7, r14 @ -a[2] * (*(temp_p - 2))
+
+ LDR r7, [r13, #-8] @ -a[4] -a[3]
+ LDRSH r11, [r10, #-8] @ *(temp_p - 4)
+
+ SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
+
+ LDRSH r9, [r10, #-10] @ *(temp_p - 5)
+
+ SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4))
+
+ LDR r7, [r13, #-12] @ -a[6] -a[5]
+ LDRSH r12, [r10, #-12] @ *(temp_p - 6)
+
+ SMLABB r14, r9, r7, r14 @ -a[5] * (*(temp_p -5))
+
+ LDRSH r6, [r10, #-14] @ *(temp_p - 7)
+
+ SMLABT r14, r12, r7, r14 @ -a[6] * (*(temp_p - 6))
+
+ LDR r7, [r13, #-16] @ -a[8] -a[7]
+ LDRSH r11, [r10, #-16] @ *(temp_p - 8)
+
+ SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
+
+ LDRSH r9, [r10, #-18] @ *(temp_p - 9)
+
+ SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8))
+
+ LDR r7, [r13, #-20] @ -a[10] -a[9]
+ LDRSH r12, [r10, #-20] @ *(temp_p - 10)
+
+ SMLABB r14, r9, r7, r14 @ -a[9] * (*(temp_p -9))
+
+ LDRSH r6, [r10, #-22] @ *(temp_p - 11)
+
+ SMLABT r14, r12, r7, r14 @ -a[10] * (*(temp_p - 10))
+
+ LDR r7, [r13, #-24] @ -a[12] -a[11]
+ LDRSH r11, [r10, #-24] @ *(temp_p - 12)
+
+ SMLABB r14, r6, r7, r14 @ -a[11] * (*(temp_p -11))
+
+ LDRSH r9, [r10, #-26] @ *(temp_p - 13)
+
+ SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12))
+
+ LDR r7, [r13, #-28] @ -a[14] -a[13]
+ LDRSH r12, [r10, #-28] @ *(temp_p - 14)
+
+ SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
+
+ LDRSH r6, [r10, #-30] @ *(temp_p - 15)
+
+ SMLABT r14, r12, r7, r14 @ -a[14] * (*(temp_p - 14))
+
+ LDR r7, [r13, #-32] @ -a[16] -a[15]
+ LDRSH r11, [r10, #-32] @ *(temp_p - 16)
+
+ SMLABB r14, r6, r7, r14 @ -a[15] * (*(temp_p -15))
+
+ SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
+
+ RSB r14, r14, r0
+
+ MOV r7, r14, LSL #4 @ L_tmp <<=4
+ ADD r8, r8, #1
+ ADD r14, r7, #0x8000
+ MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
+ CMP r8, #80
+ STRH r7, [r10] @ yy[i]
+ STRH r7, [r2], #2 @ y[i]
+ BLT LOOP
+
+ @ update mem[]
+ ADD r5, r13, #160 @ yy[64] address
+ MOV r1, r3
+ MOV r0, r5
+ MOV r2, #16
+ BL voAWB_Copy
+
+Syn_filt_asm_end:
+
+ ADD r13, r13, #700
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
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
new file mode 100644
index 0000000..acb60c3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
@@ -0,0 +1,102 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Deemph_32(
+@ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+@ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+@ Word16 y[], /* (o) : output signal (x16) */
+@ Word16 mu, /* (i) Q15 : deemphasis factor */
+@ Word16 L, /* (i) : vector size */
+@ Word16 * mem /* (i/o) : memory (y[-1]) */
+@ )
+
+@x_hi RN R0
+@x_lo RN R1
+@y[] RN R2
+@*mem RN R3
+
+ .section .text
+ .global Deemph_32_asm
+
+Deemph_32_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r4, #2 @i=0
+ LDRSH r6, [r0], #2 @load x_hi[0]
+ LDRSH r7, [r1], #2 @load x_lo[0]
+ LDR r5, =22282 @r5---mu
+ MOV r11, #0x8000
+
+ @y[0]
+ MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16
+ MOV r8, r5, ASR #1 @fac = mu >> 1
+ LDR r5, [r3]
+ ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
+ MOV r10, r12, LSL #3 @L_tmp <<= 3
+ MUL r9, r5, r8
+ LDRSH r6, [r0], #2 @load x_hi[1]
+ QDADD r10, r10, r9
+ LDRSH r7, [r1], #2 @load x_lo[1]
+ MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
+ QADD r10, r12, r11
+ MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
+
+
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ STRH r14, [r2], #2 @update y[0]
+ MOV r10, r12, LSL #3
+ MUL r9, r14, r8
+ QDADD r10, r10, r9
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ MOV r14, r10, ASR #16 @y[1] = round(L_tmp)
+
+LOOP:
+ LDRSH r6, [r0], #2 @load x_hi[]
+ LDRSH r7, [r1], #2
+ STRH r14, [r2], #2
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ MUL r9, r14, r8
+ MOV r10, r12, LSL #3
+ QDADD r10, r10, r9
+ LDRSH r6, [r0], #2 @load x_hi[]
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ LDRSH r7, [r1], #2
+ MOV r14, r10, ASR #16
+
+ MOV r10, r6, LSL #16
+ ADD r12, r10, r7, LSL #4
+ STRH r14, [r2], #2
+ MUL r9, r14, r8
+ MOV r10, r12, LSL #3
+ QDADD r10, r10, r9
+ ADD r4, r4, #2
+ MOV r12, r10, LSL #1
+ QADD r10, r12, r11
+ CMP r4, #64
+ MOV r14, r10, ASR #16
+
+ BLT LOOP
+ STR r14, [r3]
+ STRH r14, [r2]
+
+ LDMFD r13!, {r4 - r12, r15}
+
+ .END
+
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
new file mode 100644
index 0000000..07ca344
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
@@ -0,0 +1,127 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
+@ Word16 x[], /* (i) 12bits: x vector */
+@ Word16 y[], /* (i) 12bits: y vector */
+@ Word16 lg, /* (i) : vector length */
+@ Word16 * exp /* (o) : exponent of result (0..+30) */
+@)
+@************************************************************************
+@ x[] --- r0
+@ y[] --- r1
+@ lg --- r2
+@ *exp --- r3
+
+ .section .text
+ .global Dot_product12_asm
+
+Dot_product12_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ CMP r0, r1
+ BEQ LOOP_EQ
+
+ VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
+ VLD1.S16 {Q2, Q3}, [r0]! @load 16 Word16 x[]
+ VLD1.S16 {Q4, Q5}, [r0]! @load 16 Word16 x[]
+ VLD1.S16 {Q6, Q7}, [r0]! @load 16 Word16 x[]
+ VLD1.S16 {Q8, Q9}, [r1]! @load 16 Word16 y[]
+ VLD1.S16 {Q10, Q11}, [r1]! @load 16 Word16 y[]
+ VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[]
+
+ VMULL.S16 Q15, D16, D0
+ VMLAL.S16 Q15, D17, D1
+ VMLAL.S16 Q15, D18, D2
+ VMLAL.S16 Q15, D19, D3
+ VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
+ VMLAL.S16 Q15, D20, D4
+ VMLAL.S16 Q15, D21, D5
+ VMLAL.S16 Q15, D22, D6
+ VMLAL.S16 Q15, D23, D7
+ VMLAL.S16 Q15, D24, D8
+ VMLAL.S16 Q15, D25, D9
+ VMLAL.S16 Q15, D26, D10
+ VMLAL.S16 Q15, D27, D11
+ VMLAL.S16 Q15, D0, D12
+ VMLAL.S16 Q15, D1, D13
+ VMLAL.S16 Q15, D2, D14
+ VMLAL.S16 Q15, D3, D15
+
+ CMP r2, #64
+ BEQ Lable1
+ VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
+ VLD1.S16 {Q2, Q3}, [r1]!
+ VMLAL.S16 Q15, D4, D0
+ VMLAL.S16 Q15, D5, D1
+ VMLAL.S16 Q15, D6, D2
+ VMLAL.S16 Q15, D7, D3
+ BL Lable1
+
+LOOP_EQ:
+ VLD1.S16 {Q0, Q1}, [r0]!
+ VLD1.S16 {Q2, Q3}, [r0]!
+ VLD1.S16 {Q4, Q5}, [r0]!
+ VLD1.S16 {Q6, Q7}, [r0]!
+ VMULL.S16 Q15, D0, D0
+ VMLAL.S16 Q15, D1, D1
+ VMLAL.S16 Q15, D2, D2
+ VMLAL.S16 Q15, D3, D3
+ VMLAL.S16 Q15, D4, D4
+ VMLAL.S16 Q15, D5, D5
+ VMLAL.S16 Q15, D6, D6
+ VMLAL.S16 Q15, D7, D7
+ VMLAL.S16 Q15, D8, D8
+ VMLAL.S16 Q15, D9, D9
+ VMLAL.S16 Q15, D10, D10
+ VMLAL.S16 Q15, D11, D11
+ VMLAL.S16 Q15, D12, D12
+ VMLAL.S16 Q15, D13, D13
+ VMLAL.S16 Q15, D14, D14
+ VMLAL.S16 Q15, D15, D15
+
+ CMP r2, #64
+ BEQ Lable1
+ VLD1.S16 {Q0, Q1}, [r0]!
+ VMLAL.S16 Q15, D0, D0
+ VMLAL.S16 Q15, D1, D1
+ VMLAL.S16 Q15, D2, D2
+ VMLAL.S16 Q15, D3, D3
+
+Lable1:
+
+ VQADD.S32 D30, D30, D31
+ VPADD.S32 D30, D30, D30
+ VMOV.S32 r12, D30[0]
+
+ ADD r12, r12, r12
+ ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
+ MOV r4, r12
+ CMP r12, #0
+ RSBLT r4, r12, #0
+ CLZ r10, r4
+ SUB r10, r10, #1 @ sft = norm_l(L_sum)
+ MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
+ RSB r11, r10, #30 @ *exp = 30 - sft
+ STRH r11, [r3]
+
+Dot_product12_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+
+ .END
+
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
new file mode 100644
index 0000000..1880024
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
@@ -0,0 +1,228 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@void Filt_6k_7k(
+@ Word16 signal[], /* input: signal */
+@ Word16 lg, /* input: length of input */
+@ Word16 mem[] /* in/out: memory (size=30) */
+@)
+@***********************************************************************
+@ r0 --- signal[]
+@ r1 --- lg
+@ r2 --- mem[]
+
+ .section .text
+ .global Filt_6k_7k_asm
+ .extern fir_6k_7k
+
+Filt_6k_7k_asm:
+
+ STMFD r13!, {r0 - r12, r14}
+ SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
+ MOV r8, r0 @ copy signal[] address
+ MOV r5, r2 @ copy mem[] address
+
+ MOV r0, r2
+ MOV r1, r13
+
+ VLD1.S16 {D0, D1, D2, D3}, [r0]!
+ VLD1.S16 {D4, D5, D6, D7}, [r0]!
+
+ VST1.S16 {D0, D1, D2, D3}, [r1]!
+ VST1.S16 {D4, D5, D6}, [r1]!
+ VST1.S16 D7[0], [r1]!
+ VST1.S16 D7[1], [r1]!
+
+
+
+ LDR r10, Lable1 @ get fir_7k address
+ MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
+ ADD r6, r13, #60 @ get x[L_FIR - 1] address
+ MOV r7, r3 @ get signal[i]
+ @for (i = lg - 1@ i >= 0@ i--)
+ @{
+ @ x[i + L_FIR - 1] = signal[i] >> 2@
+ @}
+ VLD1.S16 {Q0, Q1}, [r7]! @ signal[0] ~ signal[15]
+ VLD1.S16 {Q2, Q3}, [r7]! @ signal[16] ~ signal[31]
+ VLD1.S16 {Q4, Q5}, [r7]! @ signal[32] ~ signal[47]
+ VLD1.S16 {Q6, Q7}, [r7]! @ signal[48] ~ signal[63]
+ VLD1.S16 {Q8, Q9}, [r7]! @ signal[64] ~ signal[79]
+ VSHR.S16 Q10, Q0, #2
+ VSHR.S16 Q11, Q1, #2
+ VSHR.S16 Q12, Q2, #2
+ VSHR.S16 Q13, Q3, #2
+ VST1.S16 {Q10, Q11}, [r6]!
+ VSHR.S16 Q0, Q4, #2
+ VSHR.S16 Q1, Q5, #2
+ VSHR.S16 Q10, Q6, #2
+ VSHR.S16 Q11, Q7, #2
+ VSHR.S16 Q2, Q8, #2
+ VSHR.S16 Q3, Q9, #2
+ VST1.S16 {Q12, Q13}, [r6]!
+ VST1.S16 {Q0, Q1}, [r6]!
+ VST1.S16 {Q10, Q11}, [r6]!
+ VST1.S16 {Q2, Q3}, [r6]!
+
+ MOV r12, r5
+ @STR r5, [sp, #-4] @ PUSH r5 to stack
+ @ not use registers: r4, r10, r12, r14, r5
+ MOV r4, r13
+ MOV r5, #0 @ i = 0
+
+ @ r4 --- x[i], r10 ---- fir_6k_7k
+ VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15]
+ VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31]
+ VMOV.S16 D7[3], r5 @set fir_6k_7K = 0
+
+ VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15]
+ VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31]
+ VLD1.S16 {Q8}, [r4]!
+ VMOV.S16 Q15, #0
+
+LOOP_6K7K:
+
+ VMULL.S16 Q9,D8,D0[0]
+ VMULL.S16 Q10,D9,D1[0]
+ VMULL.S16 Q11,D9,D0[0]
+ VMULL.S16 Q12,D10,D1[0]
+ VEXT.8 Q4,Q4,Q5,#2
+ VMLAL.S16 Q9,D10,D2[0]
+ VMLAL.S16 Q10,D11,D3[0]
+ VMLAL.S16 Q11,D11,D2[0]
+ VMLAL.S16 Q12,D12,D3[0]
+ VEXT.8 Q5,Q5,Q6,#2
+ VMLAL.S16 Q9,D12,D4[0]
+ VMLAL.S16 Q10,D13,D5[0]
+ VMLAL.S16 Q11,D13,D4[0]
+ VMLAL.S16 Q12,D14,D5[0]
+ VEXT.8 Q6,Q6,Q7,#2
+ VMLAL.S16 Q9,D14,D6[0]
+ VMLAL.S16 Q10,D15,D7[0]
+ VMLAL.S16 Q11,D15,D6[0]
+ VMLAL.S16 Q12,D16,D7[0]
+ VEXT.8 Q7,Q7,Q8,#2
+
+ VMLAL.S16 Q9,D8,D0[1]
+ VMLAL.S16 Q10,D9,D1[1]
+ VEXT.8 Q8,Q8,Q15,#2
+ VMLAL.S16 Q11,D9,D0[1]
+ VMLAL.S16 Q12,D10,D1[1]
+ VEXT.8 Q4,Q4,Q5,#2
+ VMLAL.S16 Q9,D10,D2[1]
+ VMLAL.S16 Q10,D11,D3[1]
+ VMLAL.S16 Q11,D11,D2[1]
+ VMLAL.S16 Q12,D12,D3[1]
+ VEXT.8 Q5,Q5,Q6,#2
+ VMLAL.S16 Q9,D12,D4[1]
+ VMLAL.S16 Q10,D13,D5[1]
+ VMLAL.S16 Q11,D13,D4[1]
+ VMLAL.S16 Q12,D14,D5[1]
+ VEXT.8 Q6,Q6,Q7,#2
+ VMLAL.S16 Q9,D14,D6[1]
+ VMLAL.S16 Q10,D15,D7[1]
+ VMLAL.S16 Q11,D15,D6[1]
+ VMLAL.S16 Q12,D16,D7[1]
+ VEXT.8 Q7,Q7,Q8,#2
+
+ VMLAL.S16 Q9,D8,D0[2]
+ VMLAL.S16 Q10,D9,D1[2]
+ VEXT.8 Q8,Q8,Q15,#2
+ VMLAL.S16 Q11,D9,D0[2]
+ VMLAL.S16 Q12,D10,D1[2]
+ VEXT.8 Q4,Q4,Q5,#2
+ VMLAL.S16 Q9,D10,D2[2]
+ VMLAL.S16 Q10,D11,D3[2]
+ VMLAL.S16 Q11,D11,D2[2]
+ VMLAL.S16 Q12,D12,D3[2]
+ VEXT.8 Q5,Q5,Q6,#2
+ VMLAL.S16 Q9,D12,D4[2]
+ VMLAL.S16 Q10,D13,D5[2]
+ VMLAL.S16 Q11,D13,D4[2]
+ VMLAL.S16 Q12,D14,D5[2]
+ VEXT.8 Q6,Q6,Q7,#2
+ VMLAL.S16 Q9,D14,D6[2]
+ VMLAL.S16 Q10,D15,D7[2]
+ VMLAL.S16 Q11,D15,D6[2]
+ VMLAL.S16 Q12,D16,D7[2]
+ VEXT.8 Q7,Q7,Q8,#2
+
+ VMLAL.S16 Q9,D8,D0[3]
+ VMLAL.S16 Q10,D9,D1[3]
+ VEXT.8 Q8,Q8,Q15,#2
+ VMLAL.S16 Q11,D9,D0[3]
+ VMLAL.S16 Q12,D10,D1[3]
+ VEXT.8 Q4,Q4,Q5,#2
+ VMLAL.S16 Q9,D10,D2[3]
+ VMLAL.S16 Q10,D11,D3[3]
+ VMLAL.S16 Q11,D11,D2[3]
+ VMLAL.S16 Q12,D12,D3[3]
+ VEXT.8 Q5,Q5,Q6,#2
+ VMLAL.S16 Q9,D12,D4[3]
+ VMLAL.S16 Q10,D13,D5[3]
+ VMLAL.S16 Q11,D13,D4[3]
+ VMLAL.S16 Q12,D14,D5[3]
+ VEXT.8 Q6,Q6,Q7,#2
+ VMLAL.S16 Q9,D14,D6[3]
+ VMLAL.S16 Q10,D15,D7[3]
+ VMLAL.S16 Q11,D15,D6[3]
+ VMLAL.S16 Q12,D16,D7[3]
+ VEXT.8 Q7,Q7,Q8,#2
+
+ VMOV.S16 D8,D9
+ VEXT.8 Q8,Q8,Q15,#2
+ VMOV.S16 D9,D10
+ VADD.S32 Q9,Q9,Q10
+ VMOV.S16 D10,D11
+ VMOV.S16 D11,D12
+ VADD.S32 Q11,Q11,Q12
+ VMOV.S16 D12,D13
+ VQRSHRN.S32 D28,Q9,#15
+ VMOV.S16 D13,D14
+ VMOV.S16 D14,D15
+ VQRSHRN.S32 D29,Q11,#15
+ VMOV.S16 D15,D16
+
+ VLD1.S16 {Q8},[r4]!
+ ADD r5, r5, #8
+ CMP r5, #80
+ VST1.S16 {D28,D29},[r3]!
+ BLT LOOP_6K7K
+
+ ADD r0, r13, #160 @x + lg
+ MOV r1, r12
+ @LDR r1, [sp, #-4] @mem address
+
+ VLD1.S16 {D0, D1, D2, D3}, [r0]!
+ VLD1.S16 {D4, D5, D6, D7}, [r0]!
+
+ VST1.S16 {D0, D1, D2, D3}, [r1]!
+ VST1.S16 {D4, D5, D6}, [r1]!
+ VST1.S16 D7[0], [r1]!
+ VST1.S16 D7[1], [r1]!
+
+Filt_6k_7k_end:
+
+ ADD r13, r13, #240
+ LDMFD r13!, {r0 - r12, r15}
+
+Lable1:
+ .word fir_6k_7k
+ @ENDFUNC
+ .END
+
+
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
new file mode 100644
index 0000000..60e9ade
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s
@@ -0,0 +1,270 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@static void Norm_Corr (Word16 exc[], /* (i) : excitation buffer */
+@ Word16 xn[], /* (i) : target vector */
+@ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+@ Word16 L_subfr, /* (i) : sub-frame length */
+@ Word16 t_min, /* (i) : minimum value of pitch lag. */
+@ Word16 t_max, /* (i) : maximum value of pitch lag. */
+@ Word16 corr_norm[]) /* (o) Q15 : normalized correlation */
+@
+
+@ r0 --- exc[]
+@ r1 --- xn[]
+@ r2 --- h[]
+@ r3 --- L_subfr
+@ r4 --- t_min
+@ r5 --- t_max
+@ r6 --- corr_norm[]
+
+
+ .section .text
+ .global Norm_corr_asm
+ .extern Convolve_asm
+ .extern Isqrt_n
+@******************************
+@ constant
+@******************************
+.equ EXC , 0
+.equ XN , 4
+.equ H , 8
+.equ L_SUBFR , 12
+.equ voSTACK , 172
+.equ T_MIN , 212
+.equ T_MAX , 216
+.equ CORR_NORM , 220
+
+Norm_corr_asm:
+
+ 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]
+
+ @transfer Convolve function
+ STMFD sp!, {r0 - r3}
+ MOV r0, r5
+ MOV r1, r2
+ MOV r2, r8 @r2 --- excf[]
+ BL Convolve_asm
+ LDMFD sp!, {r0 - r3}
+
+ @ r8 --- excf[]
+
+ MOV r14, r1 @copy xn[] address
+ MOV r7, #1
+ VLD1.S16 {Q0, Q1}, [r14]!
+ VLD1.S16 {Q2, Q3}, [r14]!
+ VLD1.S16 {Q4, Q5}, [r14]!
+ VLD1.S16 {Q6, Q7}, [r14]!
+
+ VMULL.S16 Q10, D0, D0
+ VMLAL.S16 Q10, D1, D1
+ VMLAL.S16 Q10, D2, D2
+ VMLAL.S16 Q10, D3, D3
+ VMLAL.S16 Q10, D4, D4
+ VMLAL.S16 Q10, D5, D5
+ VMLAL.S16 Q10, D6, D6
+ VMLAL.S16 Q10, D7, D7
+ VMLAL.S16 Q10, D8, D8
+ VMLAL.S16 Q10, D9, D9
+ VMLAL.S16 Q10, D10, D10
+ VMLAL.S16 Q10, D11, D11
+ VMLAL.S16 Q10, D12, D12
+ VMLAL.S16 Q10, D13, D13
+ VMLAL.S16 Q10, D14, D14
+ VMLAL.S16 Q10, D15, D15
+
+ VQADD.S32 D20, D20, D21
+ VMOV.S32 r9, D20[0]
+ VMOV.S32 r10, D20[1]
+ 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
+ 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:
+ 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 {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[]
+ VMLAL.S16 Q10, D1, D1
+ VMLAL.S16 Q11, D1, D9
+ VMLAL.S16 Q10, D2, D2
+ VMLAL.S16 Q11, D2, D10
+ VMLAL.S16 Q10, D3, D3
+ VMLAL.S16 Q11, D3, D11
+ VMLAL.S16 Q10, D4, D4
+ VMLAL.S16 Q11, D4, D12
+ VMLAL.S16 Q10, D5, D5
+ VMLAL.S16 Q11, D5, D13
+ VMLAL.S16 Q10, D6, D6
+ VMLAL.S16 Q11, D6, D14
+ VMLAL.S16 Q10, D7, D7
+ VMLAL.S16 Q11, D7, D15
+
+ VLD1.S16 {Q0, Q1}, [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[]
+ VMLAL.S16 Q10, D0, D0
+ VMLAL.S16 Q11, D0, D8
+ VMLAL.S16 Q10, D1, D1
+ VMLAL.S16 Q11, D1, D9
+ VMLAL.S16 Q10, D2, D2
+ VMLAL.S16 Q11, D2, D10
+ VMLAL.S16 Q10, D3, D3
+ VMLAL.S16 Q11, D3, D11
+ VMLAL.S16 Q10, D4, D4
+ VMLAL.S16 Q11, D4, D12
+ VMLAL.S16 Q10, D5, D5
+ VMLAL.S16 Q11, D5, D13
+ VMLAL.S16 Q10, D6, D6
+ VMLAL.S16 Q11, D6, D14
+ VMLAL.S16 Q10, D7, D7
+ VMLAL.S16 Q11, D7, D15
+
+ VQADD.S32 D20, D20, D21
+ VQADD.S32 D22, D22, D23
+
+ VPADD.S32 D20, D20, D20 @D20[0] --- L_tmp1 << 1
+ VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1
+
+ VMOV.S32 r6, D20[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
+ 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)
+
+ CLZ r5, r6
+ SUB r5, r5, #1
+ MOV r6, r6, LSL r5 @L_tmp = (L_tmp1 << exp)
+ RSB r5, r5, #30 @exp_norm = 30 - exp
+
+ @r10 --- exp_corr, r11 --- corr
+ @r6 --- L_tmp, r5 --- exp_norm
+
+ @Isqrt_n(&L_tmp, &exp_norm)
+
+ MOV r14, r0
+ MOV r12, r1
+
+ STMFD sp!, {r0 - r4, r7 - r12, r14}
+ ADD r1, sp, #4
+ ADD r0, sp, #0
+ STR r6, [sp]
+ STRH r5, [sp, #4]
+ BL Isqrt_n
+ LDR r6, [sp]
+ LDRSH r5, [sp, #4]
+ LDMFD sp!, {r0 - r4, r7 - r12, r14}
+ MOV r0, r14
+ MOV r1, r12
+
+
+ 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
+
+ CMP r6, #0
+ RSBLT r6, r6, #0
+ MOVLT r12, r12, ASR r6
+ MOVGT r12, r12, LSL r6 @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
+
+ ADD r12, r12, r8
+ MOV r12, r12, ASR #16 @vo_round(L_tmp)
+
+ LDR r5, [r13, #CORR_NORM] @ get corr_norm address
+ LDR r6, [r13, #T_MAX] @ get t_max
+ ADD r10, r5, r4, LSL #1 @ get corr_norm[t] address
+ STRH r12, [r10] @ corr_norm[t] = vo_round(L_tmp)
+
+ CMP r4, r6
+ BEQ Norm_corr_asm_end
+
+ ADD r4, r4, #1 @ t_min ++
+ RSB r5, r4, #0 @ k
+
+ MOV r6, #63 @ i = 63
+ MOV r8, r0 @ exc[]
+ MOV r9, r2 @ h[]
+ ADD r10, r13, #20 @ excf[]
+
+ ADD r8, r8, r5, LSL #1 @ exc[k] address
+ ADD r9, r9, r6, LSL #1 @ h[i] address
+ ADD r10, r10, r6, LSL #1 @ excf[i] address
+ LDRSH r11, [r8] @ tmp = exc[k]
+
+LOOPK:
+ LDRSH r8, [r9], #-2 @ load h[i]
+ LDRSH r12, [r10, #-2] @ load excf[i - 1]
+ MUL r14, r11, r8
+ MOV r8, r14, ASR #15
+ ADD r14, r8, r12
+ STRH r14, [r10], #-2
+ SUBS r6, r6, #1
+ BGT LOOPK
+
+ LDRSH r8, [r9] @ load h[0]
+ MUL r14, r11, r8
+ LDR r6, [r13, #T_MAX] @ get t_max
+ MOV r8, r14, ASR #15
+ STRH r8, [r10]
+
+ CMP r4, r6
+ BLE LOOPFOR
+
+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
new file mode 100644
index 0000000..cb1764f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
@@ -0,0 +1,133 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@void Syn_filt_32(
+@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+@ Word16 m, /* (i) : order of LP filter */
+@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+@ Word16 sig_hi[], /* (o) /16 : synthesis high */
+@ Word16 sig_lo[], /* (o) /16 : synthesis low */
+@ Word16 lg /* (i) : size of filtering */
+@)
+@***********************************************************************
+@ a[] --- r0
+@ m --- r1
+@ exc[] --- r2
+@ Qnew --- r3
+@ sig_hi[] --- r4
+@ sig_lo[] --- r5
+@ lg --- r6
+
+ .section .text
+ .global Syn_filt_32_asm
+
+Syn_filt_32_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ LDR r4, [r13, #40] @ get sig_hi[] address
+ LDR r5, [r13, #44] @ get sig_lo[] address
+
+ LDRSH r6, [r0], #2 @ load Aq[0]
+ ADD r7, r3, #4 @ 4 + Q_new
+ MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new)
+
+ SUB r10, r4, #32 @ sig_hi[-16] address
+ SUB r11, r5, #32 @ sig_lo[-16] address
+
+ VLD1.S16 {D0, D1, D2, D3}, [r0]! @a[1] ~ a[16]
+
+ MOV r8, #0 @ i = 0
+
+ VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1]
+ VREV64.16 D0, D0
+ VREV64.16 D1, D1
+ VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1]
+ VREV64.16 D2, D2
+ VREV64.16 D3, D3
+ VDUP.S32 Q15, r8
+
+SYN_LOOP:
+
+ LDRSH r6, [r2], #2 @exc[i]
+ @L_tmp = L_msu(L_tmp, sig_lo[i - j], a[j])@
+ VMULL.S16 Q10, D8, D3
+ VEXT.8 D8, D8, D9, #2
+ VMLAL.S16 Q10, D9, D2
+ VMLAL.S16 Q10, D10, D1
+ VMLAL.S16 Q10, D11, D0
+
+ VEXT.8 D9, D9, D10, #2
+ VEXT.8 D10, D10, D11, #2
+
+ VPADD.S32 D28, D20, D21
+ MUL r12, r6, r3 @exc[i] * a0
+ VPADD.S32 D29, D28, D28
+ VDUP.S32 Q10, D29[0] @result1
+
+ VMULL.S16 Q11, D4, D3
+ VMLAL.S16 Q11, D5, D2
+ VSUB.S32 Q10, Q15, Q10
+ @L_tmp = L_msu(L_tmp, sig_hi[i - j], a[j])@
+
+ VMLAL.S16 Q11, D6, D1
+ VEXT.8 D4, D4, D5, #2
+ VMLAL.S16 Q11, D7, D0
+
+
+ VEXT.8 D5, D5, D6, #2
+ VEXT.8 D6, D6, D7, #2
+
+ VPADD.S32 D28, D22, D23
+ VPADD.S32 D29, D28, D28
+ MOV r14, r12, LSL #1 @exc[i] * a0 << 1
+ VDUP.S32 Q11, D29[0] @result2
+
+
+
+ VSHR.S32 Q10, Q10, #11 @result1 >>= 11
+ VSHL.S32 Q11, Q11, #1 @result2 <<= 1
+ VDUP.S32 Q12, r14
+ VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)
+ VSUB.S32 Q12, Q12, Q11
+
+ VSHL.S32 Q12, Q12, #3 @L_tmp <<= 3
+
+
+ VSHRN.S32 D20, Q12, #16 @sig_hi[i] = L_tmp >> 16@
+ VMOV.S16 r10, D20[0]
+ VSHR.S32 Q12, Q12, #4 @L_tmp >>= 4
+ VEXT.8 D7, D7, D20, #2
+ STRH r10, [r4], #2 @store sig_hi[i]
+ VMOV.S32 r11, D24[0] @r11 --- L_tmp >>= 4
+ ADD r8, r8, #1
+ SUB r12, r11, r10, LSL #12
+ @MOV r11, r12, ASR #16 @sig_lo[i]
+ VDUP.S16 D21, r12
+ VEXT.8 D11, D11, D21, #2
+ STRH r12, [r5], #2 @stroe sig_lo[i]
+
+ CMP r8, #64
+ BLT SYN_LOOP
+
+Syn_filt_32_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s
new file mode 100644
index 0000000..189e33b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s
@@ -0,0 +1,178 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@*void Convolve (
+@* Word16 x[], /* (i) : input vector */
+@* Word16 h[], /* (i) : impulse response */
+@* Word16 y[], /* (o) : output vector */
+@* Word16 L /* (i) : vector size */
+@*)
+@
+@ r0 --- x[]
+@ r1 --- h[]
+@ r2 --- y[]
+@ r3 --- L
+
+ .section .text
+ .global Convolve_asm
+
+Convolve_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r3, #0
+ MOV r11, #0x8000
+
+LOOP:
+ @MOV r8, #0 @ s = 0
+ ADD r4, r1, r3, LSL #1 @ tmpH address
+ ADD r5, r3, #1 @ i = n + 1
+ MOV r6, r0
+ LDRSH r9, [r6], #2 @ *tmpX++
+ LDRSH r10, [r4] @ *tmpH--
+ SUB r5, r5, #1
+ VMOV.S32 Q10, #0
+ MUL r8, r9, r10
+
+LOOP1:
+ CMP r5, #0
+ BLE L1
+ SUB r4, r4, #8
+ MOV r9, r4
+ VLD1.S16 D0, [r6]!
+ VLD1.S16 D1, [r9]!
+ VREV64.16 D1, D1
+ 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]
+ ADD r5, r5, r8
+ ADD r5, r11, r5, LSL #1
+ MOV r5, r5, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r5, [r2], #2 @y[n]
+
+
+ @MOV r8, #0
+ ADD r4, r1, r3, LSL #1 @tmpH address
+ ADD r5, r3, #1
+ MOV r6, r0
+ LDRSH r9, [r6], #2 @ *tmpX++
+ 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 D1, [r9]!
+ SUBS r5, r5, #4
+ VREV64.16 D1, D1
+ VMLAL.S16 Q10, D0, D1
+ B LOOP2
+L2:
+ VADD.S32 D20, D20, D21
+ VPADD.S32 D20, D20, D20
+ VMOV.S32 r5, D20[0]
+ ADD r8, r8, r5
+ ADD r8, r11, r8, LSL #1
+ MOV r8, r8, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r8, [r2], #2 @y[n]
+
+
+ @MOV r8, #0
+ ADD r4, r1, r3, LSL #1
+ ADD r5, r3, #1
+ MOV r6, r0
+ LDRSH r9, [r6], #2
+ LDRSH r10, [r4], #-2
+ LDRSH r12, [r6], #2
+ LDRSH r14, [r4], #-2
+ MUL r8, r9, r10
+ LDRSH r9, [r6], #2
+ LDRSH r10, [r4]
+ MLA r8, r12, r14, r8
+ SUB r5, r5, #3
+ MLA r8, r9, r10, r8
+
+ VMOV.S32 Q10, #0
+LOOP3:
+ CMP r5, #0
+ BLE L3
+ SUB r4, r4, #8
+ MOV r9, r4
+ VLD1.S16 D0, [r6]!
+ VLD1.S16 D1, [r9]!
+ VREV64.16 D1, D1
+ SUBS r5, r5, #4
+ VMLAL.S16 Q10, D0, D1
+ B LOOP3
+
+L3:
+ VADD.S32 D20, D20, D21
+ VPADD.S32 D20, D20, D20
+ VMOV.S32 r5, D20[0]
+ ADD r8, r8, r5
+ ADD r8, r11, r8, LSL #1
+ MOV r8, r8, LSR #16 @extract_h(s)
+ ADD r3, r3, #1
+ STRH r8, [r2], #2 @y[n]
+
+ ADD r5, r3, #1 @ i = n + 1
+ ADD r4, r1, r5, LSL #1 @ tmpH address
+ MOV r6, r0
+ VMOV.S32 Q10, #0
+LOOP4:
+ CMP r5, #0
+ BLE L4
+ SUB r4, r4, #8
+ MOV r9, r4
+ VLD1.S16 D0, [r6]!
+ VLD1.S16 D1, [r9]!
+ VREV64.16 D1, D1
+ 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]
+ ADD r5, r11, r5, 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:
+
+ 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
new file mode 100644
index 0000000..2e339db
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
@@ -0,0 +1,151 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@static void cor_h_vec_012(
+@ Word16 h[], /* (i) scaled impulse response */
+@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+@ Word16 track, /* (i) track to use */
+@ Word16 sign[], /* (i) sign vector */
+@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+@)
+@r0 ---- h[]
+@r1 ---- vec[]
+@r2 ---- track
+@r3 ---- sign[]
+@r4 ---- rrixix[][NB_POS]
+@r5 ---- cor_1[]
+@r6 ---- cor_2[]
+
+ .section .text
+ .global cor_h_vec_012_asm
+
+cor_h_vec_012_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ LDR r4, [r13, #40] @load rrixix[][NB_POS]
+ ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track]
+ MOV r4, #0 @i=0
+
+ @r0 --- h[], r1 --- vec[], r2 --- pos
+ @r3 --- sign[], r4 --- i, r7 --- p0
+
+LOOPi:
+ MOV r5, #0 @L_sum1 = 0
+ MOV r6, #0 @L_sum2 = 0
+ ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
+ MOV r10, r0 @p1 = h
+ RSB r11, r2, #62 @j=62-pos
+
+LOOPj1:
+ LDRSH r12, [r10], #2
+ LDRSH r8, [r9], #2
+ LDRSH r14, [r9]
+ SUBS r11, r11, #1
+ MLA r5, r12, r8, r5
+ MLA r6, r12, r14, r6
+ BGE LOOPj1
+
+ LDRSH r12, [r10], #2 @*p1++
+ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2)
+ MLA r5, r12, r14, r5
+ MOV r14, #0x8000
+ MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
+ ADD r10, r6, r14
+ ADD r9, r5, r14
+ MOV r5, r9, ASR #16
+ MOV r6, r10, ASR #16
+ ADD r9, r3, r2, LSL #1 @address of sign[pos]
+ ADD r8, r7, #32
+ LDRSH r10, [r9], #2 @sign[pos]
+ LDRSH r11, [r9] @sign[pos + 1]
+ MUL r12, r5, r10
+ MUL r14, r6, r11
+ MOV r5, r12, ASR #15
+ MOV r6, r14, ASR #15
+ LDR r9, [r13, #44]
+ LDR r12, [r13, #48]
+ LDRSH r10, [r7], #2 @*p0++
+ LDRSH r11, [r8] @*p3++
+ ADD r9, r9, r4, LSL #1
+ ADD r12, r12, r4, LSL #1
+ ADD r5, r5, r10
+ ADD r6, r6, r11
+ STRH r5, [r9]
+ STRH r6, [r12]
+
+ ADD r2, r2, #4
+
+ MOV r5, #0 @L_sum1 = 0
+ MOV r6, #0 @L_sum2 = 0
+ ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
+ MOV r10, r0 @p1 = h
+ RSB r11, r2, #62 @j=62-pos
+ ADD r4, r4, #1 @i++
+
+LOOPj2:
+ LDRSH r12, [r10], #2
+ LDRSH r8, [r9], #2
+ LDRSH r14, [r9]
+ SUBS r11, r11, #1
+ MLA r5, r12, r8, r5
+ MLA r6, r12, r14, r6
+ BGE LOOPj2
+
+ LDRSH r12, [r10], #2 @*p1++
+ MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2)
+ MLA r5, r12, r14, r5
+ MOV r14, #0x8000
+ MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
+ ADD r10, r6, r14
+ ADD r9, r5, r14
+
+ MOV r5, r9, ASR #16
+ MOV r6, r10, ASR #16
+ ADD r9, r3, r2, LSL #1 @address of sign[pos]
+ ADD r8, r7, #32
+ LDRSH r10, [r9], #2 @sign[pos]
+ LDRSH r11, [r9] @sign[pos + 1]
+ MUL r12, r5, r10
+ MUL r14, r6, r11
+ MOV r5, r12, ASR #15
+ MOV r6, r14, ASR #15
+ LDR r9, [r13, #44]
+ LDR r12, [r13, #48]
+ LDRSH r10, [r7], #2 @*p0++
+ LDRSH r11, [r8] @*p3++
+ ADD r9, r9, r4, LSL #1
+ ADD r12, r12, r4, LSL #1
+ ADD r5, r5, r10
+ ADD r6, r6, r11
+ STRH r5, [r9]
+ STRH r6, [r12]
+ ADD r4, r4, #1 @i+1
+ ADD r2, r2, #4 @pos += STEP
+ CMP r4, #16
+
+ BLT LOOPi
+
+the_end:
+ LDMFD r13!, {r4 - r12, r15}
+
+ .END
+
+
+
+
+
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
new file mode 100644
index 0000000..3b8853f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
@@ -0,0 +1,100 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Pred_lt4(
+@ Word16 exc[], /* in/out: excitation buffer */
+@ Word16 T0, /* input : integer pitch lag */
+@ Word16 frac, /* input : fraction of lag */
+@ Word16 L_subfr /* input : subframe size */
+@)
+@***********************************************************************
+@ r0 --- exc[]
+@ r1 --- T0
+@ r2 --- frac
+@ r3 --- L_subfr
+
+ .section .text
+ .global pred_lt4_asm
+ .extern inter4_2
+
+pred_lt4_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r4, r0, r1, LSL #1 @ x = exc - T0
+ RSB r2, r2, #0 @ frac = - frac
+ SUB r4, r4, #30 @ x -= L_INTERPOL2 - 1
+ CMP r2, #0
+ ADDLT r2, r2, #4 @ frac += UP_SAMP
+ SUBLT r4, r4, #2 @ x--
+
+ LDR r11, Lable1
+ RSB r2, r2, #3 @ k = UP_SAMP - 1 - frac
+ MOV r8, #0 @ j = 0
+ ADD r11, r11, r2, LSL #6 @ get inter4_2[k][]
+
+ VLD1.S16 {Q0, Q1}, [r11]!
+ VLD1.S16 {Q2, Q3}, [r11]!
+
+ MOV r6, #0x8000
+
+ VLD1.S16 {Q4, Q5}, [r4]! @load 16 x[]
+ VLD1.S16 {Q6, Q7}, [r4]! @load 16 x[]
+
+LOOP:
+ VQDMULL.S16 Q15, D8, D0
+ VQDMLAL.S16 Q15, D9, D1
+ VQDMLAL.S16 Q15, D10, D2
+ VQDMLAL.S16 Q15, D11, D3
+
+ VQDMLAL.S16 Q15, D12, D4
+ VQDMLAL.S16 Q15, D13, D5
+ VQDMLAL.S16 Q15, D14, D6
+ VQDMLAL.S16 Q15, D15, D7
+
+ LDRSH r12, [r4], #2
+
+ VEXT.S16 D8, D8, D9, #1
+ VEXT.S16 D9, D9, D10, #1
+ VEXT.S16 D10, D10, D11, #1
+ VEXT.S16 D11, D11, D12, #1
+ VDUP.S16 D24, r12
+ VEXT.S16 D12, D12, D13, #1
+ VEXT.S16 D13, D13, D14, #1
+
+ VQADD.S32 D30, D30, D31
+ MOV r11, #0x8000
+ VPADD.S32 D30, D30, D30
+ ADD r8, r8, #1
+ VMOV.S32 r12, D30[0]
+ VEXT.S16 D14, D14, D15, #1
+
+ QADD r1, r12, r12 @ L_sum = (L_sum << 2)
+ VEXT.S16 D15, D15, D24, #1
+ QADD r5, r1, r6
+ MOV r1, r5, ASR #16
+ CMP r8, r3
+ STRH r1, [r0], #2 @ exc[j] = (L_sum + 0x8000) >> 16
+ BLT LOOP
+
+pred_lt4_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+
+Lable1:
+ .word inter4_2
+ @ENDFUNC
+ .END
+
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
new file mode 100644
index 0000000..b9e6b23
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s
@@ -0,0 +1,127 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Residu (
+@ Word16 a[], /* (i) : prediction coefficients */
+@ Word16 x[], /* (i) : speech signal */
+@ Word16 y[], /* (o) : residual signal */
+@ Word16 lg /* (i) : size of filtering */
+@)
+@a[] RN r0
+@x[] RN r1
+@y[] RN r2
+@lg RN r3
+
+ .section .text
+ .global Residu_opt
+
+Residu_opt:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r7, r3, #4 @i = lg - 4
+
+ 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
+ MOV r8, r9
+ VLD1.S16 D5, [r8]! @get x[i], x[i+1], x[i+2], x[i+3]
+ 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]!
+ VQDMLAL.S16 Q10, D5, D0[1]
+
+ SUB r8, r9, #4 @load the x[i-2] address
+ VLD1.S16 D5, [r8]!
+ 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]
+
+ SUB r8, r9, #8 @load the x[i-4] address
+ 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]
+
+ SUB r8, r9, #12 @load the x[i-6] address
+ 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]
+
+ SUB r8, r9, #16 @load the x[i-8] address
+ 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]
+
+ SUB r8, r9, #20 @load the x[i-10] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D2[2]
+
+ SUB r8, r9, #22 @load the x[i-11] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D2[3]
+
+ SUB r8, r9, #24 @load the x[i-12] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D3[0]
+
+ SUB r8, r9, #26 @load the x[i-13] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D3[1]
+
+ SUB r8, r9, #28 @load the x[i-14] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D3[2]
+
+ SUB r8, r9, #30 @load the x[i-15] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D3[3]
+
+ SUB r8, r9, #32 @load the x[i-16] address
+ VLD1.S16 D5, [r8]!
+ VQDMLAL.S16 Q10, D5, D4[0]
+
+ SUB r7, r7, #4 @i-=4
+ VQSHL.S32 Q10, Q10, #4
+ VQADD.S32 Q10, Q10, Q8
+ VSHRN.S32 D5, Q10, #16
+ VST1.S16 D5, [r10]!
+ CMP r7, #0
+
+ BGE LOOP1
+
+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
new file mode 100644
index 0000000..14957d8
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
@@ -0,0 +1,138 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@void Scale_sig(
+@ Word16 x[], /* (i/o) : signal to scale */
+@ Word16 lg, /* (i) : size of x[] */
+@ Word16 exp /* (i) : exponent: x = round(x << exp) */
+@)
+@***********************************************************************
+@ x[] --- r0
+@ lg --- r1
+@ exp --- r2
+
+ .section .text
+ .global Scale_sig_opt
+
+Scale_sig_opt:
+
+ STMFD r13!, {r4 - r12, r14}
+ MOV r4, #4
+ VMOV.S32 Q15, #0x8000
+ VDUP.S32 Q14, r2
+ MOV r5, r0 @ copy x[] address
+ CMP r1, #64
+ MOVEQ r4, #1
+ BEQ LOOP
+ CMP r1, #128
+ MOVEQ r4, #2
+ BEQ LOOP
+ CMP r1, #256
+ BEQ LOOP
+ CMP r1, #80
+ MOVEQ r4, #1
+ BEQ LOOP1
+
+LOOP1:
+ VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[]
+ VSHLL.S16 Q10, D0, #16
+ VSHLL.S16 Q11, D1, #16
+ VSHLL.S16 Q12, D2, #16
+ VSHLL.S16 Q13, D3, #16
+ VSHL.S32 Q10, Q10, Q14
+ VSHL.S32 Q11, Q11, Q14
+ VSHL.S32 Q12, Q12, Q14
+ VSHL.S32 Q13, Q13, Q14
+ VADDHN.S32 D16, Q10, Q15
+ VADDHN.S32 D17, Q11, Q15
+ VADDHN.S32 D18, Q12, Q15
+ VADDHN.S32 D19, Q13, Q15
+ VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[]
+
+LOOP:
+ VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[]
+ VLD1.S16 {Q2, Q3}, [r5]! @load 16 Word16 x[]
+ VLD1.S16 {Q4, Q5}, [r5]! @load 16 Word16 x[]
+ VLD1.S16 {Q6, Q7}, [r5]! @load 16 Word16 x[]
+
+ VSHLL.S16 Q8, D0, #16
+ VSHLL.S16 Q9, D1, #16
+ VSHLL.S16 Q10, D2, #16
+ VSHLL.S16 Q11, D3, #16
+ VSHL.S32 Q8, Q8, Q14
+ VSHL.S32 Q9, Q9, Q14
+ VSHL.S32 Q10, Q10, Q14
+ VSHL.S32 Q11, Q11, Q14
+ VADDHN.S32 D16, Q8, Q15
+ VADDHN.S32 D17, Q9, Q15
+ VADDHN.S32 D18, Q10, Q15
+ VADDHN.S32 D19, Q11, Q15
+ VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[]
+
+
+ VSHLL.S16 Q12, D4, #16
+ VSHLL.S16 Q13, D5, #16
+ VSHLL.S16 Q10, D6, #16
+ VSHLL.S16 Q11, D7, #16
+ VSHL.S32 Q12, Q12, Q14
+ VSHL.S32 Q13, Q13, Q14
+ VSHL.S32 Q10, Q10, Q14
+ VSHL.S32 Q11, Q11, Q14
+ VADDHN.S32 D16, Q12, Q15
+ VADDHN.S32 D17, Q13, Q15
+ VADDHN.S32 D18, Q10, Q15
+ VADDHN.S32 D19, Q11, Q15
+ VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[]
+
+ VSHLL.S16 Q10, D8, #16
+ VSHLL.S16 Q11, D9, #16
+ VSHLL.S16 Q12, D10, #16
+ VSHLL.S16 Q13, D11, #16
+ VSHL.S32 Q10, Q10, Q14
+ VSHL.S32 Q11, Q11, Q14
+ VSHL.S32 Q12, Q12, Q14
+ VSHL.S32 Q13, Q13, Q14
+ VADDHN.S32 D16, Q10, Q15
+ VADDHN.S32 D17, Q11, Q15
+ VADDHN.S32 D18, Q12, Q15
+ VADDHN.S32 D19, Q13, Q15
+ VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[]
+
+ VSHLL.S16 Q10, D12, #16
+ VSHLL.S16 Q11, D13, #16
+ VSHLL.S16 Q12, D14, #16
+ VSHLL.S16 Q13, D15, #16
+ VSHL.S32 Q10, Q10, Q14
+ VSHL.S32 Q11, Q11, Q14
+ VSHL.S32 Q12, Q12, Q14
+ VSHL.S32 Q13, Q13, Q14
+ VADDHN.S32 D16, Q10, Q15
+ VADDHN.S32 D17, Q11, Q15
+ VADDHN.S32 D18, Q12, Q15
+ VADDHN.S32 D19, Q13, Q15
+ VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[]
+ SUBS r4, r4, #1
+ BGT LOOP
+
+
+Scale_sig_asm_end:
+
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
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
new file mode 100644
index 0000000..dc3d4a8
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
@@ -0,0 +1,106 @@
+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ ** http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Syn_filt(
+@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+@ Word16 x[], /* (i) : input signal */
+@ Word16 y[], /* (o) : output signal */
+@ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+@)
+@***********************************************************************
+@ a[] --- r0
+@ x[] --- r1
+@ y[] --- r2
+@ mem[] --- r3
+@ m --- 16 lg --- 80 update --- 1
+
+ .section .text
+ .global Syn_filt_asm
+
+Syn_filt_asm:
+
+ STMFD r13!, {r4 - r12, r14}
+ SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
+
+ MOV r4, r3 @ copy mem[] address
+ MOV r5, r13 @ copy yy = y_buf address
+
+ @ for(i = 0@ i < m@ i++)
+ @{
+ @ *yy++ = mem[i]@
+ @}
+ VLD1.S16 {D0, D1, D2, D3}, [r4]! @load 16 mems
+ VST1.S16 {D0, D1, D2, D3}, [r5]! @store 16 mem[] to *yy
+
+ LDRSH r5, [r0], #2 @ load a[0]
+ MOV r8, #0 @ i = 0
+ MOV r5, r5, ASR #1 @ a0 = a[0] >> 1
+ VMOV.S16 D8[0], r5
+ @ load all a[]
+ VLD1.S16 {D0, D1, D2, D3}, [r0]! @ load a[1] ~ a[16]
+ VREV64.16 D0, D0
+ VREV64.16 D1, D1
+ VREV64.16 D2, D2
+ VREV64.16 D3, D3
+ MOV r8, #0 @ loop times
+ MOV r10, r13 @ temp = y_buf
+ ADD r4, r13, #32 @ yy[i] address
+
+ VLD1.S16 {D4, D5, D6, D7}, [r10]! @ first 16 temp_p
+
+SYN_LOOP:
+
+ LDRSH r6, [r1], #2 @ load x[i]
+ MUL r12, r6, r5 @ L_tmp = x[i] * a0
+ ADD r10, r4, r8, LSL #1 @ y[i], yy[i] address
+
+ VDUP.S32 Q10, r12
+ VMULL.S16 Q5, D3, D4
+ VMLAL.S16 Q5, D2, D5
+ VMLAL.S16 Q5, D1, D6
+ VMLAL.S16 Q5, D0, D7
+ VEXT.8 D4, D4, D5, #2
+ VEXT.8 D5, D5, D6, #2
+ VEXT.8 D6, D6, D7, #2
+ VPADD.S32 D12, D10, D11
+ ADD r8, r8, #1
+ VPADD.S32 D10, D12, D12
+
+ VDUP.S32 Q7, D10[0]
+
+ VSUB.S32 Q9, Q10, Q7
+ VQRSHRN.S32 D20, Q9, #12
+ VMOV.S16 r9, D20[0]
+ VEXT.8 D7, D7, D20, #2
+ CMP r8, #80
+ STRH r9, [r10] @ yy[i]
+ STRH r9, [r2], #2 @ y[i]
+
+ BLT SYN_LOOP
+
+ @ update mem[]
+ ADD r5, r13, #160 @ yy[64] address
+ VLD1.S16 {D0, D1, D2, D3}, [r5]!
+ VST1.S16 {D0, D1, D2, D3}, [r3]!
+
+Syn_filt_asm_end:
+
+ ADD r13, r13, #700
+ LDMFD r13!, {r4 - r12, r15}
+ @ENDFUNC
+ .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/autocorr.c b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
new file mode 100644
index 0000000..33ed670
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
@@ -0,0 +1,127 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/***********************************************************************
+* File: autocorr.c *
+* *
+* Description:Compute autocorrelations of signal with windowing *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+#include "ham_wind.tab"
+
+void Autocorr(
+ Word16 x[], /* (i) : Input signal */
+ Word16 m, /* (i) : LPC order */
+ Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */
+ Word16 r_l[] /* (o) : Autocorrelations (lsb) */
+ )
+{
+ Word32 i, norm, shift;
+ Word16 y[L_WINDOW];
+ Word32 L_sum, L_sum1, L_tmp, F_LEN;
+ Word16 *p1,*p2,*p3;
+ const Word16 *p4;
+ /* Windowing of signal */
+ p1 = x;
+ p4 = vo_window;
+ p3 = y;
+
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ }
+
+ /* calculate energy of signal */
+ L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */
+ for (i = 0; i < L_WINDOW; i++)
+ {
+ L_tmp = vo_L_mult(y[i], y[i]);
+ L_tmp = (L_tmp >> 8);
+ L_sum += L_tmp;
+ }
+
+ /* scale signal to avoid overflow in autocorrelation */
+ norm = norm_l(L_sum);
+ shift = 4 - (norm >> 1);
+ if(shift > 0)
+ {
+ p1 = y;
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ }
+ }
+
+ /* Compute and normalize r[0] */
+ L_sum = 1;
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ L_sum += vo_L_mult(y[i], y[i]);
+ L_sum += vo_L_mult(y[i+1], y[i+1]);
+ L_sum += vo_L_mult(y[i+2], y[i+2]);
+ L_sum += vo_L_mult(y[i+3], y[i+3]);
+ }
+
+ norm = norm_l(L_sum);
+ L_sum = (L_sum << norm);
+
+ r_h[0] = L_sum >> 16;
+ r_l[0] = (L_sum & 0xffff)>>1;
+
+ /* Compute r[1] to r[m] */
+ for (i = 1; i <= 8; i++)
+ {
+ L_sum1 = 0;
+ L_sum = 0;
+ F_LEN = (Word32)(L_WINDOW - 2*i);
+ p1 = y;
+ p2 = y + (2*i)-1;
+ do{
+ L_sum1 += *p1 * *p2++;
+ L_sum += *p1++ * *p2;
+ }while(--F_LEN!=0);
+
+ L_sum1 += *p1 * *p2++;
+
+ L_sum1 = L_sum1<<norm;
+ L_sum = L_sum<<norm;
+
+ r_h[(2*i)-1] = L_sum1 >> 15;
+ r_l[(2*i)-1] = L_sum1 & 0x00007fff;
+ r_h[(2*i)] = L_sum >> 15;
+ r_l[(2*i)] = L_sum & 0x00007fff;
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/az_isp.c b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
new file mode 100644
index 0000000..8259f91
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
@@ -0,0 +1,268 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: az_isp.c
+*
+* Description:
+*-----------------------------------------------------------------------*
+* Compute the ISPs from the LPC coefficients (order=M) *
+*-----------------------------------------------------------------------*
+* *
+* The ISPs are the roots of the two polynomials F1(z) and F2(z) *
+* defined as *
+* F1(z) = A(z) + z^-m A(z^-1) *
+* and F2(z) = A(z) - z^-m A(z^-1) *
+* *
+* For a even order m=2n, F1(z) has M/2 conjugate roots on the unit *
+* circle and F2(z) has M/2-1 conjugate roots on the unit circle in *
+* addition to two roots at 0 and pi. *
+* *
+* For a 16th order LP analysis, F1(z) and F2(z) can be written as *
+* *
+* F1(z) = (1 + a[M]) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) *
+* i=0,2,4,6,8,10,12,14 *
+* *
+* F2(z) = (1 - a[M]) (1 - z^-2) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) *
+* i=1,3,5,7,9,11,13 *
+* *
+* The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last *
+* predictor coefficient a[M]. *
+*-----------------------------------------------------------------------*
+
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "stdio.h"
+#include "grid100.tab"
+
+#define M 16
+#define NC (M/2)
+
+/* local function */
+static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n);
+
+void Az_isp(
+ Word16 a[], /* (i) Q12 : predictor coefficients */
+ Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
+ Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
+ )
+{
+ Word32 i, j, nf, ip, order;
+ Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
+ Word16 x, y, sign, exp;
+ Word16 *coef;
+ Word16 f1[NC + 1], f2[NC];
+ Word32 t0;
+ /*-------------------------------------------------------------*
+ * find the sum and diff polynomials F1(z) and F2(z) *
+ * F1(z) = [A(z) + z^M A(z^-1)] *
+ * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) *
+ * *
+ * for (i=0; i<NC; i++) *
+ * { *
+ * f1[i] = a[i] + a[M-i]; *
+ * f2[i] = a[i] - a[M-i]; *
+ * } *
+ * f1[NC] = 2.0*a[NC]; *
+ * *
+ * for (i=2; i<NC; i++) Divide by (1-z^-2) *
+ * f2[i] += f2[i-2]; *
+ *-------------------------------------------------------------*/
+ for (i = 0; i < NC; i++)
+ {
+ t0 = a[i] << 15;
+ f1[i] = vo_round(t0 + (a[M - i] << 15)); /* =(a[i]+a[M-i])/2 */
+ f2[i] = vo_round(t0 - (a[M - i] << 15)); /* =(a[i]-a[M-i])/2 */
+ }
+ f1[NC] = a[NC];
+ for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */
+ f2[i] = add1(f2[i], f2[i - 2]);
+
+ /*---------------------------------------------------------------------*
+ * Find the ISPs (roots of F1(z) and F2(z) ) using the *
+ * Chebyshev polynomial evaluation. *
+ * The roots of F1(z) and F2(z) are alternatively searched. *
+ * We start by finding the first root of F1(z) then we switch *
+ * to F2(z) then back to F1(z) and so on until all roots are found. *
+ * *
+ * - Evaluate Chebyshev pol. at grid points and check for sign change.*
+ * - If sign change track the root by subdividing the interval *
+ * 2 times and ckecking sign change. *
+ *---------------------------------------------------------------------*/
+ nf = 0; /* number of found frequencies */
+ ip = 0; /* indicator for f1 or f2 */
+ coef = f1;
+ order = NC;
+ xlow = vogrid[0];
+ ylow = Chebps2(xlow, coef, order);
+ j = 0;
+ while ((nf < M - 1) && (j < GRID_POINTS))
+ {
+ j ++;
+ xhigh = xlow;
+ yhigh = ylow;
+ xlow = vogrid[j];
+ ylow = Chebps2(xlow, coef, order);
+ if ((ylow * yhigh) <= (Word32) 0)
+ {
+ /* divide 2 times the interval */
+ for (i = 0; i < 2; i++)
+ {
+ xmid = (xlow >> 1) + (xhigh >> 1); /* xmid = (xlow + xhigh)/2 */
+ ymid = Chebps2(xmid, coef, order);
+ if ((ylow * ymid) <= (Word32) 0)
+ {
+ yhigh = ymid;
+ xhigh = xmid;
+ } else
+ {
+ ylow = ymid;
+ xlow = xmid;
+ }
+ }
+ /*-------------------------------------------------------------*
+ * Linear interpolation *
+ * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); *
+ *-------------------------------------------------------------*/
+ x = xhigh - xlow;
+ y = yhigh - ylow;
+ if (y == 0)
+ {
+ xint = xlow;
+ } else
+ {
+ sign = y;
+ y = abs_s(y);
+ exp = norm_s(y);
+ y = y << exp;
+ y = div_s((Word16) 16383, y);
+ t0 = x * y;
+ t0 = (t0 >> (19 - exp));
+ y = vo_extract_l(t0); /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */
+ if (sign < 0)
+ y = -y;
+ t0 = ylow * y; /* result in Q26 */
+ t0 = (t0 >> 10); /* result in Q15 */
+ xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */
+ }
+ isp[nf] = xint;
+ xlow = xint;
+ nf++;
+ if (ip == 0)
+ {
+ ip = 1;
+ coef = f2;
+ order = NC - 1;
+ } else
+ {
+ ip = 0;
+ coef = f1;
+ order = NC;
+ }
+ ylow = Chebps2(xlow, coef, order);
+ }
+ }
+ /* Check if M-1 roots found */
+ if(nf < M - 1)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isp[i] = old_isp[i];
+ }
+ } else
+ {
+ isp[M - 1] = a[M] << 3; /* From Q12 to Q15 with saturation */
+ }
+ return;
+}
+
+/*--------------------------------------------------------------*
+* function Chebps2: *
+* ~~~~~~~ *
+* Evaluates the Chebishev polynomial series *
+*--------------------------------------------------------------*
+* *
+* The polynomial order is *
+* n = M/2 (M is the prediction order) *
+* The polynomial is given by *
+* C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 *
+* Arguments: *
+* x: input value of evaluation; x = cos(frequency) in Q15 *
+* f[]: coefficients of the pol. in Q11 *
+* n: order of the pol. *
+* *
+* The value of C(x) is returned. (Satured to +-1.99 in Q14) *
+* *
+*--------------------------------------------------------------*/
+
+static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n)
+{
+ Word32 i, cheb;
+ Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
+ Word32 t0;
+
+ /* Note: All computation are done in Q24. */
+
+ t0 = f[0] << 13;
+ b2_h = t0 >> 16;
+ b2_l = (t0 & 0xffff)>>1;
+
+ t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1);
+ t0 <<= 1;
+ t0 += (f[1] << 13); /* + f[1] in Q24 */
+
+ b1_h = t0 >> 16;
+ b1_l = (t0 & 0xffff) >> 1;
+
+ for (i = 2; i < n; i++)
+ {
+ t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+
+ t0 += (b2_h * (-16384))<<1;
+ t0 += (f[i] << 12);
+ t0 <<= 1;
+ t0 -= (b2_l << 1); /* t0 = 2.0*x*b1 - b2 + f[i]; */
+
+ b0_h = t0 >> 16;
+ b0_l = (t0 & 0xffff) >> 1;
+
+ b2_l = b1_l; /* b2 = b1; */
+ b2_h = b1_h;
+ b1_l = b0_l; /* b1 = b0; */
+ b1_h = b0_h;
+ }
+
+ t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+ t0 += (b2_h * (-32768))<<1; /* t0 = x*b1 - b2 */
+ t0 -= (b2_l << 1);
+ t0 += (f[n] << 12); /* t0 = x*b1 - b2 + f[i]/2 */
+
+ t0 = L_shl2(t0, 6); /* Q24 to Q30 with saturation */
+
+ cheb = extract_h(t0); /* Result in Q14 */
+
+ if (cheb == -32768)
+ {
+ cheb = -32767; /* to avoid saturation in Az_isp */
+ }
+ return (cheb);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/bits.c b/media/libstagefright/codecs/amrwbenc/src/bits.c
new file mode 100644
index 0000000..90d1a00
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/bits.c
@@ -0,0 +1,210 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+ File: bits.c
+
+ Description: Performs bit stream manipulation
+
+************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "bits.h"
+#include "acelp.h"
+#include "dtx.h"
+#include "mime_io.tab"
+
+
+int PackBits(Word16 prms[], /* i: analysis parameters */
+ Word16 coding_mode, /* i: coding bit-stream ratio mode */
+ Word16 mode, /* i: coding bit-stream ratio mode*/
+ Coder_State *st /*i/o: coder global parameters struct */
+ )
+{
+ Word16 i, frame_type;
+ UWord8 temp;
+ UWord8 *stream_ptr;
+ Word16 bitstreamformat = st->frameType;
+
+ unsigned short* dataOut = st->outputStream;
+
+ if (coding_mode == MRDTX)
+ {
+ st->sid_update_counter--;
+
+ if (st->prev_ft == TX_SPEECH)
+ {
+ frame_type = TX_SID_FIRST;
+ st->sid_update_counter = 3;
+ } else
+ {
+ if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))
+ {
+ /* ensure extra updates are properly delayed after a possible SID_FIRST */
+ frame_type = TX_SID_UPDATE;
+ st->sid_handover_debt--;
+ } else
+ {
+ if (st->sid_update_counter == 0)
+ {
+ frame_type = TX_SID_UPDATE;
+ st->sid_update_counter = 8;
+ } else
+ {
+ frame_type = TX_NO_DATA;
+ }
+ }
+ }
+ } else
+ {
+ st->sid_update_counter = 8;
+ frame_type = TX_SPEECH;
+ }
+ st->prev_ft = frame_type;
+
+ if(bitstreamformat == 0) /* default file format */
+ {
+ *(dataOut) = TX_FRAME_TYPE;
+ *(dataOut + 1) = frame_type;
+ *(dataOut + 2) = mode;
+ for (i = 0; i < nb_of_bits[coding_mode]; i++)
+ {
+ *(dataOut + 3 + i) = prms[i];
+ }
+ return (3 + nb_of_bits[coding_mode])<<1;
+ } else
+ {
+ if (bitstreamformat == 1) /* ITU file format */
+ {
+ *(dataOut) = 0x6b21;
+ if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)
+ {
+ *(dataOut + 1) = nb_of_bits[coding_mode];
+ for (i = 0; i < nb_of_bits[coding_mode]; i++)
+ {
+ if(prms[i] == BIT_0){
+ *(dataOut + 2 + i) = BIT_0_ITU;
+ }
+ else{
+ *(dataOut + 2 + i) = BIT_1_ITU;
+ }
+ }
+ return (2 + nb_of_bits[coding_mode])<<1;
+ } else
+ {
+ *(dataOut + 1) = 0;
+ return 2<<1;
+ }
+ } else /* MIME/storage file format */
+ {
+#define MRSID 9
+ /* change mode index in case of SID frame */
+ if (coding_mode == MRDTX)
+ {
+ coding_mode = MRSID;
+ if (frame_type == TX_SID_FIRST)
+ {
+ for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0;
+ }
+ }
+ /* -> force NO_DATA frame */
+ if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))
+ {
+ coding_mode = 15;
+ }
+ /* mark empty frames between SID updates as NO_DATA frames */
+ if (coding_mode == MRSID && frame_type == TX_NO_DATA)
+ {
+ coding_mode = 15;
+ }
+ /* set pointer for packed frame, note that we handle data as bytes */
+ stream_ptr = (UWord8*)dataOut;
+ /* insert table of contents (ToC) byte at the beginning of the packet */
+ *stream_ptr = toc_byte[coding_mode];
+ stream_ptr++;
+ temp = 0;
+ /* sort and pack AMR-WB speech or SID bits */
+ for (i = 1; i < unpacked_size[coding_mode] + 1; i++)
+ {
+ if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)
+ {
+ temp++;
+ }
+ if (i&0x7)
+ {
+ temp <<= 1;
+ }
+ else
+ {
+ *stream_ptr = temp;
+ stream_ptr++;
+ temp = 0;
+ }
+ }
+ /* insert SID type indication and speech mode in case of SID frame */
+ if (coding_mode == MRSID)
+ {
+ if (frame_type == TX_SID_UPDATE)
+ {
+ temp++;
+ }
+ temp <<= 4;
+ temp += mode & 0x000F;
+ }
+ /* insert unused bits (zeros) at the tail of the last byte */
+ if (unused_size[coding_mode])
+ {
+ temp <<= (unused_size[coding_mode] - 1);
+ }
+ *stream_ptr = temp;
+ /* write packed frame into file (1 byte added to cover ToC entry) */
+ return (1 + packed_size[coding_mode]);
+ }
+ }
+}
+
+/*-----------------------------------------------------*
+* Parm_serial -> convert parameters to serial stream *
+*-----------------------------------------------------*/
+
+void Parm_serial(
+ Word16 value, /* input : parameter value */
+ Word16 no_of_bits, /* input : number of bits */
+ Word16 ** prms
+ )
+{
+ Word16 i, bit;
+ *prms += no_of_bits;
+ for (i = 0; i < no_of_bits; i++)
+ {
+ bit = (Word16) (value & 0x0001); /* get lsb */
+ if (bit == 0)
+ *--(*prms) = BIT_0;
+ else
+ *--(*prms) = BIT_1;
+ value >>= 1;
+ }
+ *prms += no_of_bits;
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
new file mode 100644
index 0000000..39fc4c5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
@@ -0,0 +1,297 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/************************************************************************
+* File: c2t64fx.c *
+* *
+* Description:Performs algebraic codebook search for 6.60kbits mode*
+* *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define NB_TRACK 2
+#define STEP 2
+#define NB_POS 32
+#define MSIZE 1024
+
+/*************************************************************************
+* Function: ACELP_2t64_fx() *
+* *
+* 12 bits algebraic codebook. *
+* 2 tracks x 32 positions per track = 64 samples. *
+* *
+* 12 bits --> 2 pulses in a frame of 64 samples. *
+* *
+* All pulses can have two (2) possible amplitudes: +1 or -1. *
+* Each pulse can have 32 possible positions. *
+**************************************************************************/
+
+void ACELP_2t64_fx(
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
+ )
+{
+ Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
+ Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
+ Word16 alp, val, exp, k_cn, k_dn;
+ Word16 *p0, *p1, *p2, *psign;
+ Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
+
+ Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
+ Word16 h_buf[4 * L_SUBFR] = {0};
+ Word16 rrixix[NB_TRACK][NB_POS];
+ Word16 rrixiy[MSIZE];
+ Word32 s, cor;
+
+ /*----------------------------------------------------------------*
+ * Find sign for each pulse position. *
+ *----------------------------------------------------------------*/
+ alp = 8192; /* alp = 2.0 (Q12) */
+
+ /* calculate energy for normalization of cn[] and dn[] */
+ /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+#ifdef ASM_OPT /* asm optimization branch */
+ s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+#else
+ s = Dot_product12(cn, cn, L_SUBFR, &exp);
+#endif
+
+ Isqrt_n(&s, &exp);
+ s = L_shl(s, add1(exp, 5));
+ k_cn = vo_round(s);
+
+ /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+#ifdef ASM_OPT /* asm optimization branch */
+ s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+#else
+ s = Dot_product12(dn, dn, L_SUBFR, &exp);
+#endif
+
+ Isqrt_n(&s, &exp);
+ k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */
+ k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
+
+ /* mix normalized cn[] and dn[] */
+ p0 = cn;
+ p1 = dn;
+ p2 = dn2;
+
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ }
+
+ /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
+ for (i = 0; i < L_SUBFR; i ++)
+ {
+ val = dn[i];
+ ps = dn2[i];
+ if (ps >= 0)
+ {
+ sign[i] = 32767; /* sign = +1 (Q12) */
+ vec[i] = -32768;
+ } else
+ {
+ sign[i] = -32768; /* sign = -1 (Q12) */
+ vec[i] = 32767;
+ dn[i] = -val;
+ }
+ }
+ /*------------------------------------------------------------*
+ * Compute h_inv[i]. *
+ *------------------------------------------------------------*/
+ /* impulse response buffer for fast computation */
+ h = h_buf + L_SUBFR;
+ h_inv = h + (L_SUBFR<<1);
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ h[i] = H[i];
+ h_inv[i] = vo_negate(h[i]);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixix[][] needed for the codebook search. *
+ * Result is multiplied by 0.5 *
+ *------------------------------------------------------------*/
+ /* Init pointers to last position of rrixix[] */
+ p0 = &rrixix[0][NB_POS - 1];
+ p1 = &rrixix[1][NB_POS - 1];
+
+ ptr_h1 = h;
+ cor = 0x00010000L; /* for rounding */
+ for (i = 0; i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p1-- = (extract_h(cor) >> 1);
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p0-- = (extract_h(cor) >> 1);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixiy[][] needed for the codebook search. *
+ *------------------------------------------------------------*/
+ pos = MSIZE - 1;
+ pos2 = MSIZE - 2;
+ ptr_hf = h + 1;
+
+ for (k = 0; k < NB_POS; k++)
+ {
+ p1 = &rrixiy[pos];
+ p0 = &rrixiy[pos2];
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
+
+ for (i = (k + 1); i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
+
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+
+ pos -= NB_POS;
+ pos2--;
+ ptr_hf += STEP;
+ }
+
+ /*------------------------------------------------------------*
+ * Modification of rrixiy[][] to take signs into account. *
+ *------------------------------------------------------------*/
+ p0 = rrixiy;
+ for (i = 0; i < L_SUBFR; i += STEP)
+ {
+ psign = sign;
+ if (psign[i] < 0)
+ {
+ psign = vec;
+ }
+ for (j = 1; j < L_SUBFR; j += STEP)
+ {
+ *p0 = vo_mult(*p0, psign[j]);
+ p0++;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * search 2 pulses: *
+ * ~@~~~~~~~~~~~~~~ *
+ * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) *
+ *-------------------------------------------------------------------*/
+ p0 = rrixix[0];
+ p1 = rrixix[1];
+ p2 = rrixiy;
+
+ psk = -1;
+ alpk = 1;
+ ix = 0;
+ iy = 1;
+
+ for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
+ {
+ ps1 = dn[i0];
+ alp1 = (*p0++);
+ pos = -1;
+ for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
+ {
+ ps2 = add1(ps1, dn[i1]);
+ alp2 = add1(alp1, add1(*p1++, *p2++));
+ sq = vo_mult(ps2, ps2);
+ s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
+ if (s > 0)
+ {
+ psk = sq;
+ alpk = alp2;
+ pos = i1;
+ }
+ }
+ p1 -= NB_POS;
+ if (pos >= 0)
+ {
+ ix = i0;
+ iy = pos;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * Build the codeword, the filtered codeword and index of codevector.*
+ *-------------------------------------------------------------------*/
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ code[i] = 0;
+ }
+
+ i0 = (ix >> 1); /* pos of pulse 1 (0..31) */
+ i1 = (iy >> 1); /* pos of pulse 2 (0..31) */
+ if (sign[ix] > 0)
+ {
+ code[ix] = 512; /* codeword in Q9 format */
+ p0 = h - ix;
+ } else
+ {
+ code[ix] = -512;
+ i0 += NB_POS;
+ p0 = h_inv - ix;
+ }
+ if (sign[iy] > 0)
+ {
+ code[iy] = 512;
+ p1 = h - iy;
+ } else
+ {
+ code[iy] = -512;
+ i1 += NB_POS;
+ p1 = h_inv - iy;
+ }
+ *index = add1((i0 << 6), i1);
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
new file mode 100644
index 0000000..27ba95d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
@@ -0,0 +1,1043 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: c4t64fx.c *
+* *
+* Description:Performs algebraic codebook search for higher modes *
+* *
+************************************************************************/
+
+/************************************************************************
+* Function: ACELP_4t64_fx() *
+* *
+* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. *
+* 4 tracks x 16 positions per track = 64 samples. *
+* *
+* 20 bits --> 4 pulses in a frame of 64 samples. *
+* 36 bits --> 8 pulses in a frame of 64 samples. *
+* 44 bits --> 10 pulses in a frame of 64 samples. *
+* 52 bits --> 12 pulses in a frame of 64 samples. *
+* 64 bits --> 16 pulses in a frame of 64 samples. *
+* 72 bits --> 18 pulses in a frame of 64 samples. *
+* 88 bits --> 24 pulses in a frame of 64 samples. *
+* *
+* All pulses can have two (2) possible amplitudes: +1 or -1. *
+* Each pulse can have sixteen (16) possible positions. *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#include "q_pulse.h"
+
+static Word16 tipos[36] = {
+ 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */
+ 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */
+ 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */
+ 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */
+ 0, 1, 2, 3,
+ 1, 2, 3, 0,
+ 2, 3, 0, 1,
+ 3, 0, 1, 2,
+ 0, 1, 2, 3}; /* end point for 24 pulses &ipos[35], 4th iter */
+
+#define NB_PULSE_MAX 24
+
+#define L_SUBFR 64
+#define NB_TRACK 4
+#define STEP 4
+#define NB_POS 16
+#define MSIZE 256
+#define NB_MAX 8
+#define NPMAXPT ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK)
+
+/* Private functions */
+void cor_h_vec_012(
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
+
+void cor_h_vec_012_asm(
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
+
+void cor_h_vec_30(
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
+
+void search_ixiy(
+ Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
+ Word16 track_x, /* (i) track of pulse 1 */
+ Word16 track_y, /* (i) track of pulse 2 */
+ Word16 * ps, /* (i/o) correlation of all fixed pulses */
+ Word16 * alp, /* (i/o) energy of all fixed pulses */
+ Word16 * ix, /* (o) position of pulse 1 */
+ Word16 * iy, /* (o) position of pulse 2 */
+ Word16 dn[], /* (i) corr. between target and h[] */
+ Word16 dn2[], /* (i) vector of selected positions */
+ Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
+ Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
+ Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
+ );
+
+
+void ACELP_4t64_fx(
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
+ Word16 ser_size, /* (i) : bit rate */
+ Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */
+ /* (o) : index (36): 9+9+9+9 = 36 bits. */
+ /* (o) : index (44): 13+9+13+9 = 44 bits. */
+ /* (o) : index (52): 13+13+13+13 = 52 bits. */
+ /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
+ /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
+ /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+ )
+{
+ Word32 i, j, k;
+ Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;
+ Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;
+ Word16 *p0, *p1, *p2, *p3, *psign;
+ Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;
+ Word32 s, cor, L_tmp, L_index;
+ Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];
+ Word16 ind[NPMAXPT * NB_TRACK];
+ Word16 codvec[NB_PULSE_MAX], nbpos[10];
+ Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];
+ Word16 h_buf[4 * L_SUBFR];
+ Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];
+ Word16 ipos[NB_PULSE_MAX];
+
+ switch (nbbits)
+ {
+ case 20: /* 20 bits, 4 pulses, 4 tracks */
+ nbiter = 4; /* 4x16x16=1024 loop */
+ alp = 8192; /* alp = 2.0 (Q12) */
+ nb_pulse = 4;
+ nbpos[0] = 4;
+ nbpos[1] = 8;
+ break;
+ case 36: /* 36 bits, 8 pulses, 4 tracks */
+ nbiter = 4; /* 4x20x16=1280 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 8;
+ nbpos[0] = 4;
+ nbpos[1] = 8;
+ nbpos[2] = 8;
+ break;
+ case 44: /* 44 bits, 10 pulses, 4 tracks */
+ nbiter = 4; /* 4x26x16=1664 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 10;
+ nbpos[0] = 4;
+ nbpos[1] = 6;
+ nbpos[2] = 8;
+ nbpos[3] = 8;
+ break;
+ case 52: /* 52 bits, 12 pulses, 4 tracks */
+ nbiter = 4; /* 4x26x16=1664 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 12;
+ nbpos[0] = 4;
+ nbpos[1] = 6;
+ nbpos[2] = 8;
+ nbpos[3] = 8;
+ break;
+ case 64: /* 64 bits, 16 pulses, 4 tracks */
+ nbiter = 3; /* 3x36x16=1728 loop */
+ alp = 3277; /* alp = 0.8 (Q12) */
+ nb_pulse = 16;
+ nbpos[0] = 4;
+ nbpos[1] = 4;
+ nbpos[2] = 6;
+ nbpos[3] = 6;
+ nbpos[4] = 8;
+ nbpos[5] = 8;
+ break;
+ case 72: /* 72 bits, 18 pulses, 4 tracks */
+ nbiter = 3; /* 3x35x16=1680 loop */
+ alp = 3072; /* alp = 0.75 (Q12) */
+ nb_pulse = 18;
+ nbpos[0] = 2;
+ nbpos[1] = 3;
+ nbpos[2] = 4;
+ nbpos[3] = 5;
+ nbpos[4] = 6;
+ nbpos[5] = 7;
+ nbpos[6] = 8;
+ break;
+ case 88: /* 88 bits, 24 pulses, 4 tracks */
+ if(ser_size > 462)
+ nbiter = 1;
+ else
+ nbiter = 2; /* 2x53x16=1696 loop */
+
+ alp = 2048; /* alp = 0.5 (Q12) */
+ nb_pulse = 24;
+ nbpos[0] = 2;
+ nbpos[1] = 2;
+ nbpos[2] = 3;
+ nbpos[3] = 4;
+ nbpos[4] = 5;
+ nbpos[5] = 6;
+ nbpos[6] = 7;
+ nbpos[7] = 8;
+ nbpos[8] = 8;
+ nbpos[9] = 8;
+ break;
+ default:
+ nbiter = 0;
+ alp = 0;
+ nb_pulse = 0;
+ }
+
+ for (i = 0; i < nb_pulse; i++)
+ {
+ codvec[i] = i;
+ }
+
+ /*----------------------------------------------------------------*
+ * Find sign for each pulse position. *
+ *----------------------------------------------------------------*/
+ /* calculate energy for normalization of cn[] and dn[] */
+ /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+#ifdef ASM_OPT /* asm optimization branch */
+ s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+#else
+ s = Dot_product12(cn, cn, L_SUBFR, &exp);
+#endif
+
+ Isqrt_n(&s, &exp);
+ s = L_shl(s, (exp + 5));
+ k_cn = extract_h(L_add(s, 0x8000));
+
+ /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+#ifdef ASM_OPT /* asm optimization branch */
+ s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+#else
+ s = Dot_product12(dn, dn, L_SUBFR, &exp);
+#endif
+
+ Isqrt_n(&s, &exp);
+ k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16; /* k_dn = 256..4096 */
+ k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
+
+ /* mix normalized cn[] and dn[] */
+ p0 = cn;
+ p1 = dn;
+ p2 = dn2;
+
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ }
+
+ /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
+ for(i = 0; i < L_SUBFR; i++)
+ {
+ val = dn[i];
+ ps = dn2[i];
+ if (ps >= 0)
+ {
+ sign[i] = 32767; /* sign = +1 (Q12) */
+ vec[i] = -32768;
+ } else
+ {
+ sign[i] = -32768; /* sign = -1 (Q12) */
+ vec[i] = 32767;
+ dn[i] = -val;
+ dn2[i] = -ps;
+ }
+ }
+ /*----------------------------------------------------------------*
+ * Select NB_MAX position per track according to max of dn2[]. *
+ *----------------------------------------------------------------*/
+ pos = 0;
+ for (i = 0; i < NB_TRACK; i++)
+ {
+ for (k = 0; k < NB_MAX; k++)
+ {
+ ps = -1;
+ for (j = i; j < L_SUBFR; j += STEP)
+ {
+ if(dn2[j] > ps)
+ {
+ ps = dn2[j];
+ pos = j;
+ }
+ }
+ dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */
+ if (k == 0)
+ {
+ pos_max[i] = pos;
+ }
+ }
+ }
+
+ /*--------------------------------------------------------------*
+ * Scale h[] to avoid overflow and to get maximum of precision *
+ * on correlation. *
+ * *
+ * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16). *
+ * ==> This allow addition of 16 pulses without saturation. *
+ * *
+ * Energy worst case (on resonant impulse response), *
+ * - energy of h[] is approximately MAX/16. *
+ * - During search, the energy is divided by 8 to avoid *
+ * overflow on "alp". (energy of h[] = MAX/128). *
+ * ==> "alp" worst case detected is 22854 on sinusoidal wave. *
+ *--------------------------------------------------------------*/
+
+ /* impulse response buffer for fast computation */
+
+ h = h_buf;
+ h_inv = h_buf + (2 * L_SUBFR);
+ L_tmp = 0;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ *h++ = 0;
+ *h_inv++ = 0;
+ L_tmp += (H[i] * H[i]) << 1;
+ }
+ /* scale h[] down (/2) when energy of h[] is high with many pulses used */
+ val = extract_h(L_tmp);
+ h_shift = 0;
+
+ if ((nb_pulse >= 12) && (val > 1024))
+ {
+ h_shift = 1;
+ }
+ p0 = H;
+ p1 = h;
+ p2 = h_inv;
+
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixix[][] needed for the codebook search. *
+ * This algorithm compute impulse response energy of all *
+ * positions (16) in each track (4). Total = 4x16 = 64. *
+ *------------------------------------------------------------*/
+
+ /* storage order --> i3i3, i2i2, i1i1, i0i0 */
+
+ /* Init pointers to last position of rrixix[] */
+ p0 = &rrixix[0][NB_POS - 1];
+ p1 = &rrixix[1][NB_POS - 1];
+ p2 = &rrixix[2][NB_POS - 1];
+ p3 = &rrixix[3][NB_POS - 1];
+
+ ptr_h1 = h;
+ cor = 0x00008000L; /* for rounding */
+ for (i = 0; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p3-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p2-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p1-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p0-- = extract_h(cor);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixiy[][] needed for the codebook search. *
+ * This algorithm compute correlation between 2 pulses *
+ * (2 impulses responses) in 4 possible adjacents tracks. *
+ * (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. *
+ *------------------------------------------------------------*/
+
+ /* storage order --> i2i3, i1i2, i0i1, i3i0 */
+
+ pos = MSIZE - 1;
+ ptr_hf = h + 1;
+
+ for (k = 0; k < NB_POS; k++)
+ {
+ p3 = &rrixiy[2][pos];
+ p2 = &rrixiy[1][pos];
+ p1 = &rrixiy[0][pos];
+ p0 = &rrixiy[3][pos - NB_POS];
+
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
+
+ for (i = k + 1; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
+
+ p3 -= (NB_POS + 1);
+ p2 -= (NB_POS + 1);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+
+ pos -= NB_POS;
+ ptr_hf += STEP;
+ }
+
+ /* storage order --> i3i0, i2i3, i1i2, i0i1 */
+
+ pos = MSIZE - 1;
+ ptr_hf = h + 3;
+
+ for (k = 0; k < NB_POS; k++)
+ {
+ p3 = &rrixiy[3][pos];
+ p2 = &rrixiy[2][pos - 1];
+ p1 = &rrixiy[1][pos - 1];
+ p0 = &rrixiy[0][pos - 1];
+
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
+
+ for (i = k + 1; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
+
+ p3 -= (NB_POS + 1);
+ p2 -= (NB_POS + 1);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+
+ pos--;
+ ptr_hf += STEP;
+ }
+
+ /*------------------------------------------------------------*
+ * Modification of rrixiy[][] to take signs into account. *
+ *------------------------------------------------------------*/
+
+ p0 = &rrixiy[0][0];
+
+ for (k = 0; k < NB_TRACK; k++)
+ {
+ j_temp = (k + 1)&0x03;
+ for (i = k; i < L_SUBFR; i += STEP)
+ {
+ psign = sign;
+ if (psign[i] < 0)
+ {
+ psign = vec;
+ }
+ j = j_temp;
+ for (; j < L_SUBFR; j += STEP)
+ {
+ *p0 = vo_mult(*p0, psign[j]);
+ p0++;
+ }
+ }
+ }
+
+ /*-------------------------------------------------------------------*
+ * Deep first search *
+ *-------------------------------------------------------------------*/
+
+ psk = -1;
+ alpk = 1;
+
+ for (k = 0; k < nbiter; k++)
+ {
+ j_temp = k<<2;
+ for (i = 0; i < nb_pulse; i++)
+ ipos[i] = tipos[j_temp + i];
+
+ if(nbbits == 20)
+ {
+ pos = 0;
+ ps = 0;
+ alp = 0;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ vec[i] = 0;
+ }
+ } else if ((nbbits == 36) || (nbbits == 44))
+ {
+ /* first stage: fix 2 pulses */
+ pos = 2;
+
+ ix = ind[0] = pos_max[ipos[0]];
+ iy = ind[1] = pos_max[ipos[1]];
+ ps = dn[ix] + dn[iy];
+ i = ix >> 2; /* ix / STEP */
+ j = iy >> 2; /* iy / STEP */
+ s = rrixix[ipos[0]][i] << 13;
+ s += rrixix[ipos[1]][j] << 13;
+ i = (i << 4) + j; /* (ix/STEP)*NB_POS + (iy/STEP) */
+ s += rrixiy[ipos[0]][i] << 14;
+ alp = (s + 0x8000) >> 16;
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ vec[i] = (*p0++) + (*p1++);
+ }
+
+ if(nbbits == 44)
+ {
+ ipos[8] = 0;
+ ipos[9] = 1;
+ }
+ } else
+ {
+ /* first stage: fix 4 pulses */
+ pos = 4;
+
+ ix = ind[0] = pos_max[ipos[0]];
+ iy = ind[1] = pos_max[ipos[1]];
+ i = ind[2] = pos_max[ipos[2]];
+ j = ind[3] = pos_max[ipos[3]];
+ ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);
+
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ if (sign[i] < 0)
+ p2 = h_inv - i;
+ else
+ p2 = h - i;
+
+ if (sign[j] < 0)
+ p3 = h_inv - j;
+ else
+ p3 = h - j;
+
+ L_tmp = 0L;
+ for(i = 0; i < L_SUBFR; i++)
+ {
+ vec[i] = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);
+ L_tmp += (vec[i] * vec[i]) << 1;
+ }
+
+ alp = ((L_tmp >> 3) + 0x8000) >> 16;
+
+ if(nbbits == 72)
+ {
+ ipos[16] = 0;
+ ipos[17] = 1;
+ }
+ }
+
+ /* other stages of 2 pulses */
+
+ for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
+ {
+ /*--------------------------------------------------*
+ * Calculate correlation of all possible positions *
+ * of the next 2 pulses with previous fixed pulses. *
+ * Each pulse can have 16 possible positions. *
+ *--------------------------------------------------*/
+ if(ipos[j] == 3)
+ {
+ cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+ }
+ else
+ {
+#ifdef ASM_OPT /* asm optimization branch */
+ cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+#else
+ cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+#endif
+ }
+ /*--------------------------------------------------*
+ * Find best positions of 2 pulses. *
+ *--------------------------------------------------*/
+ search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
+ &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);
+
+ ind[j] = ix;
+ ind[j + 1] = iy;
+
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ for (i = 0; i < L_SUBFR; i+=4)
+ {
+ vec[i] += add1((*p0++), (*p1++));
+ vec[i+1] += add1((*p0++), (*p1++));
+ vec[i+2] += add1((*p0++), (*p1++));
+ vec[i+3] += add1((*p0++), (*p1++));
+ }
+ }
+ /* memorise the best codevector */
+ ps = vo_mult(ps, ps);
+ s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp);
+ if (s > 0)
+ {
+ psk = ps;
+ alpk = alp;
+ for (i = 0; i < nb_pulse; i++)
+ {
+ codvec[i] = ind[i];
+ }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ y[i] = vec[i];
+ }
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * Build the codeword, the filtered codeword and index of codevector.*
+ *-------------------------------------------------------------------*/
+ for (i = 0; i < NPMAXPT * NB_TRACK; i++)
+ {
+ ind[i] = -1;
+ }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ code[i] = 0;
+ y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */
+ }
+ val = (512 >> h_shift); /* codeword in Q9 format */
+ for (k = 0; k < nb_pulse; k++)
+ {
+ i = codvec[k]; /* read pulse position */
+ j = sign[i]; /* read sign */
+ index = i >> 2; /* index = pos of pulse (0..15) */
+ track = (Word16) (i & 0x03); /* track = i % NB_TRACK (0..3) */
+
+ if (j > 0)
+ {
+ code[i] += val;
+ codvec[k] += 128;
+ } else
+ {
+ code[i] -= val;
+ index += NB_POS;
+ }
+
+ i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));
+
+ while (ind[i] >= 0)
+ {
+ i += 1;
+ }
+ ind[i] = index;
+ }
+
+ k = 0;
+ /* Build index of codevector */
+ if(nbbits == 20)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_1p_N1(ind[k], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 36)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 44)
+ {
+ for (track = 0; track < NB_TRACK - 2; track++)
+ {
+ _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+ k += NPMAXPT;
+ }
+ for (track = 2; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 52)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 64)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ L_index = quant_4p_4N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 14) & 3);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 72)
+ {
+ for (track = 0; track < NB_TRACK - 2; track++)
+ {
+ L_index = quant_5p_5N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 10) & 0x03FF);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);
+ k += NPMAXPT;
+ }
+ for (track = 2; track < NB_TRACK; track++)
+ {
+ L_index = quant_4p_4N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 14) & 3);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 88)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ L_index = quant_6p_6N_2(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 11) & 0x07FF);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);
+ k += NPMAXPT;
+ }
+ }
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * Function cor_h_vec() *
+ * ~~~~~~~~~~~~~~~~~~~~~ *
+ * Compute correlations of h[] with vec[] for the specified track. *
+ *-------------------------------------------------------------------*/
+void cor_h_vec_30(
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ )
+{
+ Word32 i, j, pos, corr;
+ Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+ Word32 L_sum1,L_sum2;
+ cor_x = cor_1;
+ cor_y = cor_2;
+ p0 = rrixix[track];
+ p3 = rrixix[0];
+ pos = track;
+
+ for (i = 0; i < NB_POS; i+=2)
+ {
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=pos;j < L_SUBFR; j++)
+ {
+ L_sum1 += *p1 * *p2;
+ p2-=3;
+ L_sum2 += *p1++ * *p2;
+ p2+=4;
+ }
+ p2-=3;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = vo_round(L_sum1);
+ *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = vo_round(L_sum2);
+ *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+ pos += STEP;
+
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=pos;j < L_SUBFR; j++)
+ {
+ L_sum1 += *p1 * *p2;
+ p2-=3;
+ L_sum2 += *p1++ * *p2;
+ p2+=4;
+ }
+ p2-=3;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = vo_round(L_sum1);
+ *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = vo_round(L_sum2);
+ *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+ pos += STEP;
+ }
+ return;
+}
+
+void cor_h_vec_012(
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ )
+{
+ Word32 i, j, pos, corr;
+ Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+ Word32 L_sum1,L_sum2;
+ cor_x = cor_1;
+ cor_y = cor_2;
+ p0 = rrixix[track];
+ p3 = rrixix[track+1];
+ pos = track;
+
+ for (i = 0; i < NB_POS; i+=2)
+ {
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=62-pos ;j >= 0; j--)
+ {
+ L_sum1 += *p1 * *p2++;
+ L_sum2 += *p1++ * *p2;
+ }
+ L_sum1 += *p1 * *p2;
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = (L_sum1 + 0x8000) >> 16;
+ cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = (L_sum2 + 0x8000) >> 16;
+ cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+ pos += STEP;
+
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j= 62-pos;j >= 0; j--)
+ {
+ L_sum1 += *p1 * *p2++;
+ L_sum2 += *p1++ * *p2;
+ }
+ L_sum1 += *p1 * *p2;
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = (L_sum1 + 0x8000) >> 16;
+ cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = (L_sum2 + 0x8000) >> 16;
+ cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+ pos += STEP;
+ }
+ return;
+}
+
+/*-------------------------------------------------------------------*
+ * Function search_ixiy() *
+ * ~~~~~~~~~~~~~~~~~~~~~~~ *
+ * Find the best positions of 2 pulses in a subframe. *
+ *-------------------------------------------------------------------*/
+
+void search_ixiy(
+ Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
+ Word16 track_x, /* (i) track of pulse 1 */
+ Word16 track_y, /* (i) track of pulse 2 */
+ Word16 * ps, /* (i/o) correlation of all fixed pulses */
+ Word16 * alp, /* (i/o) energy of all fixed pulses */
+ Word16 * ix, /* (o) position of pulse 1 */
+ Word16 * iy, /* (o) position of pulse 2 */
+ Word16 dn[], /* (i) corr. between target and h[] */
+ Word16 dn2[], /* (i) vector of selected positions */
+ Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
+ Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
+ Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
+ )
+{
+ Word32 x, y, pos, thres_ix;
+ Word16 ps1, ps2, sq, sqk;
+ Word16 alp_16, alpk;
+ Word16 *p0, *p1, *p2;
+ Word32 s, alp0, alp1, alp2;
+
+ p0 = cor_x;
+ p1 = cor_y;
+ p2 = rrixiy[track_x];
+
+ thres_ix = nb_pos_ix - NB_MAX;
+
+ alp0 = L_deposit_h(*alp);
+ alp0 = (alp0 + 0x00008000L); /* for rounding */
+
+ sqk = -1;
+ alpk = 1;
+
+ for (x = track_x; x < L_SUBFR; x += STEP)
+ {
+ ps1 = *ps + dn[x];
+ alp1 = alp0 + ((*p0++)<<13);
+
+ if (dn2[x] < thres_ix)
+ {
+ pos = -1;
+ for (y = track_y; y < L_SUBFR; y += STEP)
+ {
+ ps2 = add1(ps1, dn[y]);
+
+ alp2 = alp1 + ((*p1++)<<13);
+ alp2 = alp2 + ((*p2++)<<14);
+ alp_16 = extract_h(alp2);
+ sq = vo_mult(ps2, ps2);
+ s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1);
+
+ if (s > 0)
+ {
+ sqk = sq;
+ alpk = alp_16;
+ pos = y;
+ }
+ }
+ p1 -= NB_POS;
+
+ if (pos >= 0)
+ {
+ *ix = x;
+ *iy = pos;
+ }
+ } else
+ {
+ p2 += NB_POS;
+ }
+ }
+
+ *ps = add1(*ps, add1(dn[*ix], dn[*iy]));
+ *alp = alpk;
+
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c
new file mode 100644
index 0000000..c17264c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c
@@ -0,0 +1,73 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: cmnMemory.c
+
+ Content: sample code for memory operator implementation
+
+*******************************************************************************/
+#include "cmnMemory.h"
+
+#include <malloc.h>
+#if defined LINUX
+#include <string.h>
+#endif
+
+//VO_MEM_OPERATOR g_memOP;
+
+VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo)
+{
+ if (!pMemInfo)
+ return VO_ERR_INVALID_ARG;
+
+ pMemInfo->VBuffer = malloc (pMemInfo->Size);
+ return 0;
+}
+
+VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)
+{
+ free (pMem);
+ return 0;
+}
+
+VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)
+{
+ memset (pBuff, uValue, uSize);
+ return 0;
+}
+
+VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+ memcpy (pDest, pSource, uSize);
+ return 0;
+}
+
+VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)
+{
+ return 0;
+}
+
+VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)
+{
+ return memcmp(pBuffer1, pBuffer2, uSize);
+}
+
+VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+ memmove (pDest, pSource, uSize);
+ return 0;
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/convolve.c b/media/libstagefright/codecs/amrwbenc/src/convolve.c
new file mode 100644
index 0000000..66c74d6
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/convolve.c
@@ -0,0 +1,109 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+ File: convolve.c
+
+ Description:Perform the convolution between two vectors x[] and h[]
+ and write the result in the vector y[]
+
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Convolve (
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) : impulse response */
+ Word16 y[], /* (o) : output vector */
+ Word16 L /* (i) : vector size */
+ )
+{
+ Word32 i, n;
+ Word16 *tmpH,*tmpX;
+ Word32 s;
+ for (n = 0; n < 64;)
+ {
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
+
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
+
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
+
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
+
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
+
+ s = 0;
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
new file mode 100644
index 0000000..3c2e9d5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
@@ -0,0 +1,127 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: cor_h_x.c *
+* *
+* Description:Compute correlation between target "x[]" and "h[]" *
+* Designed for codebook search (24 pulses, 4 tracks, *
+* 4 pulses per track, 16 positions in each track) to *
+* avoid saturation. *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+#define L_SUBFR 64
+#define NB_TRACK 4
+#define STEP 4
+
+void cor_h_x(
+ Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */
+ Word16 x[], /* (i) Q0 : target vector */
+ Word16 dn[] /* (o) <12bit : correlation between target and h[] */
+ )
+{
+ Word32 i, j;
+ Word32 L_tmp, y32[L_SUBFR], L_tot;
+ Word16 *p1, *p2;
+ Word32 *p3;
+ Word32 L_max, L_max1, L_max2, L_max3;
+ /* first keep the result on 32 bits and find absolute maximum */
+ L_tot = 1;
+ L_max = 0;
+ L_max1 = 0;
+ L_max2 = 0;
+ L_max3 = 0;
+ for (i = 0; i < L_SUBFR; i += STEP)
+ {
+ L_tmp = 1; /* 1 -> to avoid null dn[] */
+ p1 = &x[i];
+ p2 = &h[0];
+ for (j = i; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
+
+ y32[i] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max)
+ {
+ L_max = L_tmp;
+ }
+
+ L_tmp = 1L;
+ p1 = &x[i+1];
+ p2 = &h[0];
+ for (j = i+1; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
+
+ y32[i+1] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max1)
+ {
+ L_max1 = L_tmp;
+ }
+
+ L_tmp = 1;
+ p1 = &x[i+2];
+ p2 = &h[0];
+ for (j = i+2; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
+
+ y32[i+2] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max2)
+ {
+ L_max2 = L_tmp;
+ }
+
+ L_tmp = 1;
+ p1 = &x[i+3];
+ p2 = &h[0];
+ for (j = i+3; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
+
+ y32[i+3] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max3)
+ {
+ L_max3 = L_tmp;
+ }
+ }
+ /* tot += 3*max / 8 */
+ L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2);
+ L_tot = vo_L_add(L_tot, L_max); /* +max/4 */
+ L_tot = vo_L_add(L_tot, (L_max >> 1)); /* +max/8 */
+
+ /* Find the number of right shifts to do on y32[] so that */
+ /* 6.0 x sumation of max of dn[] in each track not saturate. */
+ j = norm_l(L_tot) - 4; /* 4 -> 16 x tot */
+ p1 = dn;
+ p3 = y32;
+ for (i = 0; i < L_SUBFR; i+=4)
+ {
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/decim54.c b/media/libstagefright/codecs/amrwbenc/src/decim54.c
new file mode 100644
index 0000000..429a7d6
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/decim54.c
@@ -0,0 +1,146 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: decim54.c *
+* *
+* Description:Decimation of 16kHz signal to 12.8kHz *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define FAC5 5
+#define DOWN_FAC 26215 /* 4/5 in Q15 */
+
+#define NB_COEF_DOWN 15
+
+/* Local functions */
+static void Down_samp(
+ Word16 * sig, /* input: signal to downsampling */
+ Word16 * sig_d, /* output: downsampled signal */
+ Word16 L_frame_d /* input: length of output */
+ );
+
+/* 1/5 resolution interpolation filter (in Q14) */
+/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */
+
+static Word16 fir_down1[4][30] =
+{
+ {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408,
+ 294, -128, 0, 54, -50, 24, -5, 0},
+
+ {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441,
+ 198, 0, -95, 99, -58, 18, 0, -1},
+
+ {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0,
+ 153, -170, 111, -41, 0, 9, -3},
+
+ {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0,
+ -233, 270, -188, 77, 0, -26, 19, -6}
+};
+
+void Init_Decim_12k8(
+ Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
+ )
+{
+ Set_zero(mem, 2 * NB_COEF_DOWN);
+ return;
+}
+
+void Decim_12k8(
+ Word16 sig16k[], /* input: signal to downsampling */
+ Word16 lg, /* input: length of input */
+ Word16 sig12k8[], /* output: decimated signal */
+ Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
+ )
+{
+ Word16 lg_down;
+ Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)];
+
+ Copy(mem, signal, 2 * NB_COEF_DOWN);
+
+ Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg);
+
+ lg_down = (lg * DOWN_FAC)>>15;
+
+ Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down);
+
+ Copy(signal + lg, mem, 2 * NB_COEF_DOWN);
+
+ return;
+}
+
+static void Down_samp(
+ Word16 * sig, /* input: signal to downsampling */
+ Word16 * sig_d, /* output: downsampled signal */
+ Word16 L_frame_d /* input: length of output */
+ )
+{
+ Word32 i, j, frac, pos;
+ Word16 *x, *y;
+ Word32 L_sum;
+
+ pos = 0; /* position is in Q2 -> 1/4 resolution */
+ for (j = 0; j < L_frame_d; j++)
+ {
+ i = (pos >> 2); /* integer part */
+ frac = pos & 3; /* fractional part */
+ x = sig + i - NB_COEF_DOWN + 1;
+ y = (Word16 *)(fir_down1 + frac);
+
+ L_sum = vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x),(*y));
+
+ L_sum = L_shl2(L_sum, 2);
+ sig_d[j] = extract_h(L_add(L_sum, 0x8000));
+ pos += FAC5; /* pos + 5/4 */
+ }
+ return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/deemph.c b/media/libstagefright/codecs/amrwbenc/src/deemph.c
new file mode 100644
index 0000000..6ad528d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c
@@ -0,0 +1,117 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: deemph.c *
+* *
+* Description:filtering through 1/(1-mu z^ -1) *
+* Deemph2 --> signal is divided by 2 *
+* Deemph_32 --> for 32 bits signal. *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+void Deemph(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
+{
+ Word32 i;
+ Word32 L_tmp;
+
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp = L_mac(L_tmp, *mem, mu);
+ x[0] = vo_round(L_tmp);
+
+ for (i = 1; i < L; i++)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp = L_mac(L_tmp, x[i - 1], mu);
+ x[i] = voround(L_tmp);
+ }
+
+ *mem = x[L - 1];
+
+ return;
+}
+
+
+void Deemph2(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
+{
+ Word32 i;
+ Word32 L_tmp;
+ L_tmp = x[0] << 15;
+ L_tmp += ((*mem) * mu)<<1;
+ x[0] = (L_tmp + 0x8000)>>16;
+ for (i = 1; i < L; i++)
+ {
+ L_tmp = x[i] << 15;
+ L_tmp += (x[i - 1] * mu)<<1;
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+ *mem = x[L - 1];
+ return;
+}
+
+
+void Deemph_32(
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
+{
+ Word16 fac;
+ Word32 i, L_tmp;
+
+ fac = mu >> 1; /* Q15 --> Q14 */
+
+ L_tmp = L_deposit_h(x_hi[0]);
+ L_tmp += (x_lo[0] * 8)<<1;
+ L_tmp = (L_tmp << 3);
+ L_tmp += ((*mem) * fac)<<1;
+ L_tmp = (L_tmp << 1);
+ y[0] = (L_tmp + 0x8000)>>16;
+
+ for (i = 1; i < L; i++)
+ {
+ L_tmp = L_deposit_h(x_hi[i]);
+ L_tmp += (x_lo[i] * 8)<<1;
+ L_tmp = (L_tmp << 3);
+ L_tmp += (y[i - 1] * fac)<<1;
+ L_tmp = (L_tmp << 1);
+ y[i] = (L_tmp + 0x8000)>>16;
+ }
+
+ *mem = y[L - 1];
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/dtx.c b/media/libstagefright/codecs/amrwbenc/src/dtx.c
new file mode 100644
index 0000000..02921eb
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/dtx.c
@@ -0,0 +1,605 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: dtx.c *
+* *
+* Description:DTX functions *
+* *
+************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "cnst.h"
+#include "acelp.h" /* prototype of functions */
+#include "bits.h"
+#include "dtx.h"
+#include "log2.h"
+#include "mem_align.h"
+
+static void aver_isf_history(
+ Word16 isf_old[],
+ Word16 indices[],
+ Word32 isf_aver[]
+ );
+
+static void find_frame_indices(
+ Word16 isf_old_tx[],
+ Word16 indices[],
+ dtx_encState * st
+ );
+
+static Word16 dithering_control(
+ dtx_encState * st
+ );
+
+/* excitation energy adjustment depending on speech coder mode used, Q7 */
+static Word16 en_adjust[9] =
+{
+ 230, /* mode0 = 7k : -5.4dB */
+ 179, /* mode1 = 9k : -4.2dB */
+ 141, /* mode2 = 12k : -3.3dB */
+ 128, /* mode3 = 14k : -3.0dB */
+ 122, /* mode4 = 16k : -2.85dB */
+ 115, /* mode5 = 18k : -2.7dB */
+ 115, /* mode6 = 20k : -2.7dB */
+ 115, /* mode7 = 23k : -2.7dB */
+ 115 /* mode8 = 24k : -2.7dB */
+};
+
+/**************************************************************************
+*
+* Function : dtx_enc_init
+*
+**************************************************************************/
+Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP)
+{
+ dtx_encState *s;
+
+ if (st == (dtx_encState **) NULL)
+ {
+ fprintf(stderr, "dtx_enc_init: invalid parameter\n");
+ return -1;
+ }
+ *st = NULL;
+
+ /* allocate memory */
+ if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");
+ return -1;
+ }
+ dtx_enc_reset(s, isf_init);
+ *st = s;
+ return 0;
+}
+
+/**************************************************************************
+*
+* Function : dtx_enc_reset
+*
+**************************************************************************/
+Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[])
+{
+ Word32 i;
+
+ if (st == (dtx_encState *) NULL)
+ {
+ fprintf(stderr, "dtx_enc_reset: invalid parameter\n");
+ return -1;
+ }
+ st->hist_ptr = 0;
+ st->log_en_index = 0;
+
+ /* Init isf_hist[] */
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ Copy(isf_init, &st->isf_hist[i * M], M);
+ }
+ st->cng_seed = RANDOM_INITSEED;
+
+ /* Reset energy history */
+ Set_zero(st->log_en_hist, DTX_HIST_SIZE);
+
+ st->dtxHangoverCount = DTX_HANG_CONST;
+ st->decAnaElapsedCount = 32767;
+
+ for (i = 0; i < 28; i++)
+ {
+ st->D[i] = 0;
+ }
+
+ for (i = 0; i < DTX_HIST_SIZE - 1; i++)
+ {
+ st->sumD[i] = 0;
+ }
+
+ return 1;
+}
+
+/**************************************************************************
+*
+* Function : dtx_enc_exit
+*
+**************************************************************************/
+void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP)
+{
+ if (st == NULL || *st == NULL)
+ return;
+ /* deallocate memory */
+ mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB);
+ *st = NULL;
+ return;
+}
+
+
+/**************************************************************************
+*
+* Function : dtx_enc
+*
+**************************************************************************/
+Word16 dtx_enc(
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf[M], /* o : CN ISF vector */
+ Word16 * exc2, /* o : CN excitation */
+ Word16 ** prms
+ )
+{
+ Word32 i, j;
+ Word16 indice[7];
+ Word16 log_en, gain, level, exp, exp0, tmp;
+ Word16 log_en_int_e, log_en_int_m;
+ Word32 L_isf[M], ener32, level32;
+ Word16 isf_order[3];
+ Word16 CN_dith;
+
+ /* VOX mode computation of SID parameters */
+ log_en = 0;
+ for (i = 0; i < M; i++)
+ {
+ L_isf[i] = 0;
+ }
+ /* average energy and isf */
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ /* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */
+ log_en = add(log_en, st->log_en_hist[i]);
+
+ }
+ find_frame_indices(st->isf_hist, isf_order, st);
+ aver_isf_history(st->isf_hist, isf_order, L_isf);
+
+ for (j = 0; j < M; j++)
+ {
+ isf[j] = (Word16)(L_isf[j] >> 3); /* divide by 8 */
+ }
+
+ /* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E). */
+ /* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */
+
+ /* increase dynamics to 7 bits (Q8) */
+ log_en = (log_en >> 2);
+
+ /* Add 2 in Q8 = 512 to get log2(E) between 0:24 */
+ log_en = add(log_en, 512);
+
+ /* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */
+ log_en = mult(log_en, 21504);
+
+ /* Quantize Energy */
+ st->log_en_index = shr(log_en, 6);
+
+ if(st->log_en_index > 63)
+ {
+ st->log_en_index = 63;
+ }
+ if (st->log_en_index < 0)
+ {
+ st->log_en_index = 0;
+ }
+ /* Quantize ISFs */
+ Qisf_ns(isf, isf, indice);
+
+
+ Parm_serial(indice[0], 6, prms);
+ Parm_serial(indice[1], 6, prms);
+ Parm_serial(indice[2], 6, prms);
+ Parm_serial(indice[3], 5, prms);
+ Parm_serial(indice[4], 5, prms);
+
+ Parm_serial((st->log_en_index), 6, prms);
+
+ CN_dith = dithering_control(st);
+ Parm_serial(CN_dith, 1, prms);
+
+ /* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) ); */
+ /* log2(E) in Q9 (log2(E) lies in between -2:22) */
+ log_en = shl(st->log_en_index, 15 - 6);
+
+ /* Divide by 2.625; log_en will be between 0:24 */
+ log_en = mult(log_en, 12483);
+ /* the result corresponds to log2(gain) in Q10 */
+
+ /* Find integer part */
+ log_en_int_e = (log_en >> 10);
+
+ /* Find fractional part */
+ log_en_int_m = (Word16) (log_en & 0x3ff);
+ log_en_int_m = shl(log_en_int_m, 5);
+
+ /* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */
+ /* Add 16 in order to have the result of pow2 in Q16 */
+ log_en_int_e = add(log_en_int_e, 16 - 1);
+
+ level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */
+ exp0 = norm_l(level32);
+ level32 = (level32 << exp0); /* level in Q31 */
+ exp0 = (15 - exp0);
+ level = extract_h(level32); /* level in Q15 */
+
+ /* generate white noise vector */
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = (Random(&(st->cng_seed)) >> 4);
+ }
+
+ /* gain = level / sqrt(ener) * sqrt(L_FRAME) */
+
+ /* energy of generated excitation */
+ ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);
+
+ Isqrt_n(&ener32, &exp);
+
+ gain = extract_h(ener32);
+
+ gain = mult(level, gain); /* gain in Q15 */
+
+ exp = add(exp0, exp);
+
+ /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */
+ exp += 4;
+
+ for (i = 0; i < L_FRAME; i++)
+ {
+ tmp = mult(exc2[i], gain); /* Q0 * Q15 */
+ exc2[i] = shl(tmp, exp);
+ }
+
+ return 0;
+}
+
+/**************************************************************************
+*
+* Function : dtx_buffer Purpose : handles the DTX buffer
+*
+**************************************************************************/
+Word16 dtx_buffer(
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf_new[], /* i : isf vector */
+ Word32 enr, /* i : residual energy (in L_FRAME) */
+ Word16 codec_mode
+ )
+{
+ Word16 log_en;
+
+ Word16 log_en_e;
+ Word16 log_en_m;
+ st->hist_ptr = add(st->hist_ptr, 1);
+ if(st->hist_ptr == DTX_HIST_SIZE)
+ {
+ st->hist_ptr = 0;
+ }
+ /* copy lsp vector into buffer */
+ Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M);
+
+ /* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f); */
+ Log2(enr, &log_en_e, &log_en_m);
+
+ /* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */
+ log_en = shl(log_en_e, 7); /* Q7 */
+ log_en = add(log_en, shr(log_en_m, 15 - 7));
+
+ /* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The
+ * constant 0.0059322 takes into account windowings and analysis length from autocorrelation
+ * computations; 7.39722 in Q7 = 947 */
+ /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+ /* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */
+
+ /* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0 (1024 in Q7) */
+ /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+
+ log_en = sub(log_en, add(1024, en_adjust[codec_mode]));
+
+ /* Insert into the buffer */
+ st->log_en_hist[st->hist_ptr] = log_en;
+ return 0;
+}
+
+/**************************************************************************
+*
+* Function : tx_dtx_handler Purpose : adds extra speech hangover
+* to analyze speech on
+* the decoding side.
+**************************************************************************/
+void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */
+ Word16 vad_flag, /* i : vad decision */
+ Word16 * usedMode /* i/o : mode changed or not */
+ )
+{
+
+ /* this state machine is in synch with the GSMEFR txDtx machine */
+ st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
+
+ if (vad_flag != 0)
+ {
+ st->dtxHangoverCount = DTX_HANG_CONST;
+ } else
+ { /* non-speech */
+ if (st->dtxHangoverCount == 0)
+ { /* out of decoder analysis hangover */
+ st->decAnaElapsedCount = 0;
+ *usedMode = MRDTX;
+ } else
+ { /* in possible analysis hangover */
+ st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
+
+ /* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
+ if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),
+ DTX_ELAPSED_FRAMES_THRESH) < 0)
+ {
+ *usedMode = MRDTX;
+ /* if short time since decoder update, do not add extra HO */
+ }
+ /* else override VAD and stay in speech mode *usedMode and add extra hangover */
+ }
+ }
+
+ return;
+}
+
+
+
+static void aver_isf_history(
+ Word16 isf_old[],
+ Word16 indices[],
+ Word32 isf_aver[]
+ )
+{
+ Word32 i, j, k;
+ Word16 isf_tmp[2 * M];
+ Word32 L_tmp;
+
+ /* Memorize in isf_tmp[][] the ISF vectors to be replaced by */
+ /* the median ISF vector prior to the averaging */
+ for (k = 0; k < 2; k++)
+ {
+ if ((indices[k] + 1) != 0)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isf_tmp[k * M + i] = isf_old[indices[k] * M + i];
+ isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i];
+ }
+ }
+ }
+
+ /* Perform the ISF averaging */
+ for (j = 0; j < M; j++)
+ {
+ L_tmp = 0;
+
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j]));
+ }
+ isf_aver[j] = L_tmp;
+ }
+
+ /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */
+ for (k = 0; k < 2; k++)
+ {
+ if ((indices[k] + 1) != 0)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isf_old[indices[k] * M + i] = isf_tmp[k * M + i];
+ }
+ }
+ }
+
+ return;
+}
+
+static void find_frame_indices(
+ Word16 isf_old_tx[],
+ Word16 indices[],
+ dtx_encState * st
+ )
+{
+ Word32 L_tmp, summin, summax, summax2nd;
+ Word16 i, j, tmp;
+ Word16 ptr;
+
+ /* Remove the effect of the oldest frame from the column */
+ /* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is */
+ /* not updated since it will be removed later. */
+
+ tmp = DTX_HIST_SIZE_MIN_ONE;
+ j = -1;
+ for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++)
+ {
+ j = add(j, tmp);
+ st->sumD[i] = L_sub(st->sumD[i], st->D[j]);
+ tmp = sub(tmp, 1);
+ }
+
+ /* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1] */
+ /* corresponding to the oldest frame is removed. The sum of */
+ /* the distances between the latest isf and other isfs, */
+ /* i.e. the element sumD[0], will be computed during this call. */
+ /* Hence this element is initialized to zero. */
+
+ for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--)
+ {
+ st->sumD[i] = st->sumD[i - 1];
+ }
+ st->sumD[0] = 0;
+
+ /* Remove the oldest frame from the distance matrix. */
+ /* Note that the distance matrix is replaced by a one- */
+ /* dimensional array to save static memory. */
+
+ tmp = 0;
+ for (i = 27; i >= 12; i = (Word16) (i - tmp))
+ {
+ tmp = add(tmp, 1);
+ for (j = tmp; j > 0; j--)
+ {
+ st->D[i - j + 1] = st->D[i - j - tmp];
+ }
+ }
+
+ /* Compute the first column of the distance matrix D */
+ /* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */
+
+ ptr = st->hist_ptr;
+ for (i = 1; i < DTX_HIST_SIZE; i++)
+ {
+ /* Compute the distance between the latest isf and the other isfs. */
+ ptr = sub(ptr, 1);
+ if (ptr < 0)
+ {
+ ptr = DTX_HIST_SIZE_MIN_ONE;
+ }
+ L_tmp = 0;
+ for (j = 0; j < M; j++)
+ {
+ tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);
+ L_tmp = L_mac(L_tmp, tmp, tmp);
+ }
+ st->D[i - 1] = L_tmp;
+
+ /* Update also the column sums. */
+ st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]);
+ st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]);
+ }
+
+ /* Find the minimum and maximum distances */
+ summax = st->sumD[0];
+ summin = st->sumD[0];
+ indices[0] = 0;
+ indices[2] = 0;
+ for (i = 1; i < DTX_HIST_SIZE; i++)
+ {
+ if (L_sub(st->sumD[i], summax) > 0)
+ {
+ indices[0] = i;
+ summax = st->sumD[i];
+ }
+ if (L_sub(st->sumD[i], summin) < 0)
+ {
+ indices[2] = i;
+ summin = st->sumD[i];
+ }
+ }
+
+ /* Find the second largest distance */
+ summax2nd = -2147483647L;
+ indices[1] = -1;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0))
+ {
+ indices[1] = i;
+ summax2nd = st->sumD[i];
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ indices[i] = sub(st->hist_ptr, indices[i]);
+ if (indices[i] < 0)
+ {
+ indices[i] = add(indices[i], DTX_HIST_SIZE);
+ }
+ }
+
+ /* If maximum distance/MED_THRESH is smaller than minimum distance */
+ /* then the median ISF vector replacement is not performed */
+ tmp = norm_l(summax);
+ summax = (summax << tmp);
+ summin = (summin << tmp);
+ L_tmp = L_mult(voround(summax), INV_MED_THRESH);
+ if(L_tmp <= summin)
+ {
+ indices[0] = -1;
+ }
+ /* If second largest distance/MED_THRESH is smaller than */
+ /* minimum distance then the median ISF vector replacement is */
+ /* not performed */
+ summax2nd = L_shl(summax2nd, tmp);
+ L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH);
+ if(L_tmp <= summin)
+ {
+ indices[1] = -1;
+ }
+ return;
+}
+
+static Word16 dithering_control(
+ dtx_encState * st
+ )
+{
+ Word16 tmp, mean, CN_dith, gain_diff;
+ Word32 i, ISF_diff;
+
+ /* determine how stationary the spectrum of background noise is */
+ ISF_diff = 0;
+ for (i = 0; i < 8; i++)
+ {
+ ISF_diff = L_add(ISF_diff, st->sumD[i]);
+ }
+ if ((ISF_diff >> 26) > 0)
+ {
+ CN_dith = 1;
+ } else
+ {
+ CN_dith = 0;
+ }
+
+ /* determine how stationary the energy of background noise is */
+ mean = 0;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ mean = add(mean, st->log_en_hist[i]);
+ }
+ mean = (mean >> 3);
+ gain_diff = 0;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ tmp = abs_s(sub(st->log_en_hist[i], mean));
+ gain_diff = add(gain_diff, tmp);
+ }
+ if (gain_diff > GAIN_THR)
+ {
+ CN_dith = 1;
+ }
+ return CN_dith;
+}
diff --git a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
new file mode 100644
index 0000000..570138e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
@@ -0,0 +1,79 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: g_pitch.c *
+* *
+* Description:Compute the gain of pitch. Result in Q12 *
+* if(gain < 0) gain = 0 *
+* if(gain > 1.2) gain = 1.2 *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */
+ Word16 xn[], /* (i) : Pitch target. */
+ Word16 y1[], /* (i) : filtered adaptive codebook. */
+ Word16 g_coeff[], /* : Correlations need for gain quantization. */
+ Word16 L_subfr /* : Length of subframe. */
+ )
+{
+ Word32 i;
+ Word16 xy, yy, exp_xy, exp_yy, gain;
+ /* Compute scalar product <y1[],y1[]> */
+#ifdef ASM_OPT /* asm optimization branch */
+ /* Compute scalar product <xn[],y1[]> */
+ xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));
+ yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));
+
+#else
+ /* Compute scalar product <xn[],y1[]> */
+ xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));
+ yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));
+
+#endif
+
+ g_coeff[0] = yy;
+ g_coeff[1] = exp_yy;
+ g_coeff[2] = xy;
+ g_coeff[3] = exp_xy;
+
+ /* If (xy < 0) gain = 0 */
+ if (xy < 0)
+ return ((Word16) 0);
+
+ /* compute gain = xy/yy */
+
+ xy >>= 1; /* Be sure xy < yy */
+ gain = div_s(xy, yy);
+
+ i = exp_xy;
+ i -= exp_yy;
+
+ gain = shl(gain, i);
+
+ /* if (gain > 1.2) gain = 1.2 in Q14 */
+ if(gain > 19661)
+ {
+ gain = 19661;
+ }
+ return (gain);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/gpclip.c b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
new file mode 100644
index 0000000..e23f2f4
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
@@ -0,0 +1,110 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/**************************************************************************
+* File: gpclip.c *
+* *
+* Description:To avoid unstable synthesis on frame erasure, the gain *
+* need to be limited(gain pitch < 1.0) when the following *
+* case occurs *
+* a resonance on LPC filter(lp_disp < 60Hz) *
+* a good pitch prediction (lp_gp > 0.95) *
+* *
+***************************************************************************/
+#include "typedef.h"
+#include "basic_op.h"
+
+#define DIST_ISF_MAX 307 /* 120 Hz (6400Hz=16384) */
+#define DIST_ISF_THRES 154 /* 60 (6400Hz=16384) */
+#define GAIN_PIT_THRES 14746 /* 0.9 in Q14 */
+#define GAIN_PIT_MIN 9830 /* 0.6 in Q14 */
+#define M 16
+
+
+void Init_gp_clip(
+ Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */
+ )
+{
+ mem[0] = DIST_ISF_MAX;
+ mem[1] = GAIN_PIT_MIN;
+}
+
+
+Word16 Gp_clip(
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
+{
+ Word16 clip = 0;
+ if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))
+ clip = 1;
+
+ return (clip);
+}
+
+
+void Gp_clip_test_isf(
+ Word16 isf[], /* (i) : isf values (in frequency domain) */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
+{
+ Word16 dist, dist_min;
+ Word32 i;
+
+ dist_min = vo_sub(isf[1], isf[0]);
+
+ for (i = 2; i < M - 1; i++)
+ {
+ dist = vo_sub(isf[i], isf[i - 1]);
+ if(dist < dist_min)
+ {
+ dist_min = dist;
+ }
+ }
+
+ dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min));
+
+ if (dist > DIST_ISF_MAX)
+ {
+ dist = DIST_ISF_MAX;
+ }
+ mem[0] = dist;
+
+ return;
+}
+
+
+void Gp_clip_test_gain_pit(
+ Word16 gain_pit, /* (i) Q14 : gain of quantized pitch */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
+{
+ Word16 gain;
+ Word32 L_tmp;
+ L_tmp = (29491 * mem[1])<<1;
+ L_tmp += (3277 * gain_pit)<<1;
+
+ gain = extract_h(L_tmp);
+
+ if(gain < GAIN_PIT_MIN)
+ {
+ gain = GAIN_PIT_MIN;
+ }
+ mem[1] = gain;
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/homing.c b/media/libstagefright/codecs/amrwbenc/src/homing.c
new file mode 100644
index 0000000..015633f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/homing.c
@@ -0,0 +1,46 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: homing.c *
+* *
+* Description:Performs the homing routines *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "cnst.h"
+#include "basic_op.h"
+#include "bits.h"
+#include "homing.tab"
+
+Word16 encoder_homing_frame_test(Word16 input_frame[])
+{
+ Word32 i;
+ Word16 j = 0;
+
+ /* check 320 input samples for matching EHF_MASK: defined in e_homing.h */
+ for (i = 0; i < L_FRAME16k; i++)
+ {
+ j = (Word16) (input_frame[i] ^ EHF_MASK);
+
+ if (j)
+ break;
+ }
+
+ return (Word16) (!j);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp400.c b/media/libstagefright/codecs/amrwbenc/src/hp400.c
new file mode 100644
index 0000000..463a53a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/hp400.c
@@ -0,0 +1,106 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: hp400.c *
+* *
+* Description: *
+* 2nd order high pass filter with cut off frequency at 400 Hz. *
+* Designed with cheby2 function in MATLAB. *
+* Optimized for fixed-point to get the following frequency response: *
+* *
+* frequency: 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz *
+* dB loss: -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB *
+* *
+* Algorithm: *
+* *
+* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] *
+* + a[1]*y[i-1] + a[2]*y[i-2]; *
+* *
+* Word16 b[3] = {3660, -7320, 3660}; in Q12 *
+* Word16 a[3] = {4096, 7320, -3540}; in Q12 *
+* *
+* float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; *
+* a[3] = {1.000000000, 1.787109375, -0.864257812}; *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+/* filter coefficients */
+static Word16 b[3] = {915, -1830, 915}; /* Q12 (/4) */
+static Word16 a[3] = {16384, 29280, -14160}; /* Q12 (x4) */
+/* Initialization of static values */
+
+void Init_HP400_12k8(Word16 mem[])
+{
+ Set_zero(mem, 6);
+}
+
+
+void HP400_12k8(
+ Word16 signal[], /* input signal / output is divided by 16 */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ )
+{
+ Word16 x2;
+ Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+ Word32 L_tmp;
+ Word32 num;
+ y2_hi = *mem++;
+ y2_lo = *mem++;
+ y1_hi = *mem++;
+ y1_lo = *mem++;
+ x0 = *mem++;
+ x1 = *mem;
+ num = (Word32)lg;
+ do
+ {
+ x2 = x1;
+ x1 = x0;
+ x0 = *signal;
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2]; */
+ L_tmp = 8192L; /* rounding to maximise precision */
+ L_tmp += y1_lo * a[1];
+ L_tmp += y2_lo * a[2];
+ L_tmp = L_tmp >> 14;
+ L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1;
+ L_tmp <<= 1; /* coeff Q12 --> Q13 */
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = (Word16)(L_tmp>>16);
+ y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+
+ /* signal is divided by 16 to avoid overflow in energy computation */
+ *signal++ = (L_tmp + 0x8000) >> 16;
+ }while(--num !=0);
+
+ *mem-- = x1;
+ *mem-- = x0;
+ *mem-- = y1_lo;
+ *mem-- = y1_hi;
+ *mem-- = y2_lo;
+ *mem = y2_hi;
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp50.c b/media/libstagefright/codecs/amrwbenc/src/hp50.c
new file mode 100644
index 0000000..53e3d7b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/hp50.c
@@ -0,0 +1,106 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: hp50.c *
+* *
+* Description: *
+* 2nd order high pass filter with cut off frequency at 31 Hz. *
+* Designed with cheby2 function in MATLAB. *
+* Optimized for fixed-point to get the following frequency response: *
+* *
+* frequency: 0Hz 14Hz 24Hz 31Hz 37Hz 41Hz 47Hz *
+* dB loss: -infdB -15dB -6dB -3dB -1.5dB -1dB -0.5dB *
+* *
+* Algorithm: *
+* *
+* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] *
+* + a[1]*y[i-1] + a[2]*y[i-2]; *
+* *
+* Word16 b[3] = {4053, -8106, 4053}; in Q12 *
+* Word16 a[3] = {8192, 16211, -8021}; in Q12 *
+* *
+* float --> b[3] = {0.989501953, -1.979003906, 0.989501953}; *
+* a[3] = {1.000000000, 1.978881836, -0.979125977}; *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "cnst.h"
+#include "acelp.h"
+
+/* filter coefficients */
+static Word16 b[3] = {4053, -8106, 4053}; /* Q12 */
+static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */
+
+/* Initialization of static values */
+
+void Init_HP50_12k8(Word16 mem[])
+{
+ Set_zero(mem, 6);
+}
+
+
+void HP50_12k8(
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ )
+{
+ Word16 x2;
+ Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+ Word32 L_tmp;
+ Word32 num;
+
+ y2_hi = *mem++;
+ y2_lo = *mem++;
+ y1_hi = *mem++;
+ y1_lo = *mem++;
+ x0 = *mem++;
+ x1 = *mem;
+ num = (Word32)lg;
+ do
+ {
+ x2 = x1;
+ x1 = x0;
+ x0 = *signal;
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2]; */
+ L_tmp = 8192 ; /* rounding to maximise precision */
+ L_tmp += y1_lo * a[1];
+ L_tmp += y2_lo * a[2];
+ L_tmp = L_tmp >> 14;
+ L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;
+ L_tmp <<= 2; /* coeff Q12 --> Q13 */
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = (Word16)(L_tmp>>16);
+ y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+ *signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));
+ }while(--num !=0);
+
+ *mem-- = x1;
+ *mem-- = x0;
+ *mem-- = y1_lo;
+ *mem-- = y1_hi;
+ *mem-- = y2_lo;
+ *mem-- = y2_hi;
+
+ return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp6k.c b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
new file mode 100644
index 0000000..5ee5b20
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
@@ -0,0 +1,93 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: hp6k.c *
+* *
+* Description:15th order band pass 6kHz to 7kHz FIR filter *
+* frequency: 4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz *
+* dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define L_FIR 31
+
+/* filter coefficients (gain=4.0) */
+
+Word16 fir_6k_7k[L_FIR] =
+{
+ -32, 47, 32, -27, -369,
+ 1122, -1421, 0, 3798, -8880,
+ 12349, -10984, 3548, 7766, -18001,
+ 22118, -18001, 7766, 3548, -10984,
+ 12349, -8880, 3798, 0, -1421,
+ 1122, -369, -27, 32, 47,
+ -32
+};
+
+
+void Init_Filt_6k_7k(Word16 mem[]) /* mem[30] */
+{
+ Set_zero(mem, L_FIR - 1);
+ return;
+}
+
+void Filt_6k_7k(
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ )
+{
+ Word16 x[L_SUBFR16k + (L_FIR - 1)];
+ Word32 i, L_tmp;
+
+ Copy(mem, x, L_FIR - 1);
+ for (i = lg - 1; i >= 0; i--)
+ {
+ x[i + L_FIR - 1] = signal[i] >> 2; /* gain of filter = 4 */
+ }
+ for (i = 0; i < lg; i++)
+ {
+ L_tmp = (x[i] + x[i+ 30]) * fir_6k_7k[0];
+ L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1];
+ L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2];
+ L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3];
+ L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4];
+ L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5];
+ L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6];
+ L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7];
+ L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8];
+ L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9];
+ L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10];
+ L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11];
+ L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12];
+ L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13];
+ L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14];
+ L_tmp += (x[i+15]) * fir_6k_7k[15];
+ signal[i] = (L_tmp + 0x4000) >> 15;
+ }
+
+ Copy(x + lg, mem, L_FIR - 1);
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
new file mode 100644
index 0000000..7fb62a4
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
@@ -0,0 +1,148 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: hp_wsp.c *
+* Description: *
+* 3nd order high pass filter with cut off frequency at 180Hz *
+* Algorithm: *
+* *
+* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3] *
+* + a[1]*y[i-1] + a[2]*y[i-2] + a[3]*y[i-3]; *
+* *
+* float a_coef[HP_ORDER]= { *
+* -2.64436711600664f, *
+* 2.35087386625360f, *
+* -0.70001156927424f}; *
+* *
+* float b_coef[HP_ORDER+1]= { *
+* -0.83787057505665f, *
+* 2.50975570071058f, *
+* -2.50975570071058f, *
+* 0.83787057505665f}; *
+* *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+/* filter coefficients in Q12 */
+static Word16 a[4] = {8192, 21663, -19258, 5734};
+static Word16 b[4] = {-3432, +10280, -10280, +3432};
+
+/* Initialization of static values */
+void Init_Hp_wsp(Word16 mem[])
+{
+ Set_zero(mem, 9);
+
+ return;
+}
+
+void scale_mem_Hp_wsp(Word16 mem[], Word16 exp)
+{
+ Word32 i;
+ Word32 L_tmp;
+
+ for (i = 0; i < 6; i += 2)
+ {
+ L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1));
+ L_tmp = L_shl(L_tmp, exp);
+ mem[i] = L_tmp >> 16;
+ mem[i + 1] = (L_tmp & 0xffff)>>1;
+ }
+
+ for (i = 6; i < 9; i++)
+ {
+ L_tmp = L_deposit_h(mem[i]); /* x[i] */
+ L_tmp = L_shl(L_tmp, exp);
+ mem[i] = vo_round(L_tmp);
+ }
+
+ return;
+}
+
+
+void Hp_wsp(
+ Word16 wsp[], /* i : wsp[] signal */
+ Word16 hp_wsp[], /* o : hypass wsp[] */
+ Word16 lg, /* i : lenght of signal */
+ Word16 mem[] /* i/o : filter memory [9] */
+ )
+{
+ Word16 x0, x1, x2, x3;
+ Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo;
+ Word32 i, L_tmp;
+
+ y3_hi = mem[0];
+ y3_lo = mem[1];
+ y2_hi = mem[2];
+ y2_lo = mem[3];
+ y1_hi = mem[4];
+ y1_lo = mem[5];
+ x0 = mem[6];
+ x1 = mem[7];
+ x2 = mem[8];
+
+ for (i = 0; i < lg; i++)
+ {
+ x3 = x2;
+ x2 = x1;
+ x1 = x0;
+ x0 = wsp[i];
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2] + a[3]*y[i-3] */
+
+ L_tmp = 16384L; /* rounding to maximise precision */
+ L_tmp += (y1_lo * a[1])<<1;
+ L_tmp += (y2_lo * a[2])<<1;
+ L_tmp += (y3_lo * a[3])<<1;
+ L_tmp = L_tmp >> 15;
+ L_tmp += (y1_hi * a[1])<<1;
+ L_tmp += (y2_hi * a[2])<<1;
+ L_tmp += (y3_hi * a[3])<<1;
+ L_tmp += (x0 * b[0])<<1;
+ L_tmp += (x1 * b[1])<<1;
+ L_tmp += (x2 * b[2])<<1;
+ L_tmp += (x3 * b[3])<<1;
+
+ L_tmp = L_tmp << 2;
+
+ y3_hi = y2_hi;
+ y3_lo = y2_lo;
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = L_tmp >> 16;
+ y1_lo = (L_tmp & 0xffff) >>1;
+
+ hp_wsp[i] = (L_tmp + 0x4000)>>15;
+ }
+
+ mem[0] = y3_hi;
+ mem[1] = y3_lo;
+ mem[2] = y2_hi;
+ mem[3] = y2_lo;
+ mem[4] = y1_hi;
+ mem[5] = y1_lo;
+ mem[6] = x0;
+ mem[7] = x1;
+ mem[8] = x2;
+
+ return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
new file mode 100644
index 0000000..be1fd0b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
@@ -0,0 +1,66 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: int_lpc.c *
+* *
+* Description:Interpolation of the LP parameters in 4 subframes. *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "acelp.h"
+
+#define MP1 (M+1)
+
+
+void Int_isp(
+ Word16 isp_old[], /* input : isps from past frame */
+ Word16 isp_new[], /* input : isps from present frame */
+ Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
+ Word16 Az[] /* output: LP coefficients in 4 subframes */
+ )
+{
+ Word32 i, k;
+ Word16 fac_old, fac_new;
+ Word16 isp[M];
+ Word32 L_tmp;
+
+ for (k = 0; k < 3; k++)
+ {
+ fac_new = frac[k];
+ fac_old = (32767 - fac_new) + 1; /* 1.0 - fac_new */
+
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = (isp_old[i] * fac_old)<<1;
+ L_tmp += (isp_new[i] * fac_new)<<1;
+ isp[i] = (L_tmp + 0x8000)>>16;
+ }
+ Isp_Az(isp, Az, M, 0);
+ Az += MP1;
+ }
+
+ /* 4th subframe: isp_new (frac=1.0) */
+ Isp_Az(isp_new, Az, M, 0);
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
new file mode 100644
index 0000000..7b44d12
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
@@ -0,0 +1,247 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: isp_az.c *
+* *
+* Description:Compute the LPC coefficients from isp (order=M) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "cnst.h"
+
+#define NC (M/2)
+#define NC16k (M16k/2)
+
+/* local function */
+
+static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n);
+static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n);
+
+void Isp_Az(
+ Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
+ Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
+ Word16 m,
+ Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
+ /* 1 : adaptive scaling enabled */
+ )
+{
+ Word32 i, j;
+ Word16 hi, lo;
+ Word32 f1[NC16k + 1], f2[NC16k];
+ Word16 nc;
+ Word32 t0;
+ Word16 q, q_sug;
+ Word32 tmax;
+
+ nc = (m >> 1);
+ if(nc > 8)
+ {
+ Get_isp_pol_16kHz(&isp[0], f1, nc);
+ for (i = 0; i <= nc; i++)
+ {
+ f1[i] = f1[i] << 2;
+ }
+ } else
+ Get_isp_pol(&isp[0], f1, nc);
+
+ if (nc > 8)
+ {
+ Get_isp_pol_16kHz(&isp[1], f2, (nc - 1));
+ for (i = 0; i <= nc - 1; i++)
+ {
+ f2[i] = f2[i] << 2;
+ }
+ } else
+ Get_isp_pol(&isp[1], f2, (nc - 1));
+
+ /*-----------------------------------------------------*
+ * Multiply F2(z) by (1 - z^-2) *
+ *-----------------------------------------------------*/
+
+ for (i = (nc - 1); i > 1; i--)
+ {
+ f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */
+ }
+
+ /*----------------------------------------------------------*
+ * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) *
+ *----------------------------------------------------------*/
+
+ for (i = 0; i < nc; i++)
+ {
+ /* f1[i] *= (1.0 + isp[M-1]); */
+
+ hi = f1[i] >> 16;
+ lo = (f1[i] & 0xffff)>>1;
+
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ f1[i] = vo_L_add(f1[i], t0);
+
+ /* f2[i] *= (1.0 - isp[M-1]); */
+
+ hi = f2[i] >> 16;
+ lo = (f2[i] & 0xffff)>>1;
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ f2[i] = vo_L_sub(f2[i], t0);
+ }
+
+ /*-----------------------------------------------------*
+ * A(z) = (F1(z)+F2(z))/2 *
+ * F1(z) is symmetric and F2(z) is antisymmetric *
+ *-----------------------------------------------------*/
+
+ /* a[0] = 1.0; */
+ a[0] = 4096;
+ tmax = 1;
+ for (i = 1, j = m - 1; i < nc; i++, j--)
+ {
+ /* a[i] = 0.5*(f1[i] + f2[i]); */
+
+ t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
+ tmax |= L_abs(t0);
+ a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+
+ /* a[j] = 0.5*(f1[i] - f2[i]); */
+
+ t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
+ tmax |= L_abs(t0);
+ a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+ }
+
+ /* rescale data if overflow has occured and reprocess the loop */
+ if(adaptive_scaling == 1)
+ q = 4 - norm_l(tmax); /* adaptive scaling enabled */
+ else
+ q = 0; /* adaptive scaling disabled */
+
+ if (q > 0)
+ {
+ q_sug = (12 + q);
+ for (i = 1, j = m - 1; i < nc; i++, j--)
+ {
+ /* a[i] = 0.5*(f1[i] + f2[i]); */
+ t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
+ a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+
+ /* a[j] = 0.5*(f1[i] - f2[i]); */
+ t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
+ a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+ }
+ a[0] = shr(a[0], q);
+ }
+ else
+ {
+ q_sug = 12;
+ q = 0;
+ }
+ /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
+ hi = f1[nc] >> 16;
+ lo = (f1[nc] & 0xffff)>>1;
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ t0 = vo_L_add(f1[nc], t0);
+ a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+ /* a[m] = isp[m-1]; */
+
+ a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */
+ return;
+}
+
+/*-----------------------------------------------------------*
+* procedure Get_isp_pol: *
+* ~~~~~~~~~~~ *
+* Find the polynomial F1(z) or F2(z) from the ISPs. *
+* This is performed by expanding the product polynomials: *
+* *
+* F1(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) *
+* i=0,2,4,6,8 *
+* F2(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) *
+* i=1,3,5,7 *
+* *
+* where isp_i are the ISPs in the cosine domain. *
+*-----------------------------------------------------------*
+* *
+* Parameters: *
+* isp[] : isp vector (cosine domaine) in Q15 *
+* f[] : the coefficients of F1 or F2 in Q23 *
+* n : == NC for F1(z); == NC-1 for F2(z) *
+*-----------------------------------------------------------*/
+
+static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n)
+{
+ Word16 hi, lo;
+ Word32 i, j, t0;
+ /* All computation in Q23 */
+
+ f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */
+ f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */
+
+ f += 2; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ for (i = 2; i <= n; i++)
+ {
+ *f = f[-2];
+ for (j = 1; j < i; j++, f--)
+ {
+ hi = f[-1]>>16;
+ lo = (f[-1] & 0xffff)>>1;
+
+ t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
+ t0 = t0 << 1;
+ *f = vo_L_sub(*f, t0); /* *f -= t0 */
+ *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */
+ }
+ *f -= (*isp << 9); /* *f -= isp<<8 */
+ f += i; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ }
+ return;
+}
+
+static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n)
+{
+ Word16 hi, lo;
+ Word32 i, j, t0;
+
+ /* All computation in Q23 */
+ f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */
+ f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */
+
+ f += 2; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+
+ for (i = 2; i <= n; i++)
+ {
+ *f = f[-2];
+ for (j = 1; j < i; j++, f--)
+ {
+ VO_L_Extract(f[-1], &hi, &lo);
+ t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
+ t0 = L_shl2(t0, 1);
+ *f = L_sub(*f, t0); /* *f -= t0 */
+ *f = L_add(*f, f[-2]); /* *f += f[-2] */
+ }
+ *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */
+ f += i; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ }
+ return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
new file mode 100644
index 0000000..6c6e389
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
@@ -0,0 +1,91 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: isp_isf.c *
+* *
+* Description: *
+* Isp_isf Transformation isp to isf *
+* Isf_isp Transformation isf to isp *
+* *
+* The transformation from isp[i] to isf[i] and isf[i] to isp[i] *
+* are approximated by a look-up table and interpolation *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "isp_isf.tab" /* Look-up table for transformations */
+
+void Isp_isf(
+ Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 m /* (i) : LPC order */
+ )
+{
+ Word32 i, ind;
+ Word32 L_tmp;
+ ind = 127; /* beging at end of table -1 */
+ for (i = (m - 1); i >= 0; i--)
+ {
+ if (i >= (m - 2))
+ { /* m-2 is a constant */
+ ind = 127; /* beging at end of table -1 */
+ }
+ /* find value in table that is just greater than isp[i] */
+ while (table[ind] < isp[i])
+ ind--;
+ /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */
+ L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]);
+ isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */
+ isf[i] = add1(isf[i], (ind << 7));
+ }
+ isf[m - 1] = (isf[m - 1] >> 1);
+ return;
+}
+
+
+void Isf_isp(
+ Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 m /* (i) : LPC order */
+ )
+{
+ Word16 offset;
+ Word32 i, ind, L_tmp;
+
+ for (i = 0; i < m - 1; i++)
+ {
+ isp[i] = isf[i];
+ }
+ isp[m - 1] = (isf[m - 1] << 1);
+
+ for (i = 0; i < m; i++)
+ {
+ ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */
+ offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */
+
+ /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
+ L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset);
+ isp[i] = add1(table[ind], (Word16)((L_tmp >> 8)));
+ }
+
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
new file mode 100644
index 0000000..0397704
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
@@ -0,0 +1,49 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: lag_wind.c *
+* *
+* Description: Lag_windows on autocorrelations *
+* r[i] *= lag_wind[i] *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "lag_wind.tab"
+
+
+void Lag_window(
+ Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
+ )
+{
+ Word32 i;
+ Word32 x;
+
+ for (i = 1; i <= M; i++)
+ {
+ x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]);
+ r_h[i] = x >> 16;
+ r_l[i] = (x & 0xffff)>>1;
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/levinson.c b/media/libstagefright/codecs/amrwbenc/src/levinson.c
new file mode 100644
index 0000000..8bc6f62
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/levinson.c
@@ -0,0 +1,250 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: levinson.c *
+* *
+* Description:LEVINSON-DURBIN algorithm in double precision *
+* *
+************************************************************************/
+/*---------------------------------------------------------------------------*
+ * LEVINSON.C *
+ *---------------------------------------------------------------------------*
+ * *
+ * LEVINSON-DURBIN algorithm in double precision *
+ * *
+ * *
+ * Algorithm *
+ * *
+ * R[i] autocorrelations. *
+ * A[i] filter coefficients. *
+ * K reflection coefficients. *
+ * Alpha prediction gain. *
+ * *
+ * Initialization: *
+ * A[0] = 1 *
+ * K = -R[1]/R[0] *
+ * A[1] = K *
+ * Alpha = R[0] * (1-K**2] *
+ * *
+ * Do for i = 2 to M *
+ * *
+ * S = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] *
+ * *
+ * K = -S / Alpha *
+ * *
+ * An[j] = A[j] + K*A[i-j] for j=1 to i-1 *
+ * where An[i] = new A[i] *
+ * An[i]=K *
+ * *
+ * Alpha=Alpha * (1-K**2) *
+ * *
+ * END *
+ * *
+ * Remarks on the dynamics of the calculations. *
+ * *
+ * The numbers used are in double precision in the following format : *
+ * A = AH <<16 + AL<<1. AH and AL are 16 bit signed integers. *
+ * Since the LSB's also contain a sign bit, this format does not *
+ * correspond to standard 32 bit integers. We use this format since *
+ * it allows fast execution of multiplications and divisions. *
+ * *
+ * "DPF" will refer to this special format in the following text. *
+ * See oper_32b.c *
+ * *
+ * The R[i] were normalized in routine AUTO (hence, R[i] < 1.0). *
+ * The K[i] and Alpha are theoretically < 1.0. *
+ * The A[i], for a sampling frequency of 8 kHz, are in practice *
+ * always inferior to 16.0. *
+ * *
+ * These characteristics allow straigthforward fixed-point *
+ * implementation. We choose to represent the parameters as *
+ * follows : *
+ * *
+ * R[i] Q31 +- .99.. *
+ * K[i] Q31 +- .99.. *
+ * Alpha Normalized -> mantissa in Q31 plus exponent *
+ * A[i] Q27 +- 15.999.. *
+ * *
+ * The additions are performed in 32 bit. For the summation used *
+ * to calculate the K[i], we multiply numbers in Q31 by numbers *
+ * in Q27, with the result of the multiplications in Q27, *
+ * resulting in a dynamic of +- 16. This is sufficient to avoid *
+ * overflow, since the final result of the summation is *
+ * necessarily < 1.0 as both the K[i] and Alpha are *
+ * theoretically < 1.0. *
+ *___________________________________________________________________________*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+#define M 16
+#define NC (M/2)
+
+void Init_Levinson(
+ Word16 * mem /* output :static memory (18 words) */
+ )
+{
+ Set_zero(mem, 18); /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */
+ return;
+}
+
+
+void Levinson(
+ Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
+ Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
+ Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
+ Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
+ Word16 * mem /* (i/o) :static memory (18 words) */
+ )
+{
+ Word32 i, j;
+ Word16 hi, lo;
+ Word16 Kh, Kl; /* reflection coefficient; hi and lo */
+ Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent */
+ Word16 Ah[M + 1], Al[M + 1]; /* LPC coef. in double prec. */
+ Word16 Anh[M + 1], Anl[M + 1]; /* LPC coef.for next iteration in double prec. */
+ Word32 t0, t1, t2; /* temporary variable */
+ Word16 *old_A, *old_rc;
+
+ /* Last A(z) for case of unstable filter */
+ old_A = mem;
+ old_rc = mem + M;
+
+ /* K = A[1] = -R[1] / R[0] */
+
+ t1 = ((Rh[1] << 16) + (Rl[1] << 1)); /* R[1] in Q31 */
+ t2 = L_abs(t1); /* abs R[1] */
+ t0 = Div_32(t2, Rh[0], Rl[0]); /* R[1]/R[0] in Q31 */
+ if (t1 > 0)
+ t0 = -t0; /* -R[1]/R[0] */
+
+ Kh = t0 >> 16;
+ Kl = (t0 & 0xffff)>>1;
+ rc[0] = Kh;
+ t0 = (t0 >> 4); /* A[1] in Q27 */
+
+ Ah[1] = t0 >> 16;
+ Al[1] = (t0 & 0xffff)>>1;
+
+ /* Alpha = R[0] * (1-K**2) */
+ t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
+ t0 = L_abs(t0); /* Some case <0 !! */
+ t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
+
+ hi = t0 >> 16;
+ lo = (t0 & 0xffff)>>1;
+
+ t0 = Mpy_32(Rh[0], Rl[0], hi, lo); /* Alpha in Q31 */
+
+ /* Normalize Alpha */
+ alp_exp = norm_l(t0);
+ t0 = (t0 << alp_exp);
+
+ alp_h = t0 >> 16;
+ alp_l = (t0 & 0xffff)>>1;
+ /*--------------------------------------*
+ * ITERATIONS I=2 to M *
+ *--------------------------------------*/
+ for (i = 2; i <= M; i++)
+ {
+ /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */
+ t0 = 0;
+ for (j = 1; j < i; j++)
+ t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));
+
+ t0 = t0 << 4; /* result in Q27 -> convert to Q31 */
+ /* No overflow possible */
+ t1 = ((Rh[i] << 16) + (Rl[i] << 1));
+ t0 = vo_L_add(t0, t1); /* add R[i] in Q31 */
+
+ /* K = -t0 / Alpha */
+ t1 = L_abs(t0);
+ t2 = Div_32(t1, alp_h, alp_l); /* abs(t0)/Alpha */
+ if (t0 > 0)
+ t2 = -t2; /* K =-t0/Alpha */
+ t2 = (t2 << alp_exp); /* denormalize; compare to Alpha */
+
+ Kh = t2 >> 16;
+ Kl = (t2 & 0xffff)>>1;
+
+ rc[i - 1] = Kh;
+ /* Test for unstable filter. If unstable keep old A(z) */
+ if (abs_s(Kh) > 32750)
+ {
+ A[0] = 4096; /* Ai[0] not stored (always 1.0) */
+ for (j = 0; j < M; j++)
+ {
+ A[j + 1] = old_A[j];
+ }
+ rc[0] = old_rc[0]; /* only two rc coefficients are needed */
+ rc[1] = old_rc[1];
+ return;
+ }
+ /*------------------------------------------*
+ * Compute new LPC coeff. -> An[i] *
+ * An[j]= A[j] + K*A[i-j] , j=1 to i-1 *
+ * An[i]= K *
+ *------------------------------------------*/
+ for (j = 1; j < i; j++)
+ {
+ t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);
+ t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));
+ Anh[j] = t0 >> 16;
+ Anl[j] = (t0 & 0xffff)>>1;
+ }
+ t2 = (t2 >> 4); /* t2 = K in Q31 ->convert to Q27 */
+
+ VO_L_Extract(t2, &Anh[i], &Anl[i]); /* An[i] in Q27 */
+
+ /* Alpha = Alpha * (1-K**2) */
+ t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
+ t0 = L_abs(t0); /* Some case <0 !! */
+ t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
+ hi = t0 >> 16;
+ lo = (t0 & 0xffff)>>1;
+ t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31 */
+
+ /* Normalize Alpha */
+ j = norm_l(t0);
+ t0 = (t0 << j);
+ alp_h = t0 >> 16;
+ alp_l = (t0 & 0xffff)>>1;
+ alp_exp += j; /* Add normalization to alp_exp */
+
+ /* A[j] = An[j] */
+ for (j = 1; j <= i; j++)
+ {
+ Ah[j] = Anh[j];
+ Al[j] = Anl[j];
+ }
+ }
+ /* Truncate A[i] in Q27 to Q12 with rounding */
+ A[0] = 4096;
+ for (i = 1; i <= M; i++)
+ {
+ t0 = (Ah[i] << 16) + (Al[i] << 1);
+ old_A[i - 1] = A[i] = vo_round((t0 << 1));
+ }
+ old_rc[0] = rc[0];
+ old_rc[1] = rc[1];
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/log2.c b/media/libstagefright/codecs/amrwbenc/src/log2.c
new file mode 100644
index 0000000..cd3d815
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/log2.c
@@ -0,0 +1,111 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* *
+* File : log2.c *
+* Purpose : Computes log2(L_x) *
+* *
+************************************************************************/
+
+#include "log2.h"
+/********************************************************************************
+* INCLUDE FILES
+*********************************************************************************/
+#include "typedef.h"
+#include "basic_op.h"
+
+/*********************************************************************************
+* LOCAL VARIABLES AND TABLES
+**********************************************************************************/
+#include "log2_tab.h" /* Table for Log2() */
+
+/*************************************************************************
+*
+* FUNCTION: Log2_norm()
+*
+* PURPOSE: Computes log2(L_x, exp), where L_x is positive and
+* normalized, and exp is the normalisation exponent
+* If L_x is negative or zero, the result is 0.
+*
+* DESCRIPTION:
+* The function Log2(L_x) is approximated by a table and linear
+* interpolation. The following steps are used to compute Log2(L_x)
+*
+* 1- exponent = 30-norm_exponent
+* 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization).
+* 3- a = bit10-b24
+* 4- i -=32
+* 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
+*
+*************************************************************************/
+
+void Log2_norm (
+ Word32 L_x, /* (i) : input value (normalized) */
+ Word16 exp, /* (i) : norm_l (L_x) */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ )
+{
+ Word16 i, a, tmp;
+ Word32 L_y;
+ if (L_x <= (Word32) 0)
+ {
+ *exponent = 0;
+ *fraction = 0;
+ return;
+ }
+ *exponent = (30 - exp);
+ L_x = (L_x >> 9);
+ i = extract_h (L_x); /* Extract b25-b31 */
+ L_x = (L_x >> 1);
+ a = (Word16)(L_x); /* Extract b10-b24 of fraction */
+ a = (Word16)(a & (Word16)0x7fff);
+ i -= 32;
+ L_y = L_deposit_h (table[i]); /* table[i] << 16 */
+ tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
+ L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */
+ *fraction = extract_h (L_y);
+
+ return;
+}
+
+/*************************************************************************
+*
+* FUNCTION: Log2()
+*
+* PURPOSE: Computes log2(L_x), where L_x is positive.
+* If L_x is negative or zero, the result is 0.
+*
+* DESCRIPTION:
+* normalizes L_x and then calls Log2_norm().
+*
+*************************************************************************/
+
+void Log2 (
+ Word32 L_x, /* (i) : input value */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ )
+{
+ Word16 exp;
+
+ exp = norm_l(L_x);
+ Log2_norm ((L_x << exp), exp, exponent, fraction);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
new file mode 100644
index 0000000..63b746b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
@@ -0,0 +1,70 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: lp_dec2.c *
+* *
+* Description:Decimate a vector by 2 with 2nd order fir filter *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+#define L_FIR 5
+#define L_MEM (L_FIR-2)
+
+/* static float h_fir[L_FIR] = {0.13, 0.23, 0.28, 0.23, 0.13}; */
+/* fixed-point: sum of coef = 32767 to avoid overflow on DC */
+static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260};
+
+void LP_Decim2(
+ Word16 x[], /* in/out: signal to process */
+ Word16 l, /* input : size of filtering */
+ Word16 mem[] /* in/out: memory (size=3) */
+ )
+{
+ Word16 *p_x, x_buf[L_FRAME + L_MEM];
+ Word32 i, j;
+ Word32 L_tmp;
+ /* copy initial filter states into buffer */
+ p_x = x_buf;
+ for (i = 0; i < L_MEM; i++)
+ {
+ *p_x++ = mem[i];
+ mem[i] = x[l - L_MEM + i];
+ }
+ for (i = 0; i < l; i++)
+ {
+ *p_x++ = x[i];
+ }
+ for (i = 0, j = 0; i < l; i += 2, j++)
+ {
+ p_x = &x_buf[i];
+ L_tmp = ((*p_x++) * h_fir[0]);
+ L_tmp += ((*p_x++) * h_fir[1]);
+ L_tmp += ((*p_x++) * h_fir[2]);
+ L_tmp += ((*p_x++) * h_fir[3]);
+ L_tmp += ((*p_x++) * h_fir[4]);
+ x[j] = (L_tmp + 0x4000)>>15;
+ }
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c
new file mode 100644
index 0000000..1c95ed0
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c
@@ -0,0 +1,219 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*___________________________________________________________________________
+| |
+| This file contains mathematic operations in fixed point. |
+| |
+| Isqrt() : inverse square root (16 bits precision). |
+| Pow2() : 2^x (16 bits precision). |
+| Log2() : log2 (16 bits precision). |
+| Dot_product() : scalar product of <x[],y[]> |
+| |
+| These operations are not standard double precision operations. |
+| They are used where low complexity is important and the full 32 bits |
+| precision is not necessary. For example, the function Div_32() has a |
+| 24 bits precision which is enough for our purposes. |
+| |
+| In this file, the values use theses representations: |
+| |
+| Word32 L_32 : standard signed 32 bits format |
+| Word16 hi, lo : L_32 = hi<<16 + lo<<1 (DPF - Double Precision Format) |
+| Word32 frac, Word16 exp : L_32 = frac << exp-31 (normalised format) |
+| Word16 int, frac : L_32 = int.frac (fractional format) |
+|___________________________________________________________________________|
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+/*___________________________________________________________________________
+| |
+| Function Name : Isqrt |
+| |
+| Compute 1/sqrt(L_x). |
+| if L_x is negative or zero, result is 1 (7fffffff). |
+|---------------------------------------------------------------------------|
+| Algorithm: |
+| |
+| 1- Normalization of L_x. |
+| 2- call Isqrt_n(L_x, exponant) |
+| 3- L_y = L_x << exponant |
+|___________________________________________________________________________|
+*/
+Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */
+ Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
+ )
+{
+ Word16 exp;
+ Word32 L_y;
+ exp = norm_l(L_x);
+ L_x = (L_x << exp); /* L_x is normalized */
+ exp = (31 - exp);
+ Isqrt_n(&L_x, &exp);
+ L_y = (L_x << exp); /* denormalization */
+ return (L_y);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : Isqrt_n |
+| |
+| Compute 1/sqrt(value). |
+| if value is negative or zero, result is 1 (frac=7fffffff, exp=0). |
+|---------------------------------------------------------------------------|
+| Algorithm: |
+| |
+| The function 1/sqrt(value) is approximated by a table and linear |
+| interpolation. |
+| |
+| 1- If exponant is odd then shift fraction right once. |
+| 2- exponant = -((exponant-1)>>1) |
+| 3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. |
+| 4- a = bit10-b24 |
+| 5- i -=16 |
+| 6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 |
+|___________________________________________________________________________|
+*/
+static Word16 table_isqrt[49] =
+{
+ 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
+ 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
+ 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
+ 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
+ 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
+};
+
+void Isqrt_n(
+ Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+ Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
+ )
+{
+ Word16 i, a, tmp;
+
+ if (*frac <= (Word32) 0)
+ {
+ *exp = 0;
+ *frac = 0x7fffffffL;
+ return;
+ }
+
+ if((*exp & 1) == 1) /*If exponant odd -> shift right */
+ *frac = (*frac) >> 1;
+
+ *exp = negate((*exp - 1) >> 1);
+
+ *frac = (*frac >> 9);
+ i = extract_h(*frac); /* Extract b25-b31 */
+ *frac = (*frac >> 1);
+ a = (Word16)(*frac); /* Extract b10-b24 */
+ a = (Word16) (a & (Word16) 0x7fff);
+ i -= 16;
+ *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */
+ tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */
+ *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */
+
+ return;
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : Pow2() |
+| |
+| L_x = pow(2.0, exponant.fraction) (exponant = interger part) |
+| = pow(2.0, 0.fraction) << exponant |
+|---------------------------------------------------------------------------|
+| Algorithm: |
+| |
+| The function Pow2(L_x) is approximated by a table and linear |
+| interpolation. |
+| |
+| 1- i = bit10-b15 of fraction, 0 <= i <= 31 |
+| 2- a = bit0-b9 of fraction |
+| 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 |
+| 4- L_x = L_x >> (30-exponant) (with rounding) |
+|___________________________________________________________________________|
+*/
+static Word16 table_pow2[33] =
+{
+ 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
+ 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
+ 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
+ 31379, 32066, 32767
+};
+
+Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */
+ Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
+ Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
+ )
+{
+ Word16 exp, i, a, tmp;
+ Word32 L_x;
+
+ L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */
+ i = extract_h(L_x); /* Extract b10-b16 of fraction */
+ L_x =L_x >> 1;
+ a = (Word16)(L_x); /* Extract b0-b9 of fraction */
+ a = (Word16) (a & (Word16) 0x7fff);
+
+ L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */
+ tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */
+ L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */
+
+ exp = vo_sub(30, exponant);
+ L_x = vo_L_shr_r(L_x, exp);
+
+ return (L_x);
+}
+
+/*___________________________________________________________________________
+| |
+| Function Name : Dot_product12() |
+| |
+| Compute scalar product of <x[],y[]> using accumulator. |
+| |
+| The result is normalized (in Q31) with exponent (0..30). |
+|---------------------------------------------------------------------------|
+| Algorithm: |
+| |
+| dot_product = sum(x[i]*y[i]) i=0..N-1 |
+|___________________________________________________________________________|
+*/
+
+Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ )
+{
+ Word16 sft;
+ Word32 i, L_sum;
+ L_sum = 0;
+ for (i = 0; i < lg; i++)
+ {
+ L_sum += x[i] * y[i];
+ }
+ L_sum = (L_sum << 1) + 1;
+ /* Normalize acc in Q31 */
+ sft = norm_l(L_sum);
+ L_sum = L_sum << sft;
+ *exp = 30 - sft; /* exponent = 0..30 */
+ return (L_sum);
+
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/mem_align.c b/media/libstagefright/codecs/amrwbenc/src/mem_align.c
new file mode 100644
index 0000000..e58915a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/mem_align.c
@@ -0,0 +1,107 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*******************************************************************************
+ File: mem_align.c
+
+ Content: Memory alloc alignments functions
+
+*******************************************************************************/
+
+
+#include "mem_align.h"
+
+/*****************************************************************************
+*
+* function name: mem_malloc
+* description: malloc the alignments memory
+* returns: the point of the memory
+*
+**********************************************************************************/
+void *
+mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
+{
+ int ret;
+ unsigned char *mem_ptr;
+ VO_MEM_INFO MemInfo;
+
+ if (!alignment) {
+
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + 1;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
+ mem_ptr = (unsigned char *)MemInfo.VBuffer;
+
+ pMemop->Set(CodecID, mem_ptr, 0, size + 1);
+
+ *mem_ptr = (unsigned char)1;
+
+ return ((void *)(mem_ptr+1));
+ } else {
+ unsigned char *tmp;
+
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + alignment;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
+
+ tmp = (unsigned char *)MemInfo.VBuffer;
+
+ pMemop->Set(CodecID, tmp, 0, size + alignment);
+
+ mem_ptr =
+ (unsigned char *) ((unsigned int) (tmp + alignment - 1) &
+ (~((unsigned int) (alignment - 1))));
+
+ if (mem_ptr == tmp)
+ mem_ptr += alignment;
+
+ *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
+
+ return ((void *)mem_ptr);
+ }
+
+ return(0);
+}
+
+
+/*****************************************************************************
+*
+* function name: mem_free
+* description: free the memory
+*
+*******************************************************************************/
+void
+mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
+{
+
+ unsigned char *ptr;
+
+ if (mem_ptr == 0)
+ return;
+
+ ptr = mem_ptr;
+
+ ptr -= *(ptr - 1);
+
+ pMemop->Free(CodecID, ptr);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
new file mode 100644
index 0000000..5f1523e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
@@ -0,0 +1,223 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*****************************************************************************
+ * This file contains operations in double precision. *
+ * These operations are not standard double precision operations. *
+ * They are used where single precision is not enough but the full 32 bits *
+ * precision is not necessary. For example, the function Div_32() has a *
+ * 24 bits precision which is enough for our purposes. *
+ * *
+ * The double precision numbers use a special representation: *
+ * *
+ * L_32 = hi<<16 + lo<<1 *
+ * *
+ * L_32 is a 32 bit integer. *
+ * hi and lo are 16 bit signed integers. *
+ * As the low part also contains the sign, this allows fast multiplication. *
+ * *
+ * 0x8000 0000 <= L_32 <= 0x7fff fffe. *
+ * *
+ * We will use DPF (Double Precision Format )in this file to specify *
+ * this special format. *
+ *****************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+
+/*****************************************************************************
+ * *
+ * Function L_Extract() *
+ * *
+ * Extract from a 32 bit integer two 16 bit DPF. *
+ * *
+ * Arguments: *
+ * *
+ * L_32 : 32 bit integer. *
+ * 0x8000 0000 <= L_32 <= 0x7fff ffff. *
+ * hi : b16 to b31 of L_32 *
+ * lo : (L_32 - hi<<16)>>1 *
+ *****************************************************************************
+*/
+
+__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
+{
+ *hi = (Word16)(L_32 >> 16);
+ *lo = (Word16)((L_32 & 0xffff) >> 1);
+ return;
+}
+
+/*****************************************************************************
+ * *
+ * Function L_Comp() *
+ * *
+ * Compose from two 16 bit DPF a 32 bit integer. *
+ * *
+ * L_32 = hi<<16 + lo<<1 *
+ * *
+ * Arguments: *
+ * *
+ * hi msb *
+ * lo lsf (with sign) *
+ * *
+ * Return Value : *
+ * *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x8000 0000 <= L_32 <= 0x7fff fff0. *
+ * *
+ *****************************************************************************
+*/
+
+Word32 L_Comp (Word16 hi, Word16 lo)
+{
+ Word32 L_32;
+
+ L_32 = L_deposit_h (hi);
+
+ return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */
+}
+
+/*****************************************************************************
+ * Function Mpy_32() *
+ * *
+ * Multiply two 32 bit integers (DPF). The result is divided by 2**31 *
+ * *
+ * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 *
+ * *
+ * This operation can also be viewed as the multiplication of two Q31 *
+ * number and the result is also in Q31. *
+ * *
+ * Arguments: *
+ * *
+ * hi1 hi part of first number *
+ * lo1 lo part of first number *
+ * hi2 hi part of second number *
+ * lo2 lo part of second number *
+ * *
+ *****************************************************************************
+*/
+
+__inline Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
+{
+ Word32 L_32;
+ L_32 = (hi1 * hi2);
+ L_32 += (hi1 * lo2) >> 15;
+ L_32 += (lo1 * hi2) >> 15;
+ L_32 <<= 1;
+
+ return (L_32);
+}
+
+/*****************************************************************************
+ * Function Mpy_32_16() *
+ * *
+ * Multiply a 16 bit integer by a 32 bit (DPF). The result is divided *
+ * by 2**15 *
+ * *
+ * *
+ * L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 *
+ * *
+ * Arguments: *
+ * *
+ * hi hi part of 32 bit number. *
+ * lo lo part of 32 bit number. *
+ * n 16 bit number. *
+ * *
+ *****************************************************************************
+*/
+
+__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
+{
+ Word32 L_32;
+
+ L_32 = (hi * n)<<1;
+ L_32 += (((lo * n)>>15)<<1);
+
+ return (L_32);
+}
+
+/*****************************************************************************
+ * *
+ * Function Name : Div_32 *
+ * *
+ * Purpose : *
+ * Fractional integer division of two 32 bit numbers. *
+ * L_num / L_denom. *
+ * L_num and L_denom must be positive and L_num < L_denom. *
+ * L_denom = denom_hi<<16 + denom_lo<<1 *
+ * denom_hi is a normalize number. *
+ * *
+ * Inputs : *
+ * *
+ * L_num *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x0000 0000 < L_num < L_denom *
+ * *
+ * L_denom = denom_hi<<16 + denom_lo<<1 (DPF) *
+ * *
+ * denom_hi *
+ * 16 bit positive normalized integer whose value falls in the *
+ * range : 0x4000 < hi < 0x7fff *
+ * denom_lo *
+ * 16 bit positive integer whose value falls in the *
+ * range : 0 < lo < 0x7fff *
+ * *
+ * Return Value : *
+ * *
+ * L_div *
+ * 32 bit long signed integer (Word32) whose value falls in the *
+ * range : 0x0000 0000 <= L_div <= 0x7fff ffff. *
+ * *
+ * Algorithm: *
+ * *
+ * - find = 1/L_denom. *
+ * First approximation: approx = 1 / denom_hi *
+ * 1/L_denom = approx * (2.0 - L_denom * approx ) *
+ * *
+ * - result = L_num * (1/L_denom) *
+ *****************************************************************************
+*/
+
+Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo)
+{
+ Word16 approx, hi, lo, n_hi, n_lo;
+ Word32 L_32;
+
+ /* First approximation: 1 / L_denom = 1/denom_hi */
+
+ approx = div_s ((Word16) 0x3fff, denom_hi);
+
+ /* 1/L_denom = approx * (2.0 - L_denom * approx) */
+
+ L_32 = Mpy_32_16 (denom_hi, denom_lo, approx);
+
+ L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
+ hi = L_32 >> 16;
+ lo = (L_32 & 0xffff) >> 1;
+
+ L_32 = Mpy_32_16 (hi, lo, approx);
+
+ /* L_num * (1/L_denom) */
+ hi = L_32 >> 16;
+ lo = (L_32 & 0xffff) >> 1;
+ VO_L_Extract (L_num, &n_hi, &n_lo);
+ L_32 = Mpy_32 (n_hi, n_lo, hi, lo);
+ L_32 = L_shl2(L_32, 2);
+
+ return (L_32);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
new file mode 100644
index 0000000..39ee966
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
@@ -0,0 +1,256 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: p_med_ol.c *
+* *
+* Description: Compute the open loop pitch lag *
+* output: open loop pitch lag *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "p_med_ol.tab"
+
+Word16 Pitch_med_ol(
+ Word16 wsp[], /* i: signal used to compute the open loop pitch*/
+ /* wsp[-pit_max] to wsp[-1] should be known */
+ Coder_State *st, /* i/o: codec global structure */
+ Word16 L_frame /* i: length of frame to compute pitch */
+ )
+{
+ Word16 Tm;
+ Word16 hi, lo;
+ Word16 *ww, *we, *hp_wsp;
+ Word16 exp_R0, exp_R1, exp_R2;
+ Word32 i, j, max, R0, R1, R2;
+ Word16 *p1, *p2;
+ Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */
+ Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */
+ Word16 L_0 = st->old_T0_med; /* old open-loop pitch */
+ Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */
+ Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/
+ Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */
+ Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */
+
+ ww = &corrweight[198];
+ we = &corrweight[98 + L_max - L_0];
+
+ max = MIN_32;
+ Tm = 0;
+ for (i = L_max; i > L_min; i--)
+ {
+ /* Compute the correlation */
+ R0 = 0;
+ p1 = wsp;
+ p2 = &wsp[-i];
+ for (j = 0; j < L_frame; j+=4)
+ {
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ }
+ /* Weighting of the correlation function. */
+ hi = R0>>16;
+ lo = (R0 & 0xffff)>>1;
+
+ R0 = Mpy_32_16(hi, lo, *ww);
+ ww--;
+
+ if ((L_0 > 0) && (wght_flg > 0))
+ {
+ /* Weight the neighbourhood of the old lag. */
+ hi = R0>>16;
+ lo = (R0 & 0xffff)>>1;
+ R0 = Mpy_32_16(hi, lo, *we);
+ we--;
+ }
+ if(R0 >= max)
+ {
+ max = R0;
+ Tm = i;
+ }
+ }
+
+ /* Hypass the wsp[] vector */
+ hp_wsp = old_hp_wsp + L_max;
+ Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem);
+
+ /* Compute normalize correlation at delay Tm */
+ R0 = 0;
+ R1 = 0;
+ R2 = 0;
+ p1 = hp_wsp;
+ p2 = hp_wsp - Tm;
+ for (j = 0; j < L_frame; j+=4)
+ {
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ }
+ R0 = R0 <<1;
+ R1 = (R1 <<1) + 1L;
+ R2 = (R2 <<1) + 1L;
+ /* gain = R0/ sqrt(R1*R2) */
+
+ exp_R0 = norm_l(R0);
+ R0 = (R0 << exp_R0);
+
+ exp_R1 = norm_l(R1);
+ R1 = (R1 << exp_R1);
+
+ exp_R2 = norm_l(R2);
+ R2 = (R2 << exp_R2);
+
+
+ R1 = vo_L_mult(vo_round(R1), vo_round(R2));
+
+ i = norm_l(R1);
+ R1 = (R1 << i);
+
+ exp_R1 += exp_R2;
+ exp_R1 += i;
+ exp_R1 = 62 - exp_R1;
+
+ Isqrt_n(&R1, &exp_R1);
+
+ R0 = vo_L_mult(voround(R0), voround(R1));
+ exp_R0 = 31 - exp_R0;
+ exp_R0 += exp_R1;
+
+ *gain = vo_round(L_shl(R0, exp_R0));
+
+ /* Shitf hp_wsp[] for next frame */
+
+ for (i = 0; i < L_max; i++)
+ {
+ old_hp_wsp[i] = old_hp_wsp[i + L_frame];
+ }
+
+ return (Tm);
+}
+
+/************************************************************************
+* Function: median5 *
+* *
+* Returns the median of the set {X[-2], X[-1],..., X[2]}, *
+* whose elements are 16-bit integers. *
+* *
+* Input: *
+* X[-2:2] 16-bit integers. *
+* *
+* Return: *
+* The median of {X[-2], X[-1],..., X[2]}. *
+************************************************************************/
+
+Word16 median5(Word16 x[])
+{
+ Word16 x1, x2, x3, x4, x5;
+ Word16 tmp;
+
+ x1 = x[-2];
+ x2 = x[-1];
+ x3 = x[0];
+ x4 = x[1];
+ x5 = x[2];
+
+ if (x2 < x1)
+ {
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ }
+ if (x3 < x1)
+ {
+ tmp = x1;
+ x1 = x3;
+ x3 = tmp;
+ }
+ if (x4 < x1)
+ {
+ tmp = x1;
+ x1 = x4;
+ x4 = tmp;
+ }
+ if (x5 < x1)
+ {
+ x5 = x1;
+ }
+ if (x3 < x2)
+ {
+ tmp = x2;
+ x2 = x3;
+ x3 = tmp;
+ }
+ if (x4 < x2)
+ {
+ tmp = x2;
+ x2 = x4;
+ x4 = tmp;
+ }
+ if (x5 < x2)
+ {
+ x5 = x2;
+ }
+ if (x4 < x3)
+ {
+ x3 = x4;
+ }
+ if (x5 < x3)
+ {
+ x3 = x5;
+ }
+ return (x3);
+}
+
+
+Word16 Med_olag( /* output : median of 5 previous open-loop lags */
+ Word16 prev_ol_lag, /* input : previous open-loop lag */
+ Word16 old_ol_lag[5]
+ )
+{
+ Word32 i;
+
+ /* Use median of 5 previous open-loop lags as old lag */
+
+ for (i = 4; i > 0; i--)
+ {
+ old_ol_lag[i] = old_ol_lag[i - 1];
+ }
+
+ old_ol_lag[0] = prev_ol_lag;
+
+ i = median5(&old_ol_lag[2]);
+
+ return i;
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
new file mode 100644
index 0000000..c8a227c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
@@ -0,0 +1,49 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: pit_shrp.c *
+* *
+* Description: Performs Pitch sharpening routine *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Pit_shrp(
+ Word16 * x, /* in/out: impulse response (or algebraic code) */
+ Word16 pit_lag, /* input : pitch lag */
+ Word16 sharp, /* input : pitch sharpening factor (Q15) */
+ Word16 L_subfr /* input : subframe size */
+ )
+{
+ Word32 i;
+ Word32 L_tmp;
+ Word16 *x_ptr = x + pit_lag;
+
+ for (i = pit_lag; i < L_subfr; i++)
+ {
+ L_tmp = (*x_ptr << 15);
+ L_tmp += *x++ * sharp;
+ *x_ptr++ = ((L_tmp + 0x4000)>>15);
+ }
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
new file mode 100644
index 0000000..c115b11b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
@@ -0,0 +1,324 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: pitch_f4.c *
+* *
+* Description: Find the closed loop pitch period with *
+* 1/4 subsample resolution. *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define UP_SAMP 4
+#define L_INTERPOL1 4
+
+/* Local functions */
+
+#ifdef ASM_OPT
+void Norm_corr_asm(
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[] /* (o) Q15 : normalized correlation */
+ );
+#else
+static void Norm_Corr(
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[] /* (o) Q15 : normalized correlation */
+ );
+#endif
+
+static Word16 Interpol_4( /* (o) : interpolated value */
+ Word16 * x, /* (i) : input vector */
+ Word32 frac /* (i) : fraction (-4..+3) */
+ );
+
+
+Word16 Pitch_fr4( /* (o) : pitch period. */
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 t0_min, /* (i) : minimum value in the searched range. */
+ Word16 t0_max, /* (i) : maximum value in the searched range. */
+ Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */
+ Word16 i_subfr, /* (i) : indicator for first subframe. */
+ Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */
+ Word16 t0_fr1, /* (i) : minimum value for resolution 1 */
+ Word16 L_subfr /* (i) : Length of subframe */
+ )
+{
+ Word32 fraction, i;
+ Word16 t_min, t_max;
+ Word16 max, t0, step, temp;
+ Word16 *corr;
+ Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_inter */
+
+ /* Find interval to compute normalized correlation */
+
+ t_min = t0_min - L_INTERPOL1;
+ t_max = t0_max + L_INTERPOL1;
+ corr = &corr_v[-t_min];
+ /* Compute normalized correlation between target and filtered excitation */
+#ifdef ASM_OPT /* asm optimization branch */
+ Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr);
+#else
+ Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);
+#endif
+
+ /* Find integer pitch */
+
+ max = corr[t0_min];
+ t0 = t0_min;
+ for (i = t0_min + 1; i <= t0_max; i++)
+ {
+ if (corr[i] >= max)
+ {
+ max = corr[i];
+ t0 = i;
+ }
+ }
+ /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */
+ if ((i_subfr == 0) && (t0 >= t0_fr1))
+ {
+ *pit_frac = 0;
+ return (t0);
+ }
+ /*------------------------------------------------------------------*
+ * Search fractionnal pitch with 1/4 subsample resolution. *
+ * Test the fractions around t0 and choose the one which maximizes *
+ * the interpolated normalized correlation. *
+ *------------------------------------------------------------------*/
+
+ step = 1; /* 1/4 subsample resolution */
+ fraction = -3;
+ if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2)))
+ {
+ step = 2; /* 1/2 subsample resolution */
+ fraction = -2;
+ }
+ if(t0 == t0_min)
+ {
+ fraction = 0;
+ }
+ max = Interpol_4(&corr[t0], fraction);
+
+ for (i = fraction + step; i <= 3; i += step)
+ {
+ temp = Interpol_4(&corr[t0], i);
+ if(temp > max)
+ {
+ max = temp;
+ fraction = i;
+ }
+ }
+ /* limit the fraction value in the interval [0,1,2,3] */
+ if (fraction < 0)
+ {
+ fraction += UP_SAMP;
+ t0 -= 1;
+ }
+ *pit_frac = fraction;
+ return (t0);
+}
+
+
+/***********************************************************************************
+* Function: Norm_Corr() *
+* *
+* Description: Find the normalized correlation between the target vector and the *
+* filtered past excitation. *
+* (correlation between target and filtered excitation divided by the *
+* square root of energy of target and filtered excitation). *
+************************************************************************************/
+#ifndef ASM_OPT
+static void Norm_Corr(
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[]) /* (o) Q15 : normalized correlation */
+{
+ Word32 i, k, t;
+ Word32 corr, exp_corr, norm, exp, scale;
+ Word16 exp_norm, excf[L_SUBFR], tmp;
+ Word32 L_tmp, L_tmp1, L_tmp2;
+
+ /* compute the filtered excitation for the first delay t_min */
+ k = -t_min;
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Convolve_asm(&exc[k], h, excf, 64);
+#else
+ Convolve(&exc[k], h, excf, 64);
+#endif
+
+ /* Compute rounded down 1/sqrt(energy of xn[]) */
+ L_tmp = 0;
+ for (i = 0; i < 64; i+=4)
+ {
+ L_tmp += (xn[i] * xn[i]);
+ L_tmp += (xn[i+1] * xn[i+1]);
+ L_tmp += (xn[i+2] * xn[i+2]);
+ L_tmp += (xn[i+3] * xn[i+3]);
+ }
+
+ L_tmp = (L_tmp << 1) + 1;
+ exp = norm_l(L_tmp);
+ exp = (32 - exp);
+ //exp = exp + 2; /* energy of xn[] x 2 + rounded up */
+ scale = -(exp >> 1); /* (1<<scale) < 1/sqrt(energy rounded) */
+
+ /* loop for every possible period */
+
+ for (t = t_min; t <= t_max; t++)
+ {
+ /* Compute correlation between xn[] and excf[] */
+ L_tmp = 0;
+ L_tmp1 = 0;
+ for (i = 0; i < 64; i+=4)
+ {
+ L_tmp += (xn[i] * excf[i]);
+ L_tmp1 += (excf[i] * excf[i]);
+ L_tmp += (xn[i+1] * excf[i+1]);
+ L_tmp1 += (excf[i+1] * excf[i+1]);
+ L_tmp += (xn[i+2] * excf[i+2]);
+ L_tmp1 += (excf[i+2] * excf[i+2]);
+ L_tmp += (xn[i+3] * excf[i+3]);
+ L_tmp1 += (excf[i+3] * excf[i+3]);
+ }
+
+ L_tmp = (L_tmp << 1) + 1;
+ L_tmp1 = (L_tmp1 << 1) + 1;
+
+ exp = norm_l(L_tmp);
+ L_tmp = (L_tmp << exp);
+ exp_corr = (30 - exp);
+ corr = extract_h(L_tmp);
+
+ exp = norm_l(L_tmp1);
+ L_tmp = (L_tmp1 << exp);
+ exp_norm = (30 - exp);
+
+ Isqrt_n(&L_tmp, &exp_norm);
+ norm = extract_h(L_tmp);
+
+ /* Normalize correlation = correlation * (1/sqrt(energy)) */
+
+ L_tmp = vo_L_mult(corr, norm);
+
+ L_tmp2 = exp_corr + exp_norm + scale;
+ if(L_tmp2 < 0)
+ {
+ L_tmp2 = -L_tmp2;
+ L_tmp = L_tmp >> L_tmp2;
+ }
+ else
+ {
+ L_tmp = L_tmp << L_tmp2;
+ }
+
+ corr_norm[t] = vo_round(L_tmp);
+ /* modify the filtered excitation excf[] for the next iteration */
+
+ if(t != t_max)
+ {
+ k = -(t + 1);
+ tmp = exc[k];
+ for (i = 63; i > 0; i--)
+ {
+ excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]);
+ }
+ excf[0] = vo_mult(tmp, h[0]);
+ }
+ }
+ return;
+}
+
+#endif
+/************************************************************************************
+* Function: Interpol_4() *
+* *
+* Description: For interpolating the normalized correlation with 1/4 resolution. *
+**************************************************************************************/
+
+/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */
+static Word16 inter4_1[4][8] =
+{
+ {-12, 420, -1732, 5429, 13418, -1242, 73, 32},
+ {-26, 455, -2142, 9910, 9910, -2142, 455, -26},
+ {32, 73, -1242, 13418, 5429, -1732, 420, -12},
+ {206, -766, 1376, 14746, 1376, -766, 206, 0}
+};
+
+/*** Coefficients in floating point
+static float inter4_1[UP_SAMP*L_INTERPOL1+1] = {
+0.900000,
+0.818959, 0.604850, 0.331379, 0.083958,
+-0.075795, -0.130717, -0.105685, -0.046774,
+0.004467, 0.027789, 0.025642, 0.012571,
+0.001927, -0.001571, -0.000753, 0.000000};
+***/
+
+static Word16 Interpol_4( /* (o) : interpolated value */
+ Word16 * x, /* (i) : input vector */
+ Word32 frac /* (i) : fraction (-4..+3) */
+ )
+{
+ Word16 sum;
+ Word32 k, L_sum;
+ Word16 *ptr;
+
+ if (frac < 0)
+ {
+ frac += UP_SAMP;
+ x--;
+ }
+ x = x - L_INTERPOL1 + 1;
+ k = UP_SAMP - 1 - frac;
+ ptr = &(inter4_1[k][0]);
+
+ L_sum = vo_mult32(x[0], (*ptr++));
+ L_sum += vo_mult32(x[1], (*ptr++));
+ L_sum += vo_mult32(x[2], (*ptr++));
+ L_sum += vo_mult32(x[3], (*ptr++));
+ L_sum += vo_mult32(x[4], (*ptr++));
+ L_sum += vo_mult32(x[5], (*ptr++));
+ L_sum += vo_mult32(x[6], (*ptr++));
+ L_sum += vo_mult32(x[7], (*ptr++));
+
+ sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000));
+ return (sum);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
new file mode 100644
index 0000000..ac1ff22
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
@@ -0,0 +1,120 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: pred_lt4.c *
+* *
+* Description: Compute the result of long term prediction with *
+* fractional interpolation of resolution 1/4 *
+* on return exc[0..L_subr-1] contains the interpolated signal *
+* (adaptive codebook excitation) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+#define UP_SAMP 4
+#define L_INTERPOL2 16
+
+/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */
+
+Word16 inter4_2[4][32] =
+{
+ {0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249,
+ -16,153,-213,226,-209,175,-133,91,-55,28,-10,2},
+
+ {1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044,
+ 626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1},
+
+ {2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207,
+ 871,-619,424,-275,165,-88,38,-10,-2,4,-2,0},
+
+ {1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762,
+ 656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0}
+
+};
+
+void Pred_lt4(
+ Word16 exc[], /* in/out: excitation buffer */
+ Word16 T0, /* input : integer pitch lag */
+ Word16 frac, /* input : fraction of lag */
+ Word16 L_subfr /* input : subframe size */
+ )
+{
+ Word16 j, k, *x;
+ Word32 L_sum;
+ Word16 *ptr, *ptr1;
+ Word16 *ptr2;
+
+ x = exc - T0;
+ frac = -frac;
+ if (frac < 0)
+ {
+ frac += UP_SAMP;
+ x--;
+ }
+ x -= 15; /* x = L_INTERPOL2 - 1 */
+ k = 3 - frac; /* k = UP_SAMP - 1 - frac */
+
+ ptr2 = &(inter4_2[k][0]);
+ for (j = 0; j < L_subfr; j++)
+ {
+ ptr = ptr2;
+ ptr1 = x;
+ L_sum = vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+
+ L_sum = L_shl2(L_sum, 2);
+ exc[j] = extract_h(L_add(L_sum, 0x8000));
+ x++;
+ }
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c
new file mode 100644
index 0000000..f5bcd33
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c
@@ -0,0 +1,88 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: preemph.c *
+* *
+* Description: Preemphasis: filtering through 1 - g z^-1 *
+* Preemph2 --> signal is multiplied by 2 *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Preemph(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ )
+{
+ Word16 temp;
+ Word32 i, L_tmp;
+
+ temp = x[lg - 1];
+
+ for (i = lg - 1; i > 0; i--)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp -= (x[i - 1] * mu)<<1;
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp -= ((*mem) * mu)<<1;
+ x[0] = (L_tmp + 0x8000)>>16;
+
+ *mem = temp;
+
+ return;
+}
+
+
+void Preemph2(
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ )
+{
+ Word16 temp;
+ Word32 i, L_tmp;
+
+ temp = x[lg - 1];
+
+ for (i = (Word16) (lg - 1); i > 0; i--)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp -= (x[i - 1] * mu)<<1;
+ L_tmp = (L_tmp << 1);
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp -= ((*mem) * mu)<<1;
+ L_tmp = (L_tmp << 1);
+ x[0] = (L_tmp + 0x8000)>>16;
+
+ *mem = temp;
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
new file mode 100644
index 0000000..59eefe4
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
@@ -0,0 +1,346 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/**************************************************************************
+* File: q_gain2.c *
+* *
+* Description: *
+* Quantization of pitch and codebook gains. *
+* MA prediction is performed on the innovation energy (in dB with mean *
+* removed). *
+* An initial predicted gain, g_0, is first determined and the correction *
+* factor alpha = gain / g_0 is quantized. *
+* The pitch gain and the correction factor are vector quantized and the *
+* mean-squared weighted error criterion is used in the quantizer search. *
+****************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "log2.h"
+#include "acelp.h"
+#include "q_gain2.tab"
+
+#define MEAN_ENER 30
+#define RANGE 64
+#define PRED_ORDER 4
+
+
+/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */
+static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638};
+
+
+void Init_Q_gain2(
+ Word16 * mem /* output :static memory (2 words) */
+ )
+{
+ Word32 i;
+
+ /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */
+ for (i = 0; i < PRED_ORDER; i++)
+ {
+ mem[i] = -14336; /* past_qua_en[i] */
+ }
+
+ return;
+}
+
+Word16 Q_gain2( /* Return index of quantization. */
+ Word16 xn[], /* (i) Q_xn: Target vector. */
+ Word16 y1[], /* (i) Q_xn: Adaptive codebook. */
+ Word16 Q_xn, /* (i) : xn and y1 format */
+ Word16 y2[], /* (i) Q9 : Filtered innovative vector. */
+ Word16 code[], /* (i) Q9 : Innovative vector. */
+ Word16 g_coeff[], /* (i) : Correlations <xn y1> <y1 y1> */
+ /* Compute in G_pitch(). */
+ Word16 L_subfr, /* (i) : Subframe lenght. */
+ Word16 nbits, /* (i) : number of bits (6 or 7) */
+ Word16 * gain_pit, /* (i/o)Q14: Pitch gain. */
+ Word32 * gain_cod, /* (o) Q16 : Code gain. */
+ Word16 gp_clip, /* (i) : Gp Clipping flag */
+ Word16 * mem /* (i/o) : static memory (2 words) */
+ )
+{
+ Word16 index, *p, min_ind, size;
+ Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener;
+ Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo;
+ Word16 coeff[5], coeff_lo[5], exp_coeff[5];
+ Word16 exp_max[5];
+ Word32 i, j, L_tmp, dist_min;
+ Word16 *past_qua_en, *t_qua_gain;
+
+ past_qua_en = mem;
+
+ /*-----------------------------------------------------------------*
+ * - Find the initial quantization pitch index *
+ * - Set gains search range *
+ *-----------------------------------------------------------------*/
+ if (nbits == 6)
+ {
+ t_qua_gain = t_qua_gain6b;
+ min_ind = 0;
+ size = RANGE;
+
+ if(gp_clip == 1)
+ {
+ size = size - 16; /* limit gain pitch to 1.0 */
+ }
+ } else
+ {
+ t_qua_gain = t_qua_gain7b;
+
+ p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */
+
+ j = nb_qua_gain7b - RANGE;
+
+ if (gp_clip == 1)
+ {
+ j = j - 27; /* limit gain pitch to 1.0 */
+ }
+ min_ind = 0;
+ g_pitch = *gain_pit;
+
+ for (i = 0; i < j; i++, p += 2)
+ {
+ if (g_pitch > *p)
+ {
+ min_ind = min_ind + 1;
+ }
+ }
+ size = RANGE;
+ }
+
+ /*------------------------------------------------------------------*
+ * Compute coefficient need for the quantization. *
+ * *
+ * coeff[0] = y1 y1 *
+ * coeff[1] = -2 xn y1 *
+ * coeff[2] = y2 y2 *
+ * coeff[3] = -2 xn y2 *
+ * coeff[4] = 2 y1 y2 *
+ * *
+ * Product <y1 y1> and <xn y1> have been compute in G_pitch() and *
+ * are in vector g_coeff[]. *
+ *------------------------------------------------------------------*/
+
+ coeff[0] = g_coeff[0];
+ exp_coeff[0] = g_coeff[1];
+ coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */
+ exp_coeff[1] = g_coeff[3] + 1;
+
+ /* Compute scalar product <y2[],y2[]> */
+#ifdef ASM_OPT /* asm optimization branch */
+ coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp));
+#else
+ coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp));
+#endif
+ exp_coeff[2] = (exp - 18) + (Q_xn << 1); /* -18 (y2 Q9) */
+
+ /* Compute scalar product -2*<xn[],y2[]> */
+#ifdef ASM_OPT /* asm optimization branch */
+ coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp)));
+#else
+ coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp)));
+#endif
+
+ exp_coeff[3] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 xn y2) */
+
+ /* Compute scalar product 2*<y1[],y2[]> */
+#ifdef ASM_OPT /* asm optimization branch */
+ coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp));
+#else
+ coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp));
+#endif
+ exp_coeff[4] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 y1 y2) */
+
+ /*-----------------------------------------------------------------*
+ * Find energy of code and compute: *
+ * *
+ * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) *
+ * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) *
+ *-----------------------------------------------------------------*/
+#ifdef ASM_OPT /* asm optimization branch */
+ L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code);
+#else
+ L_tmp = Dot_product12(code, code, L_subfr, &exp_code);
+#endif
+ /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */
+ exp_code = (exp_code - (18 + 6 + 31));
+
+ Log2(L_tmp, &exp, &frac);
+ exp += exp_code;
+ L_tmp = Mpy_32_16(exp, frac, -24660); /* x -3.0103(Q13) -> Q14 */
+
+ L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */
+
+ /*-----------------------------------------------------------------*
+ * Compute gcode0. *
+ * = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code *
+ *-----------------------------------------------------------------*/
+ L_tmp = (L_tmp << 10); /* From Q14 to Q24 */
+ L_tmp += (pred[0] * past_qua_en[0])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[1] * past_qua_en[1])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[2] * past_qua_en[2])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[3] * past_qua_en[3])<<1; /* Q13*Q10 -> Q24 */
+
+ gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */
+
+ /*-----------------------------------------------------------------*
+ * gcode0 = pow(10.0, gcode0/20) *
+ * = pow(2, 3.321928*gcode0/20) *
+ * = pow(2, 0.166096*gcode0) *
+ *-----------------------------------------------------------------*/
+
+ L_tmp = vo_L_mult(gcode0, 5443); /* *0.166096 in Q15 -> Q24 */
+ L_tmp = L_tmp >> 8; /* From Q24 to Q16 */
+ VO_L_Extract(L_tmp, &exp_gcode0, &frac); /* Extract exponent of gcode0 */
+
+ gcode0 = (Word16)(Pow2(14, frac)); /* Put 14 as exponent so that */
+ /* output of Pow2() will be: */
+ /* 16384 < Pow2() <= 32767 */
+ exp_gcode0 -= 14;
+
+ /*-------------------------------------------------------------------------*
+ * Find the best quantizer *
+ * ~~~~~~~~~~~~~~~~~~~~~~~ *
+ * Before doing the computation we need to aling exponents of coeff[] *
+ * to be sure to have the maximum precision. *
+ * *
+ * In the table the pitch gains are in Q14, the code gains are in Q11 and *
+ * are multiply by gcode0 which have been multiply by 2^exp_gcode0. *
+ * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code *
+ * we divide by 2^15. *
+ * Considering all the scaling above we have: *
+ * *
+ * exp_code = exp_gcode0-11+15 = exp_gcode0+4 *
+ * *
+ * g_pitch*g_pitch = -14-14+15 *
+ * g_pitch = -14 *
+ * g_code*g_code = (2*exp_code)+15 *
+ * g_code = exp_code *
+ * g_pitch*g_code = -14 + exp_code +15 *
+ * *
+ * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 *
+ * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 *
+ * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) *
+ * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code *
+ * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code *
+ *-------------------------------------------------------------------------*/
+
+ exp_code = (exp_gcode0 + 4);
+ exp_max[0] = (exp_coeff[0] - 13);
+ exp_max[1] = (exp_coeff[1] - 14);
+ exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1)));
+ exp_max[3] = (exp_coeff[3] + exp_code);
+ exp_max[4] = (exp_coeff[4] + (1 + exp_code));
+
+ /* Find maximum exponant */
+
+ e_max = exp_max[0];
+ for (i = 1; i < 5; i++)
+ {
+ if(exp_max[i] > e_max)
+ {
+ e_max = exp_max[i];
+ }
+ }
+
+ /* align coeff[] and save in special 32 bit double precision */
+
+ for (i = 0; i < 5; i++)
+ {
+ j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */
+ L_tmp = L_deposit_h(coeff[i]);
+ L_tmp = L_shr(L_tmp, j);
+ VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]);
+ coeff_lo[i] = (coeff_lo[i] >> 3); /* lo >> 3 */
+ }
+
+ /* Codebook search */
+ dist_min = MAX_32;
+ p = &t_qua_gain[min_ind << 1];
+
+ index = 0;
+ for (i = 0; i < size; i++)
+ {
+ g_pitch = *p++;
+ g_code = *p++;
+
+ g_code = ((g_code * gcode0) + 0x4000)>>15;
+ g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15;
+ g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15;
+ L_tmp = (g_code * g_code)<<1;
+ VO_L_Extract(L_tmp, &g2_code, &g2_code_lo);
+
+ L_tmp = (coeff[2] * g2_code_lo)<<1;
+ L_tmp = (L_tmp >> 3);
+ L_tmp += (coeff_lo[0] * g2_pitch)<<1;
+ L_tmp += (coeff_lo[1] * g_pitch)<<1;
+ L_tmp += (coeff_lo[2] * g2_code)<<1;
+ L_tmp += (coeff_lo[3] * g_code)<<1;
+ L_tmp += (coeff_lo[4] * g_pit_cod)<<1;
+ L_tmp = (L_tmp >> 12);
+ L_tmp += (coeff[0] * g2_pitch)<<1;
+ L_tmp += (coeff[1] * g_pitch)<<1;
+ L_tmp += (coeff[2] * g2_code)<<1;
+ L_tmp += (coeff[3] * g_code)<<1;
+ L_tmp += (coeff[4] * g_pit_cod)<<1;
+
+ if(L_tmp < dist_min)
+ {
+ dist_min = L_tmp;
+ index = i;
+ }
+ }
+
+ /* Read the quantized gains */
+ index = index + min_ind;
+ p = &t_qua_gain[(index + index)];
+ *gain_pit = *p++; /* selected pitch gain in Q14 */
+ g_code = *p++; /* selected code gain in Q11 */
+
+ L_tmp = vo_L_mult(g_code, gcode0); /* Q11*Q0 -> Q12 */
+ L_tmp = L_shl(L_tmp, (exp_gcode0 + 4)); /* Q12 -> Q16 */
+
+ *gain_cod = L_tmp; /* gain of code in Q16 */
+
+ /*---------------------------------------------------*
+ * qua_ener = 20*log10(g_code) *
+ * = 6.0206*log2(g_code) *
+ * = 6.0206*(log2(g_codeQ11) - 11) *
+ *---------------------------------------------------*/
+
+ L_tmp = L_deposit_l(g_code);
+ Log2(L_tmp, &exp, &frac);
+ exp -= 11;
+ L_tmp = Mpy_32_16(exp, frac, 24660); /* x 6.0206 in Q12 */
+
+ qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */
+
+ /* update table of past quantized energies */
+
+ past_qua_en[3] = past_qua_en[2];
+ past_qua_en[2] = past_qua_en[1];
+ past_qua_en[1] = past_qua_en[0];
+ past_qua_en[0] = qua_ener;
+
+ return (index);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
new file mode 100644
index 0000000..a28ba40
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
@@ -0,0 +1,400 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: q_pulse.c *
+* *
+* Description: Coding and decoding of algebraic codebook *
+* *
+************************************************************************/
+
+#include <stdio.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "q_pulse.h"
+
+#define NB_POS 16 /* pos in track, mask for sign bit */
+
+Word32 quant_1p_N1( /* (o) return N+1 bits */
+ Word16 pos, /* (i) position of the pulse */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 mask;
+ Word32 index;
+
+ mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
+ /*-------------------------------------------------------*
+ * Quantization of 1 pulse with N+1 bits: *
+ *-------------------------------------------------------*/
+ index = L_deposit_l((Word16) (pos & mask));
+ if ((pos & NB_POS) != 0)
+ {
+ index = vo_L_add(index, L_deposit_l(1 << N)); /* index += 1 << N; */
+ }
+ return (index);
+}
+
+
+Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 mask, tmp;
+ Word32 index;
+ mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
+ /*-------------------------------------------------------*
+ * Quantization of 2 pulses with 2*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos2 ^ pos1) & NB_POS) == 0)
+ {
+ /* sign of 1st pulse == sign of 2th pulse */
+ if(pos1 <= pos2) /* ((pos1 - pos2) <= 0) */
+ {
+ /* index = ((pos1 & mask) << N) + (pos2 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
+ } else
+ {
+ /* ((pos2 & mask) << N) + (pos1 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
+ }
+ if ((pos1 & NB_POS) != 0)
+ {
+ tmp = (N << 1);
+ index = vo_L_add(index, (1L << tmp)); /* index += 1 << (2*N); */
+ }
+ } else
+ {
+ /* sign of 1st pulse != sign of 2th pulse */
+ if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
+ {
+ /* index = ((pos2 & mask) << N) + (pos1 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
+ if ((pos2 & NB_POS) != 0)
+ {
+ tmp = (N << 1); /* index += 1 << (2*N); */
+ index = vo_L_add(index, (1L << tmp));
+ }
+ } else
+ {
+ /* index = ((pos1 & mask) << N) + (pos2 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
+ if ((pos1 & NB_POS) != 0)
+ {
+ tmp = (N << 1);
+ index = vo_L_add(index, (1 << tmp)); /* index += 1 << (2*N); */
+ }
+ }
+ }
+ return (index);
+}
+
+
+Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 nb_pos;
+ Word32 index;
+
+ nb_pos =(1 <<(N - 1)); /* nb_pos = (1<<(N-1)); */
+ /*-------------------------------------------------------*
+ * Quantization of 3 pulses with 3*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos1 ^ pos2) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_1p_N1(pos3, N) << (2*N); */
+ index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
+
+ } else if (((pos1 ^ pos3) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos3, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
+ /* index += quant_1p_N1(pos2, N) <<
+ * (2*N); */
+ } else
+ {
+ index = quant_2p_2N1(pos2, pos3, (N - 1)); /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
+ /* index += (pos2 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
+ /* index += quant_1p_N1(pos1, N) << (2*N); */
+ index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
+ }
+ return (index);
+}
+
+
+Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 pos4, /* (i) position of the pulse 4 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 nb_pos;
+ Word32 index;
+
+ nb_pos = 1 << (N - 1); /* nb_pos = (1<<(N-1)); */
+ /*-------------------------------------------------------*
+ * Quantization of 4 pulses with 4*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos1 ^ pos2) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
+ } else if (((pos1 ^ pos3) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos3, (N - 1));
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
+ } else
+ {
+ index = quant_2p_2N1(pos2, pos3, (N - 1));
+ /* index += (pos2 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
+ }
+ return (index);
+}
+
+
+Word32 quant_4p_4N( /* (o) return 4*N bits */
+ Word16 pos[], /* (i) position of the pulse 1..4 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 nb_pos, mask, n_1, tmp;
+ Word16 posA[4], posB[4];
+ Word32 i, j, k, index;
+
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+ mask = vo_sub((1 << N), 1); /* mask = ((1<<N)-1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 4; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ tmp = vo_sub((N << 2), 3); /* index = 1 << ((4*N)-3); */
+ index = (1L << tmp);
+ /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
+ index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
+ break;
+ case 1:
+ /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
+ tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
+ index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
+ /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+ index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
+ break;
+ case 2:
+ tmp = ((n_1 << 1) + 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
+ index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
+ /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
+ break;
+ case 3:
+ /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
+ index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
+ break;
+ case 4:
+ index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_4p_4N\n");
+ }
+ tmp = ((N << 2) - 2); /* index += (i & 3) << ((4*N)-2); */
+ index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
+
+ return (index);
+}
+
+
+
+Word32 quant_5p_5N( /* (o) return 5*N bits */
+ Word16 pos[], /* (i) position of the pulse 1..5 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 nb_pos, n_1, tmp;
+ Word16 posA[5], posB[5];
+ Word32 i, j, k, index, tmp2;
+
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 5; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
+ index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */
+ break;
+ case 1:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* index = 1 << ((5*N)-1); */
+ index = L_shl(1L, tmp);
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */
+ break;
+ case 2:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
+ index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */
+ break;
+ case 3:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */
+ break;
+ case 4:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */
+ break;
+ case 5:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_5p_5N\n");
+ }
+
+ return (index);
+}
+
+
+Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */
+ Word16 pos[], /* (i) position of the pulse 1..6 */
+ Word16 N) /* (i) number of bits for position */
+{
+ Word16 nb_pos, n_1;
+ Word16 posA[6], posB[6];
+ Word32 i, j, k, index;
+
+ /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 6; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ index = (1 << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */
+ break;
+ case 1:
+ index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */
+ break;
+ case 2:
+ index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
+ index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
+ index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
+ break;
+ case 3:
+ index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
+ /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
+ index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
+ /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+ break;
+ case 4:
+ i = 2;
+ index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+ break;
+ case 5:
+ i = 1;
+ index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
+ break;
+ case 6:
+ i = 0;
+ index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_6p_6N_2\n");
+ }
+ index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4))); /* index += (i & 3) << ((6*N)-4); */
+
+ return (index);
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
new file mode 100644
index 0000000..00b0a53
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
@@ -0,0 +1,111 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***************************************************************************
+* File: qisf_ns.c *
+* *
+* Description: Coding/Decoding of ISF parameters for background noise.*
+* The ISF vector is quantized using VQ with split-by-5 *
+* *
+****************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "qisf_ns.tab" /* Codebooks of ISFs */
+
+/*------------------------------------------------------------------*
+* routine: Qisf_ns() *
+* ~~~~~~~~~ *
+*------------------------------------------------------------------*/
+
+void Qisf_ns(
+ Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* output: quantized ISF */
+ Word16 * indice /* output: quantization indices */
+ )
+{
+ Word16 i;
+ Word32 tmp;
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = sub(isf1[i], mean_isf_noise[i]);
+ }
+
+ indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);
+ indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);
+ indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);
+ indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);
+ indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);
+
+ /* decoding the ISFs */
+
+ Disf_ns(indice, isf_q);
+
+ return;
+}
+
+/********************************************************************
+* Function: Disf_ns() *
+* ~~~~~~~~~ *
+* Decoding of ISF parameters *
+*-------------------------------------------------------------------*
+* Arguments: *
+* indice[] : indices of the selected codebook entries *
+* isf[] : quantized ISFs (in frequency domain) *
+*********************************************************************/
+
+void Disf_ns(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
+ )
+{
+ Word16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];
+ }
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];
+ }
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add(isf_q[i], mean_isf_noise[i]);
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
new file mode 100644
index 0000000..ccedb5c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
@@ -0,0 +1,542 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: apisf_2s.c *
+* *
+* Description: Coding/Decodeing of ISF parameters with predication
+* The ISF vector is quantized using two-stage VQ with split-by-2 *
+* in 1st stage and split-by-5(or 3) in the second stage *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "acelp.h"
+#include "qpisf_2s.tab" /* Codebooks of isfs */
+
+#define MU 10923 /* Prediction factor (1.0/3.0) in Q15 */
+#define N_SURV_MAX 4 /* 4 survivors max */
+#define ALPHA 29491 /* 0. 9 in Q15 */
+#define ONE_ALPHA (32768-ALPHA) /* (1.0 - ALPHA) in Q15 */
+
+/* private functions */
+static void VQ_stage1(
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ );
+
+/**************************************************************************
+* Function: Qpisf_2s_46B() *
+* *
+* Description: Quantization of isf parameters with prediction. (46 bits) *
+* *
+* The isf vector is quantized using two-stage VQ with split-by-2 in *
+* 1st stage and split-by-5 in the second stage. *
+***************************************************************************/
+
+void Qpisf_2s_46b(
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
+{
+ Word16 tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 i, k, temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
+ temp = vo_L_add(temp, min_err);
+ tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 3; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 5] = tmp_ind[i];
+ }
+ }
+ }
+
+ Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
+}
+
+/*****************************************************************************
+* Function: Qpisf_2s_36B() *
+* *
+* Description: Quantization of isf parameters with prediction. (36 bits) *
+* *
+* The isf vector is quantized using two-stage VQ with split-by-2 in *
+* 1st stage and split-by-3 in the second stage. *
+******************************************************************************/
+
+void Qpisf_2s_36b(
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
+{
+ Word16 i, k, tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
+ temp = min_err;
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ indice[4] = tmp_ind[0];
+ }
+ }
+
+ Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
+}
+
+/*********************************************************************
+* Function: Dpisf_2s_46b() *
+* *
+* Description: Decoding of ISF parameters *
+**********************************************************************/
+
+void Dpisf_2s_46b(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
+{
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
+ isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
+ isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
+ isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = mean_isf[i] << 14;
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+ return;
+}
+
+/*********************************************************************
+* Function: Disf_2s_36b() *
+* *
+* Description: Decoding of ISF parameters *
+*********************************************************************/
+
+void Dpisf_2s_36b(
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
+{
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 5; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = (mean_isf[i] << 14);
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+ return;
+}
+
+
+/***************************************************************************
+* Function: Reorder_isf() *
+* *
+* Description: To make sure that the isfs are properly order and to *
+* keep a certain minimum distance between consecutive isfs. *
+*--------------------------------------------------------------------------*
+* Argument description in/out *
+* *
+* isf[] vector of isfs i/o *
+* min_dist minimum required distance i *
+* n LPC order i *
+****************************************************************************/
+
+void Reorder_isf(
+ Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+ Word16 min_dist, /* (i) Q15 : minimum distance to keep */
+ Word16 n /* (i) : number of ISF */
+ )
+{
+ Word32 i;
+ Word16 isf_min;
+
+ isf_min = min_dist;
+ for (i = 0; i < n - 1; i++)
+ {
+ if(isf[i] < isf_min)
+ {
+ isf[i] = isf_min;
+ }
+ isf_min = (isf[i] + min_dist);
+ }
+ return;
+}
+
+
+Word16 Sub_VQ( /* output: return quantization index */
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word32 * distance /* output: error of quantization */
+ )
+{
+ Word16 temp, *p_dico;
+ Word32 i, j, index;
+ Word32 dist_min, dist;
+
+ dist_min = MAX_32;
+ p_dico = dico;
+
+ index = 0;
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ if(dist < dist_min)
+ {
+ dist_min = dist;
+ index = i;
+ }
+ }
+
+ *distance = dist_min;
+
+ /* Reading the selected vector */
+ p_dico = &dico[index * dim];
+ for (j = 0; j < dim; j++)
+ {
+ x[j] = *p_dico++;
+ }
+
+ return index;
+}
+
+
+static void VQ_stage1(
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ )
+{
+ Word16 temp, *p_dico;
+ Word32 i, j, k, l;
+ Word32 dist_min[N_SURV_MAX], dist;
+
+ dist_min[0] = MAX_32;
+ dist_min[1] = MAX_32;
+ dist_min[2] = MAX_32;
+ dist_min[3] = MAX_32;
+ index[0] = 0;
+ index[1] = 1;
+ index[2] = 2;
+ index[3] = 3;
+
+ p_dico = dico;
+
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ for (k = 0; k < surv; k++)
+ {
+ if(dist < dist_min[k])
+ {
+ for (l = surv - 1; l > k; l--)
+ {
+ dist_min[l] = dist_min[l - 1];
+ index[l] = index[l - 1];
+ }
+ dist_min[k] = dist;
+ index[k] = i;
+ break;
+ }
+ }
+ }
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/random.c b/media/libstagefright/codecs/amrwbenc/src/random.c
new file mode 100644
index 0000000..8baa8bf
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/random.c
@@ -0,0 +1,33 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: random.c *
+* *
+* Description: Signed 16 bits random generator *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+Word16 Random(Word16 * seed)
+{
+ /* static Word16 seed = 21845; */
+ *seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L));
+ return (*seed);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/residu.c b/media/libstagefright/codecs/amrwbenc/src/residu.c
new file mode 100644
index 0000000..6829882
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/residu.c
@@ -0,0 +1,67 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: residu.c *
+* *
+* Description: Compute the LPC residual by filtering *
+* the input speech through A(z) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Residu(
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) x2 : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ )
+{
+ Word16 i,*p1, *p2;
+ Word32 s;
+ for (i = 0; i < lg; i++)
+ {
+ p1 = a;
+ p2 = &x[i];
+ s = vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1), (*p2));
+
+ s = L_shl2(s, 5);
+ y[i] = extract_h(L_add(s, 0x8000));
+ }
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/scale.c b/media/libstagefright/codecs/amrwbenc/src/scale.c
new file mode 100644
index 0000000..af40121
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/scale.c
@@ -0,0 +1,57 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: scale.c *
+* *
+* Description: Scale signal to get maximum of dynamic *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Scale_sig(
+ Word16 x[], /* (i/o) : signal to scale */
+ Word16 lg, /* (i) : size of x[] */
+ Word16 exp /* (i) : exponent: x = round(x << exp) */
+ )
+{
+ Word32 i;
+ Word32 L_tmp;
+ if(exp > 0)
+ {
+ for (i = lg - 1 ; i >= 0; i--)
+ {
+ L_tmp = L_shl2(x[i], 16 + exp);
+ x[i] = extract_h(L_add(L_tmp, 0x8000));
+ }
+ }
+ else
+ {
+ exp = -exp;
+ for (i = lg - 1; i >= 0; i--)
+ {
+ L_tmp = x[i] << 16;
+ L_tmp >>= exp;
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+ }
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/stream.c b/media/libstagefright/codecs/amrwbenc/src/stream.c
new file mode 100644
index 0000000..a708235
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/stream.c
@@ -0,0 +1,58 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: stream.c *
+* *
+* Description: VOME API Buffer Operator Implement Code *
+* *
+************************************************************************/
+
+#include "stream.h"
+
+void voAWB_InitFrameBuffer(FrameStream *stream)
+{
+ stream->set_ptr = NULL;
+ stream->frame_ptr_bk = stream->frame_ptr;
+ stream->set_len = 0;
+ stream->framebuffer_len = 0;
+ stream->frame_storelen = 0;
+}
+
+void voAWB_UpdateFrameBuffer(
+ FrameStream *stream,
+ VO_MEM_OPERATOR *pMemOP
+ )
+{
+ int len;
+ len = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len);
+ pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len);
+ stream->set_len -= len;
+ stream->set_ptr += len;
+ stream->framebuffer_len = stream->frame_storelen + len;
+ stream->frame_ptr = stream->frame_ptr_bk;
+ stream->used_len += len;
+}
+
+void voAWB_FlushFrameBuffer(FrameStream *stream)
+{
+ stream->set_ptr = NULL;
+ stream->frame_ptr_bk = stream->frame_ptr;
+ stream->set_len = 0;
+ stream->framebuffer_len = 0;
+ stream->frame_storelen = 0;
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
new file mode 100644
index 0000000..6c1fb8e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
@@ -0,0 +1,160 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: syn_filt.c *
+* *
+* Description: Do the synthesis filtering 1/A(z) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "cnst.h"
+
+void Syn_filt(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 lg, /* (i) : size of filtering */
+ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+ Word16 update /* (i) : 0=no update, 1=update of memory. */
+ )
+{
+ Word32 i, a0;
+ Word16 y_buf[L_SUBFR16k + M16k];
+ Word32 L_tmp;
+ Word16 *yy, *p1, *p2;
+ yy = &y_buf[0];
+ /* copy initial filter states into synthesis buffer */
+ for (i = 0; i < 16; i++)
+ {
+ *yy++ = mem[i];
+ }
+ a0 = (a[0] >> 1); /* input / 2 */
+ /* Do the filtering. */
+ for (i = 0; i < lg; i++)
+ {
+ p1 = &a[1];
+ p2 = &yy[i-1];
+ L_tmp = vo_mult32(a0, x[i]);
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1), (*p2));
+
+ L_tmp = L_shl2(L_tmp, 4);
+ y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000));
+ }
+ /* Update memory if required */
+ if (update)
+ for (i = 0; i < 16; i++)
+ {
+ mem[i] = yy[lg - 16 + i];
+ }
+ return;
+}
+
+
+void Syn_filt_32(
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ )
+{
+ Word32 i,a0;
+ Word32 L_tmp, L_tmp1;
+ Word16 *p1, *p2, *p3;
+ a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */
+ /* Do the filtering. */
+ for (i = 0; i < lg; i++)
+ {
+ L_tmp = 0;
+ L_tmp1 = 0;
+ p1 = a;
+ p2 = &sig_lo[i - 1];
+ p3 = &sig_hi[i - 1];
+
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+
+ L_tmp = L_tmp >> 11;
+ L_tmp += vo_L_mult(exc[i], a0);
+
+ /* sig_hi = bit16 to bit31 of synthesis */
+ L_tmp = L_tmp - (L_tmp1<<1);
+
+ L_tmp = L_tmp >> 3; /* ai in Q12 */
+ sig_hi[i] = extract_h(L_tmp);
+
+ /* sig_lo = bit4 to bit15 of synthesis */
+ L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */
+ sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13)));
+ }
+
+ return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
new file mode 100644
index 0000000..f3e5650
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
@@ -0,0 +1,49 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: updt_tar.c *
+* *
+* Description: Update the target vector for codebook search *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Updt_tar(
+ Word16 * x, /* (i) Q0 : old target (for pitch search) */
+ Word16 * x2, /* (o) Q0 : new target (for codebook search) */
+ Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */
+ Word16 gain, /* (i) Q14 : adaptive codebook gain */
+ Word16 L /* (i) : subframe size */
+ )
+{
+ Word32 i;
+ Word32 L_tmp;
+
+ for (i = 0; i < L; i++)
+ {
+ L_tmp = x[i] << 15;
+ L_tmp -= (y[i] * gain)<<1;
+ x2[i] = extract_h(L_shl2(L_tmp, 1));
+ }
+
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/util.c b/media/libstagefright/codecs/amrwbenc/src/util.c
new file mode 100644
index 0000000..78141dd
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/util.c
@@ -0,0 +1,74 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: util.c *
+* *
+* Description: Reset and Copy buffer *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+/***********************************************************************
+* Function: Set_zero() *
+* Description: Set vector x[] to zero *
+************************************************************************/
+
+void Set_zero(
+ Word16 x[], /* (o) : vector to clear */
+ Word16 L /* (i) : length of vector */
+ )
+{
+ Word32 num = (Word32)L;
+ do{
+ *x++ = 0;
+ }while(--num !=0);
+}
+
+
+/*********************************************************************
+* Function: Copy() *
+* *
+* Description: Copy vector x[] to y[] *
+*********************************************************************/
+
+void Copy(
+ Word16 x[], /* (i) : input vector */
+ Word16 y[], /* (o) : output vector */
+ Word16 L /* (i) : vector length */
+ )
+{
+ Word32 temp1,temp2,num;
+ if(L&1)
+ {
+ temp1 = *x++;
+ *y++ = temp1;
+ }
+ num = (Word32)(L>>1);
+ temp1 = *x++;
+ temp2 = *x++;
+ do{
+ *y++ = temp1;
+ *y++ = temp2;
+ temp1 = *x++;
+ temp2 = *x++;
+ }while(--num!=0);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
new file mode 100644
index 0000000..d0d99a7
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
@@ -0,0 +1,1941 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: voAMRWBEnc.c *
+* *
+* Description: Performs the main encoder routine *
+* Fixed-point C simulation of AMR WB ACELP coding *
+* algorithm with 20 msspeech frames for *
+* wideband speech signals. *
+* *
+************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "cnst.h"
+#include "acelp.h"
+#include "cod_main.h"
+#include "bits.h"
+#include "main.h"
+#include "voAMRWB.h"
+#include "mem_align.h"
+#include "cmnMemory.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */
+static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};
+
+/* isp tables for initialization */
+static Word16 isp_init[M] =
+{
+ 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
+ -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
+};
+
+static Word16 isf_init[M] =
+{
+ 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
+ 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
+};
+
+/* High Band encoding */
+static const Word16 HP_gain[16] =
+{
+ 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
+ 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
+};
+
+/* Private function declaration */
+static Word16 synthesis(
+ Word16 Aq[], /* A(z) : quantized Az */
+ Word16 exc[], /* (i) : excitation at 12kHz */
+ Word16 Q_new, /* (i) : scaling performed on exc */
+ Word16 synth16k[], /* (o) : 16kHz synthesis signal */
+ Coder_State * st /* (i/o) : State structure */
+ );
+
+/* Codec some parameters initialization */
+void Reset_encoder(void *st, Word16 reset_all)
+{
+ Word16 i;
+ Coder_State *cod_state;
+ cod_state = (Coder_State *) st;
+ Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);
+ Set_zero(cod_state->mem_syn, M);
+ Set_zero(cod_state->past_isfq, M);
+ cod_state->mem_w0 = 0;
+ cod_state->tilt_code = 0;
+ cod_state->first_frame = 1;
+ Init_gp_clip(cod_state->gp_clip);
+ cod_state->L_gc_thres = 0;
+ if (reset_all != 0)
+ {
+ /* Static vectors to zero */
+ Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);
+ Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));
+ Set_zero(cod_state->mem_decim2, 3);
+ /* routines initialization */
+ Init_Decim_12k8(cod_state->mem_decim);
+ Init_HP50_12k8(cod_state->mem_sig_in);
+ Init_Levinson(cod_state->mem_levinson);
+ Init_Q_gain2(cod_state->qua_gain);
+ Init_Hp_wsp(cod_state->hp_wsp_mem);
+ /* isp initialization */
+ Copy(isp_init, cod_state->ispold, M);
+ Copy(isp_init, cod_state->ispold_q, M);
+ /* variable initialization */
+ cod_state->mem_preemph = 0;
+ cod_state->mem_wsp = 0;
+ cod_state->Q_old = 15;
+ cod_state->Q_max[0] = 15;
+ cod_state->Q_max[1] = 15;
+ cod_state->old_wsp_max = 0;
+ cod_state->old_wsp_shift = 0;
+ /* pitch ol initialization */
+ cod_state->old_T0_med = 40;
+ cod_state->ol_gain = 0;
+ cod_state->ada_w = 0;
+ cod_state->ol_wght_flg = 0;
+ for (i = 0; i < 5; i++)
+ {
+ cod_state->old_ol_lag[i] = 40;
+ }
+ Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));
+ Set_zero(cod_state->mem_syn_hf, M);
+ Set_zero(cod_state->mem_syn_hi, M);
+ Set_zero(cod_state->mem_syn_lo, M);
+ Init_HP50_12k8(cod_state->mem_sig_out);
+ Init_Filt_6k_7k(cod_state->mem_hf);
+ Init_HP400_12k8(cod_state->mem_hp400);
+ Copy(isf_init, cod_state->isfold, M);
+ cod_state->mem_deemph = 0;
+ cod_state->seed2 = 21845;
+ Init_Filt_6k_7k(cod_state->mem_hf2);
+ cod_state->gain_alpha = 32767;
+ cod_state->vad_hist = 0;
+ wb_vad_reset(cod_state->vadSt);
+ dtx_enc_reset(cod_state->dtx_encSt, isf_init);
+ }
+ return;
+}
+
+/*-----------------------------------------------------------------*
+* Funtion coder *
+* ~~~~~ *
+* ->Main coder routine. *
+* *
+*-----------------------------------------------------------------*/
+void coder(
+ Word16 * mode, /* input : used mode */
+ Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */
+ Word16 prms[], /* output: output parameters */
+ Word16 * ser_size, /* output: bit rate of the used mode */
+ void *spe_state, /* i/o : State structure */
+ Word16 allow_dtx /* input : DTX ON/OFF */
+ )
+{
+ /* Coder states */
+ Coder_State *st;
+ /* Speech vector */
+ Word16 old_speech[L_TOTAL];
+ Word16 *new_speech, *speech, *p_window;
+
+ /* Weighted speech vector */
+ Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];
+ Word16 *wsp;
+
+ /* Excitation vector */
+ Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];
+ Word16 *exc;
+
+ /* LPC coefficients */
+ Word16 r_h[M + 1], r_l[M + 1]; /* Autocorrelations of windowed speech */
+ Word16 rc[M]; /* Reflection coefficients. */
+ Word16 Ap[M + 1]; /* A(z) with spectral expansion */
+ Word16 ispnew[M]; /* immittance spectral pairs at 4nd sfr */
+ Word16 ispnew_q[M]; /* quantized ISPs at 4nd subframe */
+ Word16 isf[M]; /* ISF (frequency domain) at 4nd sfr */
+ Word16 *p_A, *p_Aq; /* ptr to A(z) for the 4 subframes */
+ Word16 A[NB_SUBFR * (M + 1)]; /* A(z) unquantized for the 4 subframes */
+ Word16 Aq[NB_SUBFR * (M + 1)]; /* A(z) quantized for the 4 subframes */
+
+ /* Other vectors */
+ Word16 xn[L_SUBFR]; /* Target vector for pitch search */
+ Word16 xn2[L_SUBFR]; /* Target vector for codebook search */
+ Word16 dn[L_SUBFR]; /* Correlation between xn2 and h1 */
+ Word16 cn[L_SUBFR]; /* Target vector in residual domain */
+ Word16 h1[L_SUBFR]; /* Impulse response vector */
+ Word16 h2[L_SUBFR]; /* Impulse response vector */
+ Word16 code[L_SUBFR]; /* Fixed codebook excitation */
+ Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */
+ Word16 y2[L_SUBFR]; /* Filtered adaptive excitation */
+ Word16 error[M + L_SUBFR]; /* error of quantization */
+ Word16 synth[L_SUBFR]; /* 12.8kHz synthesis vector */
+ Word16 exc2[L_FRAME]; /* excitation vector */
+ Word16 buf[L_FRAME]; /* VAD buffer */
+
+ /* Scalars */
+ Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;
+ Word16 codec_mode;
+ Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;
+ Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];
+ Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;
+ Word16 voice_fac;
+ Word16 indice[8];
+ Word32 L_tmp, L_gain_code, L_max, L_tmp1;
+ Word16 code2[L_SUBFR]; /* Fixed codebook excitation */
+ Word16 stab_fac, fac, gain_code_lo;
+
+ Word16 corr_gain;
+ Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;
+
+ st = (Coder_State *) spe_state;
+
+ *ser_size = nb_of_bits[*mode];
+ codec_mode = *mode;
+
+ /*--------------------------------------------------------------------------*
+ * Initialize pointers to speech vector. *
+ * *
+ * *
+ * |-------|-------|-------|-------|-------|-------| *
+ * past sp sf1 sf2 sf3 sf4 L_NEXT *
+ * <------- Total speech buffer (L_TOTAL) ------> *
+ * old_speech *
+ * <------- LPC analysis window (L_WINDOW) ------> *
+ * | <-- present frame (L_FRAME) ----> *
+ * p_window | <----- new speech (L_FRAME) ----> *
+ * | | *
+ * speech | *
+ * new_speech *
+ *--------------------------------------------------------------------------*/
+
+ new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT; /* New speech */
+ speech = old_speech + L_TOTAL - L_FRAME - L_NEXT; /* Present frame */
+ p_window = old_speech + L_TOTAL - L_WINDOW;
+
+ exc = old_exc + PIT_MAX + L_INTERPOL;
+ wsp = old_wsp + (PIT_MAX / OPL_DECIM);
+
+ /* copy coder memory state into working space */
+ Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);
+ Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);
+ Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);
+
+ /*---------------------------------------------------------------*
+ * Down sampling signal from 16kHz to 12.8kHz *
+ * -> The signal is extended by L_FILT samples (padded to zero) *
+ * to avoid additional delay (L_FILT samples) in the coder. *
+ * The last L_FILT samples are approximated after decimation and *
+ * are used (and windowed) only in autocorrelations. *
+ *---------------------------------------------------------------*/
+
+ Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);
+
+ /* last L_FILT samples for autocorrelation window */
+ Copy(st->mem_decim, code, 2 * L_FILT16k);
+ Set_zero(error, L_FILT16k); /* set next sample to zero */
+ Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);
+
+ /*---------------------------------------------------------------*
+ * Perform 50Hz HP filtering of input signal. *
+ *---------------------------------------------------------------*/
+
+ HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);
+
+ /* last L_FILT samples for autocorrelation window */
+ Copy(st->mem_sig_in, code, 6);
+ HP50_12k8(new_speech + L_FRAME, L_FILT, code);
+
+ /*---------------------------------------------------------------*
+ * Perform fixed preemphasis through 1 - g z^-1 *
+ * Scale signal to get maximum of precision in filtering *
+ *---------------------------------------------------------------*/
+
+ mu = PREEMPH_FAC >> 1; /* Q15 --> Q14 */
+
+ /* get max of new preemphased samples (L_FRAME+L_FILT) */
+ L_tmp = new_speech[0] << 15;
+ L_tmp -= (st->mem_preemph * mu)<<1;
+ L_max = L_abs(L_tmp);
+
+ for (i = 1; i < L_FRAME + L_FILT; i++)
+ {
+ L_tmp = new_speech[i] << 15;
+ L_tmp -= (new_speech[i - 1] * mu)<<1;
+ L_tmp = L_abs(L_tmp);
+ if(L_tmp > L_max)
+ {
+ L_max = L_tmp;
+ }
+ }
+
+ /* get scaling factor for new and previous samples */
+ /* limit scaling to Q_MAX to keep dynamic for ringing in low signal */
+ /* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */
+ tmp = extract_h(L_max);
+ if (tmp == 0)
+ {
+ shift = Q_MAX;
+ } else
+ {
+ shift = norm_s(tmp) - 1;
+ if (shift < 0)
+ {
+ shift = 0;
+ }
+ if (shift > Q_MAX)
+ {
+ shift = Q_MAX;
+ }
+ }
+ Q_new = shift;
+ if (Q_new > st->Q_max[0])
+ {
+ Q_new = st->Q_max[0];
+ }
+ if (Q_new > st->Q_max[1])
+ {
+ Q_new = st->Q_max[1];
+ }
+ exp = (Q_new - st->Q_old);
+ st->Q_old = Q_new;
+ st->Q_max[1] = st->Q_max[0];
+ st->Q_max[0] = shift;
+
+ /* preemphasis with scaling (L_FRAME+L_FILT) */
+ tmp = new_speech[L_FRAME - 1];
+
+ for (i = L_FRAME + L_FILT - 1; i > 0; i--)
+ {
+ L_tmp = new_speech[i] << 15;
+ L_tmp -= (new_speech[i - 1] * mu)<<1;
+ L_tmp = (L_tmp << Q_new);
+ new_speech[i] = vo_round(L_tmp);
+ }
+
+ L_tmp = new_speech[0] << 15;
+ L_tmp -= (st->mem_preemph * mu)<<1;
+ L_tmp = (L_tmp << Q_new);
+ new_speech[0] = vo_round(L_tmp);
+
+ st->mem_preemph = tmp;
+
+ /* scale previous samples and memory */
+
+ Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);
+ Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);
+ Scale_sig(st->mem_syn, M, exp);
+ Scale_sig(st->mem_decim2, 3, exp);
+ Scale_sig(&(st->mem_wsp), 1, exp);
+ Scale_sig(&(st->mem_w0), 1, exp);
+
+ /*------------------------------------------------------------------------*
+ * Call VAD *
+ * Preemphesis scale down signal in low frequency and keep dynamic in HF.*
+ * Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT). *
+ *------------------------------------------------------------------------*/
+ Copy(new_speech, buf, L_FRAME);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(buf, L_FRAME, 1 - Q_new);
+#else
+ Scale_sig(buf, L_FRAME, 1 - Q_new);
+#endif
+
+ vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */
+ if (vad_flag == 0)
+ {
+ st->vad_hist = (st->vad_hist + 1);
+ } else
+ {
+ st->vad_hist = 0;
+ }
+
+ /* DTX processing */
+ if (allow_dtx != 0)
+ {
+ /* Note that mode may change here */
+ tx_dtx_handler(st->dtx_encSt, vad_flag, mode);
+ *ser_size = nb_of_bits[*mode];
+ }
+
+ if(*mode != MRDTX)
+ {
+ Parm_serial(vad_flag, 1, &prms);
+ }
+ /*------------------------------------------------------------------------*
+ * Perform LPC analysis *
+ * ~~~~~~~~~~~~~~~~~~~~ *
+ * - autocorrelation + lag windowing *
+ * - Levinson-durbin algorithm to find a[] *
+ * - convert a[] to isp[] *
+ * - convert isp[] to isf[] for quantization *
+ * - quantize and code the isf[] *
+ * - convert isf[] to isp[] for interpolation *
+ * - find the interpolated ISPs and convert to a[] for the 4 subframes *
+ *------------------------------------------------------------------------*/
+
+ /* LP analysis centered at 4nd subframe */
+ Autocorr(p_window, M, r_h, r_l); /* Autocorrelations */
+ Lag_window(r_h, r_l); /* Lag windowing */
+ Levinson(r_h, r_l, A, rc, st->mem_levinson); /* Levinson Durbin */
+ Az_isp(A, ispnew, st->ispold); /* From A(z) to ISP */
+
+ /* Find the interpolated ISPs and convert to a[] for all subframes */
+ Int_isp(st->ispold, ispnew, interpol_frac, A);
+
+ /* update ispold[] for the next frame */
+ Copy(ispnew, st->ispold, M);
+
+ /* Convert ISPs to frequency domain 0..6400 */
+ Isp_isf(ispnew, isf, M);
+
+ /* check resonance for pitch clipping algorithm */
+ Gp_clip_test_isf(isf, st->gp_clip);
+
+ /*----------------------------------------------------------------------*
+ * Perform PITCH_OL analysis *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~ *
+ * - Find the residual res[] for the whole speech frame *
+ * - Find the weighted input speech wsp[] for the whole speech frame *
+ * - scale wsp[] to avoid overflow in pitch estimation *
+ * - Find open loop pitch lag for whole speech frame *
+ *----------------------------------------------------------------------*/
+ p_A = A;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ /* Weighting of LPC coefficients */
+ Weight_a(p_A, Ap, GAMMA1, M);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+#else
+ Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+#endif
+
+ p_A += (M + 1);
+ }
+
+ Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));
+
+ /* find maximum value on wsp[] for 12 bits scaling */
+ max = 0;
+ for (i = 0; i < L_FRAME; i++)
+ {
+ tmp = abs_s(wsp[i]);
+ if(tmp > max)
+ {
+ max = tmp;
+ }
+ }
+ tmp = st->old_wsp_max;
+ if(max > tmp)
+ {
+ tmp = max; /* tmp = max(wsp_max, old_wsp_max) */
+ }
+ st->old_wsp_max = max;
+
+ shift = norm_s(tmp) - 3;
+ if (shift > 0)
+ {
+ shift = 0; /* shift = 0..-3 */
+ }
+ /* decimation of wsp[] to search pitch in LF and to reduce complexity */
+ LP_Decim2(wsp, L_FRAME, st->mem_decim2);
+
+ /* scale wsp[] in 12 bits to avoid overflow */
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);
+#else
+ Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);
+#endif
+ /* scale old_wsp (warning: exp must be Q_new-Q_old) */
+ exp = exp + (shift - st->old_wsp_shift);
+ st->old_wsp_shift = shift;
+
+ Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);
+ Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);
+
+ scale_mem_Hp_wsp(st->hp_wsp_mem, exp);
+
+ /* Find open loop pitch lag for whole speech frame */
+
+ if(*ser_size == NBBITS_7k)
+ {
+ /* Find open loop pitch lag for whole speech frame */
+ T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);
+ } else
+ {
+ /* Find open loop pitch lag for first 1/2 frame */
+ T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);
+ }
+
+ if(st->ol_gain > 19661) /* 0.6 in Q15 */
+ {
+ st->old_T0_med = Med_olag(T_op, st->old_ol_lag);
+ st->ada_w = 32767;
+ } else
+ {
+ st->ada_w = vo_mult(st->ada_w, 29491);
+ }
+
+ if(st->ada_w < 26214)
+ st->ol_wght_flg = 0;
+ else
+ st->ol_wght_flg = 1;
+
+ wb_vad_tone_detection(st->vadSt, st->ol_gain);
+ T_op *= OPL_DECIM;
+
+ if(*ser_size != NBBITS_7k)
+ {
+ /* Find open loop pitch lag for second 1/2 frame */
+ T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);
+
+ if(st->ol_gain > 19661) /* 0.6 in Q15 */
+ {
+ st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);
+ st->ada_w = 32767;
+ } else
+ {
+ st->ada_w = mult(st->ada_w, 29491);
+ }
+
+ if(st->ada_w < 26214)
+ st->ol_wght_flg = 0;
+ else
+ st->ol_wght_flg = 1;
+
+ wb_vad_tone_detection(st->vadSt, st->ol_gain);
+
+ T_op2 *= OPL_DECIM;
+
+ } else
+ {
+ T_op2 = T_op;
+ }
+ /*----------------------------------------------------------------------*
+ * DTX-CNG *
+ *----------------------------------------------------------------------*/
+ if(*mode == MRDTX) /* CNG mode */
+ {
+ /* Buffer isf's and energy */
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);
+#else
+ Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);
+#endif
+
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = shr(exc[i], Q_new);
+ }
+
+ L_tmp = 0;
+ for (i = 0; i < L_FRAME; i++)
+ L_tmp += (exc2[i] * exc2[i])<<1;
+
+ L_tmp >>= 1;
+
+ dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+
+ /* Quantize and code the ISFs */
+ dtx_enc(st->dtx_encSt, isf, exc2, &prms);
+
+ /* Convert ISFs to the cosine domain */
+ Isf_isp(isf, ispnew_q, M);
+ Isp_Az(ispnew_q, Aq, M, 0);
+
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);
+ }
+ Copy(isf, st->isfold, M);
+
+ /* reset speech coder memories */
+ Reset_encoder(st, 0);
+
+ /*--------------------------------------------------*
+ * Update signal for next frame. *
+ * -> save past of speech[] and wsp[]. *
+ *--------------------------------------------------*/
+
+ Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+ Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+
+ return;
+ }
+ /*----------------------------------------------------------------------*
+ * ACELP *
+ *----------------------------------------------------------------------*/
+
+ /* Quantize and code the ISFs */
+
+ if (*ser_size <= NBBITS_7k)
+ {
+ Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);
+
+ Parm_serial(indice[0], 8, &prms);
+ Parm_serial(indice[1], 8, &prms);
+ Parm_serial(indice[2], 7, &prms);
+ Parm_serial(indice[3], 7, &prms);
+ Parm_serial(indice[4], 6, &prms);
+ } else
+ {
+ Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);
+
+ Parm_serial(indice[0], 8, &prms);
+ Parm_serial(indice[1], 8, &prms);
+ Parm_serial(indice[2], 6, &prms);
+ Parm_serial(indice[3], 7, &prms);
+ Parm_serial(indice[4], 7, &prms);
+ Parm_serial(indice[5], 5, &prms);
+ Parm_serial(indice[6], 5, &prms);
+ }
+
+ /* Check stability on isf : distance between old isf and current isf */
+
+ L_tmp = 0;
+ for (i = 0; i < M - 1; i++)
+ {
+ tmp = vo_sub(isf[i], st->isfold[i]);
+ L_tmp += (tmp * tmp)<<1;
+ }
+
+ tmp = extract_h(L_shl2(L_tmp, 8));
+
+ tmp = vo_mult(tmp, 26214); /* tmp = L_tmp*0.8/256 */
+ tmp = vo_sub(20480, tmp); /* 1.25 - tmp (in Q14) */
+
+ stab_fac = shl(tmp, 1);
+
+ if (stab_fac < 0)
+ {
+ stab_fac = 0;
+ }
+ Copy(isf, st->isfold, M);
+
+ /* Convert ISFs to the cosine domain */
+ Isf_isp(isf, ispnew_q, M);
+
+ if (st->first_frame != 0)
+ {
+ st->first_frame = 0;
+ Copy(ispnew_q, st->ispold_q, M);
+ }
+ /* Find the interpolated ISPs and convert to a[] for all subframes */
+
+ Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);
+
+ /* update ispold[] for the next frame */
+ Copy(ispnew_q, st->ispold_q, M);
+
+ p_Aq = Aq;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#else
+ Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#endif
+ p_Aq += (M + 1);
+ }
+
+ /* Buffer isf's and energy for dtx on non-speech frame */
+ if (vad_flag == 0)
+ {
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = exc[i] >> Q_new;
+ }
+ L_tmp = 0;
+ for (i = 0; i < L_FRAME; i++)
+ L_tmp += (exc2[i] * exc2[i])<<1;
+ L_tmp >>= 1;
+
+ dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+ }
+ /* range for closed loop pitch search in 1st subframe */
+
+ T0_min = T_op - 8;
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = (T0_min + 15);
+
+ if(T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = T0_max - 15;
+ }
+ /*------------------------------------------------------------------------*
+ * Loop for every subframe in the analysis frame *
+ *------------------------------------------------------------------------*
+ * To find the pitch and innovation parameters. The subframe size is *
+ * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. *
+ * - compute the target signal for pitch search *
+ * - compute impulse response of weighted synthesis filter (h1[]) *
+ * - find the closed-loop pitch parameters *
+ * - encode the pitch dealy *
+ * - find 2 lt prediction (with / without LP filter for lt pred) *
+ * - find 2 pitch gains and choose the best lt prediction. *
+ * - find target vector for codebook search *
+ * - update the impulse response h1[] for codebook search *
+ * - correlation between target vector and impulse response *
+ * - codebook search and encoding *
+ * - VQ of pitch and codebook gains *
+ * - find voicing factor and tilt of code for next subframe. *
+ * - update states of weighting filter *
+ * - find excitation and synthesis speech *
+ *------------------------------------------------------------------------*/
+ p_A = A;
+ p_Aq = Aq;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ pit_flag = i_subfr;
+ if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))
+ {
+ pit_flag = 0;
+ /* range for closed loop pitch search in 3rd subframe */
+ T0_min = (T_op2 - 8);
+
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = (T0_min + 15);
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ }
+ /*-----------------------------------------------------------------------*
+ * *
+ * Find the target vector for pitch search: *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
+ * *
+ * |------| res[n] *
+ * speech[n]---| A(z) |-------- *
+ * |------| | |--------| error[n] |------| *
+ * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
+ * exc |--------| |------| *
+ * *
+ * Instead of subtracting the zero-input response of filters from *
+ * the weighted input speech, the above configuration is used to *
+ * compute the target vector. *
+ * *
+ *-----------------------------------------------------------------------*/
+
+ for (i = 0; i < M; i++)
+ {
+ error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);
+ }
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#else
+ Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#endif
+ Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);
+ Weight_a(p_A, Ap, GAMMA1, M);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(Ap, error + M, xn, L_SUBFR);
+#else
+ Residu(Ap, error + M, xn, L_SUBFR);
+#endif
+ Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
+
+ /*----------------------------------------------------------------------*
+ * Find approx. target in residual domain "cn[]" for inovation search. *
+ *----------------------------------------------------------------------*/
+ /* first half: xn[] --> cn[] */
+ Set_zero(code, M);
+ Copy(xn, code + M, L_SUBFR / 2);
+ tmp = 0;
+ Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);
+ Weight_a(p_A, Ap, GAMMA1, M);
+ Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);
+#else
+ Residu(p_Aq,code + M, cn, L_SUBFR / 2);
+#endif
+
+ /* second half: res[] --> cn[] (approximated and faster) */
+ Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);
+
+ /*---------------------------------------------------------------*
+ * Compute impulse response, h1[], of weighted synthesis filter *
+ *---------------------------------------------------------------*/
+
+ Set_zero(error, M + L_SUBFR);
+ Weight_a(p_A, error + M, GAMMA1, M);
+
+ vo_p0 = error+M;
+ vo_p3 = h1;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ L_tmp = *vo_p0 << 14; /* x4 (Q12 to Q14) */
+ vo_p1 = p_Aq + 1;
+ vo_p2 = vo_p0-1;
+ for (j = 1; j <= M/4; j++)
+ {
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ }
+ *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));
+ }
+ /* deemph without division by 2 -> Q14 to Q15 */
+ tmp = 0;
+ Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */
+
+ /* h2 in Q12 for codebook search */
+ Copy(h1, h2, L_SUBFR);
+
+ /*---------------------------------------------------------------*
+ * scale xn[] and h1[] to avoid overflow in dot_product12() *
+ *---------------------------------------------------------------*/
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(h2, L_SUBFR, -2);
+ Scale_sig_opt(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
+ Scale_sig_opt(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
+#else
+ Scale_sig(h2, L_SUBFR, -2);
+ Scale_sig(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
+ Scale_sig(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
+#endif
+ /*----------------------------------------------------------------------*
+ * Closed-loop fractional pitch search *
+ *----------------------------------------------------------------------*/
+ /* find closed loop fractional pitch lag */
+ if(*ser_size <= NBBITS_9k)
+ {
+ T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+ pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);
+
+ /* encode pitch lag */
+ if (pit_flag == 0) /* if 1st/3rd subframe */
+ {
+ /*--------------------------------------------------------------*
+ * The pitch range for the 1st/3rd subframe is encoded with *
+ * 8 bits and is divided as follows: *
+ * PIT_MIN to PIT_FR1-1 resolution 1/2 (frac = 0 or 2) *
+ * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
+ *--------------------------------------------------------------*/
+ if (T0 < PIT_FR1_8b)
+ {
+ index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));
+ } else
+ {
+ index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));
+ }
+
+ Parm_serial(index, 8, &prms);
+
+ /* find T0_min and T0_max for subframe 2 and 4 */
+ T0_min = (T0 - 8);
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = T0_min + 15;
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ } else
+ { /* if subframe 2 or 4 */
+ /*--------------------------------------------------------------*
+ * The pitch range for subframe 2 or 4 is encoded with 5 bits: *
+ * T0_min to T0_max resolution 1/2 (frac = 0 or 2) *
+ *--------------------------------------------------------------*/
+ i = (T0 - T0_min);
+ index = (i << 1) + (T0_frac >> 1);
+
+ Parm_serial(index, 5, &prms);
+ }
+ } else
+ {
+ T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+ pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);
+
+ /* encode pitch lag */
+ if (pit_flag == 0) /* if 1st/3rd subframe */
+ {
+ /*--------------------------------------------------------------*
+ * The pitch range for the 1st/3rd subframe is encoded with *
+ * 9 bits and is divided as follows: *
+ * PIT_MIN to PIT_FR2-1 resolution 1/4 (frac = 0,1,2 or 3) *
+ * PIT_FR2 to PIT_FR1-1 resolution 1/2 (frac = 0 or 1) *
+ * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
+ *--------------------------------------------------------------*/
+
+ if (T0 < PIT_FR2)
+ {
+ index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);
+ } else if(T0 < PIT_FR1_9b)
+ {
+ index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));
+ } else
+ {
+ index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));
+ }
+
+ Parm_serial(index, 9, &prms);
+
+ /* find T0_min and T0_max for subframe 2 and 4 */
+
+ T0_min = (T0 - 8);
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = T0_min + 15;
+
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ } else
+ { /* if subframe 2 or 4 */
+ /*--------------------------------------------------------------*
+ * The pitch range for subframe 2 or 4 is encoded with 6 bits: *
+ * T0_min to T0_max resolution 1/4 (frac = 0,1,2 or 3) *
+ *--------------------------------------------------------------*/
+ i = (T0 - T0_min);
+ index = (i << 2) + T0_frac;
+ Parm_serial(index, 6, &prms);
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Gain clipping test to avoid unstable synthesis on frame erasure *
+ *-----------------------------------------------------------------*/
+
+ clip_gain = 0;
+ if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))
+ clip_gain = 1;
+
+ /*-----------------------------------------------------------------*
+ * - find unity gain pitch excitation (adaptive codebook entry) *
+ * with fractional interpolation. *
+ * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) *
+ * - compute pitch gain1 *
+ *-----------------------------------------------------------------*/
+ /* find pitch exitation */
+#ifdef ASM_OPT /* asm optimization branch */
+ pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+#else
+ Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+#endif
+ if (*ser_size > NBBITS_9k)
+ {
+#ifdef ASM_OPT /* asm optimization branch */
+ Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);
+#else
+ Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
+#endif
+ gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);
+ /* clip gain if necessary to avoid problem at decoder */
+ if ((clip_gain != 0) && (gain1 > GP_CLIP))
+ {
+ gain1 = GP_CLIP;
+ }
+ /* find energy of new target xn2[] */
+ Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */
+ } else
+ {
+ gain1 = 0;
+ }
+ /*-----------------------------------------------------------------*
+ * - find pitch excitation filtered by 1st order LP filter. *
+ * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) *
+ * - compute pitch gain2 *
+ *-----------------------------------------------------------------*/
+ /* find pitch excitation with lp filter */
+ vo_p0 = exc + i_subfr-1;
+ vo_p1 = code;
+ /* find pitch excitation with lp filter */
+ for (i = 0; i < L_SUBFR/2; i++)
+ {
+ L_tmp = 5898 * *vo_p0++;
+ L_tmp1 = 5898 * *vo_p0;
+ L_tmp += 20972 * *vo_p0++;
+ L_tmp1 += 20972 * *vo_p0++;
+ L_tmp1 += 5898 * *vo_p0--;
+ L_tmp += 5898 * *vo_p0;
+ *vo_p1++ = (L_tmp + 0x4000)>>15;
+ *vo_p1++ = (L_tmp1 + 0x4000)>>15;
+ }
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Convolve_asm(code, h1, y2, L_SUBFR);
+#else
+ Convolve(code, h1, y2, L_SUBFR);
+#endif
+
+ gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);
+
+ /* clip gain if necessary to avoid problem at decoder */
+ if ((clip_gain != 0) && (gain2 > GP_CLIP))
+ {
+ gain2 = GP_CLIP;
+ }
+ /* find energy of new target xn2[] */
+ Updt_tar(xn, xn2, y2, gain2, L_SUBFR);
+ /*-----------------------------------------------------------------*
+ * use the best prediction (minimise quadratic error). *
+ *-----------------------------------------------------------------*/
+ select = 0;
+ if(*ser_size > NBBITS_9k)
+ {
+ L_tmp = 0L;
+ vo_p0 = dn;
+ vo_p1 = xn2;
+ for (i = 0; i < L_SUBFR/2; i++)
+ {
+ L_tmp += *vo_p0 * *vo_p0;
+ vo_p0++;
+ L_tmp -= *vo_p1 * *vo_p1;
+ vo_p1++;
+ L_tmp += *vo_p0 * *vo_p0;
+ vo_p0++;
+ L_tmp -= *vo_p1 * *vo_p1;
+ vo_p1++;
+ }
+
+ if (L_tmp <= 0)
+ {
+ select = 1;
+ }
+ Parm_serial(select, 1, &prms);
+ }
+ if (select == 0)
+ {
+ /* use the lp filter for pitch excitation prediction */
+ gain_pit = gain2;
+ Copy(code, &exc[i_subfr], L_SUBFR);
+ Copy(y2, y1, L_SUBFR);
+ Copy(g_coeff2, g_coeff, 4);
+ } else
+ {
+ /* no filter used for pitch excitation prediction */
+ gain_pit = gain1;
+ Copy(dn, xn2, L_SUBFR); /* target vector for codebook search */
+ }
+ /*-----------------------------------------------------------------*
+ * - update cn[] for codebook search *
+ *-----------------------------------------------------------------*/
+ Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
+#else
+ Scale_sig(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
+#endif
+ /*-----------------------------------------------------------------*
+ * - include fixed-gain pitch contribution into impulse resp. h1[] *
+ *-----------------------------------------------------------------*/
+ tmp = 0;
+ Preemph(h2, st->tilt_code, L_SUBFR, &tmp);
+
+ if (T0_frac > 2)
+ T0 = (T0 + 1);
+ Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);
+ /*-----------------------------------------------------------------*
+ * - Correlation between target xn2[] and impulse response h1[] *
+ * - Innovative codebook search *
+ *-----------------------------------------------------------------*/
+ cor_h_x(h2, xn2, dn);
+ if (*ser_size <= NBBITS_7k)
+ {
+ ACELP_2t64_fx(dn, cn, h2, code, y2, indice);
+
+ Parm_serial(indice[0], 12, &prms);
+ } else if(*ser_size <= NBBITS_9k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);
+
+ Parm_serial(indice[0], 5, &prms);
+ Parm_serial(indice[1], 5, &prms);
+ Parm_serial(indice[2], 5, &prms);
+ Parm_serial(indice[3], 5, &prms);
+ } else if(*ser_size <= NBBITS_12k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);
+
+ Parm_serial(indice[0], 9, &prms);
+ Parm_serial(indice[1], 9, &prms);
+ Parm_serial(indice[2], 9, &prms);
+ Parm_serial(indice[3], 9, &prms);
+ } else if(*ser_size <= NBBITS_14k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);
+
+ Parm_serial(indice[0], 13, &prms);
+ Parm_serial(indice[1], 13, &prms);
+ Parm_serial(indice[2], 9, &prms);
+ Parm_serial(indice[3], 9, &prms);
+ } else if(*ser_size <= NBBITS_16k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);
+
+ Parm_serial(indice[0], 13, &prms);
+ Parm_serial(indice[1], 13, &prms);
+ Parm_serial(indice[2], 13, &prms);
+ Parm_serial(indice[3], 13, &prms);
+ } else if(*ser_size <= NBBITS_18k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);
+
+ Parm_serial(indice[0], 2, &prms);
+ Parm_serial(indice[1], 2, &prms);
+ Parm_serial(indice[2], 2, &prms);
+ Parm_serial(indice[3], 2, &prms);
+ Parm_serial(indice[4], 14, &prms);
+ Parm_serial(indice[5], 14, &prms);
+ Parm_serial(indice[6], 14, &prms);
+ Parm_serial(indice[7], 14, &prms);
+ } else if(*ser_size <= NBBITS_20k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);
+
+ Parm_serial(indice[0], 10, &prms);
+ Parm_serial(indice[1], 10, &prms);
+ Parm_serial(indice[2], 2, &prms);
+ Parm_serial(indice[3], 2, &prms);
+ Parm_serial(indice[4], 10, &prms);
+ Parm_serial(indice[5], 10, &prms);
+ Parm_serial(indice[6], 14, &prms);
+ Parm_serial(indice[7], 14, &prms);
+ } else
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);
+
+ Parm_serial(indice[0], 11, &prms);
+ Parm_serial(indice[1], 11, &prms);
+ Parm_serial(indice[2], 11, &prms);
+ Parm_serial(indice[3], 11, &prms);
+ Parm_serial(indice[4], 11, &prms);
+ Parm_serial(indice[5], 11, &prms);
+ Parm_serial(indice[6], 11, &prms);
+ Parm_serial(indice[7], 11, &prms);
+ }
+ /*-------------------------------------------------------*
+ * - Add the fixed-gain pitch contribution to code[]. *
+ *-------------------------------------------------------*/
+ tmp = 0;
+ Preemph(code, st->tilt_code, L_SUBFR, &tmp);
+ Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);
+ /*----------------------------------------------------------*
+ * - Compute the fixed codebook gain *
+ * - quantize fixed codebook gain *
+ *----------------------------------------------------------*/
+ if(*ser_size <= NBBITS_9k)
+ {
+ index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,
+ &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+ Parm_serial(index, 6, &prms);
+ } else
+ {
+ index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,
+ &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+ Parm_serial(index, 7, &prms);
+ }
+ /* test quantized gain of pitch for pitch clipping algorithm */
+ Gp_clip_test_gain_pit(gain_pit, st->gp_clip);
+
+ L_tmp = L_shl(L_gain_code, Q_new);
+ gain_code = extract_h(L_add(L_tmp, 0x8000));
+
+ /*----------------------------------------------------------*
+ * Update parameters for the next subframe. *
+ * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) *
+ *----------------------------------------------------------*/
+ /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
+ Copy(&exc[i_subfr], exc2, L_SUBFR);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(exc2, L_SUBFR, shift);
+#else
+ Scale_sig(exc2, L_SUBFR, shift);
+#endif
+ voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);
+ /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
+ st->tilt_code = ((voice_fac >> 2) + 8192);
+ /*------------------------------------------------------*
+ * - Update filter's memory "mem_w0" for finding the *
+ * target vector in the next subframe. *
+ * - Find the total excitation *
+ * - Find synthesis speech to update mem_syn[]. *
+ *------------------------------------------------------*/
+
+ /* y2 in Q9, gain_pit in Q14 */
+ L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;
+ L_tmp = L_shl(L_tmp, (5 + shift));
+ L_tmp = L_negate(L_tmp);
+ L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;
+ L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;
+ L_tmp = L_shl(L_tmp, (1 - shift));
+ st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));
+
+ if (*ser_size >= NBBITS_24k)
+ Copy(&exc[i_subfr], exc2, L_SUBFR);
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ /* code in Q9, gain_pit in Q14 */
+ L_tmp = (gain_code * code[i])<<1;
+ L_tmp = (L_tmp << 5);
+ L_tmp += (exc[i + i_subfr] * gain_pit)<<1;
+ L_tmp = L_shl2(L_tmp, 1);
+ exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
+ }
+
+ Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
+
+ if(*ser_size >= NBBITS_24k)
+ {
+ /*------------------------------------------------------------*
+ * phase dispersion to enhance noise in low bit rate *
+ *------------------------------------------------------------*/
+ /* L_gain_code in Q16 */
+ VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);
+
+ /*------------------------------------------------------------*
+ * noise enhancer *
+ * ~~~~~~~~~~~~~~ *
+ * - Enhance excitation on noise. (modify gain of code) *
+ * If signal is noisy and LPC filter is stable, move gain *
+ * of code 1.5 dB toward gain of code threshold. *
+ * This decrease by 3 dB noise energy variation. *
+ *------------------------------------------------------------*/
+ tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */
+ fac = vo_mult(stab_fac, tmp);
+ L_tmp = L_gain_code;
+ if(L_tmp < st->L_gc_thres)
+ {
+ L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));
+ if(L_tmp > st->L_gc_thres)
+ {
+ L_tmp = st->L_gc_thres;
+ }
+ } else
+ {
+ L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);
+ if(L_tmp < st->L_gc_thres)
+ {
+ L_tmp = st->L_gc_thres;
+ }
+ }
+ st->L_gc_thres = L_tmp;
+
+ L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));
+ VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);
+ L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));
+
+ /*------------------------------------------------------------*
+ * pitch enhancer *
+ * ~~~~~~~~~~~~~~ *
+ * - Enhance excitation on voice. (HP filtering of code) *
+ * On voiced signal, filtering of code by a smooth fir HP *
+ * filter to decrease energy of code in low frequency. *
+ *------------------------------------------------------------*/
+
+ tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */
+
+ L_tmp = L_deposit_h(code[0]);
+ L_tmp -= (code[1] * tmp)<<1;
+ code2[0] = vo_round(L_tmp);
+
+ for (i = 1; i < L_SUBFR - 1; i++)
+ {
+ L_tmp = L_deposit_h(code[i]);
+ L_tmp -= (code[i + 1] * tmp)<<1;
+ L_tmp -= (code[i - 1] * tmp)<<1;
+ code2[i] = vo_round(L_tmp);
+ }
+
+ L_tmp = L_deposit_h(code[L_SUBFR - 1]);
+ L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;
+ code2[L_SUBFR - 1] = vo_round(L_tmp);
+
+ /* build excitation */
+ gain_code = vo_round(L_shl(L_gain_code, Q_new));
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ L_tmp = (code2[i] * gain_code)<<1;
+ L_tmp = (L_tmp << 5);
+ L_tmp += (exc2[i] * gain_pit)<<1;
+ L_tmp = (L_tmp << 1);
+ exc2[i] = vo_round(L_tmp);
+ }
+
+ corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);
+ Parm_serial(corr_gain, 4, &prms);
+ }
+ p_A += (M + 1);
+ p_Aq += (M + 1);
+ } /* end of subframe loop */
+
+ /*--------------------------------------------------*
+ * Update signal for next frame. *
+ * -> save past of speech[], wsp[] and exc[]. *
+ *--------------------------------------------------*/
+ Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+ Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+ Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);
+ return;
+}
+
+/*-----------------------------------------------------*
+* Function synthesis() *
+* *
+* Synthesis of signal at 16kHz with HF extension. *
+* *
+*-----------------------------------------------------*/
+
+static Word16 synthesis(
+ Word16 Aq[], /* A(z) : quantized Az */
+ Word16 exc[], /* (i) : excitation at 12kHz */
+ Word16 Q_new, /* (i) : scaling performed on exc */
+ Word16 synth16k[], /* (o) : 16kHz synthesis signal */
+ Coder_State * st /* (i/o) : State structure */
+ )
+{
+ Word16 fac, tmp, exp;
+ Word16 ener, exp_ener;
+ Word32 L_tmp, i;
+
+ Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];
+ Word16 synth[L_SUBFR];
+ Word16 HF[L_SUBFR16k]; /* High Frequency vector */
+ Word16 Ap[M + 1];
+
+ Word16 HF_SP[L_SUBFR16k]; /* High Frequency vector (from original signal) */
+
+ Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;
+ Word16 dist_min, dist;
+ Word16 HP_gain_ind = 0;
+ Word16 gain1, gain2;
+ Word16 weight1, weight2;
+
+ /*------------------------------------------------------------*
+ * speech synthesis *
+ * ~~~~~~~~~~~~~~~~ *
+ * - Find synthesis speech corresponding to exc2[]. *
+ * - Perform fixed deemphasis and hp 50hz filtering. *
+ * - Oversampling from 12.8kHz to 16kHz. *
+ *------------------------------------------------------------*/
+ Copy(st->mem_syn_hi, synth_hi, M);
+ Copy(st->mem_syn_lo, synth_lo, M);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+#else
+ Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+#endif
+
+ Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);
+ Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));
+#else
+ Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
+#endif
+
+ HP50_12k8(synth, L_SUBFR, st->mem_sig_out);
+
+ /* Original speech signal as reference for high band gain quantisation */
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF_SP[i] = synth16k[i];
+ }
+
+ /*------------------------------------------------------*
+ * HF noise synthesis *
+ * ~~~~~~~~~~~~~~~~~~ *
+ * - Generate HF noise between 5.5 and 7.5 kHz. *
+ * - Set energy of noise according to synthesis tilt. *
+ * tilt > 0.8 ==> - 14 dB (voiced) *
+ * tilt 0.5 ==> - 6 dB (voiced or noise) *
+ * tilt < 0.0 ==> 0 dB (noise) *
+ *------------------------------------------------------*/
+ /* generate white noise vector */
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF[i] = Random(&(st->seed2))>>3;
+ }
+ /* energy of excitation */
+#ifdef ASM_OPT /* asm optimization branch */
+ Scale_sig_opt(exc, L_SUBFR, -3);
+ Q_new = Q_new - 3;
+ ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));
+#else
+ Scale_sig(exc, L_SUBFR, -3);
+ Q_new = Q_new - 3;
+ ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
+#endif
+
+ exp_ener = exp_ener - (Q_new + Q_new);
+ /* set energy of white noise to energy of excitation */
+#ifdef ASM_OPT /* asm optimization branch */
+ tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+#else
+ tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+#endif
+
+ if(tmp > ener)
+ {
+ tmp = (tmp >> 1); /* Be sure tmp < ener */
+ exp = (exp + 1);
+ }
+ L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+ exp = (exp - exp_ener);
+ Isqrt_n(&L_tmp, &exp);
+ L_tmp = L_shl(L_tmp, (exp + 1)); /* L_tmp x 2, L_tmp in Q31 */
+ tmp = extract_h(L_tmp); /* tmp = 2 x sqrt(ener_exc/ener_hf) */
+
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF[i] = vo_mult(HF[i], tmp);
+ }
+
+ /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
+ HP400_12k8(synth, L_SUBFR, st->mem_hp400);
+
+ L_tmp = 1L;
+ for (i = 0; i < L_SUBFR; i++)
+ L_tmp += (synth[i] * synth[i])<<1;
+
+ exp = norm_l(L_tmp);
+ ener = extract_h(L_tmp << exp); /* ener = r[0] */
+
+ L_tmp = 1L;
+ for (i = 1; i < L_SUBFR; i++)
+ L_tmp +=(synth[i] * synth[i - 1])<<1;
+
+ tmp = extract_h(L_tmp << exp); /* tmp = r[1] */
+
+ if (tmp > 0)
+ {
+ fac = div_s(tmp, ener);
+ } else
+ {
+ fac = 0;
+ }
+
+ /* modify energy of white noise according to synthesis tilt */
+ gain1 = 32767 - fac;
+ gain2 = vo_mult(gain1, 20480);
+ gain2 = shl(gain2, 1);
+
+ if (st->vad_hist > 0)
+ {
+ weight1 = 0;
+ weight2 = 32767;
+ } else
+ {
+ weight1 = 32767;
+ weight2 = 0;
+ }
+ tmp = vo_mult(weight1, gain1);
+ tmp = add1(tmp, vo_mult(weight2, gain2));
+
+ if (tmp != 0)
+ {
+ tmp = (tmp + 1);
+ }
+ HP_est_gain = tmp;
+
+ if(HP_est_gain < 3277)
+ {
+ HP_est_gain = 3277; /* 0.1 in Q15 */
+ }
+ /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
+ Weight_a(Aq, Ap, 19661, M); /* fac=0.6 */
+
+#ifdef ASM_OPT /* asm optimization branch */
+ Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);
+ /* noise High Pass filtering (1ms of delay) */
+ Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);
+ /* filtering of the original signal */
+ Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);
+
+ /* check the gain difference */
+ Scale_sig_opt(HF_SP, L_SUBFR16k, -1);
+ ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+ /* set energy of white noise to energy of excitation */
+ tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+#else
+ Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
+ /* noise High Pass filtering (1ms of delay) */
+ Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);
+ /* filtering of the original signal */
+ Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
+ /* check the gain difference */
+ Scale_sig(HF_SP, L_SUBFR16k, -1);
+ ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+ /* set energy of white noise to energy of excitation */
+ tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+#endif
+
+ if (tmp > ener)
+ {
+ tmp = (tmp >> 1); /* Be sure tmp < ener */
+ exp = (exp + 1);
+ }
+ L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+ exp = vo_sub(exp, exp_ener);
+ Isqrt_n(&L_tmp, &exp);
+ L_tmp = L_shl(L_tmp, exp); /* L_tmp, L_tmp in Q31 */
+ HP_calc_gain = extract_h(L_tmp); /* tmp = sqrt(ener_input/ener_hf) */
+
+ /* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */
+ L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);
+ st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));
+
+ if(st->dtx_encSt->dtxHangoverCount > 6)
+ st->gain_alpha = 32767;
+ HP_est_gain = HP_est_gain >> 1; /* From Q15 to Q14 */
+ HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));
+
+ /* Quantise the correction gain */
+ dist_min = 32767;
+ for (i = 0; i < 16; i++)
+ {
+ dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));
+ if (dist_min > dist)
+ {
+ dist_min = dist;
+ HP_gain_ind = i;
+ }
+ }
+ HP_corr_gain = HP_gain[HP_gain_ind];
+ /* return the quantised gain index when using the highest mode, otherwise zero */
+ return (HP_gain_ind);
+}
+
+/*************************************************
+*
+* Breif: Codec main function
+*
+**************************************************/
+
+int AMR_Enc_Encode(HAMRENC hCodec)
+{
+ Word32 i;
+ Coder_State *gData = (Coder_State*)hCodec;
+ Word16 *signal;
+ Word16 packed_size = 0;
+ Word16 prms[NB_BITS_MAX];
+ Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;
+ mode = gData->mode;
+ coding_mode = gData->mode;
+ nb_bits = nb_of_bits[mode];
+ signal = (Word16 *)gData->inputStream;
+ allow_dtx = gData->allow_dtx;
+
+ /* check for homing frame */
+ reset_flag = encoder_homing_frame_test(signal);
+
+ for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */
+ {
+ *(signal + i) = (Word16) (*(signal + i) & 0xfffC);
+ }
+
+ coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);
+ packed_size = PackBits(prms, coding_mode, mode, gData);
+ if (reset_flag != 0)
+ {
+ Reset_encoder(gData, 1);
+ }
+ return packed_size;
+}
+
+/***************************************************************************
+*
+*Brief: Codec API function --- Initialize the codec and return a codec handle
+*
+***************************************************************************/
+
+VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audio codec handle */
+ VO_AUDIO_CODINGTYPE vType, /* i: Codec Type ID */
+ VO_CODEC_INIT_USERDATA * pUserData /* i: init Parameters */
+ )
+{
+ Coder_State *st;
+ FrameStream *stream;
+#ifdef USE_DEAULT_MEM
+ VO_MEM_OPERATOR voMemoprator;
+#endif
+ VO_MEM_OPERATOR *pMemOP;
+ int interMem = 0;
+
+ if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
+ {
+#ifdef USE_DEAULT_MEM
+ voMemoprator.Alloc = cmnMemAlloc;
+ voMemoprator.Copy = cmnMemCopy;
+ voMemoprator.Free = cmnMemFree;
+ voMemoprator.Set = cmnMemSet;
+ voMemoprator.Check = cmnMemCheck;
+ interMem = 1;
+ pMemOP = &voMemoprator;
+#else
+ *phCodec = NULL;
+ return VO_ERR_INVALID_ARG;
+#endif
+ }
+ else
+ {
+ pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
+ }
+ /*-------------------------------------------------------------------------*
+ * Memory allocation for coder state. *
+ *-------------------------------------------------------------------------*/
+ if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ return VO_ERR_OUTOF_MEMORY;
+ }
+
+ st->vadSt = NULL;
+ st->dtx_encSt = NULL;
+ st->sid_update_counter = 3;
+ st->sid_handover_debt = 0;
+ st->prev_ft = TX_SPEECH;
+ st->inputStream = NULL;
+ st->inputSize = 0;
+
+ /* Default setting */
+ st->mode = VOAMRWB_MD2385; /* bit rate 23.85kbps */
+ st->frameType = VOAMRWB_RFC3267; /* frame type: RFC3267 */
+ st->allow_dtx = 0; /* disable DTX mode */
+
+ st->outputStream = NULL;
+ st->outputSize = 0;
+
+ st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);
+ if(st->stream == NULL)
+ return VO_ERR_OUTOF_MEMORY;
+
+ st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);
+ if(st->stream->frame_ptr == NULL)
+ return VO_ERR_OUTOF_MEMORY;
+
+ stream = st->stream;
+ voAWB_InitFrameBuffer(stream);
+
+ wb_vad_init(&(st->vadSt), pMemOP);
+ dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);
+
+ Reset_encoder((void *) st, 1);
+
+ if(interMem)
+ {
+ st->voMemoprator.Alloc = cmnMemAlloc;
+ st->voMemoprator.Copy = cmnMemCopy;
+ st->voMemoprator.Free = cmnMemFree;
+ st->voMemoprator.Set = cmnMemSet;
+ st->voMemoprator.Check = cmnMemCheck;
+ pMemOP = &st->voMemoprator;
+ }
+
+ st->pvoMemop = pMemOP;
+
+ *phCodec = (void *) st;
+
+ return VO_ERR_NONE;
+}
+
+/**********************************************************************************
+*
+* Brief: Codec API function: Input PCM data
+*
+***********************************************************************************/
+
+VO_U32 VO_API voAMRWB_SetInputData(
+ VO_HANDLE hCodec, /* i/o: The codec handle which was created by Init function */
+ VO_CODECBUFFER * pInput /* i: The input buffer parameter */
+ )
+{
+ Coder_State *gData;
+ FrameStream *stream;
+
+ if(NULL == hCodec)
+ {
+ return VO_ERR_INVALID_ARG;
+ }
+
+ gData = (Coder_State *)hCodec;
+ stream = gData->stream;
+
+ if(NULL == pInput || NULL == pInput->Buffer || 0 > pInput->Length)
+ {
+ return VO_ERR_INVALID_ARG;
+ }
+
+ stream->set_ptr = pInput->Buffer;
+ stream->set_len = pInput->Length;
+ stream->frame_ptr = stream->frame_ptr_bk;
+ stream->used_len = 0;
+
+ return VO_ERR_NONE;
+}
+
+/**************************************************************************************
+*
+* Brief: Codec API function: Get the compression audio data frame by frame
+*
+***************************************************************************************/
+
+VO_U32 VO_API voAMRWB_GetOutputData(
+ VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function*/
+ VO_CODECBUFFER * pOutput, /* o: The output audio data */
+ VO_AUDIO_OUTPUTINFO * pAudioFormat /* o: The encoder module filled audio format and used the input size*/
+ )
+{
+ Coder_State* gData = (Coder_State*)hCodec;
+ VO_MEM_OPERATOR *pMemOP;
+ FrameStream *stream = (FrameStream *)gData->stream;
+ pMemOP = (VO_MEM_OPERATOR *)gData->pvoMemop;
+
+ if(stream->framebuffer_len < Frame_MaxByte) /* check the work buffer len */
+ {
+ stream->frame_storelen = stream->framebuffer_len;
+ if(stream->frame_storelen)
+ {
+ pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);
+ }
+ if(stream->set_len > 0)
+ {
+ voAWB_UpdateFrameBuffer(stream, pMemOP);
+ }
+ if(stream->framebuffer_len < Frame_MaxByte)
+ {
+ if(pAudioFormat)
+ pAudioFormat->InputUsed = stream->used_len;
+ return VO_ERR_INPUT_BUFFER_SMALL;
+ }
+ }
+
+ gData->inputStream = stream->frame_ptr;
+ gData->outputStream = (unsigned short*)pOutput->Buffer;
+
+ gData->outputSize = AMR_Enc_Encode(gData); /* encoder main function */
+
+ pOutput->Length = gData->outputSize; /* get the output buffer length */
+ stream->frame_ptr += 640; /* update the work buffer ptr */
+ stream->framebuffer_len -= 640;
+
+ if(pAudioFormat) /* return output audio information */
+ {
+ pAudioFormat->Format.Channels = 1;
+ pAudioFormat->Format.SampleRate = 8000;
+ pAudioFormat->Format.SampleBits = 16;
+ pAudioFormat->InputUsed = stream->used_len;
+ }
+ return VO_ERR_NONE;
+}
+
+/*************************************************************************
+*
+* Brief: Codec API function---set the data by specified parameter ID
+*
+*************************************************************************/
+
+
+VO_U32 VO_API voAMRWB_SetParam(
+ VO_HANDLE hCodec, /* i/o: The Codec Handle which was created by Init function */
+ VO_S32 uParamID, /* i: The param ID */
+ VO_PTR pData /* i: The param value depend on the ID */
+ )
+{
+ Coder_State* gData = (Coder_State*)hCodec;
+ FrameStream *stream = (FrameStream *)(gData->stream);
+ int *lValue = (int*)pData;
+
+ switch(uParamID)
+ {
+ /* setting AMR-WB frame type*/
+ case VO_PID_AMRWB_FRAMETYPE:
+ if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)
+ return VO_ERR_WRONG_PARAM_ID;
+ gData->frameType = *lValue;
+ break;
+ /* setting AMR-WB bit rate */
+ case VO_PID_AMRWB_MODE:
+ {
+ if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)
+ return VO_ERR_WRONG_PARAM_ID;
+ gData->mode = *lValue;
+ }
+ break;
+ /* enable or disable DTX mode */
+ case VO_PID_AMRWB_DTX:
+ gData->allow_dtx = (Word16)(*lValue);
+ break;
+
+ case VO_PID_COMMON_HEADDATA:
+ break;
+ /* flush the work buffer */
+ case VO_PID_COMMON_FLUSH:
+ stream->set_ptr = NULL;
+ stream->frame_storelen = 0;
+ stream->framebuffer_len = 0;
+ stream->set_len = 0;
+ break;
+
+ default:
+ return VO_ERR_WRONG_PARAM_ID;
+ }
+ return VO_ERR_NONE;
+}
+
+/**************************************************************************
+*
+*Brief: Codec API function---Get the data by specified parameter ID
+*
+***************************************************************************/
+
+VO_U32 VO_API voAMRWB_GetParam(
+ VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function */
+ VO_S32 uParamID, /* i: The param ID */
+ VO_PTR pData /* o: The param value depend on the ID */
+ )
+{
+ int temp;
+ Coder_State* gData = (Coder_State*)hCodec;
+
+ if (gData==NULL)
+ return VO_ERR_INVALID_ARG;
+ switch(uParamID)
+ {
+ /* output audio format */
+ case VO_PID_AMRWB_FORMAT:
+ {
+ VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;
+ fmt->Channels = 1;
+ fmt->SampleRate = 16000;
+ fmt->SampleBits = 16;
+ break;
+ }
+ /* output audio channel number */
+ case VO_PID_AMRWB_CHANNELS:
+ temp = 1;
+ pData = (void *)(&temp);
+ break;
+ /* output audio sample rate */
+ case VO_PID_AMRWB_SAMPLERATE:
+ temp = 16000;
+ pData = (void *)(&temp);
+ break;
+ /* output audio frame type */
+ case VO_PID_AMRWB_FRAMETYPE:
+ temp = gData->frameType;
+ pData = (void *)(&temp);
+ break;
+ /* output audio bit rate */
+ case VO_PID_AMRWB_MODE:
+ temp = gData->mode;
+ pData = (void *)(&temp);
+ break;
+ default:
+ return VO_ERR_WRONG_PARAM_ID;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/***********************************************************************************
+*
+* Brief: Codec API function---Release the codec after all encoder operations are done
+*
+*************************************************************************************/
+
+VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec /* i/o: Codec handle pointer */
+ )
+{
+ Coder_State* gData = (Coder_State*)hCodec;
+ VO_MEM_OPERATOR *pMemOP;
+ pMemOP = gData->pvoMemop;
+
+ if(hCodec)
+ {
+ if(gData->stream)
+ {
+ if(gData->stream->frame_ptr_bk)
+ {
+ mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);
+ gData->stream->frame_ptr_bk = NULL;
+ }
+ mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);
+ gData->stream = NULL;
+ }
+ wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);
+ dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);
+
+ mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);
+ hCodec = NULL;
+ }
+
+ return VO_ERR_NONE;
+}
+
+/********************************************************************************
+*
+* Brief: voGetAMRWBEncAPI gets the API handle of the codec
+*
+********************************************************************************/
+
+VO_S32 VO_API voGetAMRWBEncAPI(
+ VO_AUDIO_CODECAPI * pEncHandle /* i/o: Codec handle pointer */
+ )
+{
+ if(NULL == pEncHandle)
+ return VO_ERR_INVALID_ARG;
+ pEncHandle->Init = voAMRWB_Init;
+ pEncHandle->SetInputData = voAMRWB_SetInputData;
+ pEncHandle->GetOutputData = voAMRWB_GetOutputData;
+ pEncHandle->SetParam = voAMRWB_SetParam;
+ pEncHandle->GetParam = voAMRWB_GetParam;
+ pEncHandle->Uninit = voAMRWB_Uninit;
+
+ return VO_ERR_NONE;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/media/libstagefright/codecs/amrwbenc/src/voicefac.c b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
new file mode 100644
index 0000000..187d774
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
@@ -0,0 +1,92 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: voicefac.c *
+* *
+* Description: Find the voicing factors (1 = voice to -1 = unvoiced) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
+ Word16 exc[], /* (i) Q_exc : pitch excitation */
+ Word16 Q_exc, /* (i) : exc format */
+ Word16 gain_pit, /* (i) Q14 : gain of pitch */
+ Word16 code[], /* (i) Q9 : Fixed codebook excitation */
+ Word16 gain_code, /* (i) Q0 : gain of code */
+ Word16 L_subfr /* (i) : subframe length */
+ )
+{
+ Word16 tmp, exp, ener1, exp1, ener2, exp2;
+ Word32 i, L_tmp;
+
+#ifdef ASM_OPT /* asm optimization branch */
+ ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1));
+#else
+ ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));
+#endif
+ exp1 = exp1 - (Q_exc + Q_exc);
+ L_tmp = vo_L_mult(gain_pit, gain_pit);
+ exp = norm_l(L_tmp);
+ tmp = extract_h(L_tmp << exp);
+ ener1 = vo_mult(ener1, tmp);
+ exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */
+
+#ifdef ASM_OPT /* asm optimization branch */
+ ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2));
+#else
+ ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));
+#endif
+
+ exp = norm_s(gain_code);
+ tmp = gain_code << exp;
+ tmp = vo_mult(tmp, tmp);
+ ener2 = vo_mult(ener2, tmp);
+ exp2 = exp2 - (exp + exp);
+
+ i = exp1 - exp2;
+
+ if (i >= 0)
+ {
+ ener1 = ener1 >> 1;
+ ener2 = ener2 >> (i + 1);
+ } else
+ {
+ ener1 = ener1 >> (1 - i);
+ ener2 = ener2 >> 1;
+ }
+
+ tmp = vo_sub(ener1, ener2);
+ ener1 = add1(add1(ener1, ener2), 1);
+
+ if (tmp >= 0)
+ {
+ tmp = div_s(tmp, ener1);
+ } else
+ {
+ tmp = vo_negate(div_s(vo_negate(tmp), ener1));
+ }
+
+ return (tmp);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
new file mode 100644
index 0000000..0126853
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
@@ -0,0 +1,808 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: wb_vad.c *
+* *
+* Description: Voice Activity Detection *
+* *
+************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "cnst.h"
+#include "wb_vad.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "wb_vad_c.h"
+#include "mem_align.h"
+
+/******************************************************************************
+* Calculate Log2 and scale the signal:
+*
+* ilog2(Word32 in) = -1024*log10(in * 2^-31)/log10(2), where in = [1, 2^31-1]
+*
+* input output
+* 32768 16384
+* 1 31744
+*
+* When input is in the range of [1,2^16], max error is 0.0380%.
+*********************************************************************************/
+
+static Word16 ilog2( /* return: output value of the log2 */
+ Word16 mant /* i: value to be converted */
+ )
+{
+ Word16 ex, ex2, res;
+ Word32 i, l_temp;
+
+ if (mant <= 0)
+ {
+ mant = 1;
+ }
+ ex = norm_s(mant);
+ mant = mant << ex;
+
+ for (i = 0; i < 3; i++)
+ mant = vo_mult(mant, mant);
+ l_temp = vo_L_mult(mant, mant);
+
+ ex2 = norm_l(l_temp);
+ mant = extract_h(l_temp << ex2);
+
+ res = (ex + 16) << 10;
+ res = add1(res, (ex2 << 6));
+ res = vo_sub(add1(res, 127), (mant >> 8));
+ return (res);
+}
+
+/******************************************************************************
+*
+* Function : filter5
+* Purpose : Fifth-order half-band lowpass/highpass filter pair with
+* decimation.
+*
+*******************************************************************************/
+
+static void filter5(
+ Word16 * in0, /* i/o : input values; output low-pass part */
+ Word16 * in1, /* i/o : input values; output high-pass part */
+ Word16 data[] /* i/o : filter memory */
+ )
+{
+ Word16 temp0, temp1, temp2;
+
+ temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0]));
+ temp1 = add1(data[0], vo_mult(COEFF5_1, temp0));
+ data[0] = temp0;
+
+ temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1]));
+ temp2 = add1(data[1], vo_mult(COEFF5_2, temp0));
+ data[1] = temp0;
+
+ *in0 = extract_h((vo_L_add(temp1, temp2) << 15));
+ *in1 = extract_h((vo_L_sub(temp1, temp2) << 15));
+}
+
+/******************************************************************************
+*
+* Function : filter3
+* Purpose : Third-order half-band lowpass/highpass filter pair with
+* decimation.
+*
+*******************************************************************************/
+
+static void filter3(
+ Word16 * in0, /* i/o : input values; output low-pass part */
+ Word16 * in1, /* i/o : input values; output high-pass part */
+ Word16 * data /* i/o : filter memory */
+ )
+{
+ Word16 temp1, temp2;
+
+ temp1 = vo_sub(*in1, vo_mult(COEFF3, *data));
+ temp2 = add1(*data, vo_mult(COEFF3, temp1));
+ *data = temp1;
+
+ *in1 = extract_h((vo_L_sub(*in0, temp2) << 15));
+ *in0 = extract_h((vo_L_add(*in0, temp2) << 15));
+}
+
+/******************************************************************************
+*
+* Function : level_calculation
+* Purpose : Calculate signal level in a sub-band. Level is calculated
+* by summing absolute values of the input data.
+*
+* Signal level calculated from of the end of the frame
+* (data[count1 - count2]) is stored to (*sub_level)
+* and added to the level of the next frame.
+*
+******************************************************************************/
+
+static Word16 level_calculation( /* return: signal level */
+ Word16 data[], /* i : signal buffer */
+ Word16 * sub_level, /* i : level calculated at the end of the previous frame*/
+ /* o : level of signal calculated from the last */
+ /* (count2 - count1) samples */
+ Word16 count1, /* i : number of samples to be counted */
+ Word16 count2, /* i : number of samples to be counted */
+ Word16 ind_m, /* i : step size for the index of the data buffer */
+ Word16 ind_a, /* i : starting index of the data buffer */
+ Word16 scale /* i : scaling for the level calculation */
+ )
+{
+ Word32 i, l_temp1, l_temp2;
+ Word16 level;
+
+ l_temp1 = 0L;
+ for (i = count1; i < count2; i++)
+ {
+ l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1);
+ }
+
+ l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale));
+ *sub_level = extract_h(L_shl(l_temp1, scale));
+
+ for (i = 0; i < count1; i++)
+ {
+ l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1);
+ }
+ level = extract_h(L_shl2(l_temp2, scale));
+
+ return level;
+}
+
+/******************************************************************************
+*
+* Function : filter_bank
+* Purpose : Divide input signal into bands and calculate level of
+* the signal in each band
+*
+*******************************************************************************/
+
+static void filter_bank(
+ VadVars * st, /* i/o : State struct */
+ Word16 in[], /* i : input frame */
+ Word16 level[] /* o : signal levels at each band */
+ )
+{
+ Word32 i;
+ Word16 tmp_buf[FRAME_LEN];
+
+ /* shift input 1 bit down for safe scaling */
+ for (i = 0; i < FRAME_LEN; i++)
+ {
+ tmp_buf[i] = in[i] >> 1;
+ }
+
+ /* run the filter bank */
+ for (i = 0; i < 128; i++)
+ {
+ filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]);
+ }
+ for (i = 0; i < 64; i++)
+ {
+ filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]);
+ filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]);
+ }
+ for (i = 0; i < 32; i++)
+ {
+ filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]);
+ filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]);
+ filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]);
+ }
+ for (i = 0; i < 16; i++)
+ {
+ filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]);
+ filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]);
+ filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]);
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]);
+ filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]);
+ }
+
+ /* calculate levels in each frequency band */
+
+ /* 4800 - 6400 Hz */
+ level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14);
+ /* 4000 - 4800 Hz */
+ level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15);
+ /* 3200 - 4000 Hz */
+ level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15);
+ /* 2400 - 3200 Hz */
+ level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15);
+ /* 2000 - 2400 Hz */
+ level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16);
+ /* 1600 - 2000 Hz */
+ level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16);
+ /* 1200 - 1600 Hz */
+ level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16);
+ /* 800 - 1200 Hz */
+ level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16);
+ /* 600 - 800 Hz */
+ level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17);
+ /* 400 - 600 Hz */
+ level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17);
+ /* 200 - 400 Hz */
+ level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17);
+ /* 0 - 200 Hz */
+ level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17);
+}
+
+/******************************************************************************
+*
+* Function : update_cntrl
+* Purpose : Control update of the background noise estimate.
+*
+*******************************************************************************/
+
+static void update_cntrl(
+ VadVars * st, /* i/o : State structure */
+ Word16 level[] /* i : sub-band levels of the input frame */
+ )
+{
+ Word32 i;
+ Word16 num, temp, stat_rat, exp, denom;
+ Word16 alpha;
+
+ /* if a tone has been detected for a while, initialize stat_count */
+ if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ /* if 8 last vad-decisions have been "0", reinitialize stat_count */
+ if ((st->vadreg & 0x7f80) == 0)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ stat_rat = 0;
+ for (i = 0; i < COMPLEN; i++)
+ {
+ if(level[i] > st->ave_level[i])
+ {
+ num = level[i];
+ denom = st->ave_level[i];
+ } else
+ {
+ num = st->ave_level[i];
+ denom = level[i];
+ }
+ /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
+ if(num < STAT_THR_LEVEL)
+ {
+ num = STAT_THR_LEVEL;
+ }
+ if(denom < STAT_THR_LEVEL)
+ {
+ denom = STAT_THR_LEVEL;
+ }
+ exp = norm_s(denom);
+ denom = denom << exp;
+
+ /* stat_rat = num/denom * 64 */
+ temp = div_s(num >> 1, denom);
+ stat_rat = add1(stat_rat, shr(temp, (8 - exp)));
+ }
+
+ /* compare stat_rat with a threshold and update stat_count */
+ if(stat_rat > STAT_THR)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ if ((st->vadreg & 0x4000) != 0)
+ {
+
+ if (st->stat_count != 0)
+ {
+ st->stat_count = st->stat_count - 1;
+ }
+ }
+ }
+ }
+ }
+
+ /* Update average amplitude estimate for stationarity estimation */
+ alpha = ALPHA4;
+ if(st->stat_count == STAT_COUNT)
+ {
+ alpha = 32767;
+ } else if ((st->vadreg & 0x4000) == 0)
+ {
+ alpha = ALPHA5;
+ }
+ for (i = 0; i < COMPLEN; i++)
+ {
+ st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i])));
+ }
+}
+
+/******************************************************************************
+*
+* Function : hangover_addition
+* Purpose : Add hangover after speech bursts
+*
+*******************************************************************************/
+
+static Word16 hangover_addition( /* return: VAD_flag indicating final VAD decision */
+ VadVars * st, /* i/o : State structure */
+ Word16 low_power, /* i : flag power of the input frame */
+ Word16 hang_len, /* i : hangover length */
+ Word16 burst_len /* i : minimum burst length for hangover addition */
+ )
+{
+ /* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0" */
+ if (low_power != 0)
+ {
+ st->burst_count = 0;
+ st->hang_count = 0;
+ return 0;
+ }
+ /* update the counters (hang_count, burst_count) */
+ if ((st->vadreg & 0x4000) != 0)
+ {
+ st->burst_count = st->burst_count + 1;
+ if(st->burst_count >= burst_len)
+ {
+ st->hang_count = hang_len;
+ }
+ return 1;
+ } else
+ {
+ st->burst_count = 0;
+ if (st->hang_count > 0)
+ {
+ st->hang_count = st->hang_count - 1;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/******************************************************************************
+*
+* Function : noise_estimate_update
+* Purpose : Update of background noise estimate
+*
+*******************************************************************************/
+
+static void noise_estimate_update(
+ VadVars * st, /* i/o : State structure */
+ Word16 level[] /* i : sub-band levels of the input frame */
+ )
+{
+ Word32 i;
+ Word16 alpha_up, alpha_down, bckr_add = 2;
+
+ /* Control update of bckr_est[] */
+ update_cntrl(st, level);
+
+ /* Choose update speed */
+ if ((0x7800 & st->vadreg) == 0)
+ {
+ alpha_up = ALPHA_UP1;
+ alpha_down = ALPHA_DOWN1;
+ } else
+ {
+ if ((st->stat_count == 0))
+ {
+ alpha_up = ALPHA_UP2;
+ alpha_down = ALPHA_DOWN2;
+ } else
+ {
+ alpha_up = 0;
+ alpha_down = ALPHA3;
+ bckr_add = 0;
+ }
+ }
+
+ /* Update noise estimate (bckr_est) */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ Word16 temp;
+ temp = (st->old_level[i] - st->bckr_est[i]);
+
+ if (temp < 0)
+ { /* update downwards */
+ st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp)));
+ /* limit minimum value of the noise estimate to NOISE_MIN */
+ if(st->bckr_est[i] < NOISE_MIN)
+ {
+ st->bckr_est[i] = NOISE_MIN;
+ }
+ } else
+ { /* update upwards */
+ st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp)));
+
+ /* limit maximum value of the noise estimate to NOISE_MAX */
+ if(st->bckr_est[i] > NOISE_MAX)
+ {
+ st->bckr_est[i] = NOISE_MAX;
+ }
+ }
+ }
+
+ /* Update signal levels of the previous frame (old_level) */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ st->old_level[i] = level[i];
+ }
+}
+
+/******************************************************************************
+*
+* Function : vad_decision
+* Purpose : Calculates VAD_flag
+*
+*******************************************************************************/
+
+static Word16 vad_decision( /* return value : VAD_flag */
+ VadVars * st, /* i/o : State structure */
+ Word16 level[COMPLEN], /* i : sub-band levels of the input frame */
+ Word32 pow_sum /* i : power of the input frame */
+ )
+{
+ Word32 i;
+ Word32 L_snr_sum;
+ Word32 L_temp;
+ Word16 vad_thr, temp, noise_level;
+ Word16 low_power_flag;
+ Word16 hang_len, burst_len;
+ Word16 ilog2_speech_level, ilog2_noise_level;
+ Word16 temp2;
+
+ /* Calculate squared sum of the input levels (level) divided by the background noise components
+ * (bckr_est). */
+ L_snr_sum = 0;
+ for (i = 0; i < COMPLEN; i++)
+ {
+ Word16 exp;
+
+ exp = norm_s(st->bckr_est[i]);
+ temp = (st->bckr_est[i] << exp);
+ temp = div_s((level[i] >> 1), temp);
+ temp = shl(temp, (exp - (UNIRSHFT - 1)));
+ L_snr_sum = L_mac(L_snr_sum, temp, temp);
+ }
+
+ /* Calculate average level of estimated background noise */
+ L_temp = 0;
+ for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
+ {
+ L_temp = vo_L_add(L_temp, st->bckr_est[i]);
+ }
+
+ noise_level = extract_h((L_temp << 12));
+ /* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */
+ temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3;
+
+ if(st->speech_level < temp)
+ {
+ st->speech_level = temp;
+ }
+ ilog2_noise_level = ilog2(noise_level);
+
+ /* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by
+ * subtracting MIN_SPEECH_SNR*noise_level from speech level */
+ ilog2_speech_level = ilog2(st->speech_level - temp);
+
+ temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH);
+
+ temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1)));
+ if (temp2 < SP_CH_MIN)
+ {
+ temp2 = SP_CH_MIN;
+ }
+ if (temp2 > SP_CH_MAX)
+ {
+ temp2 = SP_CH_MAX;
+ }
+ vad_thr = temp + temp2;
+
+ if(vad_thr < THR_MIN)
+ {
+ vad_thr = THR_MIN;
+ }
+ /* Shift VAD decision register */
+ st->vadreg = (st->vadreg >> 1);
+
+ /* Make intermediate VAD decision */
+ if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN)))
+ {
+ st->vadreg = (Word16) (st->vadreg | 0x4000);
+ }
+ /* check if the input power (pow_sum) is lower than a threshold" */
+ if(pow_sum < VAD_POW_LOW)
+ {
+ low_power_flag = 1;
+ } else
+ {
+ low_power_flag = 0;
+ }
+ /* Update background noise estimates */
+ noise_estimate_update(st, level);
+
+ /* Calculate values for hang_len and burst_len based on vad_thr */
+ hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH);
+ if(hang_len < HANG_LOW)
+ {
+ hang_len = HANG_LOW;
+ }
+ burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH);
+
+ return (hangover_addition(st, low_power_flag, hang_len, burst_len));
+}
+
+/******************************************************************************
+*
+* Function : Estimate_Speech()
+* Purpose : Estimate speech level
+*
+* Maximum signal level is searched and stored to the variable sp_max.
+* The speech frames must locate within SP_EST_COUNT number of frames.
+* Thus, noisy frames having occasional VAD = "1" decisions will not
+* affect to the estimated speech_level.
+*
+*******************************************************************************/
+
+static void Estimate_Speech(
+ VadVars * st, /* i/o : State structure */
+ Word16 in_level /* level of the input frame */
+ )
+{
+ Word16 alpha;
+
+ /* if the required activity count cannot be achieved, reset counters */
+ if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT))
+ {
+ st->sp_est_cnt = 0;
+ st->sp_max = 0;
+ st->sp_max_cnt = 0;
+ }
+ st->sp_est_cnt += 1;
+
+ if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1))
+ {
+ /* update sp_max */
+ if(in_level > st->sp_max)
+ {
+ st->sp_max = in_level;
+ }
+ st->sp_max_cnt += 1;
+
+ if(st->sp_max_cnt >= SP_ACTIVITY_COUNT)
+ {
+ Word16 tmp;
+ /* update speech estimate */
+ tmp = (st->sp_max >> 1); /* scale to get "average" speech level */
+
+ /* select update speed */
+ if(tmp > st->speech_level)
+ {
+ alpha = ALPHA_SP_UP;
+ } else
+ {
+ alpha = ALPHA_SP_DOWN;
+ }
+ if(tmp > MIN_SPEECH_LEVEL2)
+ {
+ st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level)));
+ }
+ /* clear all counters used for speech estimation */
+ st->sp_max = 0;
+ st->sp_max_cnt = 0;
+ st->sp_est_cnt = 0;
+ }
+ }
+}
+
+/******************************************************************************
+*
+* Function: wb_vad_init
+* Purpose: Allocates state memory and initializes state memory
+*
+*******************************************************************************/
+
+Word16 wb_vad_init( /* return: non-zero with error, zero for ok. */
+ VadVars ** state, /* i/o : State structure */
+ VO_MEM_OPERATOR *pMemOP
+ )
+{
+ VadVars *s;
+
+ if (state == (VadVars **) NULL)
+ {
+ fprintf(stderr, "vad_init: invalid parameter\n");
+ return -1;
+ }
+ *state = NULL;
+
+ /* allocate memory */
+ if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ fprintf(stderr, "vad_init: can not malloc state structure\n");
+ return -1;
+ }
+ wb_vad_reset(s);
+
+ *state = s;
+
+ return 0;
+}
+
+/******************************************************************************
+*
+* Function: wb_vad_reset
+* Purpose: Initializes state memory
+*
+*******************************************************************************/
+
+Word16 wb_vad_reset( /* return: non-zero with error, zero for ok. */
+ VadVars * state /* i/o : State structure */
+ )
+{
+ Word32 i, j;
+
+ if (state == (VadVars *) NULL)
+ {
+ fprintf(stderr, "vad_reset: invalid parameter\n");
+ return -1;
+ }
+ state->tone_flag = 0;
+ state->vadreg = 0;
+ state->hang_count = 0;
+ state->burst_count = 0;
+ state->hang_count = 0;
+
+ /* initialize memory used by the filter bank */
+ for (i = 0; i < F_5TH_CNT; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ state->a_data5[i][j] = 0;
+ }
+ }
+
+ for (i = 0; i < F_3TH_CNT; i++)
+ {
+ state->a_data3[i] = 0;
+ }
+
+ /* initialize the rest of the memory */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ state->bckr_est[i] = NOISE_INIT;
+ state->old_level[i] = NOISE_INIT;
+ state->ave_level[i] = NOISE_INIT;
+ state->sub_level[i] = 0;
+ }
+
+ state->sp_est_cnt = 0;
+ state->sp_max = 0;
+ state->sp_max_cnt = 0;
+ state->speech_level = SPEECH_LEVEL_INIT;
+ state->prev_pow_sum = 0;
+ return 0;
+}
+
+/******************************************************************************
+*
+* Function: wb_vad_exit
+* Purpose: The memory used for state memory is freed
+*
+*******************************************************************************/
+
+void wb_vad_exit(
+ VadVars ** state, /* i/o : State structure */
+ VO_MEM_OPERATOR *pMemOP
+ )
+{
+ if (state == NULL || *state == NULL)
+ return;
+ /* deallocate memory */
+ mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB);
+ *state = NULL;
+ return;
+}
+
+/******************************************************************************
+*
+* Function : wb_vad_tone_detection
+* Purpose : Search maximum pitch gain from a frame. Set tone flag if
+* pitch gain is high. This is used to detect
+* signaling tones and other signals with high pitch gain.
+*
+*******************************************************************************/
+
+void wb_vad_tone_detection(
+ VadVars * st, /* i/o : State struct */
+ Word16 p_gain /* pitch gain */
+ )
+{
+ /* update tone flag */
+ st->tone_flag = (st->tone_flag >> 1);
+
+ /* if (pitch_gain > TONE_THR) set tone flag */
+ if (p_gain > TONE_THR)
+ {
+ st->tone_flag = (Word16) (st->tone_flag | 0x4000);
+ }
+}
+
+/******************************************************************************
+*
+* Function : wb_vad
+* Purpose : Main program for Voice Activity Detection (VAD) for AMR
+*
+*******************************************************************************/
+
+Word16 wb_vad( /* Return value : VAD Decision, 1 = speech, 0 = noise */
+ VadVars * st, /* i/o : State structure */
+ Word16 in_buf[] /* i : samples of the input frame */
+ )
+{
+ Word16 level[COMPLEN];
+ Word32 i;
+ Word16 VAD_flag, temp;
+ Word32 L_temp, pow_sum;
+
+ /* Calculate power of the input frame. */
+ L_temp = 0L;
+ for (i = 0; i < FRAME_LEN; i++)
+ {
+ L_temp = L_mac(L_temp, in_buf[i], in_buf[i]);
+ }
+
+ /* pow_sum = power of current frame and previous frame */
+ pow_sum = L_add(L_temp, st->prev_pow_sum);
+
+ /* save power of current frame for next call */
+ st->prev_pow_sum = L_temp;
+
+ /* If input power is very low, clear tone flag */
+ if (pow_sum < POW_TONE_THR)
+ {
+ st->tone_flag = (Word16) (st->tone_flag & 0x1fff);
+ }
+ /* Run the filter bank and calculate signal levels at each band */
+ filter_bank(st, in_buf, level);
+
+ /* compute VAD decision */
+ VAD_flag = vad_decision(st, level, pow_sum);
+
+ /* Calculate input level */
+ L_temp = 0;
+ for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
+ {
+ L_temp = vo_L_add(L_temp, level[i]);
+ }
+
+ temp = extract_h(L_temp << 12);
+
+ Estimate_Speech(st, temp); /* Estimate speech level */
+ return (VAD_flag);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/weight_a.c b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
new file mode 100644
index 0000000..d47be97
--- /dev/null
+++ b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
@@ -0,0 +1,48 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+* File: weight_a.c *
+* *
+* Description:Weighting of LPC coefficients *
+* ap[i] = a[i] * (gamma ** i) *
+* *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Weight_a(
+ Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
+ Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
+ Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
+ Word16 m /* (i) : LPC order. */
+ )
+{
+ Word32 num = m - 1, fac;
+ *ap++ = *a++;
+ fac = gamma;
+ do{
+ *ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+ fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16;
+ }while(--num != 0);
+
+ *ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+ return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/common/Android.mk b/media/libstagefright/codecs/common/Android.mk
new file mode 100644
index 0000000..fffb2ad
--- /dev/null
+++ b/media/libstagefright/codecs/common/Android.mk
@@ -0,0 +1,33 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_SRC_FILES := cmnMemory.c
+
+LOCAL_MODULE := libstagefright_enc_common
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/include
+
+LOCAL_CFLAGS := $(VO_CFLAGS)
+
+ifeq ($(VOTT), v5)
+LOCAL_CFLAGS += -DARM -DASM_OPT
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+endif
+
+ifeq ($(VOTT), v7)
+LOCAL_CFLAGS += -DARM -DARMV7 -DASM_OPT
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
+
+
diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk
new file mode 100644
index 0000000..27a17c1
--- /dev/null
+++ b/media/libstagefright/codecs/common/Config.mk
@@ -0,0 +1,24 @@
+#
+# This configure file is just for Linux projects against Android
+#
+
+VOPRJ :=
+VONJ :=
+
+# WARNING:
+# Using v7 breaks generic build
+ifeq ($(TARGET_ARCH),arm)
+VOTT := v5
+else
+VOTT := pc
+endif
+
+# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+VOTT := v7
+endif
+
+VOTEST := 0
+
+VO_CFLAGS:=-DLINUX
+
diff --git a/media/libstagefright/codecs/common/cmnMemory.c b/media/libstagefright/codecs/common/cmnMemory.c
new file mode 100644
index 0000000..c17264c
--- /dev/null
+++ b/media/libstagefright/codecs/common/cmnMemory.c
@@ -0,0 +1,73 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: cmnMemory.c
+
+ Content: sample code for memory operator implementation
+
+*******************************************************************************/
+#include "cmnMemory.h"
+
+#include <malloc.h>
+#if defined LINUX
+#include <string.h>
+#endif
+
+//VO_MEM_OPERATOR g_memOP;
+
+VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo)
+{
+ if (!pMemInfo)
+ return VO_ERR_INVALID_ARG;
+
+ pMemInfo->VBuffer = malloc (pMemInfo->Size);
+ return 0;
+}
+
+VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)
+{
+ free (pMem);
+ return 0;
+}
+
+VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)
+{
+ memset (pBuff, uValue, uSize);
+ return 0;
+}
+
+VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+ memcpy (pDest, pSource, uSize);
+ return 0;
+}
+
+VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)
+{
+ return 0;
+}
+
+VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)
+{
+ return memcmp(pBuffer1, pBuffer2, uSize);
+}
+
+VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+ memmove (pDest, pSource, uSize);
+ return 0;
+}
+
diff --git a/media/libstagefright/codecs/common/include/cmnMemory.h b/media/libstagefright/codecs/common/include/cmnMemory.h
new file mode 100644
index 0000000..9315600
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/cmnMemory.h
@@ -0,0 +1,106 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: cmnMemory.h
+
+ Content: memory operator implementation header file
+
+*******************************************************************************/
+
+#ifndef __cmnMemory_H__
+#define __cmnMemory_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <voMem.h>
+
+//extern VO_MEM_OPERATOR g_memOP;
+
+/**
+ * Allocate memory
+ * \param uID [in] module ID
+ * \param uSize [in] size of memory
+ * \return value is the allocated memory address. NULL is failed.
+ */
+VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo);
+
+/**
+ * Free up memory
+ * \param uID [in] module ID
+ * \param pMem [in] address of memory
+ * \return value 0, if succeeded.
+ */
+VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pBuffer);
+
+/**
+ * memory set function
+ * \param uID [in] module ID
+ * \param pBuff [in/out] address of memory
+ * \param uValue [in] the value to be set
+ * \param uSize [in] the size to be set
+ * \return value 0, if succeeded.
+ */
+VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize);
+
+/**
+ * memory copy function
+ * \param uID [in] module ID
+ * \param pDest [in/out] address of destination memory
+ * \param pSource [in] address of source memory
+ * \param uSize [in] the size to be copied
+ * \return value 0, if succeeded.
+ */
+VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+
+/**
+ * memory check function
+ * \param uID [in] module ID
+ * \param pBuff [in] address of buffer to be checked
+ * \param uSize [in] the size to be checked
+ * \return value 0, if succeeded.
+ */
+VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize);
+
+/**
+ * memory compare function
+ * \param uID [in] module ID
+ * \param pBuffer1 [in] address of buffer 1 to be compared
+ * \param pBuffer2 [in] address of buffer 2 to be compared
+ * \param uSize [in] the size to be compared
+ * \return value: same as standard C run-time memcmp() function.
+ */
+VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize);
+
+/**
+ * memory move function
+ * \param uID [in] module ID
+ * \param pDest [in/out] address of destination memory
+ * \param pSource [in] address of source memory
+ * \param uSize [in] the size to be moved
+ * \return value 0, if succeeded.
+ */
+VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __cmnMemory_H__
+
+
diff --git a/media/libstagefright/codecs/common/include/voAAC.h b/media/libstagefright/codecs/common/include/voAAC.h
new file mode 100644
index 0000000..d11ed83
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voAAC.h
@@ -0,0 +1,74 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voAAC.h
+
+ Content: AAC codec APIs & data types
+
+*******************************************************************************/
+
+#ifndef __voAAC_H__
+#define __voAAC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voAudio.h"
+
+/*!
+ * the frame type that the decoder supports
+ */
+typedef enum {
+ VOAAC_RAWDATA = 0, /*!<contains only raw aac data in a frame*/
+ VOAAC_ADTS = 1, /*!<contains ADTS header + raw AAC data in a frame*/
+ VOAAC_FT_MAX = VO_MAX_ENUM_VALUE
+} VOAACFRAMETYPE;
+
+/*!
+ * the structure for AAC encoder input parameter
+ */
+typedef struct {
+ int sampleRate; /*! audio file sample rate */
+ int bitRate; /*! encoder bit rate in bits/sec */
+ short nChannels; /*! number of channels on input (1,2) */
+ short adtsUsed; /*! whether write adts header */
+} AACENC_PARAM;
+
+/* AAC Param ID */
+#define VO_PID_AAC_Mdoule 0x42211000
+#define VO_PID_AAC_ENCPARAM VO_PID_AAC_Mdoule | 0x0040 /*!< get/set AAC encoder parameter, the parameter is a pointer to AACENC_PARAM */
+
+/* AAC decoder error ID */
+#define VO_ERR_AAC_Mdoule 0x82210000
+#define VO_ERR_AAC_UNSFILEFORMAT (VO_ERR_AAC_Mdoule | 0xF001)
+#define VO_ERR_AAC_UNSPROFILE (VO_ERR_AAC_Mdoule | 0xF002)
+
+/**
+ * Get audio encoder API interface
+ * \param pEncHandle [out] Return the AAC Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAACEncAPI (VO_AUDIO_CODECAPI * pEncHandle);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voAAC_H__
+
+
+
diff --git a/media/libstagefright/codecs/common/include/voAMRWB.h b/media/libstagefright/codecs/common/include/voAMRWB.h
new file mode 100644
index 0000000..8a93eb8
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voAMRWB.h
@@ -0,0 +1,87 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voAMRWB.h
+
+ Content: AMR-WB codec APIs & data types
+
+*******************************************************************************/
+#ifndef __VOAMRWB_H__
+#define __VOAMRWB_H__
+
+#include "voAudio.h"
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#pragma pack(push, 4)
+
+/*!* the bit rate the codec supports*/
+typedef enum {
+ VOAMRWB_MDNONE = -1, /*!< Invalid mode */
+ VOAMRWB_MD66 = 0, /*!< 6.60kbps */
+ VOAMRWB_MD885 = 1, /*!< 8.85kbps */
+ VOAMRWB_MD1265 = 2, /*!< 12.65kbps */
+ VOAMRWB_MD1425 = 3, /*!< 14.25kbps */
+ VOAMRWB_MD1585 = 4, /*!< 15.85bps */
+ VOAMRWB_MD1825 = 5, /*!< 18.25bps */
+ VOAMRWB_MD1985 = 6, /*!< 19.85kbps */
+ VOAMRWB_MD2305 = 7, /*!< 23.05kbps */
+ VOAMRWB_MD2385 = 8, /*!< 23.85kbps> */
+ VOAMRWB_N_MODES = 9, /*!< Invalid mode */
+ VOAMRWB_MODE_MAX = VO_MAX_ENUM_VALUE
+
+}VOAMRWBMODE;
+
+/*!* the frame format the codec supports*/
+typedef enum {
+ VOAMRWB_DEFAULT = 0, /*!< the frame type is the header (defined in RFC3267) + rawdata*/
+ /*One word (2-byte) for sync word (0x6b21)*/
+ /*One word (2-byte) for frame length N.*/
+ /*N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).*/
+ VOAMRWB_ITU = 1,
+ /*One word (2-byte) for sync word (0x6b21).*/
+ /*One word (2-byte) to indicate the frame type.*/
+ /*One word (2-byte) to indicate the mode.*/
+ /*N words (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).*/
+ VOAMRWB_RFC3267 = 2, /* see RFC 3267 */
+ VOAMRWB_TMAX = VO_MAX_ENUM_VALUE
+}VOAMRWBFRAMETYPE;
+
+
+#define VO_PID_AMRWB_Module 0x42261000
+#define VO_PID_AMRWB_FORMAT (VO_PID_AMRWB_Module | 0x0002)
+#define VO_PID_AMRWB_CHANNELS (VO_PID_AMRWB_Module | 0x0003)
+#define VO_PID_AMRWB_SAMPLERATE (VO_PID_AMRWB_Module | 0x0004)
+#define VO_PID_AMRWB_FRAMETYPE (VO_PID_AMRWB_Module | 0x0005)
+#define VO_PID_AMRWB_MODE (VO_PID_AMRWB_Module | 0x0006)
+#define VO_PID_AMRWB_DTX (VO_PID_AMRWB_Module | 0x0007)
+
+/**
+ * Get audio codec API interface
+ * \param pEncHandle [out] Return the AMRWB Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAMRWBEncAPI(VO_AUDIO_CODECAPI *pEncHandle);
+
+
+#pragma pack(pop)
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+
+#endif //__VOAMRWB_H__
+
diff --git a/media/libstagefright/codecs/common/include/voAudio.h b/media/libstagefright/codecs/common/include/voAudio.h
new file mode 100644
index 0000000..64c9dfb
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voAudio.h
@@ -0,0 +1,173 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voAudio.h
+
+ Content: Audio types and functions
+
+*******************************************************************************/
+
+#ifndef __voAudio_H__
+#define __voAudio_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voIndex.h"
+#include "voMem.h"
+
+#define VO_PID_AUDIO_BASE 0x42000000 /*!< The base param ID for AUDIO codec */
+#define VO_PID_AUDIO_FORMAT (VO_PID_AUDIO_BASE | 0X0001) /*!< The format data of audio in track */
+#define VO_PID_AUDIO_SAMPLEREATE (VO_PID_AUDIO_BASE | 0X0002) /*!< The sample rate of audio */
+#define VO_PID_AUDIO_CHANNELS (VO_PID_AUDIO_BASE | 0X0003) /*!< The channel of audio */
+#define VO_PID_AUDIO_BITRATE (VO_PID_AUDIO_BASE | 0X0004) /*!< The bit rate of audio */
+#define VO_PID_AUDIO_CHANNELMODE (VO_PID_AUDIO_BASE | 0X0005) /*!< The channel mode of audio */
+
+#define VO_ERR_AUDIO_BASE 0x82000000
+#define VO_ERR_AUDIO_UNSCHANNEL VO_ERR_AUDIO_BASE | 0x0001
+#define VO_ERR_AUDIO_UNSSAMPLERATE VO_ERR_AUDIO_BASE | 0x0002
+#define VO_ERR_AUDIO_UNSFEATURE VO_ERR_AUDIO_BASE | 0x0003
+
+
+/**
+ *Enumeration used to define the possible audio coding formats.
+ */
+typedef enum VO_AUDIO_CODINGTYPE {
+ VO_AUDIO_CodingUnused = 0, /**< Placeholder value when coding is N/A */
+ VO_AUDIO_CodingPCM, /**< Any variant of PCM coding */
+ VO_AUDIO_CodingADPCM, /**< Any variant of ADPCM encoded data */
+ VO_AUDIO_CodingAMRNB, /**< Any variant of AMR encoded data */
+ VO_AUDIO_CodingAMRWB, /**< Any variant of AMR encoded data */
+ VO_AUDIO_CodingAMRWBP, /**< Any variant of AMR encoded data */
+ VO_AUDIO_CodingQCELP13, /**< Any variant of QCELP 13kbps encoded data */
+ VO_AUDIO_CodingEVRC, /**< Any variant of EVRC encoded data */
+ VO_AUDIO_CodingAAC, /**< Any variant of AAC encoded data, 0xA106 - ISO/MPEG-4 AAC, 0xFF - AAC */
+ VO_AUDIO_CodingAC3, /**< Any variant of AC3 encoded data */
+ VO_AUDIO_CodingFLAC, /**< Any variant of FLAC encoded data */
+ VO_AUDIO_CodingMP1, /**< Any variant of MP1 encoded data */
+ VO_AUDIO_CodingMP3, /**< Any variant of MP3 encoded data */
+ VO_AUDIO_CodingOGG, /**< Any variant of OGG encoded data */
+ VO_AUDIO_CodingWMA, /**< Any variant of WMA encoded data */
+ VO_AUDIO_CodingRA, /**< Any variant of RA encoded data */
+ VO_AUDIO_CodingMIDI, /**< Any variant of MIDI encoded data */
+ VO_AUDIO_CodingDRA, /**< Any variant of dra encoded data */
+ VO_AUDIO_CodingG729, /**< Any variant of dra encoded data */
+ VO_AUDIO_Coding_MAX = VO_MAX_ENUM_VALUE
+} VO_AUDIO_CODINGTYPE;
+
+/*!
+* the channel type value
+*/
+typedef enum {
+ VO_CHANNEL_CENTER = 1, /*!<center channel*/
+ VO_CHANNEL_FRONT_LEFT = 1<<1, /*!<front left channel*/
+ VO_CHANNEL_FRONT_RIGHT = 1<<2, /*!<front right channel*/
+ VO_CHANNEL_SIDE_LEFT = 1<<3, /*!<side left channel*/
+ VO_CHANNEL_SIDE_RIGHT = 1<<4, /*!<side right channel*/
+ VO_CHANNEL_BACK_LEFT = 1<<5, /*!<back left channel*/
+ VO_CHANNEL_BACK_RIGHT = 1<<6, /*!<back right channel*/
+ VO_CHANNEL_BACK_CENTER = 1<<7, /*!<back center channel*/
+ VO_CHANNEL_LFE_BASS = 1<<8, /*!<low-frequency effects bass channel*/
+ VO_CHANNEL_ALL = 0xffff,/*!<[default] include all channels */
+ VO_CHANNEL_MAX = VO_MAX_ENUM_VALUE
+} VO_AUDIO_CHANNELTYPE;
+
+/**
+ * General audio format info
+ */
+typedef struct
+{
+ VO_S32 SampleRate; /*!< Sample rate */
+ VO_S32 Channels; /*!< Channel count */
+ VO_S32 SampleBits; /*!< Bits per sample */
+} VO_AUDIO_FORMAT;
+
+/**
+ * General audio output info
+ */
+typedef struct
+{
+ VO_AUDIO_FORMAT Format; /*!< Sample rate */
+ VO_U32 InputUsed; /*!< Channel count */
+ VO_U32 Resever; /*!< Resevered */
+} VO_AUDIO_OUTPUTINFO;
+
+/**
+ * General audio codec function set
+ */
+typedef struct VO_AUDIO_CODECAPI
+{
+ /**
+ * Init the audio codec module and return codec handle
+ * \param phCodec [OUT] Return the video codec handle
+ * \param vType [IN] The codec type if the module support multi codec.
+ * \param pUserData [IN] The init param. It is either a memory operator or an allocated memory
+ * \retval VO_ERR_NONE Succeeded.
+ */
+ VO_U32 (VO_API * Init) (VO_HANDLE * phCodec, VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA * pUserData );
+
+ /**
+ * Set input audio data.
+ * \param hCodec [IN]] The codec handle which was created by Init function.
+ * \param pInput [IN] The input buffer param.
+ * \retval VO_ERR_NONE Succeeded.
+ */
+ VO_U32 (VO_API * SetInputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pInput);
+
+ /**
+ * Get the outut audio data
+ * \param hCodec [IN]] The codec handle which was created by Init function.
+ * \param pOutBuffer [OUT] The output audio data
+ * \param pOutInfo [OUT] The codec fills audio format and the input data size used in current call.
+ * pOutInfo->InputUsed is total used input data size in byte.
+ * \retval VO_ERR_NONE Succeeded.
+ * VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. Continue to input
+ * data before next call.
+ */
+ VO_U32 (VO_API * GetOutputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pOutBuffer, VO_AUDIO_OUTPUTINFO * pOutInfo);
+
+ /**
+ * Set the parameter for the specified param ID.
+ * \param hCodec [IN]] The codec handle which was created by Init function.
+ * \param uParamID [IN] The param ID.
+ * \param pData [IN] The param value.
+ * \retval VO_ERR_NONE Succeeded.
+ */
+ VO_U32 (VO_API * SetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);
+
+ /**
+ * Get the parameter for the specified param ID.
+ * \param hCodec [IN]] The codec handle which was created by Init function.
+ * \param uParamID [IN] The param ID.
+ * \param pData [IN] The param value.
+ * \retval VO_ERR_NONE Succeeded.
+ */
+ VO_U32 (VO_API * GetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);
+
+ /**
+ * Uninit the Codec.
+ * \param hCodec [IN]] The codec handle which was created by Init function.
+ * \retval VO_ERR_NONE Succeeded.
+ */
+ VO_U32 (VO_API * Uninit) (VO_HANDLE hCodec);
+} VO_AUDIO_CODECAPI;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voAudio_H__
diff --git a/media/libstagefright/codecs/common/include/voIndex.h b/media/libstagefright/codecs/common/include/voIndex.h
new file mode 100644
index 0000000..541a0db
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voIndex.h
@@ -0,0 +1,193 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voIndex.h
+
+ Content: module and ID definition
+
+*******************************************************************************/
+
+#ifndef __voIndex_H__
+#define __voIndex_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voType.h"
+
+/* Define the module ID */
+#define _MAKE_SOURCE_ID(id, name) \
+VO_INDEX_SRC_##name = _VO_INDEX_SOURCE | id,
+
+#define _MAKE_CODEC_ID(id, name) \
+VO_INDEX_DEC_##name = _VO_INDEX_DEC | id, \
+VO_INDEX_ENC_##name = _VO_INDEX_ENC | id,
+
+#define _MAKE_EFFECT_ID(id, name) \
+VO_INDEX_EFT_##name = _VO_INDEX_EFFECT | id,
+
+#define _MAKE_SINK_ID(id, name) \
+VO_INDEX_SNK_##name = _VO_INDEX_SINK | id,
+
+#define _MAKE_FILTER_ID(id, name) \
+VO_INDEX_FLT_##name = _VO_INDEX_FILTER | id,
+
+#define _MAKE_OMX_ID(id, name) \
+VO_INDEX_OMX_##name = _VO_INDEX_OMX | id,
+
+#define _MAKE_MFW_ID(id, name) \
+VO_INDEX_MFW_##name = _VO_INDEX_MFW | id,
+
+enum
+{
+ _VO_INDEX_SOURCE = 0x01000000,
+ _VO_INDEX_DEC = 0x02000000,
+ _VO_INDEX_ENC = 0x03000000,
+ _VO_INDEX_EFFECT = 0x04000000,
+ _VO_INDEX_SINK = 0x05000000,
+ _VO_INDEX_FILTER = 0x06000000,
+ _VO_INDEX_OMX = 0x07000000,
+ _VO_INDEX_MFW = 0x08000000,
+
+ // define file parser modules
+ _MAKE_SOURCE_ID (0x010000, MP4)
+ _MAKE_SOURCE_ID (0x020000, AVI)
+ _MAKE_SOURCE_ID (0x030000, ASF)
+ _MAKE_SOURCE_ID (0x040000, REAL)
+ _MAKE_SOURCE_ID (0x050000, AUDIO)
+ _MAKE_SOURCE_ID (0x060000, FLASH)
+ _MAKE_SOURCE_ID (0x070000, OGG)
+ _MAKE_SOURCE_ID (0x080000, MKV)
+
+ // define network source modules
+ _MAKE_SOURCE_ID (0x110000, RTSP)
+ _MAKE_SOURCE_ID (0x120000, HTTP)
+
+ // define CMMB source modules
+ _MAKE_SOURCE_ID (0x200000, CMMB)
+ _MAKE_SOURCE_ID (0x210000, CMMB_INNO)
+ _MAKE_SOURCE_ID (0x220000, CMMB_TELE)
+ _MAKE_SOURCE_ID (0x230000, CMMB_SIANO)
+
+ // define DVBT source modules
+ _MAKE_SOURCE_ID (0x300000, DVBT)
+ _MAKE_SOURCE_ID (0x310000, DVBT_DIBCOM)
+
+ // define other source modules
+ _MAKE_SOURCE_ID (0x400000, ID3)
+
+ // define video codec modules
+ _MAKE_CODEC_ID (0x010000, H264)
+ _MAKE_CODEC_ID (0x020000, MPEG4)
+ _MAKE_CODEC_ID (0x030000, H263)
+ _MAKE_CODEC_ID (0x040000, S263)
+ _MAKE_CODEC_ID (0x050000, RV)
+ _MAKE_CODEC_ID (0x060000, WMV)
+ _MAKE_CODEC_ID (0x070000, DIVX3)
+ _MAKE_CODEC_ID (0x080000, MJPEG)
+ _MAKE_CODEC_ID (0x090000, MPEG2)
+ _MAKE_CODEC_ID (0x0A0000, VP6)
+
+ // define audio codec modules
+ _MAKE_CODEC_ID (0x210000, AAC)
+ _MAKE_CODEC_ID (0x220000, MP3)
+ _MAKE_CODEC_ID (0x230000, WMA)
+ _MAKE_CODEC_ID (0x240000, RA)
+ _MAKE_CODEC_ID (0x250000, AMRNB)
+ _MAKE_CODEC_ID (0x260000, AMRWB)
+ _MAKE_CODEC_ID (0x270000, AMRWBP)
+ _MAKE_CODEC_ID (0x280000, QCELP)
+ _MAKE_CODEC_ID (0x290000, EVRC)
+ _MAKE_CODEC_ID (0x2A0000, ADPCM)
+ _MAKE_CODEC_ID (0x2B0000, MIDI)
+ _MAKE_CODEC_ID (0x2C0000, AC3)
+ _MAKE_CODEC_ID (0x2D0000, FLAC)
+ _MAKE_CODEC_ID (0x2E0000, DRA)
+ _MAKE_CODEC_ID (0x2F0000, OGG)
+ _MAKE_CODEC_ID (0x300000, G729)
+
+ // define image codec modules
+ _MAKE_CODEC_ID (0x410000, JPEG)
+ _MAKE_CODEC_ID (0x420000, GIF)
+ _MAKE_CODEC_ID (0x430000, PNG)
+ _MAKE_CODEC_ID (0x440000, TIF)
+
+ // define effect modules
+ _MAKE_EFFECT_ID (0x010000, EQ)
+
+ // define sink modules
+ _MAKE_SINK_ID (0x010000, VIDEO)
+ _MAKE_SINK_ID (0x020000, AUDIO)
+ _MAKE_SINK_ID (0x030000, CCRRR)
+ _MAKE_SINK_ID (0x040000, CCRRV)
+
+ _MAKE_SINK_ID (0x110000, MP4)
+ _MAKE_SINK_ID (0x120000, AVI)
+ _MAKE_SINK_ID (0x130000, AFW)
+
+ // define media frame module ID
+ _MAKE_MFW_ID (0x010000, VOMMPLAY)
+ _MAKE_MFW_ID (0x020000, VOMMREC)
+ _MAKE_MFW_ID (0x030000, VOME)
+};
+
+
+/* define the error ID */
+#define VO_ERR_NONE 0x00000000
+#define VO_ERR_FINISH 0x00000001
+#define VO_ERR_BASE 0X80000000
+#define VO_ERR_FAILED 0x80000001
+#define VO_ERR_OUTOF_MEMORY 0x80000002
+#define VO_ERR_NOT_IMPLEMENT 0x80000003
+#define VO_ERR_INVALID_ARG 0x80000004
+#define VO_ERR_INPUT_BUFFER_SMALL 0x80000005
+#define VO_ERR_OUTPUT_BUFFER_SMALL 0x80000006
+#define VO_ERR_WRONG_STATUS 0x80000007
+#define VO_ERR_WRONG_PARAM_ID 0x80000008
+#define VO_ERR_LICENSE_ERROR 0x80000009
+
+/* xxx is the module ID
+#define VO_ERR_FAILED 0x8xxx0001
+#define VO_ERR_OUTOF_MEMORY 0x8xxx0002
+#define VO_ERR_NOT_IMPLEMENT 0x8xxx0003
+#define VO_ERR_INVALID_ARG 0x8xxx0004
+#define VO_ERR_INPUT_BUFFER_SMALL 0x8xxx0005
+#define VO_ERR_OUTPUT_BUFFER_SMALL 0x8xxx0006
+#define VO_ERR_WRONG_STATUS 0x8xxx0007
+#define VO_ERR_WRONG_PARAM_ID 0x8xxx0008
+#define VO_ERR_LICENSE_ERROR 0x8xxx0009
+// Module own error ID
+#define VO_ERR_Module 0x8xxx0X00
+*/
+
+#define VO_PID_COMMON_BASE 0x40000000 /*!< The base of common param ID */
+#define VO_PID_COMMON_QUERYMEM (VO_PID_COMMON_BASE | 0X0001) /*!< Query the memory needed; Reserved. */
+#define VO_PID_COMMON_INPUTTYPE (VO_PID_COMMON_BASE | 0X0002) /*!< Set or get the input buffer type. VO_INPUT_TYPE */
+#define VO_PID_COMMON_HASRESOURCE (VO_PID_COMMON_BASE | 0X0003) /*!< Query it has resource to be used. VO_U32 *, 1 have, 0 No */
+#define VO_PID_COMMON_HEADDATA (VO_PID_COMMON_BASE | 0X0004) /*!< Decoder track header data. VO_CODECBUFFER * */
+#define VO_PID_COMMON_FLUSH (VO_PID_COMMON_BASE | 0X0005) /*!< Flush the codec buffer. VO_U32 *, 1 Flush, 0 No * */
+
+/*
+// Module Param ID
+#define VO_ID_Mdoule 0x0xxx1000
+*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voIndex_H__
diff --git a/media/libstagefright/codecs/common/include/voMem.h b/media/libstagefright/codecs/common/include/voMem.h
new file mode 100644
index 0000000..8dfb634
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voMem.h
@@ -0,0 +1,65 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voMem.h
+
+ Content: memory functions & data structures
+
+*******************************************************************************/
+
+#ifndef __voMem_H__
+#define __voMem_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voIndex.h"
+
+typedef struct
+{
+ VO_S32 Size; /*!< Buffer stride */
+ VO_S32 Flag;
+ VO_PTR VBuffer; /*!< user data pointer */
+ VO_PTR PBuffer; /*!< user data pointer */
+}
+VO_MEM_INFO;
+
+typedef struct VO_MEM_OPERATOR
+{
+ VO_U32 (VO_API * Alloc) (VO_S32 uID, VO_MEM_INFO * pMemInfo);
+ VO_U32 (VO_API * Free) (VO_S32 uID, VO_PTR pBuff);
+ VO_U32 (VO_API * Set) (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize);
+ VO_U32 (VO_API * Copy) (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+ VO_U32 (VO_API * Check) (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize);
+ VO_S32 (VO_API * Compare) (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize);
+ VO_U32 (VO_API * Move) (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+} VO_MEM_OPERATOR;
+
+#define voMemAlloc(pBuff, pMemOP, ID, nSize) \
+{ \
+ VO_MEM_INFO voMemInfo; \
+ voMemInfo.Size=nSize; \
+ pMemOP->Alloc(ID, &voMemInfo); \
+ pBuff=(VO_PBYTE)voMemInfo.VBuffer; \
+}
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voMem_H__
diff --git a/media/libstagefright/codecs/common/include/voType.h b/media/libstagefright/codecs/common/include/voType.h
new file mode 100644
index 0000000..2669134
--- /dev/null
+++ b/media/libstagefright/codecs/common/include/voType.h
@@ -0,0 +1,221 @@
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+ File: voType.h
+
+ Content: data type definition
+
+*******************************************************************************/
+#ifndef __voType_H__
+#define __voType_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef _WIN32
+# define VO_API __cdecl
+# define VO_CBI __stdcall
+#else
+# define VO_API
+# define VO_CBI
+#endif //_WIN32
+
+/** VO_IN is used to identify inputs to an VO function. This designation
+ will also be used in the case of a pointer that points to a parameter
+ that is used as an output. */
+#ifndef VO_IN
+#define VO_IN
+#endif
+
+/** VO_OUT is used to identify outputs from an VO function. This
+ designation will also be used in the case of a pointer that points
+ to a parameter that is used as an input. */
+#ifndef VO_OUT
+#define VO_OUT
+#endif
+
+/** VO_INOUT is used to identify parameters that may be either inputs or
+ outputs from an VO function at the same time. This designation will
+ also be used in the case of a pointer that points to a parameter that
+ is used both as an input and an output. */
+#ifndef VO_INOUT
+#define VO_INOUT
+#endif
+
+#define VO_MAX_ENUM_VALUE 0X7FFFFFFF
+
+/** VO_VOID */
+typedef void VO_VOID;
+
+/** VO_U8 is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char VO_U8;
+
+/** VO_BYTE is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char VO_BYTE;
+
+/** VO_S8 is an 8 bit signed quantity that is byte aligned */
+typedef signed char VO_S8;
+
+/** VO_CHAR is an 8 bit signed quantity that is byte aligned */
+typedef char VO_CHAR;
+
+/** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */
+typedef unsigned short VO_U16;
+
+/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */
+#if defined _WIN32
+typedef unsigned short VO_WCHAR;
+typedef unsigned short* VO_PWCHAR;
+#elif defined LINUX
+typedef unsigned char VO_WCHAR;
+typedef unsigned char* VO_PWCHAR;
+#endif
+
+/** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */
+typedef signed short VO_S16;
+
+/** VO_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
+typedef unsigned long VO_U32;
+
+/** VO_S32 is a 32 bit signed quantity that is 32 bit word aligned */
+typedef signed long VO_S32;
+
+/* Users with compilers that cannot accept the "long long" designation should
+ define the VO_SKIP64BIT macro. It should be noted that this may cause
+ some components to fail to compile if the component was written to require
+ 64 bit integral types. However, these components would NOT compile anyway
+ since the compiler does not support the way the component was written.
+*/
+#ifndef VO_SKIP64BIT
+#ifdef _WIN32
+/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned __int64 VO_U64;
+/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed __int64 VO_S64;
+#else // WIN32
+/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long VO_U64;
+/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long VO_S64;
+#endif // WIN32
+#endif // VO_SKIP64BIT
+
+/** The VO_BOOL type is intended to be used to represent a true or a false
+ value when passing parameters to and from the VO core and components. The
+ VO_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.
+ */
+typedef enum VO_BOOL {
+ VO_FALSE = 0,
+ VO_TRUE = !VO_FALSE,
+ VO_BOOL_MAX = VO_MAX_ENUM_VALUE
+} VO_BOOL;
+
+/** The VO_PTR type is intended to be used to pass pointers between the VO
+ applications and the VO Core and components. This is a 32 bit pointer and
+ is aligned on a 32 bit boundary.
+ */
+typedef void* VO_PTR;
+
+/** The VO_HANDLE type is intended to be used to pass pointers between the VO
+ applications and the VO Core and components. This is a 32 bit pointer and
+ is aligned on a 32 bit boundary.
+ */
+typedef void* VO_HANDLE;
+
+/** The VO_STRING type is intended to be used to pass "C" type strings between
+ the application and the core and component. The VO_STRING type is a 32
+ bit pointer to a zero terminated string. The pointer is word aligned and
+ the string is byte aligned.
+ */
+typedef char* VO_PCHAR;
+
+/** The VO_PBYTE type is intended to be used to pass arrays of bytes such as
+ buffers between the application and the component and core. The VO_PBYTE
+ type is a 32 bit pointer to a zero terminated string. The pointer is word
+ aligned and the string is byte aligned.
+ */
+typedef unsigned char* VO_PBYTE;
+
+/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as
+ unicode char between the application and the component and core. The VO_PTCHAR
+ type is a 32 bit pointer to a zero terminated string. The pointer is word
+ aligned and the string is byte aligned.
+ */
+/*
+#if !defined LINUX
+typedef unsigned short* VO_PTCHAR;
+typedef unsigned short* VO_TCHAR;
+#else
+typedef char* VO_PTCHAR;
+typedef char VO_TCHAR;
+#endif
+*/
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif
+
+/**
+ * Input stream format, Frame or Stream..
+ */
+typedef enum {
+ VO_INPUT_FRAME = 1, /*!< Input contains completely frame(s) data. */
+ VO_INPUT_STREAM, /*!< Input is stream data. */
+ VO_INPUT_STREAM_MAX = VO_MAX_ENUM_VALUE
+} VO_INPUT_TYPE;
+
+
+/**
+ * General data buffer, used as input or output.
+ */
+typedef struct {
+ VO_PBYTE Buffer; /*!< Buffer pointer */
+ VO_U32 Length; /*!< Buffer size in byte */
+ VO_S64 Time; /*!< The time of the buffer */
+} VO_CODECBUFFER;
+
+
+/**
+ * The init memdata flag.
+ */
+typedef enum{
+ VO_IMF_USERMEMOPERATOR =0, /*!< memData is the pointer of memoperator function*/
+ VO_IMF_PREALLOCATEDBUFFER =1, /*!< memData is preallocated memory*/
+ VO_IMF_MAX = VO_MAX_ENUM_VALUE
+}VO_INIT_MEM_FlAG;
+
+
+/**
+ * The init memory structure..
+ */
+typedef struct{
+ VO_INIT_MEM_FlAG memflag; /*!<memory flag */
+ VO_PTR memData; /*!<a pointer to VO_MEM_OPERATOR or a preallocated buffer */
+ VO_U32 reserved1; /*!<reserved */
+ VO_U32 reserved2; /*!<reserved */
+}VO_CODEC_INIT_USERDATA;
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voType_H__
diff --git a/media/libstagefright/include/AACEncoder.h b/media/libstagefright/include/AACEncoder.h
new file mode 100644
index 0000000..211a332
--- /dev/null
+++ b/media/libstagefright/include/AACEncoder.h
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+#ifndef AAC_ENCODER_H
+#define AAC_ENCODER_H
+
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
+
+struct VO_AUDIO_CODECAPI;
+struct VO_MEM_OPERATOR;
+
+namespace android {
+
+struct MediaBufferGroup;
+
+class AACEncoder: public MediaSource {
+ public:
+ AACEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta);
+
+ virtual status_t start(MetaData *params);
+ virtual status_t stop();
+ virtual sp<MetaData> getFormat();
+ virtual status_t read(
+ MediaBuffer **buffer, const ReadOptions *options);
+
+
+ protected:
+ virtual ~AACEncoder();
+
+ private:
+ sp<MediaSource> mSource;
+ sp<MetaData> mMeta;
+ bool mStarted;
+ MediaBufferGroup *mBufferGroup;
+ MediaBuffer *mInputBuffer;
+ status_t mInitCheck;
+ int32_t mSampleRate;
+ int32_t mChannels;
+ int32_t mBitRate;
+ int32_t mFrameCount;
+ uint8_t mAudioSpecificConfigData[2]; // auido specific data
+ void *mEncoderHandle;
+ VO_AUDIO_CODECAPI *mApiHandle;
+ VO_MEM_OPERATOR *mMemOperator;
+
+ status_t setAudioSpecificConfigData();
+ status_t initCheck();
+
+ AACEncoder& operator=(const AACEncoder &rhs);
+ AACEncoder(const AACEncoder& copy);
+
+};
+
+}
+
+#endif //#ifndef AAC_ENCODER_H
+
diff --git a/media/libstagefright/include/AMRNBEncoder.h b/media/libstagefright/include/AMRNBEncoder.h
index 7167c00..71160e6 100644
--- a/media/libstagefright/include/AMRNBEncoder.h
+++ b/media/libstagefright/include/AMRNBEncoder.h
@@ -19,13 +19,14 @@
#define AMR_NB_ENCODER_H_
#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
namespace android {
struct MediaBufferGroup;
struct AMRNBEncoder : public MediaSource {
- AMRNBEncoder(const sp<MediaSource> &source);
+ AMRNBEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta);
virtual status_t start(MetaData *params);
virtual status_t stop();
@@ -40,6 +41,7 @@
private:
sp<MediaSource> mSource;
+ sp<MetaData> mMeta;
bool mStarted;
MediaBufferGroup *mBufferGroup;
diff --git a/media/libstagefright/include/AMRWBEncoder.h b/media/libstagefright/include/AMRWBEncoder.h
new file mode 100644
index 0000000..f2d155f
--- /dev/null
+++ b/media/libstagefright/include/AMRWBEncoder.h
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+#ifndef AMR_WB_ENCODER_H
+#define AMR_WB_ENCODER_H
+
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
+
+struct VO_AUDIO_CODECAPI;
+struct VO_MEM_OPERATOR;
+
+namespace android {
+
+struct MediaBufferGroup;
+
+class AMRWBEncoder: public MediaSource {
+ public:
+ AMRWBEncoder(const sp<MediaSource> &source, const sp<MetaData> &meta);
+
+ virtual status_t start(MetaData *params);
+ virtual status_t stop();
+ virtual sp<MetaData> getFormat();
+ virtual status_t read(
+ MediaBuffer **buffer, const ReadOptions *options);
+
+
+ protected:
+ virtual ~AMRWBEncoder();
+
+ private:
+ sp<MediaSource> mSource;
+ sp<MetaData> mMeta;
+ bool mStarted;
+ MediaBufferGroup *mBufferGroup;
+ MediaBuffer *mInputBuffer;
+ status_t mInitCheck;
+ int32_t mBitRate;
+ void *mEncoderHandle;
+ VO_AUDIO_CODECAPI *mApiHandle;
+ VO_MEM_OPERATOR *mMemOperator;
+
+ int64_t mAnchorTimeUs;
+ int64_t mNumFramesOutput;
+
+ int16_t mInputFrame[320];
+ int32_t mNumInputSamples;
+
+ status_t initCheck();
+
+ AMRWBEncoder& operator=(const AMRWBEncoder &rhs);
+ AMRWBEncoder(const AMRWBEncoder& copy);
+
+};
+
+}
+
+#endif //#ifndef AMR_WB_ENCODER_H
+
diff --git a/media/mtp/Android.mk b/media/mtp/Android.mk
index 4d86064..d9c69a4 100644
--- a/media/mtp/Android.mk
+++ b/media/mtp/Android.mk
@@ -24,6 +24,7 @@
MtpDatabase.cpp \
MtpDataPacket.cpp \
MtpDebug.cpp \
+ MtpMediaScanner.cpp \
MtpPacket.cpp \
MtpRequestPacket.cpp \
MtpResponsePacket.cpp \
@@ -40,7 +41,7 @@
LOCAL_CFLAGS := -DMTP_DEVICE
-LOCAL_SHARED_LIBRARIES := libutils libsqlite
+LOCAL_SHARED_LIBRARIES := libutils libsqlite libstagefright
include $(BUILD_EXECUTABLE)
@@ -56,13 +57,19 @@
MtpClient.cpp \
MtpDataPacket.cpp \
MtpDebug.cpp \
+ MtpDeviceInfo.cpp \
+ MtpObjectInfo.cpp \
MtpPacket.cpp \
MtpRequestPacket.cpp \
MtpResponsePacket.cpp \
+ MtpStorageInfo.cpp \
MtpStringBuffer.cpp \
+ MtpUtils.cpp \
+ ../../libs/utils/VectorImpl.cpp \
+ ../../libs/utils/SharedBuffer.cpp \
-LOCAL_STATIC_LIBRARIES := libusbhost
+LOCAL_STATIC_LIBRARIES := libusbhost libcutils
LOCAL_LDLIBS := -lpthread
LOCAL_CFLAGS := -g -DMTP_HOST
@@ -70,4 +77,31 @@
include $(BUILD_HOST_EXECUTABLE)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := scantest
+LOCAL_SRC_FILES:= \
+ scantest.cpp \
+ MtpMediaScanner.cpp \
+ MtpDatabase.cpp \
+ MtpDataPacket.cpp \
+ MtpPacket.cpp \
+ MtpStringBuffer.cpp \
+ MtpUtils.cpp \
+ SqliteDatabase.cpp \
+ SqliteStatement.cpp \
+
+
+#LOCAL_STATIC_LIBRARIES := libusbhost
+#LOCAL_LDLIBS := -lpthread
+
+LOCAL_C_INCLUDES := external/sqlite/dist
+LOCAL_SHARED_LIBRARIES := libutils libsqlite libstagefright
+
+
+LOCAL_CFLAGS := -g
+LOCAL_LDFLAGS := -g
+
+include $(BUILD_EXECUTABLE)
+
endif
\ No newline at end of file
diff --git a/media/mtp/MtpClient.cpp b/media/mtp/MtpClient.cpp
index 5e4adb4..de3c199 100644
--- a/media/mtp/MtpClient.cpp
+++ b/media/mtp/MtpClient.cpp
@@ -26,8 +26,13 @@
#include "MtpClient.h"
#include "MtpDebug.h"
+#include "MtpDeviceInfo.h"
+#include "MtpObjectInfo.h"
+#include "MtpStorageInfo.h"
#include "MtpStringBuffer.h"
+namespace android {
+
MtpClient::MtpClient(struct usb_endpoint *ep_in, struct usb_endpoint *ep_out,
struct usb_endpoint *ep_intr)
: mEndpointIn(ep_in),
@@ -42,7 +47,6 @@
MtpClient::~MtpClient() {
}
-
bool MtpClient::openSession() {
printf("openSession\n");
mSessionID = 0;
@@ -63,30 +67,90 @@
return true;
}
-bool MtpClient::getDeviceInfo() {
- mRequest.reset();
- if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO))
- return false;
- if (!readData())
- return false;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpStringBuffer string;
-
- // fill in device info
- printf("MTP standard version: %d\n", mData.getUInt16());
- printf("MTP Vendor Extension ID: %d\n", mData.getUInt32());
- printf("MTP vendor extension version: %d\n", mData.getUInt16());
- mData.getString(string);
- printf("vendor extension desc %s\n", (const char *)string);
-
- return true;
- }
- return false;
+bool MtpClient::closeSession() {
+ // FIXME
+ return true;
}
-bool MtpClient::closeSession() {
- return true;
+MtpDeviceInfo* MtpClient::getDeviceInfo() {
+ mRequest.reset();
+ if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO))
+ return NULL;
+ if (!readData())
+ return NULL;
+ MtpResponseCode ret = readResponse();
+printf("getDeviceInfo returned %04X\n", ret);
+ if (ret == MTP_RESPONSE_OK) {
+ MtpDeviceInfo* info = new MtpDeviceInfo;
+ info->read(mData);
+ return info;
+ }
+ return NULL;
+}
+
+MtpStorageIDList* MtpClient::getStorageIDs() {
+ mRequest.reset();
+ if (!sendRequest(MTP_OPERATION_GET_STORAGE_IDS))
+ return NULL;
+ if (!readData())
+ return NULL;
+ MtpResponseCode ret = readResponse();
+ if (ret == MTP_RESPONSE_OK) {
+ return mData.getAUInt32();
+ }
+ return NULL;
+}
+
+MtpStorageInfo* MtpClient::getStorageInfo(MtpStorageID storageID) {
+ mRequest.reset();
+ mRequest.setParameter(1, storageID);
+ if (!sendRequest(MTP_OPERATION_GET_STORAGE_INFO))
+ return NULL;
+ if (!readData())
+ return NULL;
+ MtpResponseCode ret = readResponse();
+printf("getStorageInfo returned %04X\n", ret);
+ if (ret == MTP_RESPONSE_OK) {
+ MtpStorageInfo* info = new MtpStorageInfo(storageID);
+ info->read(mData);
+ return info;
+ }
+ return NULL;
+}
+
+MtpObjectHandleList* MtpClient::getObjectHandles(MtpStorageID storageID,
+ MtpObjectFormat format, MtpObjectHandle parent) {
+ mRequest.reset();
+ mRequest.setParameter(1, storageID);
+ mRequest.setParameter(2, format);
+ mRequest.setParameter(3, parent);
+ if (!sendRequest(MTP_OPERATION_GET_OBJECT_HANDLES))
+ return NULL;
+ if (!readData())
+ return NULL;
+ MtpResponseCode ret = readResponse();
+printf("getObjectHandles returned %04X\n", ret);
+ if (ret == MTP_RESPONSE_OK) {
+ return mData.getAUInt32();
+ }
+ return NULL;
+}
+
+MtpObjectInfo* MtpClient::getObjectInfo(MtpObjectHandle handle) {
+ mRequest.reset();
+ mRequest.setParameter(1, handle);
+ if (!sendRequest(MTP_OPERATION_GET_OBJECT_INFO))
+ return NULL;
+ if (!readData())
+ return NULL;
+ MtpResponseCode ret = readResponse();
+printf("getObjectInfo returned %04X\n", ret);
+ if (ret == MTP_RESPONSE_OK) {
+ MtpObjectInfo* info = new MtpObjectInfo(handle);
+ info->read(mData);
+ return info;
+ }
+ return NULL;
}
bool MtpClient::sendRequest(MtpOperationCode operation) {
@@ -109,7 +173,8 @@
}
bool MtpClient::readData() {
- int ret = mData.read(mEndpointIn);
+ mData.reset();
+ int ret = mData.read(mEndpointIn);
printf("readData returned %d\n", ret);
if (ret >= MTP_CONTAINER_HEADER_SIZE) {
mData.dump();
@@ -134,3 +199,4 @@
}
}
+} // namespace android
diff --git a/media/mtp/MtpClient.h b/media/mtp/MtpClient.h
index fbbd388..76d9648 100644
--- a/media/mtp/MtpClient.h
+++ b/media/mtp/MtpClient.h
@@ -20,40 +20,51 @@
#include "MtpRequestPacket.h"
#include "MtpDataPacket.h"
#include "MtpResponsePacket.h"
-#include "mtp.h"
+#include "MtpTypes.h"
-#include "MtpUtils.h"
+namespace android {
+
+class MtpDeviceInfo;
+class MtpObjectInfo;
+class MtpStorageInfo;
class MtpClient {
private:
- struct usb_endpoint *mEndpointIn;
- struct usb_endpoint *mEndpointOut;
- struct usb_endpoint *mEndpointIntr;
+ struct usb_endpoint* mEndpointIn;
+ struct usb_endpoint* mEndpointOut;
+ struct usb_endpoint* mEndpointIntr;
// current session ID
- MtpSessionID mSessionID;
+ MtpSessionID mSessionID;
// current transaction ID
- MtpTransactionID mTransactionID;
+ MtpTransactionID mTransactionID;
- MtpRequestPacket mRequest;
- MtpDataPacket mData;
- MtpResponsePacket mResponse;
+ MtpRequestPacket mRequest;
+ MtpDataPacket mData;
+ MtpResponsePacket mResponse;
public:
- MtpClient(struct usb_endpoint *ep_in, struct usb_endpoint *ep_out,
+ MtpClient(struct usb_endpoint *ep_in, struct usb_endpoint *ep_out,
struct usb_endpoint *ep_intr);
- virtual ~MtpClient();
+ virtual ~MtpClient();
- bool openSession();
- bool getDeviceInfo();
- bool closeSession();
+ bool openSession();
+ bool closeSession();
+
+ MtpDeviceInfo* getDeviceInfo();
+ MtpStorageIDList* getStorageIDs();
+ MtpStorageInfo* getStorageInfo(MtpStorageID storageID);
+ MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent);
+ MtpObjectInfo* getObjectInfo(MtpObjectHandle handle);
private:
- bool sendRequest(MtpOperationCode operation);
- bool sendData(MtpOperationCode operation);
- bool readData();
- MtpResponseCode readResponse();
+ bool sendRequest(MtpOperationCode operation);
+ bool sendData(MtpOperationCode operation);
+ bool readData();
+ MtpResponseCode readResponse();
};
+}; // namespace android
+
#endif // _MTP_CLIENT_H
diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp
index 8e7ea6e..fa086c5 100644
--- a/media/mtp/MtpDataPacket.cpp
+++ b/media/mtp/MtpDataPacket.cpp
@@ -21,6 +21,8 @@
#include "MtpDataPacket.h"
#include "MtpStringBuffer.h"
+namespace android {
+
MtpDataPacket::MtpDataPacket()
: MtpPacket(512),
mOffset(MTP_CONTAINER_HEADER_SIZE)
@@ -73,6 +75,70 @@
string.readFromPacket(this);
}
+Int8List* MtpDataPacket::getAInt8() {
+ Int8List* result = new Int8List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getInt8());
+ return result;
+}
+
+UInt8List* MtpDataPacket::getAUInt8() {
+ UInt8List* result = new UInt8List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getUInt8());
+ return result;
+}
+
+Int16List* MtpDataPacket::getAInt16() {
+ Int16List* result = new Int16List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getInt16());
+ return result;
+}
+
+UInt16List* MtpDataPacket::getAUInt16() {
+ UInt16List* result = new UInt16List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getUInt16());
+ return result;
+}
+
+Int32List* MtpDataPacket::getAInt32() {
+ Int32List* result = new Int32List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getInt32());
+ return result;
+}
+
+UInt32List* MtpDataPacket::getAUInt32() {
+ UInt32List* result = new UInt32List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getUInt32());
+ return result;
+}
+
+Int64List* MtpDataPacket::getAInt64() {
+ Int64List* result = new Int64List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getInt64());
+ return result;
+}
+
+UInt64List* MtpDataPacket::getAUInt64() {
+ UInt64List* result = new UInt64List;
+ int count = getUInt32();
+ for (int i = 0; i < count; i++)
+ result->push(getUInt64());
+ return result;
+}
+
void MtpDataPacket::putInt8(int8_t value) {
allocate(mOffset + 1);
mBuffer[mOffset++] = (uint8_t)value;
@@ -294,3 +360,5 @@
}
#endif // MTP_HOST
+
+} // namespace android
diff --git a/media/mtp/MtpDataPacket.h b/media/mtp/MtpDataPacket.h
index 3b18e4e..03f2b4b 100644
--- a/media/mtp/MtpDataPacket.h
+++ b/media/mtp/MtpDataPacket.h
@@ -20,6 +20,8 @@
#include "MtpPacket.h"
#include "mtp.h"
+namespace android {
+
class MtpDataPacket : public MtpPacket {
private:
// current offset for get/put methods
@@ -44,6 +46,15 @@
inline int64_t getInt64() { return (int64_t)getUInt64(); }
void getString(MtpStringBuffer& string);
+ Int8List* getAInt8();
+ UInt8List* getAUInt8();
+ Int16List* getAInt16();
+ UInt16List* getAUInt16();
+ Int32List* getAInt32();
+ UInt32List* getAUInt32();
+ Int64List* getAInt64();
+ UInt64List* getAUInt64();
+
void putInt8(int8_t value);
void putUInt8(uint8_t value);
void putInt16(int16_t value);
@@ -86,4 +97,6 @@
inline bool hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; }
};
+}; // namespace android
+
#endif // _MTP_DATA_PACKET_H
diff --git a/media/mtp/MtpDatabase.cpp b/media/mtp/MtpDatabase.cpp
index bb44ab6..775a070 100644
--- a/media/mtp/MtpDatabase.cpp
+++ b/media/mtp/MtpDatabase.cpp
@@ -16,41 +16,79 @@
#include "MtpDatabase.h"
#include "MtpDataPacket.h"
+#include "MtpUtils.h"
#include "SqliteDatabase.h"
#include "SqliteStatement.h"
#include <stdio.h>
+#include <stdlib.h>
#include <sqlite3.h>
-#define ID_COLUMN 1
-#define PATH_COLUMN 2
-#define FORMAT_COLUMN 3
-#define PARENT_COLUMN 4
-#define STORAGE_COLUMN 5
-#define SIZE_COLUMN 6
-#define CREATED_COLUMN 7
-#define MODIFIED_COLUMN 8
+namespace android {
-#define TABLE_CREATE "CREATE TABLE IF NOT EXISTS files (" \
+#define FILE_ID_COLUMN 1
+#define FILE_PATH_COLUMN 2
+#define FILE_FORMAT_COLUMN 3
+#define FILE_PARENT_COLUMN 4
+#define FILE_STORAGE_COLUMN 5
+#define FILE_SIZE_COLUMN 6
+#define FILE_MODIFIED_COLUMN 7
+
+#define AUDIO_ID_COLUMN 1
+#define AUDIO_TITLE_COLUMN 2
+#define AUDIO_ARTIST_COLUMN 3
+#define AUDIO_ALBUM_COLUMN 4
+#define AUDIO_ALBUM_ARTIST_COLUMN 5
+#define AUDIO_GENRE_COLUMN 6
+#define AUDIO_COMPOSER_COLUMN 7
+#define AUDIO_TRACK_NUMBER_COLUMN 8
+#define AUDIO_YEAR_COLUMN 9
+#define AUDIO_DURATION_COLUMN 10
+#define AUDIO_USE_COUNT_COLUMN 11
+#define AUDIO_SAMPLE_RATE_COLUMN 12
+#define AUDIO_NUM_CHANNELS_COLUMN 13
+#define AUDIO_AUDIO_WAVE_CODEC_COLUMN 14
+#define AUDIO_AUDIO_BIT_RATE_COLUMN 15
+
+#define FILE_TABLE_CREATE "CREATE TABLE IF NOT EXISTS files (" \
"_id INTEGER PRIMARY KEY," \
"path TEXT," \
"format INTEGER," \
"parent INTEGER," \
"storage INTEGER," \
"size INTEGER," \
- "date_created INTEGER," \
- "date_modified INTEGER" \
+ "date_modified INTEGER" \
+ ");"
+
+#define AUDIO_TABLE_CREATE "CREATE TABLE IF NOT EXISTS audio (" \
+ "id INTEGER PRIMARY KEY," \
+ "title TEXT," \
+ "artist TEXT," \
+ "album TEXT," \
+ "album_artist TEXT," \
+ "genre TEXT," \
+ "composer TEXT," \
+ "track_number INTEGER," \
+ "year INTEGER," \
+ "duration INTEGER," \
+ "use_count INTEGER," \
+ "sample_rate INTEGER," \
+ "num_channels INTEGER," \
+ "audio_wave_codec TEXT," \
+ "audio_bit_rate INTEGER" \
");"
#define PATH_INDEX_CREATE "CREATE INDEX IF NOT EXISTS path_index on files(path);"
-#define FILE_ID_QUERY "SELECT _id FROM files WHERE path = ?;"
+#define FILE_ID_QUERY "SELECT _id,format FROM files WHERE path = ?;"
#define FILE_PATH_QUERY "SELECT path,size FROM files WHERE _id = ?"
-#define GET_OBJECT_INFO_QUERY "SELECT storage,format,parent,path,size,date_created,date_modified FROM files WHERE _id = ?;"
-#define FILE_INSERT "INSERT INTO files VALUES(?,?,?,?,?,?,?,?);"
-#define FILE_DELETE "DELETE FROM files WHERE path = ?;"
+#define GET_OBJECT_INFO_QUERY "SELECT storage,format,parent,path,size,date_modified FROM files WHERE _id = ?;"
+#define FILE_INSERT "INSERT INTO files VALUES(?,?,?,?,?,?,?);"
+#define FILE_DELETE "DELETE FROM files WHERE _id = ?;"
+#define AUDIO_INSERT "INSERT INTO audio VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"
+#define AUDIO_DELETE "DELETE FROM audio WHERE id = ?;"
struct PropertyTableEntry {
MtpObjectProperty property;
@@ -64,7 +102,6 @@
{ MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT32, "format" },
{ MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR, "path" },
{ MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64, "size" },
- { MTP_PROPERTY_DATE_CREATED, MTP_TYPE_STR, "date_created" },
{ MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR, "date_modified" },
};
@@ -82,11 +119,14 @@
}
+
MtpDatabase::MtpDatabase()
: mFileIdQuery(NULL),
mObjectInfoQuery(NULL),
mFileInserter(NULL),
- mFileDeleter(NULL)
+ mFileDeleter(NULL),
+ mAudioInserter(NULL),
+ mAudioDeleter(NULL)
{
}
@@ -97,66 +137,195 @@
if (!SqliteDatabase::open(path, create))
return false;
- // create the table if necessary
- if (!exec(TABLE_CREATE)) {
- fprintf(stderr, "could not create table\n");
+ // create tables and indices if necessary
+ if (!exec(FILE_TABLE_CREATE)) {
+ fprintf(stderr, "could not create file table\n");
return false;
}
if (!exec(PATH_INDEX_CREATE)) {
- fprintf(stderr, "could not path index\n");
+ fprintf(stderr, "could not path index on file table\n");
return false;
}
+ if (!exec(AUDIO_TABLE_CREATE)) {
+ fprintf(stderr, "could not create file table\n");
+ return false;
+ }
+
+ if (!mFileIdQuery) {
+ mFileIdQuery = new SqliteStatement(this);
+ if (!mFileIdQuery->prepare(FILE_ID_QUERY)) {
+ fprintf(stderr, "could not compile FILE_ID_QUERY\n");
+ exit(-1);
+ }
+ }
+ if (!mFilePathQuery) {
+ mFilePathQuery = new SqliteStatement(this);
+ if (!mFilePathQuery->prepare(FILE_PATH_QUERY)) {
+ fprintf(stderr, "could not compile FILE_PATH_QUERY\n");
+ exit(-1);
+ }
+ }
+ if (!mObjectInfoQuery) {
+ mObjectInfoQuery = new SqliteStatement(this);
+ if (!mObjectInfoQuery->prepare(GET_OBJECT_INFO_QUERY)) {
+ fprintf(stderr, "could not compile GET_OBJECT_INFO_QUERY\n");
+ exit(-1);
+ }
+ }
+ if (!mFileInserter) {
+ mFileInserter = new SqliteStatement(this);
+ if (!mFileInserter->prepare(FILE_INSERT)) {
+ fprintf(stderr, "could not compile FILE_INSERT\n");
+ exit(-1);
+ }
+ }
+ if (!mFileDeleter) {
+ mFileDeleter = new SqliteStatement(this);
+ if (!mFileDeleter->prepare(FILE_DELETE)) {
+ fprintf(stderr, "could not compile FILE_DELETE\n");
+ exit(-1);
+ }
+ }
+ if (!mAudioInserter) {
+ mAudioInserter = new SqliteStatement(this);
+ if (!mAudioInserter->prepare(AUDIO_INSERT)) {
+ fprintf(stderr, "could not compile AUDIO_INSERT\n");
+ exit(-1);
+ }
+ }
+ if (!mAudioDeleter) {
+ mAudioDeleter = new SqliteStatement(this);
+ if (!mAudioDeleter->prepare(AUDIO_DELETE)) {
+ fprintf(stderr, "could not compile AUDIO_DELETE\n");
+ exit(-1);
+ }
+ }
+
return true;
}
+uint32_t MtpDatabase::getTableForFile(MtpObjectFormat format) {
+ switch (format) {
+ case MTP_FORMAT_AIFF:
+ case MTP_FORMAT_WAV:
+ case MTP_FORMAT_MP3:
+ case MTP_FORMAT_FLAC:
+ case MTP_FORMAT_UNDEFINED_AUDIO:
+ case MTP_FORMAT_WMA:
+ case MTP_FORMAT_OGG:
+ case MTP_FORMAT_AAC:
+ case MTP_FORMAT_AUDIBLE:
+ return kObjectHandleTableAudio;
+ case MTP_FORMAT_AVI:
+ case MTP_FORMAT_MPEG:
+ case MTP_FORMAT_ASF:
+ case MTP_FORMAT_UNDEFINED_VIDEO:
+ case MTP_FORMAT_WMV:
+ case MTP_FORMAT_MP4_CONTAINER:
+ case MTP_FORMAT_MP2:
+ case MTP_FORMAT_3GP_CONTAINER:
+ return kObjectHandleTableVideo;
+ case MTP_FORMAT_DEFINED:
+ case MTP_FORMAT_EXIF_JPEG:
+ case MTP_FORMAT_TIFF_EP:
+ case MTP_FORMAT_FLASHPIX:
+ case MTP_FORMAT_BMP:
+ case MTP_FORMAT_CIFF:
+ case MTP_FORMAT_GIF:
+ case MTP_FORMAT_JFIF:
+ case MTP_FORMAT_CD:
+ case MTP_FORMAT_PICT:
+ case MTP_FORMAT_PNG:
+ case MTP_FORMAT_TIFF:
+ case MTP_FORMAT_TIFF_IT:
+ case MTP_FORMAT_JP2:
+ case MTP_FORMAT_JPX:
+ case MTP_FORMAT_WINDOWS_IMAGE_FORMAT:
+ return kObjectHandleTableImage;
+ case MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST:
+ case MTP_FORMAT_ABSTRACT_AV_PLAYLIST:
+ case MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST:
+ case MTP_FORMAT_WPL_PLAYLIST:
+ case MTP_FORMAT_M3U_PLAYLIST:
+ case MTP_FORMAT_MPL_PLAYLIST:
+ case MTP_FORMAT_ASX_PLAYLIST:
+ case MTP_FORMAT_PLS_PLAYLIST:
+ return kObjectHandleTablePlaylist;
+ default:
+ return kObjectHandleTableFile;
+ }
+}
+
+MtpObjectHandle MtpDatabase::getObjectHandle(const char* path) {
+ mFileIdQuery->reset();
+ mFileIdQuery->bind(1, path);
+ if (mFileIdQuery->step()) {
+ int row = mFileIdQuery->getColumnInt(0);
+ if (row > 0) {
+ MtpObjectFormat format = mFileIdQuery->getColumnInt(1);
+ row |= getTableForFile(format);
+ return row;
+ }
+ }
+
+ return 0;
+}
+
MtpObjectHandle MtpDatabase::addFile(const char* path,
MtpObjectFormat format,
MtpObjectHandle parent,
MtpStorageID storage,
uint64_t size,
- time_t created,
time_t modified) {
-
- // first check to see if the file exists
- if (mFileIdQuery)
- mFileIdQuery->reset();
- else {
- mFileIdQuery = new SqliteStatement(this);
- if (!mFileIdQuery->prepare(FILE_ID_QUERY)) {
- fprintf(stderr, "could not compile FILE_ID_QUERY\n");
- delete mFileIdQuery;
- mFileIdQuery = NULL;
- return kInvalidObjectHandle;
- }
- }
-
- mFileIdQuery->bind(1, path);
- if (mFileIdQuery->step()) {
- int row = mFileIdQuery->getColumnInt(0);
- if (row > 0)
- return row;
- }
-
- if (!mFileInserter) {
- mFileInserter = new SqliteStatement(this);
- if (!mFileInserter->prepare(FILE_INSERT)) {
- fprintf(stderr, "could not compile FILE_INSERT\n");
- delete mFileInserter;
- mFileInserter = NULL;
- return kInvalidObjectHandle;
- }
- }
- mFileInserter->bind(PATH_COLUMN, path);
- mFileInserter->bind(FORMAT_COLUMN, format);
- mFileInserter->bind(PARENT_COLUMN, parent);
- mFileInserter->bind(STORAGE_COLUMN, storage);
- mFileInserter->bind(SIZE_COLUMN, size);
- mFileInserter->bind(CREATED_COLUMN, created);
- mFileInserter->bind(MODIFIED_COLUMN, modified);
+ mFileInserter->bind(FILE_PATH_COLUMN, path);
+ mFileInserter->bind(FILE_FORMAT_COLUMN, format);
+ mFileInserter->bind(FILE_PARENT_COLUMN, parent);
+ mFileInserter->bind(FILE_STORAGE_COLUMN, storage);
+ mFileInserter->bind(FILE_SIZE_COLUMN, size);
+ mFileInserter->bind(FILE_MODIFIED_COLUMN, modified);
mFileInserter->step();
mFileInserter->reset();
- int row = lastInsertedRow();
- return (row > 0 ? row : kInvalidObjectHandle);
+ int result = lastInsertedRow();
+ return (result <= 0 ? kInvalidObjectHandle : result);
+}
+
+MtpObjectHandle MtpDatabase::addAudioFile(MtpObjectHandle handle) {
+ mAudioInserter->bind(AUDIO_ID_COLUMN, handle);
+ mAudioInserter->step();
+ mAudioInserter->reset();
+ int result = lastInsertedRow();
+ handle |= kObjectHandleTableAudio;
+ return (result > 0 ? handle : kInvalidObjectHandle);
+}
+
+MtpObjectHandle MtpDatabase::addAudioFile(MtpObjectHandle handle,
+ const char* title,
+ const char* artist,
+ const char* album,
+ const char* albumArtist,
+ const char* genre,
+ const char* composer,
+ const char* mimeType,
+ int track,
+ int year,
+ int duration) {
+ mAudioInserter->bind(AUDIO_ID_COLUMN, handle);
+ if (title) mAudioInserter->bind(AUDIO_TITLE_COLUMN, title);
+ if (artist) mAudioInserter->bind(AUDIO_ARTIST_COLUMN, artist);
+ if (album) mAudioInserter->bind(AUDIO_ALBUM_COLUMN, album);
+ if (albumArtist) mAudioInserter->bind(AUDIO_ALBUM_ARTIST_COLUMN, albumArtist);
+ if (genre) mAudioInserter->bind(AUDIO_GENRE_COLUMN, genre);
+ if (composer) mAudioInserter->bind(AUDIO_COMPOSER_COLUMN, composer);
+ if (track) mAudioInserter->bind(AUDIO_TRACK_NUMBER_COLUMN, track);
+ if (year) mAudioInserter->bind(AUDIO_YEAR_COLUMN, year);
+ if (duration) mAudioInserter->bind(AUDIO_DURATION_COLUMN, duration);
+ mAudioInserter->step();
+ mAudioInserter->reset();
+ int result = lastInsertedRow();
+ if (result <= 0)
+ return kInvalidObjectHandle;
+ result |= kObjectHandleTableAudio;
+ return result;
}
MtpObjectHandleList* MtpDatabase::getObjectList(MtpStorageID storageID,
@@ -167,7 +336,7 @@
bool whereParent = (parent != 0);
char intBuffer[20];
- MtpString query("SELECT _id FROM files");
+ MtpString query("SELECT _id,format FROM files");
if (whereStorage || whereFormat || whereParent)
query += " WHERE";
if (whereStorage) {
@@ -183,6 +352,8 @@
query += intBuffer;
}
if (whereParent) {
+ if (parent != MTP_PARENT_ROOT)
+ parent &= kObjectHandleIndexMask;
snprintf(intBuffer, sizeof(intBuffer), "%d", parent);
if (whereStorage || whereFormat)
query += " AND";
@@ -200,14 +371,18 @@
if (stmt.step()) {
int index = stmt.getColumnInt(0);
printf("stmt.getColumnInt returned %d\n", index);
- if (index > 0)
+ if (index > 0) {
+ MtpObjectFormat format = stmt.getColumnInt(1);
+ index |= getTableForFile(format);
list->push(index);
+ }
}
}
printf("list size: %d\n", list->size());
return list;
}
+
MtpResponseCode MtpDatabase::getObjectProperty(MtpObjectHandle handle,
MtpObjectProperty property,
MtpDataPacket& packet) {
@@ -215,6 +390,9 @@
const char* columnName;
char intBuffer[20];
+ if (handle != MTP_PARENT_ROOT)
+ handle &= kObjectHandleIndexMask;
+
if (!getPropertyInfo(property, type, columnName))
return MTP_RESPONSE_INVALID_OBJECT_PROP_CODE;
snprintf(intBuffer, sizeof(intBuffer), "%d", handle);
@@ -271,18 +449,10 @@
MtpDataPacket& packet) {
char date[20];
- if (mObjectInfoQuery)
- mObjectInfoQuery->reset();
- else {
- mObjectInfoQuery = new SqliteStatement(this);
- if (!mObjectInfoQuery->prepare(GET_OBJECT_INFO_QUERY)) {
- fprintf(stderr, "could not compile FILE_ID_QUERY\n");
- delete mObjectInfoQuery;
- mObjectInfoQuery = NULL;
- return MTP_RESPONSE_GENERAL_ERROR;
- }
- }
+ if (handle != MTP_PARENT_ROOT)
+ handle &= kObjectHandleIndexMask;
+ mObjectInfoQuery->reset();
mObjectInfoQuery->bind(1, handle);
if (!mObjectInfoQuery->step())
return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
@@ -296,8 +466,7 @@
if (lastSlash)
name = lastSlash + 1;
int64_t size = mObjectInfoQuery->getColumnInt64(4);
- time_t created = mObjectInfoQuery->getColumnInt(5);
- time_t modified = mObjectInfoQuery->getColumnInt(6);
+ time_t modified = mObjectInfoQuery->getColumnInt(5);
int associationType = (format == MTP_FORMAT_ASSOCIATION ?
MTP_ASSOCIATION_TYPE_GENERIC_FOLDER :
MTP_ASSOCIATION_TYPE_UNDEFINED);
@@ -320,8 +489,7 @@
packet.putUInt32(0); // association desc
packet.putUInt32(0); // sequence number
packet.putString(name); // file name
- formatDateTime(created, date, sizeof(date));
- packet.putString(date); // date created
+ packet.putEmptyString();
formatDateTime(modified, date, sizeof(date));
packet.putString(date); // date modified
packet.putEmptyString(); // keywords
@@ -332,18 +500,9 @@
bool MtpDatabase::getObjectFilePath(MtpObjectHandle handle,
MtpString& filePath,
int64_t& fileLength) {
- if (mFilePathQuery)
- mFilePathQuery->reset();
- else {
- mFilePathQuery = new SqliteStatement(this);
- if (!mFilePathQuery->prepare(FILE_PATH_QUERY)) {
- fprintf(stderr, "could not compile FILE_ID_QUERY\n");
- delete mFilePathQuery;
- mFilePathQuery = NULL;
- return kInvalidObjectHandle;
- }
- }
-
+ if (handle != MTP_PARENT_ROOT)
+ handle &= kObjectHandleIndexMask;
+ mFilePathQuery->reset();
mFilePathQuery->bind(1, handle);
if (!mFilePathQuery->step())
return false;
@@ -357,22 +516,52 @@
}
bool MtpDatabase::deleteFile(MtpObjectHandle handle) {
- if (!mFileDeleter) {
- mFileDeleter = new SqliteStatement(this);
- if (!mFileDeleter->prepare(FILE_DELETE)) {
- fprintf(stderr, "could not compile FILE_DELETE\n");
- delete mFileDeleter;
- mFileDeleter = NULL;
- return false;
- }
- }
-printf("deleteFile %d\n", handle);
+ uint32_t table = handle & kObjectHandleTableMask;
+ handle &= kObjectHandleIndexMask;
mFileDeleter->bind(1, handle);
mFileDeleter->step();
mFileDeleter->reset();
+ if (table == kObjectHandleTableAudio) {
+ mAudioDeleter->bind(1, handle);
+ mAudioDeleter->step();
+ mAudioDeleter->reset();
+ }
+
return true;
}
+MtpObjectHandle* MtpDatabase::getFileList(int& outCount) {
+ MtpObjectHandle* result = NULL;
+ int count = 0;
+ SqliteStatement stmt(this);
+ stmt.prepare("SELECT count(*) FROM files;");
+
+ MtpObjectHandleList* list = new MtpObjectHandleList();
+ if (stmt.step())
+ count = stmt.getColumnInt(0);
+
+ if (count > 0) {
+ result = new MtpObjectHandle[count];
+ memset(result, 0, count * sizeof(*result));
+ SqliteStatement stmt2(this);
+ stmt2.prepare("SELECT _id,format FROM files;");
+
+ for (int i = 0; i < count; i++) {
+ if (!stmt2.step()) {
+ printf("getFileList ended early\n");
+ count = i;
+ break;
+ }
+ MtpObjectHandle handle = stmt2.getColumnInt(0);
+ MtpObjectFormat format = stmt2.getColumnInt(1);
+ handle |= getTableForFile(format);
+ result[i] = handle;
+ }
+ }
+ outCount = count;
+ return result;
+}
+
/*
for getObjectPropDesc
@@ -384,3 +573,5 @@
packet.putUInt8(formFlag);
// form, variable
*/
+
+} // namespace android
diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h
index 66f70bd..51d5fb1 100644
--- a/media/mtp/MtpDatabase.h
+++ b/media/mtp/MtpDatabase.h
@@ -17,9 +17,10 @@
#ifndef _MTP_DATABASE_H
#define _MTP_DATABASE_H
-#include "MtpUtils.h"
+#include "MtpTypes.h"
#include "SqliteDatabase.h"
-#include "mtp.h"
+
+namespace android {
class MtpDataPacket;
class SqliteStatement;
@@ -31,20 +32,38 @@
SqliteStatement* mObjectInfoQuery;
SqliteStatement* mFileInserter;
SqliteStatement* mFileDeleter;
+ SqliteStatement* mAudioInserter;
+ SqliteStatement* mAudioDeleter;
public:
MtpDatabase();
virtual ~MtpDatabase();
+ static uint32_t getTableForFile(MtpObjectFormat format);
+
bool open(const char* path, bool create);
+ MtpObjectHandle getObjectHandle(const char* path);
MtpObjectHandle addFile(const char* path,
MtpObjectFormat format,
MtpObjectHandle parent,
MtpStorageID storage,
uint64_t size,
- time_t created,
time_t modified);
+ MtpObjectHandle addAudioFile(MtpObjectHandle id);
+
+ MtpObjectHandle addAudioFile(MtpObjectHandle id,
+ const char* title,
+ const char* artist,
+ const char* album,
+ const char* albumArtist,
+ const char* genre,
+ const char* composer,
+ const char* mimeType,
+ int track,
+ int year,
+ int duration);
+
MtpObjectHandleList* getObjectList(MtpStorageID storageID,
MtpObjectFormat format,
MtpObjectHandle parent);
@@ -60,6 +79,11 @@
MtpString& filePath,
int64_t& fileLength);
bool deleteFile(MtpObjectHandle handle);
+
+ // helper for media scanner
+ MtpObjectHandle* getFileList(int& outCount);
};
+}; // namespace android
+
#endif // _MTP_DATABASE_H
diff --git a/media/mtp/MtpDebug.cpp b/media/mtp/MtpDebug.cpp
index 6d0273d..9ded6e2 100644
--- a/media/mtp/MtpDebug.cpp
+++ b/media/mtp/MtpDebug.cpp
@@ -16,6 +16,7 @@
#include "MtpDebug.h"
+namespace android {
struct OperationCodeEntry {
const char* name;
@@ -71,3 +72,5 @@
}
return "*** UNKNOWN OPERATION ***";
}
+
+} // namespace android
diff --git a/media/mtp/MtpDebug.h b/media/mtp/MtpDebug.h
index bab79e9..3cbc209 100644
--- a/media/mtp/MtpDebug.h
+++ b/media/mtp/MtpDebug.h
@@ -17,11 +17,15 @@
#ifndef _MTP_DEBUG_H
#define _MTP_DEBUG_H
-#include "mtp.h"
+#include "MtpTypes.h"
+
+namespace android {
class MtpDebug {
public:
static const char* getOperationCodeName(MtpOperationCode code);
};
+}; // namespace android
+
#endif // _MTP_DEBUG_H
diff --git a/media/mtp/MtpDeviceInfo.cpp b/media/mtp/MtpDeviceInfo.cpp
new file mode 100644
index 0000000..210dfcc
--- /dev/null
+++ b/media/mtp/MtpDeviceInfo.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#include <stdlib.h>
+
+#include "MtpDataPacket.h"
+#include "MtpDeviceInfo.h"
+#include "MtpStringBuffer.h"
+
+namespace android {
+
+MtpDeviceInfo::MtpDeviceInfo()
+ : mStandardVersion(0),
+ mVendorExtensionID(0),
+ mVendorExtensionVersion(0),
+ mVendorExtensionDesc(NULL),
+ mFunctionalCode(0),
+ mOperations(NULL),
+ mEvents(NULL),
+ mDeviceProperties(NULL),
+ mCaptureFormats(NULL),
+ mPlaybackFormats(NULL),
+ mManufacturer(NULL),
+ mModel(NULL),
+ mVersion(NULL),
+ mSerial(NULL)
+{
+}
+
+MtpDeviceInfo::~MtpDeviceInfo() {
+ if (mVendorExtensionDesc)
+ free(mVendorExtensionDesc);
+ delete mOperations;
+ delete mEvents;
+ delete mDeviceProperties;
+ delete mCaptureFormats;
+ delete mPlaybackFormats;
+ if (mManufacturer)
+ free(mManufacturer);
+ if (mModel)
+ free(mModel);
+ if (mVersion)
+ free(mVersion);
+ if (mSerial)
+ free(mSerial);
+}
+
+void MtpDeviceInfo::read(MtpDataPacket& packet) {
+ MtpStringBuffer string;
+
+ // read the device info
+ mStandardVersion = packet.getUInt16();
+ mVendorExtensionID = packet.getUInt32();
+ mVendorExtensionVersion = packet.getUInt16();
+
+ packet.getString(string);
+ mVendorExtensionDesc = strdup((const char *)string);
+
+ mFunctionalCode = packet.getUInt16();
+ mOperations = packet.getAUInt16();
+ mEvents = packet.getAUInt16();
+ mDeviceProperties = packet.getAUInt16();
+ mCaptureFormats = packet.getAUInt16();
+ mPlaybackFormats = packet.getAUInt16();
+
+ packet.getString(string);
+ mManufacturer = strdup((const char *)string);
+ packet.getString(string);
+ mModel = strdup((const char *)string);
+ packet.getString(string);
+ mVersion = strdup((const char *)string);
+ packet.getString(string);
+ mSerial = strdup((const char *)string);
+}
+
+void MtpDeviceInfo::print() {
+ printf("Device Info:\n\tmStandardVersion: %d\n\tmVendorExtensionID: %d\n\tmVendorExtensionVersiony: %d\n",
+ mStandardVersion, mVendorExtensionID, mVendorExtensionVersion);
+ printf("\tmVendorExtensionDesc: %s\n\tmFunctionalCode: %d\n\tmManufacturer: %s\n\tmModel: %s\n\tmVersion: %s\n\tmSerial: %s\n",
+ mVendorExtensionDesc, mFunctionalCode, mManufacturer, mModel, mVersion, mSerial);
+}
+
+} // namespace android
diff --git a/media/mtp/MtpDeviceInfo.h b/media/mtp/MtpDeviceInfo.h
new file mode 100644
index 0000000..2abaa10
--- /dev/null
+++ b/media/mtp/MtpDeviceInfo.h
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+#ifndef _MTP_DEVICE_INFO_H
+#define _MTP_DEVICE_INFO_H
+
+struct stat;
+
+namespace android {
+
+class MtpDataPacket;
+
+class MtpDeviceInfo {
+public:
+ uint16_t mStandardVersion;
+ uint32_t mVendorExtensionID;
+ uint16_t mVendorExtensionVersion;
+ char* mVendorExtensionDesc;
+ uint16_t mFunctionalCode;
+ UInt16List* mOperations;
+ UInt16List* mEvents;
+ MtpDevicePropertyList* mDeviceProperties;
+ MtpObjectFormatList* mCaptureFormats;
+ MtpObjectFormatList* mPlaybackFormats;
+ char* mManufacturer;
+ char* mModel;
+ char* mVersion;
+ char* mSerial;
+
+public:
+ MtpDeviceInfo();
+ virtual ~MtpDeviceInfo();
+
+ void read(MtpDataPacket& packet);
+
+ void print();
+};
+
+}; // namespace android
+
+#endif // _MTP_DEVICE_INFO_H
diff --git a/media/mtp/MtpMediaScanner.cpp b/media/mtp/MtpMediaScanner.cpp
new file mode 100644
index 0000000..4e566f1
--- /dev/null
+++ b/media/mtp/MtpMediaScanner.cpp
@@ -0,0 +1,378 @@
+/*
+ * 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.
+ */
+
+#include "MtpDatabase.h"
+#include "MtpMediaScanner.h"
+#include "mtp.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <limits.h>
+
+#include <media/mediascanner.h>
+#include <media/stagefright/StagefrightMediaScanner.h>
+
+namespace android {
+
+class MtpMediaScannerClient : public MediaScannerClient
+{
+public:
+ MtpMediaScannerClient()
+ {
+ reset();
+ }
+
+ virtual ~MtpMediaScannerClient()
+ {
+ }
+
+ // returns true if it succeeded, false if an exception occured in the Java code
+ virtual bool scanFile(const char* path, long long lastModified, long long fileSize)
+ {
+ printf("scanFile %s\n", path);
+ return true;
+ }
+
+ // returns true if it succeeded, false if an exception occured in the Java code
+ virtual bool handleStringTag(const char* name, const char* value)
+ {
+ int temp;
+
+ if (!strcmp(name, "title")) {
+ mTitle = value;
+ mHasTitle = true;
+ } else if (!strcmp(name, "artist")) {
+ mArtist = value;
+ mHasArtist = true;
+ } else if (!strcmp(name, "album")) {
+ mAlbum = value;
+ mHasAlbum = true;
+ } else if (!strcmp(name, "albumartist")) {
+ mAlbumArtist = value;
+ mHasAlbumArtist = true;
+ } else if (!strcmp(name, "genre")) {
+ // FIXME - handle numeric values here
+ mGenre = value;
+ mHasGenre = true;
+ } else if (!strcmp(name, "composer")) {
+ mComposer = value;
+ mHasComposer = true;
+ } else if (!strcmp(name, "tracknumber")) {
+ if (sscanf(value, "%d", &temp) == 1)
+ mTrack = temp;
+ } else if (!strcmp(name, "discnumber")) {
+ // currently unused
+ } else if (!strcmp(name, "year") || !strcmp(name, "date")) {
+ if (sscanf(value, "%d", &temp) == 1)
+ mYear = temp;
+ } else if (!strcmp(name, "duration")) {
+ if (sscanf(value, "%d", &temp) == 1)
+ mDuration = temp;
+ } else {
+ printf("handleStringTag %s : %s\n", name, value);
+ }
+ return true;
+ }
+
+ // returns true if it succeeded, false if an exception occured in the Java code
+ virtual bool setMimeType(const char* mimeType)
+ {
+ mMimeType = mimeType;
+ mHasMimeType = true;
+ return true;
+ }
+
+ // returns true if it succeeded, false if an exception occured in the Java code
+ virtual bool addNoMediaFolder(const char* path)
+ {
+ printf("addNoMediaFolder %s\n", path);
+ return true;
+ }
+
+ void reset()
+ {
+ mHasTitle = false;
+ mHasArtist = false;
+ mHasAlbum = false;
+ mHasAlbumArtist = false;
+ mHasGenre = false;
+ mHasComposer = false;
+ mHasMimeType = false;
+ mTrack = mYear = mDuration = 0;
+ }
+
+ inline const char* getTitle() const { return mHasTitle ? (const char *)mTitle : NULL; }
+ inline const char* getArtist() const { return mHasArtist ? (const char *)mArtist : NULL; }
+ inline const char* getAlbum() const { return mHasAlbum ? (const char *)mAlbum : NULL; }
+ inline const char* getAlbumArtist() const { return mHasAlbumArtist ? (const char *)mAlbumArtist : NULL; }
+ inline const char* getGenre() const { return mHasGenre ? (const char *)mGenre : NULL; }
+ inline const char* getComposer() const { return mHasComposer ? (const char *)mComposer : NULL; }
+ inline const char* getMimeType() const { return mHasMimeType ? (const char *)mMimeType : NULL; }
+ inline int getTrack() const { return mTrack; }
+ inline int getYear() const { return mYear; }
+ inline int getDuration() const { return mDuration; }
+
+private:
+ MtpString mTitle;
+ MtpString mArtist;
+ MtpString mAlbum;
+ MtpString mAlbumArtist;
+ MtpString mGenre;
+ MtpString mComposer;
+ MtpString mMimeType;
+
+ bool mHasTitle;
+ bool mHasArtist;
+ bool mHasAlbum;
+ bool mHasAlbumArtist;
+ bool mHasGenre;
+ bool mHasComposer;
+ bool mHasMimeType;
+
+ int mTrack;
+ int mYear;
+ int mDuration;
+};
+
+
+MtpMediaScanner::MtpMediaScanner(MtpStorageID id, const char* filePath, MtpDatabase* db)
+ : mStorageID(id),
+ mFilePath(filePath),
+ mDatabase(db),
+ mMediaScanner(NULL),
+ mMediaScannerClient(NULL),
+ mFileList(NULL),
+ mFileCount(0)
+{
+ mMediaScanner = new StagefrightMediaScanner;
+ mMediaScannerClient = new MtpMediaScannerClient;
+}
+
+MtpMediaScanner::~MtpMediaScanner() {
+}
+
+bool MtpMediaScanner::scanFiles() {
+ mDatabase->beginTransaction();
+ mFileCount = 0;
+ mFileList = mDatabase->getFileList(mFileCount);
+
+ int ret = scanDirectory(mFilePath, MTP_PARENT_ROOT);
+
+ for (int i = 0; i < mFileCount; i++) {
+ MtpObjectHandle test = mFileList[i];
+ if (! (test & kObjectHandleMarkBit)) {
+ printf("delete missing file %08X\n", test);
+ mDatabase->deleteFile(test);
+ }
+ }
+
+ delete[] mFileList;
+ mFileCount = 0;
+ mDatabase->commitTransaction();
+ return (ret == 0);
+}
+
+
+static const struct MediaFileTypeEntry
+{
+ const char* extension;
+ MtpObjectFormat format;
+ uint32_t table;
+} sFileTypes[] =
+{
+ { "MP3", MTP_FORMAT_MP3, kObjectHandleTableAudio },
+ { "M4A", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "WAV", MTP_FORMAT_WAV, kObjectHandleTableAudio },
+ { "AMR", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "AWB", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "WMA", MTP_FORMAT_WMA, kObjectHandleTableAudio },
+ { "OGG", MTP_FORMAT_OGG, kObjectHandleTableAudio },
+ { "OGA", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "AAC", MTP_FORMAT_AAC, kObjectHandleTableAudio },
+ { "MID", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "MIDI", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "XMF", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "RTTTL", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "SMF", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "IMY", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "RTX", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "OTA", MTP_FORMAT_UNDEFINED_AUDIO, kObjectHandleTableAudio },
+ { "MPEG", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "MP4", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "M4V", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "3GP", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "3GPP", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "3G2", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "3GPP2", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "WMV", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "ASF", MTP_FORMAT_UNDEFINED_VIDEO, kObjectHandleTableVideo },
+ { "JPG", MTP_FORMAT_EXIF_JPEG, kObjectHandleTableImage },
+ { "JPEG", MTP_FORMAT_EXIF_JPEG, kObjectHandleTableImage },
+ { "GIF", MTP_FORMAT_GIF, kObjectHandleTableImage },
+ { "PNG", MTP_FORMAT_PNG, kObjectHandleTableImage },
+ { "BMP", MTP_FORMAT_BMP, kObjectHandleTableImage },
+ { "WBMP", MTP_FORMAT_BMP, kObjectHandleTableImage },
+ { "M3U", MTP_FORMAT_M3U_PLAYLIST, kObjectHandleTablePlaylist },
+ { "PLS", MTP_FORMAT_PLS_PLAYLIST, kObjectHandleTablePlaylist },
+ { "WPL", MTP_FORMAT_WPL_PLAYLIST, kObjectHandleTablePlaylist },
+};
+
+MtpObjectFormat MtpMediaScanner::getFileFormat(const char* path, uint32_t& table)
+{
+ const char* extension = strrchr(path, '.');
+ if (!extension)
+ return MTP_FORMAT_UNDEFINED;
+ extension++; // skip the dot
+
+ for (unsigned i = 0; i < sizeof(sFileTypes) / sizeof(sFileTypes[0]); i++) {
+ if (!strcasecmp(extension, sFileTypes[i].extension)) {
+ table = sFileTypes[i].table;
+ return sFileTypes[i].format;
+ }
+ }
+ table = kObjectHandleTableFile;
+ return MTP_FORMAT_UNDEFINED;
+}
+
+int MtpMediaScanner::scanDirectory(const char* path, MtpObjectHandle parent)
+{
+ char buffer[PATH_MAX];
+ struct dirent* entry;
+
+ unsigned length = strlen(path);
+ if (length > sizeof(buffer) + 2) {
+ fprintf(stderr, "path too long: %s\n", path);
+ }
+
+ DIR* dir = opendir(path);
+ if (!dir) {
+ fprintf(stderr, "opendir %s failed, errno: %d", path, errno);
+ return -1;
+ }
+
+ strncpy(buffer, path, sizeof(buffer));
+ char* fileStart = buffer + length;
+ // make sure we have a trailing slash
+ if (fileStart[-1] != '/') {
+ *(fileStart++) = '/';
+ }
+ int fileNameLength = sizeof(buffer) + fileStart - buffer;
+
+ while ((entry = readdir(dir))) {
+ const char* name = entry->d_name;
+
+ // ignore "." and "..", as well as any files or directories staring with dot
+ if (name[0] == '.') {
+ continue;
+ }
+ if (strlen(name) + 1 > fileNameLength) {
+ fprintf(stderr, "path too long for %s\n", name);
+ continue;
+ }
+ strcpy(fileStart, name);
+
+ struct stat statbuf;
+ memset(&statbuf, 0, sizeof(statbuf));
+ stat(buffer, &statbuf);
+
+ if (entry->d_type == DT_DIR) {
+ MtpObjectHandle handle = mDatabase->getObjectHandle(buffer);
+ if (handle) {
+ markFile(handle);
+ } else {
+ handle = mDatabase->addFile(buffer, MTP_FORMAT_ASSOCIATION,
+ parent, mStorageID, 0, statbuf.st_mtime);
+ }
+ scanDirectory(buffer, handle);
+ } else if (entry->d_type == DT_REG) {
+ scanFile(buffer, parent, statbuf);
+ }
+ }
+
+ closedir(dir);
+ return 0;
+}
+
+void MtpMediaScanner::scanFile(const char* path, MtpObjectHandle parent, struct stat& statbuf) {
+ uint32_t table;
+ MtpObjectFormat format = getFileFormat(path, table);
+ // don't scan unknown file types
+ if (format == MTP_FORMAT_UNDEFINED)
+ return;
+ MtpObjectHandle handle = mDatabase->getObjectHandle(path);
+ // fixme - rescan if mod date changed
+ if (handle) {
+ markFile(handle);
+ } else {
+ mDatabase->beginTransaction();
+ handle = mDatabase->addFile(path, format, parent, mStorageID,
+ statbuf.st_size, statbuf.st_mtime);
+ if (handle <= 0) {
+ fprintf(stderr, "addFile failed in MtpMediaScanner::scanFile()\n");
+ mDatabase->rollbackTransaction();
+ return;
+ }
+
+ if (table == kObjectHandleTableAudio) {
+ mMediaScannerClient->reset();
+ mMediaScanner->processFile(path, NULL, *mMediaScannerClient);
+ handle = mDatabase->addAudioFile(handle,
+ mMediaScannerClient->getTitle(),
+ mMediaScannerClient->getArtist(),
+ mMediaScannerClient->getAlbum(),
+ mMediaScannerClient->getAlbumArtist(),
+ mMediaScannerClient->getGenre(),
+ mMediaScannerClient->getComposer(),
+ mMediaScannerClient->getMimeType(),
+ mMediaScannerClient->getTrack(),
+ mMediaScannerClient->getYear(),
+ mMediaScannerClient->getDuration());
+ }
+ mDatabase->commitTransaction();
+ }
+}
+
+void MtpMediaScanner::markFile(MtpObjectHandle handle) {
+ if (mFileList) {
+ handle &= kObjectHandleIndexMask;
+ // binary search for the file in mFileList
+ int low = 0;
+ int high = mFileCount;
+ int index;
+
+ while (low < high) {
+ index = (low + high) >> 1;
+ MtpObjectHandle test = (mFileList[index] & kObjectHandleIndexMask);
+ if (handle < test)
+ high = index; // item is less than index
+ else if (handle > test)
+ low = index + 1; // item is greater than index
+ else {
+ mFileList[index] |= kObjectHandleMarkBit;
+ return;
+ }
+ }
+ fprintf(stderr, "file %d not found in mFileList\n", handle);
+ }
+}
+
+} // namespace android
diff --git a/media/mtp/MtpMediaScanner.h b/media/mtp/MtpMediaScanner.h
new file mode 100644
index 0000000..53d5063
--- /dev/null
+++ b/media/mtp/MtpMediaScanner.h
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+#ifndef _MTP_MEDIA_SCANNER_H
+#define _MTP_MEDIA_SCANNER_H
+
+struct stat;
+
+namespace android {
+
+class MtpDatabase;
+class SqliteStatement;
+class MediaScanner;
+class MtpMediaScannerClient;
+
+class MtpMediaScanner {
+private:
+ MtpStorageID mStorageID;
+ const char* mFilePath;
+ MtpDatabase* mDatabase;
+ MediaScanner* mMediaScanner;
+ MtpMediaScannerClient* mMediaScannerClient;
+
+ // for garbage collecting missing files
+ MtpObjectHandle* mFileList;
+ int mFileCount;
+
+public:
+ MtpMediaScanner(MtpStorageID id, const char* filePath, MtpDatabase* db);
+ virtual ~MtpMediaScanner();
+
+ bool scanFiles();
+
+private:
+ MtpObjectFormat getFileFormat(const char* path, uint32_t& table);
+ int scanDirectory(const char* path, MtpObjectHandle parent);
+ void scanFile(const char* path, MtpObjectHandle parent, struct stat& statbuf);
+ void markFile(MtpObjectHandle handle);
+};
+
+}; // namespace android
+
+#endif // _MTP_MEDIA_SCANNER_H
diff --git a/media/mtp/MtpObjectInfo.cpp b/media/mtp/MtpObjectInfo.cpp
new file mode 100644
index 0000000..8ca2880
--- /dev/null
+++ b/media/mtp/MtpObjectInfo.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#include <stdlib.h>
+
+#include "MtpDataPacket.h"
+#include "MtpObjectInfo.h"
+#include "MtpStringBuffer.h"
+#include "MtpUtils.h"
+
+namespace android {
+
+MtpObjectInfo::MtpObjectInfo(MtpObjectHandle handle)
+ : mHandle(handle),
+ mStorageID(0),
+ mFormat(0),
+ mProtectionStatus(0),
+ mCompressedSize(0),
+ mThumbFormat(0),
+ mThumbCompressedSize(0),
+ mThumbPixWidth(0),
+ mThumbPixHeight(0),
+ mImagePixWidth(0),
+ mImagePixHeight(0),
+ mImagePixDepth(0),
+ mParent(0),
+ mAssociationType(0),
+ mAssociationDesc(0),
+ mSequenceNumber(0),
+ mName(NULL),
+ mDateCreated(0),
+ mDateModified(0),
+ mKeywords(NULL)
+{
+}
+
+MtpObjectInfo::~MtpObjectInfo() {
+ if (mName)
+ free(mName);
+ if (mKeywords)
+ free(mKeywords);
+}
+
+void MtpObjectInfo::read(MtpDataPacket& packet) {
+ MtpStringBuffer string;
+ time_t time;
+
+ mStorageID = packet.getUInt32();
+ mFormat = packet.getUInt16();
+ mProtectionStatus = packet.getUInt16();
+ mCompressedSize = packet.getUInt32();
+ mThumbFormat = packet.getUInt16();
+ mCompressedSize = packet.getUInt32();
+ mThumbPixWidth = packet.getUInt32();
+ mThumbPixHeight = packet.getUInt32();
+ mImagePixWidth = packet.getUInt32();
+ mImagePixHeight = packet.getUInt32();
+ mImagePixDepth = packet.getUInt32();
+ mParent = packet.getUInt32();
+ mAssociationType = packet.getUInt16();
+ mAssociationDesc = packet.getUInt32();
+ mSequenceNumber = packet.getUInt32();
+
+ packet.getString(string);
+ mName = strdup((const char *)string);
+
+ packet.getString(string);
+ if (parseDateTime((const char*)string, time))
+ mDateCreated = time;
+
+ packet.getString(string);
+ if (parseDateTime((const char*)string, time))
+ mDateModified = time;
+
+ packet.getString(string);
+ mKeywords = strdup((const char *)string);
+}
+
+void MtpObjectInfo::print() {
+ printf("MtpObject Info %08X: %s\n", mHandle, mName);
+}
+
+} // namespace android
diff --git a/media/mtp/MtpObjectInfo.h b/media/mtp/MtpObjectInfo.h
new file mode 100644
index 0000000..c7a449ca
--- /dev/null
+++ b/media/mtp/MtpObjectInfo.h
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+
+#ifndef _MTP_OBJECT_INFO_H
+#define _MTP_OBJECT_INFO_H
+
+#include "MtpTypes.h"
+
+namespace android {
+
+class MtpDataPacket;
+
+class MtpObjectInfo {
+public:
+ MtpObjectHandle mHandle;
+ MtpStorageID mStorageID;
+ MtpObjectFormat mFormat;
+ uint16_t mProtectionStatus;
+ uint32_t mCompressedSize;
+ MtpObjectFormat mThumbFormat;
+ uint32_t mThumbCompressedSize;
+ uint32_t mThumbPixWidth;
+ uint32_t mThumbPixHeight;
+ uint32_t mImagePixWidth;
+ uint32_t mImagePixHeight;
+ uint32_t mImagePixDepth;
+ MtpObjectHandle mParent;
+ uint16_t mAssociationType;
+ uint32_t mAssociationDesc;
+ uint32_t mSequenceNumber;
+ char* mName;
+ time_t mDateCreated;
+ time_t mDateModified;
+ char* mKeywords;
+
+public:
+ MtpObjectInfo(MtpObjectHandle handle);
+ virtual ~MtpObjectInfo();
+
+ void read(MtpDataPacket& packet);
+
+ void print();
+};
+
+}; // namespace android
+
+#endif // _MTP_OBJECT_INFO_H
diff --git a/media/mtp/MtpPacket.cpp b/media/mtp/MtpPacket.cpp
index 26a9460..3db6abb 100644
--- a/media/mtp/MtpPacket.cpp
+++ b/media/mtp/MtpPacket.cpp
@@ -21,6 +21,9 @@
#include <usbhost/usbhost.h>
#include "MtpPacket.h"
+#include "mtp.h"
+
+namespace android {
MtpPacket::MtpPacket(int bufferSize)
: mBuffer(NULL),
@@ -125,7 +128,6 @@
#ifdef MTP_HOST
int MtpPacket::transfer(struct usb_endpoint *ep, void* buffer, int length) {
- printf("MtpPacket::transfer length: %d\n", length);
if (usb_endpoint_queue(ep, buffer, length)) {
printf("usb_endpoint_queue failed, errno: %d\n", errno);
return -1;
@@ -134,3 +136,5 @@
return usb_endpoint_wait(usb_endpoint_get_device(ep), &ep_num);
}
#endif
+
+} // namespace android
diff --git a/media/mtp/MtpPacket.h b/media/mtp/MtpPacket.h
index 26a3c24..a624a71 100644
--- a/media/mtp/MtpPacket.h
+++ b/media/mtp/MtpPacket.h
@@ -17,13 +17,14 @@
#ifndef _MTP_PACKET_H
#define _MTP_PACKET_H
+#include "MtpTypes.h"
+
+struct usb_endpoint;
+
+namespace android {
+
class MtpStringBuffer;
-#include "mtp.h"
-#include "MtpUtils.h"
-
-#include <stdint.h>
-
class MtpPacket {
protected:
@@ -65,4 +66,6 @@
void putUInt32(int offset, uint32_t value);
};
+}; // namespace android
+
#endif // _MTP_PACKET_H
diff --git a/media/mtp/MtpRequestPacket.cpp b/media/mtp/MtpRequestPacket.cpp
index ed4cc9d..e3a720c 100644
--- a/media/mtp/MtpRequestPacket.cpp
+++ b/media/mtp/MtpRequestPacket.cpp
@@ -20,6 +20,8 @@
#include "MtpRequestPacket.h"
+namespace android {
+
MtpRequestPacket::MtpRequestPacket()
: MtpPacket(512)
{
@@ -48,3 +50,5 @@
return transfer(ep, mBuffer, mPacketSize);
}
#endif
+
+} // namespace android
diff --git a/media/mtp/MtpRequestPacket.h b/media/mtp/MtpRequestPacket.h
index d44d1dc..df518f2 100644
--- a/media/mtp/MtpRequestPacket.h
+++ b/media/mtp/MtpRequestPacket.h
@@ -20,6 +20,8 @@
#include "MtpPacket.h"
#include "mtp.h"
+namespace android {
+
class MtpRequestPacket : public MtpPacket {
public:
@@ -41,4 +43,6 @@
{ return setContainerCode(code); }
};
+}; // namespace android
+
#endif // _MTP_REQUEST_PACKET_H
diff --git a/media/mtp/MtpResponsePacket.cpp b/media/mtp/MtpResponsePacket.cpp
index 6ebac9e..a1979d7 100644
--- a/media/mtp/MtpResponsePacket.cpp
+++ b/media/mtp/MtpResponsePacket.cpp
@@ -20,6 +20,8 @@
#include "MtpResponsePacket.h"
+namespace android {
+
MtpResponsePacket::MtpResponsePacket()
: MtpPacket(512)
{
@@ -49,4 +51,5 @@
}
#endif
+} // namespace android
diff --git a/media/mtp/MtpResponsePacket.h b/media/mtp/MtpResponsePacket.h
index 84c3024..373f8f9 100644
--- a/media/mtp/MtpResponsePacket.h
+++ b/media/mtp/MtpResponsePacket.h
@@ -20,6 +20,8 @@
#include "MtpPacket.h"
#include "mtp.h"
+namespace android {
+
class MtpResponsePacket : public MtpPacket {
public:
@@ -41,4 +43,6 @@
{ return setContainerCode(code); }
};
+}; // namespace android
+
#endif // _MTP_RESPONSE_PACKET_H
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 57b84ac..88c08bf 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -30,6 +30,8 @@
#include "f_mtp.h"
+namespace android {
+
static const MtpOperationCode kSupportedOperationCodes[] = {
MTP_OPERATION_GET_DEVICE_INFO,
MTP_OPERATION_OPEN_SESSION,
@@ -77,9 +79,35 @@
};
static const MtpObjectFormat kSupportedPlaybackFormats[] = {
- // FIXME - fill this out later
+ // MTP_FORMAT_UNDEFINED,
MTP_FORMAT_ASSOCIATION,
+ // MTP_FORMAT_TEXT,
+ // MTP_FORMAT_HTML,
MTP_FORMAT_MP3,
+ //MTP_FORMAT_AVI,
+ MTP_FORMAT_MPEG,
+ // MTP_FORMAT_ASF,
+ MTP_FORMAT_EXIF_JPEG,
+ MTP_FORMAT_TIFF_EP,
+ // MTP_FORMAT_BMP,
+ MTP_FORMAT_GIF,
+ MTP_FORMAT_JFIF,
+ MTP_FORMAT_PNG,
+ MTP_FORMAT_TIFF,
+ MTP_FORMAT_WMA,
+ MTP_FORMAT_OGG,
+ MTP_FORMAT_AAC,
+ // MTP_FORMAT_FLAC,
+ // MTP_FORMAT_WMV,
+ MTP_FORMAT_MP4_CONTAINER,
+ MTP_FORMAT_MP2,
+ MTP_FORMAT_3GP_CONTAINER,
+ // MTP_FORMAT_ABSTRACT_AUDIO_ALBUM,
+ // MTP_FORMAT_ABSTRACT_AV_PLAYLIST,
+ // MTP_FORMAT_WPL_PLAYLIST,
+ // MTP_FORMAT_M3U_PLAYLIST,
+ // MTP_FORMAT_MPL_PLAYLIST,
+ // MTP_FORMAT_PLS_PLAYLIST,
};
MtpServer::MtpServer(int fd, const char* databasePath)
@@ -332,7 +360,7 @@
if (!mSessionOpen)
return MTP_RESPONSE_SESSION_NOT_OPEN;
MtpStorageID storageID = mRequest.getParameter(1); // 0xFFFFFFFF for all storage
- MtpObjectFormat format = mRequest.getParameter(2); // 0x00000000 for all formats
+ MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats
MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent
// 0x00000000 for all objects?
@@ -418,9 +446,7 @@
mData.getString(modified); // date modified
// keywords follow
- time_t createdTime, modifiedTime;
- if (!parseDateTime(created, createdTime))
- createdTime = 0;
+ time_t modifiedTime;
if (!parseDateTime(modified, modifiedTime))
modifiedTime = 0;
printf("SendObjectInfo format: %04X size: %d name: %s, created: %s, modified: %s\n",
@@ -430,11 +456,17 @@
path += "/";
path += (const char *)name;
- MtpObjectHandle handle = mDatabase->addFile((const char*)path,
- format, parent, storageID, mSendObjectFileSize,
- createdTime, modifiedTime);
- if (handle == kInvalidObjectHandle)
+ mDatabase->beginTransaction();
+ MtpObjectHandle handle = mDatabase->addFile((const char*)path, format, parent, storageID,
+ mSendObjectFileSize, modifiedTime);
+ if (handle == kInvalidObjectHandle) {
+ mDatabase->rollbackTransaction();
return MTP_RESPONSE_GENERAL_ERROR;
+ }
+ uint32_t table = MtpDatabase::getTableForFile(format);
+ if (table == kObjectHandleTableAudio)
+ handle = mDatabase->addAudioFile(handle);
+ mDatabase->commitTransaction();
if (format == MTP_FORMAT_ASSOCIATION) {
mode_t mask = umask(0);
@@ -514,3 +546,5 @@
return -1;
}
+
+} // namespace android
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
index 81b1c81..ca570f0 100644
--- a/media/mtp/MtpServer.h
+++ b/media/mtp/MtpServer.h
@@ -24,6 +24,8 @@
#include "MtpUtils.h"
+namespace android {
+
class MtpStorage;
class MtpDatabase;
@@ -83,4 +85,6 @@
MtpResponseCode doGetObjectPropDesc();
};
+}; // namespace android
+
#endif // _MTP_SERVER_H
diff --git a/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp
index bbdef51..f176148 100644
--- a/media/mtp/MtpStorage.cpp
+++ b/media/mtp/MtpStorage.cpp
@@ -16,6 +16,7 @@
#include "MtpDatabase.h"
#include "MtpStorage.h"
+#include "MtpMediaScanner.h"
#include <sys/types.h>
#include <sys/stat.h>
@@ -27,6 +28,7 @@
#include <stdio.h>
#include <limits.h>
+namespace android {
MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, MtpDatabase* db)
: mStorageID(id),
@@ -73,63 +75,8 @@
}
bool MtpStorage::scanFiles() {
- mDatabase->beginTransaction();
- int ret = scanDirectory(mFilePath, MTP_PARENT_ROOT);
- mDatabase->commitTransaction();
- return (ret == 0);
+ MtpMediaScanner scanner(mStorageID, mFilePath, mDatabase);
+ return scanner.scanFiles();
}
-int MtpStorage::scanDirectory(const char* path, MtpObjectHandle parent)
-{
- char buffer[PATH_MAX];
- struct dirent* entry;
-
- int length = strlen(path);
- if (length > sizeof(buffer) + 2) {
- fprintf(stderr, "path too long: %s\n", path);
- }
-
- DIR* dir = opendir(path);
- if (!dir) {
- fprintf(stderr, "opendir %s failed, errno: %d", path, errno);
- return -1;
- }
-
- strncpy(buffer, path, sizeof(buffer));
- char* fileStart = buffer + length;
- // make sure we have a trailing slash
- if (fileStart[-1] != '/') {
- *(fileStart++) = '/';
- }
- int fileNameLength = sizeof(buffer) + fileStart - buffer;
-
- while ((entry = readdir(dir))) {
- const char* name = entry->d_name;
-
- // ignore "." and "..", as well as any files or directories staring with dot
- if (name[0] == '.') {
- continue;
- }
- if (strlen(name) + 1 > fileNameLength) {
- fprintf(stderr, "path too long for %s\n", name);
- continue;
- }
- strcpy(fileStart, name);
-
- struct stat statbuf;
- memset(&statbuf, 0, sizeof(statbuf));
- stat(buffer, &statbuf);
-
- if (entry->d_type == DT_DIR) {
- MtpObjectHandle handle = mDatabase->addFile(buffer, MTP_FORMAT_ASSOCIATION,
- parent, mStorageID, 0, 0, statbuf.st_mtime);
- scanDirectory(buffer, handle);
- } else if (entry->d_type == DT_REG) {
- mDatabase->addFile(buffer, MTP_FORMAT_UNDEFINED, parent, mStorageID,
- statbuf.st_size, 0, statbuf.st_mtime);
- }
- }
-
- closedir(dir);
- return 0;
-}
+} // namespace android
diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h
index 011cb81..6097272 100644
--- a/media/mtp/MtpStorage.h
+++ b/media/mtp/MtpStorage.h
@@ -19,6 +19,8 @@
#include "mtp.h"
+namespace android {
+
class MtpDatabase;
class SqliteStatement;
@@ -44,9 +46,8 @@
inline const char* getPath() const { return mFilePath; }
bool scanFiles();
-
-private:
- int scanDirectory(const char* path, MtpObjectHandle parent);
};
+}; // namespace android
+
#endif // _MTP_STORAGE_H
diff --git a/media/mtp/MtpStorageInfo.cpp b/media/mtp/MtpStorageInfo.cpp
new file mode 100644
index 0000000..7116e2b
--- /dev/null
+++ b/media/mtp/MtpStorageInfo.cpp
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+#include <stdlib.h>
+
+#include "MtpDataPacket.h"
+#include "MtpStorageInfo.h"
+#include "MtpStringBuffer.h"
+
+namespace android {
+
+MtpStorageInfo::MtpStorageInfo(MtpStorageID id)
+ : mStorageID(id),
+ mStorageType(0),
+ mFileSystemType(0),
+ mAccessCapability(0),
+ mMaxCapacity(0),
+ mFreeSpaceBytes(0),
+ mFreeSpaceObjects(0),
+ mStorageDescription(NULL),
+ mVolumeIdentifier(NULL)
+{
+}
+
+MtpStorageInfo::~MtpStorageInfo() {
+ if (mStorageDescription)
+ free(mStorageDescription);
+ if (mVolumeIdentifier)
+ free(mVolumeIdentifier);
+}
+
+void MtpStorageInfo::read(MtpDataPacket& packet) {
+ MtpStringBuffer string;
+
+ // read the device info
+ mStorageType = packet.getUInt16();
+ mFileSystemType = packet.getUInt16();
+ mAccessCapability = packet.getUInt16();
+ mMaxCapacity = packet.getUInt64();
+ mFreeSpaceBytes = packet.getUInt64();
+ mFreeSpaceObjects = packet.getUInt32();
+
+ packet.getString(string);
+ mStorageDescription = strdup((const char *)string);
+ packet.getString(string);
+ mVolumeIdentifier = strdup((const char *)string);
+}
+
+void MtpStorageInfo::print() {
+ printf("Storage Info %08X:\n\tmStorageType: %d\n\tmFileSystemType: %d\n\tmAccessCapability: %d\n",
+ mStorageID, mStorageType, mFileSystemType, mAccessCapability);
+ printf("\tmMaxCapacity: %lld\n\tmFreeSpaceBytes: %lld\n\tmFreeSpaceObjects: %d\n",
+ mMaxCapacity, mFreeSpaceBytes, mFreeSpaceObjects);
+ printf("\tmStorageDescription: %s\n\tmVolumeIdentifier: %s\n",
+ mStorageDescription, mVolumeIdentifier);
+}
+
+} // namespace android
diff --git a/media/mtp/MtpStorageInfo.h b/media/mtp/MtpStorageInfo.h
new file mode 100644
index 0000000..2cb626e
--- /dev/null
+++ b/media/mtp/MtpStorageInfo.h
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+#ifndef _MTP_STORAGE_INFO_H
+#define _MTP_STORAGE_INFO_H
+
+#include "MtpTypes.h"
+
+namespace android {
+
+class MtpDataPacket;
+
+class MtpStorageInfo {
+public:
+ MtpStorageID mStorageID;
+ uint16_t mStorageType;
+ uint16_t mFileSystemType;
+ uint16_t mAccessCapability;
+ uint64_t mMaxCapacity;
+ uint64_t mFreeSpaceBytes;
+ uint32_t mFreeSpaceObjects;
+ char* mStorageDescription;
+ char* mVolumeIdentifier;
+
+public:
+ MtpStorageInfo(MtpStorageID id);
+ virtual ~MtpStorageInfo();
+
+ void read(MtpDataPacket& packet);
+
+ void print();
+};
+
+}; // namespace android
+
+#endif // _MTP_STORAGE_INFO_H
diff --git a/media/mtp/MtpStringBuffer.cpp b/media/mtp/MtpStringBuffer.cpp
index 6b55c44..8694575 100644
--- a/media/mtp/MtpStringBuffer.cpp
+++ b/media/mtp/MtpStringBuffer.cpp
@@ -19,6 +19,7 @@
#include "MtpDataPacket.h"
#include "MtpStringBuffer.h"
+namespace android {
MtpStringBuffer::MtpStringBuffer()
: mCharCount(0),
@@ -131,3 +132,5 @@
packet->putUInt16(ch);
}
}
+
+} // namespace android
diff --git a/media/mtp/MtpStringBuffer.h b/media/mtp/MtpStringBuffer.h
index 46138d2..4641c3f 100644
--- a/media/mtp/MtpStringBuffer.h
+++ b/media/mtp/MtpStringBuffer.h
@@ -19,6 +19,8 @@
#include <stdint.h>
+namespace android {
+
class MtpDataPacket;
// Represents a utf8 string, with a maximum of 255 characters
@@ -47,4 +49,6 @@
inline operator const char*() const { return (const char *)mBuffer; }
};
+}; // namespace android
+
#endif // _MTP_STRING_BUFFER_H
diff --git a/media/mtp/MtpTypes.h b/media/mtp/MtpTypes.h
new file mode 100644
index 0000000..3ec844f
--- /dev/null
+++ b/media/mtp/MtpTypes.h
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+
+#ifndef _MTP_TYPES_H
+#define _MTP_TYPES_H
+
+#include <stdint.h>
+#include "utils/String8.h"
+#include "utils/Vector.h"
+
+namespace android {
+
+typedef uint16_t MtpOperationCode;
+typedef uint16_t MtpResponseCode;
+typedef uint32_t MtpSessionID;
+typedef uint32_t MtpStorageID;
+typedef uint32_t MtpTransactionID;
+typedef uint16_t MtpDeviceProperty;
+typedef uint16_t MtpObjectFormat;
+typedef uint16_t MtpObjectProperty;
+
+// object handles are unique across all storage but only within a single session.
+// object handles cannot be reused after an object is deleted.
+// values 0x00000000 and 0xFFFFFFFF are reserved for special purposes.
+typedef uint32_t MtpObjectHandle;
+
+// Special values
+#define MTP_PARENT_ROOT 0xFFFFFFFF // parent is root of the storage
+#define kInvalidObjectHandle 0xFFFFFFFF
+
+// MtpObjectHandle bits and masks
+#define kObjectHandleMarkBit 0x80000000 // used for mark & sweep by MtpMediaScanner
+#define kObjectHandleTableMask 0x70000000 // mask for object table
+#define kObjectHandleTableFile 0x00000000 // object is only in the file table
+#define kObjectHandleTableAudio 0x10000000 // object is in the audio table
+#define kObjectHandleTableVideo 0x20000000 // object is in the video table
+#define kObjectHandleTableImage 0x30000000 // object is in the images table
+#define kObjectHandleTablePlaylist 0x40000000 // object is in the playlist table
+#define kObjectHandleIndexMask 0x0FFFFFFF // mask for object index in file table
+
+class MtpStorage;
+
+typedef android::Vector<MtpStorage *> MtpStorageList;
+
+typedef android::Vector<uint8_t> UInt8List;
+typedef android::Vector<uint32_t> UInt16List;
+typedef android::Vector<uint32_t> UInt32List;
+typedef android::Vector<uint64_t> UInt64List;
+typedef android::Vector<int8_t> Int8List;
+typedef android::Vector<int32_t> Int16List;
+typedef android::Vector<int32_t> Int32List;
+typedef android::Vector<int64_t> Int64List;
+
+typedef UInt16List MtpDevicePropertyList;
+typedef UInt16List MtpObjectFormatList;
+typedef UInt32List MtpObjectHandleList;
+typedef UInt16List MtpObjectPropertyList;
+typedef UInt32List MtpStorageIDList;
+
+typedef android::String8 MtpString;
+
+}; // namespace android
+
+#endif // _MTP_TYPES_H
diff --git a/media/mtp/MtpUtils.cpp b/media/mtp/MtpUtils.cpp
index a472781..10ca166 100644
--- a/media/mtp/MtpUtils.cpp
+++ b/media/mtp/MtpUtils.cpp
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+#include <stdio.h>
#include <time.h>
#include <cutils/tztime.h>
#include "MtpUtils.h"
+namespace android {
+
/*
DateTime strings follow a compatible subset of the definition found in ISO 8601, and
take the form of a Unicode string formatted as: "YYYYMMDDThhmmss.s". In this
@@ -70,4 +73,4 @@
tm.tm_year + 1900, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}
-
+} // namespace android
diff --git a/media/mtp/MtpUtils.h b/media/mtp/MtpUtils.h
index 2e80762..61f9055 100644
--- a/media/mtp/MtpUtils.h
+++ b/media/mtp/MtpUtils.h
@@ -17,18 +17,13 @@
#ifndef _MTP_UTILS_H
#define _MTP_UTILS_H
-#include "utils/String8.h"
-#include "utils/Vector.h"
+#include <stdint.h>
-class MtpStorage;
-
-typedef android::Vector<MtpStorage *> MtpStorageList;
-typedef android::Vector<uint32_t> UInt32List;
-typedef UInt32List MtpObjectHandleList;
-
-typedef android::String8 MtpString;
+namespace android {
bool parseDateTime(const char* dateTime, time_t& outSeconds);
void formatDateTime(time_t seconds, char* buffer, int bufferLength);
+}; // namespace android
+
#endif // _MTP_UTILS_H
diff --git a/media/mtp/SqliteDatabase.cpp b/media/mtp/SqliteDatabase.cpp
index 5a70dfe..e115630 100644
--- a/media/mtp/SqliteDatabase.cpp
+++ b/media/mtp/SqliteDatabase.cpp
@@ -20,6 +20,8 @@
#include <stdio.h>
#include <sqlite3.h>
+namespace android {
+
SqliteDatabase::SqliteDatabase()
: mDatabaseHandle(NULL)
{
@@ -79,3 +81,5 @@
snprintf(buffer, sizeof(buffer), "PRAGMA user_version = %d", version);
exec(buffer);
}
+
+} // namespace android
diff --git a/media/mtp/SqliteDatabase.h b/media/mtp/SqliteDatabase.h
index 841b2b7..56dd9dd 100644
--- a/media/mtp/SqliteDatabase.h
+++ b/media/mtp/SqliteDatabase.h
@@ -19,6 +19,8 @@
typedef struct sqlite3 sqlite3;
+namespace android {
+
class SqliteDatabase {
private:
sqlite3* mDatabaseHandle;
@@ -41,7 +43,8 @@
void setVersion(int version);
inline sqlite3* getDatabaseHandle() const { return mDatabaseHandle; }
-
};
+}; // namespace android
+
#endif // _SQLITE_DATABASE_H
diff --git a/media/mtp/SqliteStatement.cpp b/media/mtp/SqliteStatement.cpp
index e568928..e1300b6 100644
--- a/media/mtp/SqliteStatement.cpp
+++ b/media/mtp/SqliteStatement.cpp
@@ -20,6 +20,8 @@
#include <stdio.h>
#include <sqlite3.h>
+namespace android {
+
SqliteStatement::SqliteStatement(SqliteDatabase* db)
: mDatabaseHandle(db->getDatabaseHandle()),
mStatement(NULL),
@@ -75,3 +77,5 @@
const char* SqliteStatement::getColumnString(int column) {
return (const char *)sqlite3_column_text(mStatement, column);
}
+
+} // namespace android
diff --git a/media/mtp/SqliteStatement.h b/media/mtp/SqliteStatement.h
index 0fd8a1e..c0ebfff 100644
--- a/media/mtp/SqliteStatement.h
+++ b/media/mtp/SqliteStatement.h
@@ -17,11 +17,14 @@
#ifndef _SQLITE_STATEMENT_H
#define _SQLITE_STATEMENT_H
+#include <stdint.h>
+
typedef struct sqlite3 sqlite3;
typedef struct sqlite3_stmt sqlite3_stmt;
-class SqliteDatabase;
-#include <stdint.h>
+namespace android {
+
+class SqliteDatabase;
class SqliteStatement {
private:
@@ -48,4 +51,6 @@
inline bool isDone() const { return mDone; }
};
+}; // namespace android
+
#endif // _SQLITE_STATEMENT_H
diff --git a/media/mtp/f_mtp.h b/media/mtp/f_mtp.h
index 7307d74..82015a0 100644
--- a/media/mtp/f_mtp.h
+++ b/media/mtp/f_mtp.h
@@ -18,6 +18,11 @@
#ifndef __LINUX_USB_F_MTP_H
#define __LINUX_USB_F_MTP_H
+/* Constants for MTP_SET_INTERFACE_MODE */
+#define MTP_INTERFACE_MODE_MTP 0
+#define MTP_INTERFACE_MODE_PTP 1
+
+
struct mtp_file_range {
/* path for file to transfer */
const char *path;
@@ -35,5 +40,7 @@
* The file is created if it does not exist.
*/
#define MTP_RECEIVE_FILE _IOW('M', 1, struct mtp_file_range)
+/* Sets the driver mode to either MTP or PTP */
+#define MTP_SET_INTERFACE_MODE _IOW('M', 2, int)
#endif /* __LINUX_USB_F_MTP_H */
diff --git a/media/mtp/mtp.h b/media/mtp/mtp.h
index 27abaa7..7a97d7c 100644
--- a/media/mtp/mtp.h
+++ b/media/mtp/mtp.h
@@ -19,21 +19,6 @@
#include <stdint.h>
-typedef uint16_t MtpOperationCode;
-typedef uint16_t MtpResponseCode;
-typedef uint32_t MtpSessionID;
-typedef uint32_t MtpStorageID;
-typedef uint32_t MtpTransactionID;
-typedef uint16_t MtpObjectFormat;
-typedef uint16_t MtpObjectProperty;
-
-// object handles are unique across all storage but only within a single session.
-// object handles cannot be reused after an object is deleted.
-// values 0x00000000 and 0xFFFFFFFF are reserved for special purposes.
-typedef uint32_t MtpObjectHandle;
-
-#define kInvalidObjectHandle 0xFFFFFFFF
-
#define MTP_STANDARD_VERSION 100
// Container Types
@@ -51,9 +36,6 @@
#define MTP_CONTAINER_PARAMETER_OFFSET 12
#define MTP_CONTAINER_HEADER_SIZE 12
-// Special values
-#define MTP_PARENT_ROOT 0xFFFFFFFF // parent is root of the storage
-
// MTP Types
#define MTP_TYPE_UNDEFINED 0x0000 // Undefined
#define MTP_TYPE_INT8 0x0001 // Signed 8-bit integer
diff --git a/media/mtp/mtptest.cpp b/media/mtp/mtptest.cpp
index 8996458..0d9d45a 100644
--- a/media/mtp/mtptest.cpp
+++ b/media/mtp/mtptest.cpp
@@ -21,10 +21,13 @@
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
+#include <sys/ioctl.h>
#include "MtpServer.h"
#include "MtpStorage.h"
+#include "f_mtp.h"
+using namespace android;
static void enable_usb_function(const char* name, bool enable) {
char path[PATH_MAX];
@@ -39,10 +42,13 @@
close(fd);
}
-int main() {
- // first disable UMS and enable MTP USB functions
- enable_usb_function("usb_mass_storage", false);
- enable_usb_function("mtp", true);
+int main(int argc, char* argv[]) {
+ bool usePTP = false;
+
+ for (int i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-p"))
+ usePTP = true;
+ }
int fd = open("/dev/mtp_usb", O_RDWR);
printf("open returned %d\n", fd);
@@ -51,6 +57,19 @@
return -1;
}
+ if (usePTP) {
+ // set driver mode to PTP
+ int ret = ioctl(fd, MTP_SET_INTERFACE_MODE, MTP_INTERFACE_MODE_PTP);
+ if (ret) {
+ fprintf(stderr, "MTP_SET_INTERFACE_MODE failed\n");
+ return -1;
+ }
+ }
+
+ // disable UMS and enable MTP USB functions
+ enable_usb_function("usb_mass_storage", false);
+ enable_usb_function("mtp", true);
+
MtpServer server(fd, "/data/data/mtp/mtp.db");
server.addStorage("/sdcard");
server.scanStorage();
diff --git a/media/mtp/ptptest.cpp b/media/mtp/ptptest.cpp
index 1218fa6e6..5da4d45 100644
--- a/media/mtp/ptptest.cpp
+++ b/media/mtp/ptptest.cpp
@@ -22,6 +22,11 @@
#include <linux/usb/ch9.h>
#include "MtpClient.h"
+#include "MtpDeviceInfo.h"
+#include "MtpObjectInfo.h"
+#include "MtpStorageInfo.h"
+
+using namespace android;
static struct usb_device *sCameraDevice = NULL;
static int sCameraInterface = 0;
@@ -35,7 +40,34 @@
delete sClient;
sClient = new MtpClient(ep_in, ep_out, ep_intr);
sClient->openSession();
- sClient->getDeviceInfo();
+ MtpDeviceInfo* info = sClient->getDeviceInfo();
+ if (info) {
+ info->print();
+ delete info;
+ }
+ MtpStorageIDList* storageIDs = sClient->getStorageIDs();
+ if (storageIDs) {
+ for (int i = 0; i < storageIDs->size(); i++) {
+ MtpStorageID storageID = (*storageIDs)[i];
+ MtpStorageInfo* info = sClient->getStorageInfo(storageID);
+ if (info) {
+ info->print();
+ delete info;
+ }
+ MtpObjectHandleList* objects = sClient->getObjectHandles(storageID, 0, MTP_PARENT_ROOT);
+ if (objects) {
+ for (int j = 0; j < objects->size(); j++) {
+ MtpObjectHandle handle = (*objects)[j];
+ MtpObjectInfo* info = sClient->getObjectInfo(handle);
+ if (info) {
+ info->print();
+ delete info;
+ }
+ }
+ delete objects;
+ }
+ }
+ }
}
static void usb_device_added(const char *devname)
@@ -131,4 +163,4 @@
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/media/mtp/scantest.cpp b/media/mtp/scantest.cpp
new file mode 100644
index 0000000..f910bb6
--- /dev/null
+++ b/media/mtp/scantest.cpp
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+#include <stdio.h>
+
+#include "MtpDatabase.h"
+#include "MtpMediaScanner.h"
+
+using namespace android;
+
+int main(int argc, char* argv[]) {
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <storage path>\n", argv[0]);
+ return -1;
+ }
+
+ MtpDatabase* database = new MtpDatabase();
+ database->open("scantest.db", true);
+
+ MtpMediaScanner scanner(1, argv[1], database);
+ scanner.scanFiles();
+ database->close();
+
+ return 0;
+}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
index 2e599f2..bbd6bea 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
@@ -19,21 +19,20 @@
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
-import java.io.*;
-
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.ShutterCallback;
+import android.os.ConditionVariable;
+import android.os.Environment;
+import android.os.Looper;
import android.test.ActivityInstrumentationTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
import android.view.SurfaceHolder;
-import android.os.ConditionVariable;
-import android.os.Looper;
-
-import android.test.suitebuilder.annotation.LargeTest;
+import java.io.*;
/**
* Junit / Instrumentation test case for the camera api
@@ -153,7 +152,8 @@
try {
if (rawData != null) {
int rawDataLength = rawData.length;
- File rawoutput = new File("/sdcard/test.bmp");
+ File rawoutput = new File(
+ Environment.getExternalStorageDirectory().toString(), "/test.bmp");
FileOutputStream outstream = new FileOutputStream(rawoutput);
outstream.write(rawData);
Log.v(TAG, "JpegPictureCallback rawDataLength = " + rawDataLength);
diff --git a/native/include/android/native_activity.h b/native/include/android/native_activity.h
index 8b09461..328a4b5 100644
--- a/native/include/android/native_activity.h
+++ b/native/include/android/native_activity.h
@@ -27,39 +27,147 @@
extern "C" {
#endif
+// Temporary until native surface API is defined.
+struct android_surface_t;
+typedef struct android_surface_t android_surface_t;
+
struct android_activity_callbacks_t;
+/**
+ * This structure defines the native side of an android.app.NativeActivity.
+ * It is created by the framework, and handed to the application's native
+ * code as it is being launched.
+ */
typedef struct android_activity_t {
+ /**
+ * Pointer to the callback function table of the native application.
+ * You can set the functions here to your own callbacks. The callbacks
+ * pointer itself here should not be changed; it is allocated and managed
+ * for you by the framework.
+ */
struct android_activity_callbacks_t* callbacks;
+ /**
+ * JNI context for the main thread of the app.
+ */
JNIEnv* env;
+
+ /**
+ * The NativeActivity Java class.
+ */
jobject clazz;
+ /**
+ * This is the native instance of the application. It is not used by
+ * the framework, but can be set by the application to its own instance
+ * state.
+ */
void* instance;
} android_activity_t;
+/**
+ * These are the callbacks the framework makes into a native application.
+ * All of these callbacks happen on the main thread of the application.
+ * By default, all callbacks are NULL; set to a pointer to your own function
+ * to have it called.
+ */
typedef struct android_activity_callbacks_t {
+ /**
+ * NativeActivity has started. See Java documentation for Activity.onStart()
+ * for more information.
+ */
void (*onStart)(android_activity_t* activity);
+
+ /**
+ * NativeActivity has resumed. See Java documentation for Activity.onResume()
+ * for more information.
+ */
void (*onResume)(android_activity_t* activity);
+
+ /**
+ * Framework is asking NativeActivity to save its current instance state.
+ * See Java documentation for Activity.onSaveInstanceState() for more
+ * information. The returned pointer needs to be created with malloc();
+ * the framework will call free() on it for you. You also must fill in
+ * outSize with the number of bytes in the allocation. Note that the
+ * saved state will be persisted, so it can not contain any active
+ * entities (pointers to memory, file descriptors, etc).
+ */
void* (*onSaveInstanceState)(android_activity_t* activity, size_t* outSize);
+
+ /**
+ * NativeActivity has paused. See Java documentation for Activity.onPause()
+ * for more information.
+ */
void (*onPause)(android_activity_t* activity);
+
+ /**
+ * NativeActivity has stopped. See Java documentation for Activity.onStop()
+ * for more information.
+ */
void (*onStop)(android_activity_t* activity);
+
+ /**
+ * NativeActivity is being destroyed. See Java documentation for Activity.onDestroy()
+ * for more information.
+ */
void (*onDestroy)(android_activity_t* activity);
- void (*onLowMemory)(android_activity_t* activity);
+ /**
+ * Focus has changed in this NativeActivity's window. This is often used,
+ * for example, to pause a game when it loses input focus.
+ */
void (*onWindowFocusChanged)(android_activity_t* activity, int hasFocus);
+
+ /**
+ * The drawing surface for this native activity has been created. You
+ * can use the given surface object to start drawing. NOTE: surface
+ * drawing API is not yet defined.
+ */
+ void (*onSurfaceCreated)(android_activity_t* activity, android_surface_t* surface);
+
+ /**
+ * The drawing surface for this native activity has changed. The surface
+ * given here is guaranteed to be the same as the one last given to
+ * onSurfaceCreated. This is simply to inform you about interesting
+ * changed to that surface.
+ */
+ void (*onSurfaceChanged)(android_activity_t* activity, android_surface_t* surface,
+ int format, int width, int height);
+
+ /**
+ * The drawing surface for this native activity is going to be destroyed.
+ * You MUST ensure that you do not touch the surface object after returning
+ * from this function: in the common case of drawing to the surface from
+ * another thread, that means the implementation of this callback must
+ * properly synchronize with the other thread to stop its drawing before
+ * returning from here.
+ */
+ void (*onSurfaceDestroyed)(android_activity_t* activity, android_surface_t* surface);
+
+ /**
+ * The system is running low on memory. Use this callback to release
+ * resources you do not need, to help the system avoid killing more
+ * important processes.
+ */
+ void (*onLowMemory)(android_activity_t* activity);
} android_activity_callbacks_t;
+/**
+ * This is the function that must be in the native code to instantiate the
+ * application's native activity. It is called with the activity instance (see
+ * above); if the code is being instantiated from a previously saved instance,
+ * the savedState will be non-NULL and point to the saved data.
+ */
typedef void android_activity_create_t(android_activity_t* activity,
void* savedState, size_t savedStateSize);
+/**
+ * The name of the function that NativeInstance looks for when launching its
+ * native code.
+ */
extern android_activity_create_t android_onCreateActivity;
-#if 0
-extern android_onCreateActivity(android_activity_t activity,
- void* savedState, size_t savedStateSize);
-#endif
-
#ifdef __cplusplus
};
#endif
diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp
index b6e0aae..7cb01d0 100644
--- a/opengl/libagl/egl.cpp
+++ b/opengl/libagl/egl.cpp
@@ -1525,8 +1525,13 @@
}
if (ggl_unlikely(attrib_list==0)) {
- *num_config = 0;
- return EGL_TRUE;
+ /*
+ * A NULL attrib_list should be treated as though it was an empty
+ * one (terminated with EGL_NONE) as defined in
+ * section 3.4.1 "Querying Configurations" in the EGL specification.
+ */
+ static const EGLint dummy = EGL_NONE;
+ attrib_list = &dummy;
}
int numAttributes = 0;
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index e6cf792..ba09d08 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -843,10 +843,12 @@
EGLint patch_index = -1;
GLint attr;
size_t size = 0;
- while ((attr=attrib_list[size]) != EGL_NONE) {
- if (attr == EGL_CONFIG_ID)
- patch_index = size;
- size += 2;
+ if (attrib_list) {
+ while ((attr=attrib_list[size]) != EGL_NONE) {
+ if (attr == EGL_CONFIG_ID)
+ patch_index = size;
+ size += 2;
+ }
}
if (patch_index >= 0) {
size += 2; // we need copy the sentinel as well
diff --git a/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java
index 27706ef..587f9c1 100644
--- a/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -687,8 +687,17 @@
private void showTimeoutDialog() {
int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000;
+ int messageId = R.string.lockscreen_too_many_failed_attempts_dialog_message;;
+ if(getUnlockMode() == UnlockMode.Password) {
+ if(mLockPatternUtils.getKeyguardStoredPasswordQuality() ==
+ DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
+ messageId = R.string.lockscreen_too_many_failed_pin_attempts_dialog_message;
+ } else {
+ messageId = R.string.lockscreen_too_many_failed_password_attempts_dialog_message;
+ }
+ }
String message = mContext.getString(
- R.string.lockscreen_too_many_failed_attempts_dialog_message,
+ messageId,
mUpdateMonitor.getFailedAttempts(),
timeoutInSeconds);
final AlertDialog dialog = new AlertDialog.Builder(mContext)
diff --git a/policy/com/android/internal/policy/impl/PasswordUnlockScreen.java b/policy/com/android/internal/policy/impl/PasswordUnlockScreen.java
index 8f5bb24..c519d82 100644
--- a/policy/com/android/internal/policy/impl/PasswordUnlockScreen.java
+++ b/policy/com/android/internal/policy/impl/PasswordUnlockScreen.java
@@ -198,7 +198,14 @@
@Override
public void onFinish() {
mPasswordEntry.setEnabled(true);
- mTitle.setText(R.string.keyguard_password_enter_password_code);
+ final int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
+ final boolean isAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == quality
+ || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == quality;
+ if(isAlpha) {
+ mTitle.setText(R.string.keyguard_password_enter_password_code);
+ } else {
+ mTitle.setText(R.string.keyguard_password_enter_pin_password_code);
+ }
mKeyboardView.setEnabled(true);
}
}.start();
diff --git a/policy/com/android/internal/policy/impl/PhoneWindow.java b/policy/com/android/internal/policy/impl/PhoneWindow.java
index 20d9f26..0bf0d52 100644
--- a/policy/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/com/android/internal/policy/impl/PhoneWindow.java
@@ -21,6 +21,15 @@
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+
+import com.android.internal.view.BaseSurfaceHolder;
+import com.android.internal.view.RootViewSurfaceTaker;
+import com.android.internal.view.menu.ContextMenuBuilder;
+import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.view.menu.MenuDialogHelper;
+import com.android.internal.view.menu.MenuView;
+import com.android.internal.view.menu.SubMenuBuilder;
+
import android.app.KeyguardManager;
import android.app.SearchManager;
import android.content.ActivityNotFoundException;
@@ -35,6 +44,7 @@
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -53,6 +63,8 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.SurfaceHolder;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewManager;
@@ -100,6 +112,9 @@
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent;
+ SurfaceHolder.Callback mTakeSurfaceCallback;
+ BaseSurfaceHolder mSurfaceHolder;
+
private boolean mIsFloating;
private LayoutInflater mLayoutInflater;
@@ -241,6 +256,11 @@
}
@Override
+ public void takeSurface(SurfaceHolder.Callback callback) {
+ mTakeSurfaceCallback = callback;
+ }
+
+ @Override
public boolean isFloating() {
return mIsFloating;
}
@@ -1558,7 +1578,7 @@
}
}
- private final class DecorView extends FrameLayout {
+ private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
/* package */int mDefaultOpacity = PixelFormat.OPAQUE;
/** The feature ID of the panel, or -1 if this is the application's DecorView */
@@ -2023,6 +2043,23 @@
closeAllPanels();
}
}
+
+ public android.view.SurfaceHolder.Callback willYouTakeTheSurface() {
+ return mFeatureId < 0 ? mTakeSurfaceCallback : null;
+ }
+
+ public void setSurfaceType(int type) {
+ PhoneWindow.this.setType(type);
+ }
+
+ public void setSurfaceFormat(int format) {
+ PhoneWindow.this.setFormat(format);
+ }
+
+ public void setSurfaceKeepScreenOn(boolean keepOn) {
+ if (keepOn) PhoneWindow.this.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ else PhoneWindow.this.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
}
protected DecorView generateDecor() {
diff --git a/services/java/com/android/server/LightsService.java b/services/java/com/android/server/LightsService.java
index c056eef..9b57735 100644
--- a/services/java/com/android/server/LightsService.java
+++ b/services/java/com/android/server/LightsService.java
@@ -17,10 +17,17 @@
package com.android.server;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Handler;
+import android.os.IHardwareService;
+import android.os.ServiceManager;
import android.os.Message;
import android.util.Slog;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
public class LightsService {
private static final String TAG = "LightsService";
@@ -124,11 +131,53 @@
private boolean mFlashing;
}
+ /* This class implements an obsolete API that was removed after eclair and re-added during the
+ * final moments of the froyo release to support flashlight apps that had been using the private
+ * IHardwareService API. This is expected to go away in the next release.
+ */
+ private final IHardwareService.Stub mLegacyFlashlightHack = new IHardwareService.Stub() {
+
+ private static final String FLASHLIGHT_FILE = "/sys/class/leds/spotlight/brightness";
+
+ public boolean getFlashlightEnabled() {
+ try {
+ FileInputStream fis = new FileInputStream(FLASHLIGHT_FILE);
+ int result = fis.read();
+ fis.close();
+ return (result != '0');
+ } catch (Exception e) {
+ Slog.e(TAG, "getFlashlightEnabled failed", e);
+ return false;
+ }
+ }
+
+ public void setFlashlightEnabled(boolean on) {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.FLASHLIGHT)
+ != PackageManager.PERMISSION_GRANTED &&
+ mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires FLASHLIGHT or HARDWARE_TEST permission");
+ }
+ try {
+ FileOutputStream fos = new FileOutputStream(FLASHLIGHT_FILE);
+ byte[] bytes = new byte[2];
+ bytes[0] = (byte)(on ? '1' : '0');
+ bytes[1] = '\n';
+ fos.write(bytes);
+ fos.close();
+ } catch (Exception e) {
+ Slog.e(TAG, "setFlashlightEnabled failed", e);
+ }
+ }
+ };
+
LightsService(Context context) {
mNativePointer = init_native();
mContext = context;
+ ServiceManager.addService("hardware", mLegacyFlashlightHack);
+
for (int i = 0; i < LIGHT_ID_COUNT; i++) {
mLights[i] = new Light(i);
}
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index c10a7e8..599023c 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -5082,7 +5082,8 @@
}
}
- private InstallArgs createInstallArgs(Uri packageURI, int flags, String pkgName) {
+ private InstallArgs createInstallArgs(Uri packageURI, int flags,
+ String pkgName) {
if (installOnSd(flags)) {
String cid = getNextCodePath(null, pkgName, "/" + SdInstallArgs.RES_FILE_NAME);
return new SdInstallArgs(packageURI, cid);
@@ -5342,6 +5343,7 @@
SdInstallArgs(String cid) {
super(null, null, PackageManager.INSTALL_EXTERNAL, null);
this.cid = cid;
+ cachePath = PackageHelper.getSdDir(cid);
}
SdInstallArgs(Uri packageURI, String cid) {
@@ -9608,7 +9610,10 @@
}
if (DEBUG_SD_INSTALL) Log.i(TAG, "Looking for pkg : " + pkgName);
PackageSetting ps = mSettings.mPackages.get(pkgName);
- if (ps != null && ps.codePathString != null) {
+ // The package status is changed only if the code path
+ // matches between settings and the container id.
+ if (ps != null && ps.codePathString != null &&
+ ps.codePathString.equals(args.getCodePath())) {
if (DEBUG_SD_INSTALL) Log.i(TAG, "Container : " + cid +
" corresponds to pkg : " + pkgName +
" at code path: " + ps.codePathString);
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index c0a4491..8d6ad93 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -872,7 +872,7 @@
value = mWifiStateTracker.getNetworkVariable(netId, WifiConfiguration.ssidVarName);
if (!TextUtils.isEmpty(value)) {
- config.SSID = removeDoubleQuotes(value);
+ config.SSID = value;
} else {
config.SSID = null;
}
@@ -1062,7 +1062,7 @@
!mWifiStateTracker.setNetworkVariable(
netId,
WifiConfiguration.ssidVarName,
- convertToQuotedString(config.SSID))) {
+ config.SSID)) {
if (DBG) {
Slog.d(TAG, "failed to set SSID: "+config.SSID);
}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 666ad72..90f0ad0 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -732,7 +732,8 @@
return "";
}
- if ((bytes[offset] & 0xff) == TOA_International) {
+ //Only TON field should be taken in consideration
+ if ((bytes[offset] & 0xf0) == (TOA_International & 0xf0)) {
prependPlus = true;
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 1f00885..35a2c19 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -57,7 +57,7 @@
public static final int STATE_EMERGENCY_ONLY = 2;
/**
- * Radio of telephony is explictly powered off.
+ * Radio of telephony is explicitly powered off.
*/
public static final int STATE_POWER_OFF = 3;
@@ -220,7 +220,8 @@
return 0;
}
- public static final Parcelable.Creator<ServiceState> CREATOR = new Parcelable.Creator() {
+ public static final Parcelable.Creator<ServiceState> CREATOR =
+ new Parcelable.Creator<ServiceState>() {
public ServiceState createFromParcel(Parcel in) {
return new ServiceState(in);
}
@@ -231,7 +232,7 @@
};
/**
- * Get current servcie state of phone
+ * Get current service state of phone
*
* @see #STATE_IN_SERVICE
* @see #STATE_OUT_OF_SERVICE
@@ -290,10 +291,10 @@
}
/**
- * Get current registered operator name in long alphanumeric format
+ * Get current registered operator name in long alphanumeric format.
*
- * In GSM/UMTS, long format can be upto 16 characters long
- * In CDMA, returns the ERI text, if set, otherwise the ONS
+ * In GSM/UMTS, long format can be up to 16 characters long.
+ * In CDMA, returns the ERI text, if set. Otherwise, returns the ONS.
*
* @return long name of operator, null if unregistered or unknown
*/
@@ -302,9 +303,9 @@
}
/**
- * Get current registered operator name in short lphanumeric format
+ * Get current registered operator name in short alphanumeric format.
*
- * In GSM/UMST, short format can be upto 8 characters long
+ * In GSM/UMTS, short format can be up to 8 characters long.
*
* @return short name of operator, null if unregistered or unknown
*/
@@ -313,21 +314,23 @@
}
/**
- * Get current registered operator numeric id
+ * Get current registered operator numeric id.
*
* In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit
- * network code
- *
- * The country code can be decoded using MccTable.countryCodeForMcc()
+ * network code.
*
* @return numeric format of operator, null if unregistered or unknown
*/
+ /*
+ * The country code can be decoded using
+ * {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}.
+ */
public String getOperatorNumeric() {
return mOperatorNumeric;
}
/**
- * Get current network selection mode
+ * Get current network selection mode.
*
* @return true if manual mode, false if automatic mode
*/
@@ -458,7 +461,7 @@
mIsEmergencyOnly = false;
}
- // TODO - can't this be combined with the above func..
+ // TODO - can't this be combined with the above method?
public void setStateOff() {
mState = STATE_POWER_OFF;
mRoaming = false;
@@ -528,8 +531,8 @@
}
/**
- * In CDMA mOperatorAlphaLong can be set from the ERI
- * text, this is done from the CDMAPhone and not from the CdmaServiceStateTracker
+ * In CDMA, mOperatorAlphaLong can be set from the ERI text.
+ * This is done from the CDMAPhone and not from the CdmaServiceStateTracker.
*
* @hide
*/
@@ -542,7 +545,7 @@
}
/**
- * Test whether two objects hold the same data values or both are null
+ * Test whether two objects hold the same data values or both are null.
*
* @param a first obj
* @param b second obj
@@ -553,7 +556,7 @@
}
/**
- * Set ServiceState based on intent notifier map
+ * Set ServiceState based on intent notifier map.
*
* @param m intent notifier map
* @hide
@@ -575,7 +578,7 @@
}
/**
- * Set intent notifier Bundle based on service state
+ * Set intent notifier Bundle based on service state.
*
* @param m intent notifier Bundle
* @hide
diff --git a/telephony/java/android/telephony/gsm/SmsManager.java b/telephony/java/android/telephony/gsm/SmsManager.java
index 241c485..3b75298 100644
--- a/telephony/java/android/telephony/gsm/SmsManager.java
+++ b/telephony/java/android/telephony/gsm/SmsManager.java
@@ -56,7 +56,7 @@
* the current default SMSC
* @param text the body of the message to send
* @param sentIntent if not NULL this <code>PendingIntent</code> is
- * broadcast when the message is sucessfully sent, or failed.
+ * broadcast when the message is successfully sent, or failed.
* The result code will be <code>Activity.RESULT_OK<code> for success,
* or one of these errors:
* <code>RESULT_ERROR_GENERIC_FAILURE</code>
diff --git a/telephony/java/com/android/internal/telephony/AdnRecord.java b/telephony/java/com/android/internal/telephony/AdnRecord.java
index 0896ba6..1bf2d3c 100644
--- a/telephony/java/com/android/internal/telephony/AdnRecord.java
+++ b/telephony/java/com/android/internal/telephony/AdnRecord.java
@@ -19,10 +19,9 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
import android.util.Log;
-import com.android.internal.telephony.GsmAlphabet;
-
import java.util.Arrays;
@@ -38,8 +37,8 @@
//***** Instance Variables
- String alphaTag = "";
- String number = "";
+ String alphaTag = null;
+ String number = null;
String[] emails;
int extRecord = 0xff;
int efid; // or 0 if none
@@ -63,8 +62,8 @@
// ADN offset
static final int ADN_BCD_NUMBER_LENGTH = 0;
static final int ADN_TON_AND_NPI = 1;
- static final int ADN_DAILING_NUMBER_START = 2;
- static final int ADN_DAILING_NUMBER_END = 11;
+ static final int ADN_DIALING_NUMBER_START = 2;
+ static final int ADN_DIALING_NUMBER_END = 11;
static final int ADN_CAPABILITY_ID = 12;
static final int ADN_EXTENSION_ID = 13;
@@ -152,17 +151,31 @@
}
public boolean isEmpty() {
- return alphaTag.equals("") && number.equals("") && emails == null;
+ return TextUtils.isEmpty(alphaTag) && TextUtils.isEmpty(number) && emails == null;
}
public boolean hasExtendedRecord() {
return extRecord != 0 && extRecord != 0xff;
}
+ /** Helper function for {@link #isEqual}. */
+ private static boolean stringCompareNullEqualsEmpty(String s1, String s2) {
+ if (s1 == s2) {
+ return true;
+ }
+ if (s1 == null) {
+ s1 = "";
+ }
+ if (s2 == null) {
+ s2 = "";
+ }
+ return (s1.equals(s2));
+ }
+
public boolean isEqual(AdnRecord adn) {
- return ( alphaTag.equals(adn.getAlphaTag()) &&
- number.equals(adn.getNumber()) &&
- Arrays.equals(emails, adn.getEmails()));
+ return ( stringCompareNullEqualsEmpty(alphaTag, adn.alphaTag) &&
+ stringCompareNullEqualsEmpty(number, adn.number) &&
+ Arrays.equals(emails, adn.emails));
}
//***** Parcelable Implementation
@@ -184,36 +197,33 @@
*
* @param recordSize is the size X of EF record
* @return hex byte[recordSize] to be written to EF record
- * return nulll for wrong format of dialing nubmer or tag
+ * return null for wrong format of dialing number or tag
*/
public byte[] buildAdnString(int recordSize) {
byte[] bcdNumber;
byte[] byteTag;
- byte[] adnString = null;
+ byte[] adnString;
int footerOffset = recordSize - FOOTER_SIZE_BYTES;
- if (number == null || number.equals("") ||
- alphaTag == null || alphaTag.equals("")) {
+ // create an empty record
+ adnString = new byte[recordSize];
+ for (int i = 0; i < recordSize; i++) {
+ adnString[i] = (byte) 0xFF;
+ }
- Log.w(LOG_TAG, "[buildAdnString] Empty alpha tag or number");
- adnString = new byte[recordSize];
- for (int i = 0; i < recordSize; i++) {
- adnString[i] = (byte) 0xFF;
- }
+ if (TextUtils.isEmpty(number)) {
+ Log.w(LOG_TAG, "[buildAdnString] Empty dialing number");
+ return adnString; // return the empty record (for delete)
} else if (number.length()
- > (ADN_DAILING_NUMBER_END - ADN_DAILING_NUMBER_START + 1) * 2) {
+ > (ADN_DIALING_NUMBER_END - ADN_DIALING_NUMBER_START + 1) * 2) {
Log.w(LOG_TAG,
- "[buildAdnString] Max length of dailing number is 20");
- } else if (alphaTag.length() > footerOffset) {
+ "[buildAdnString] Max length of dialing number is 20");
+ return null;
+ } else if (alphaTag != null && alphaTag.length() > footerOffset) {
Log.w(LOG_TAG,
"[buildAdnString] Max length of tag is " + footerOffset);
+ return null;
} else {
-
- adnString = new byte[recordSize];
- for (int i = 0; i < recordSize; i++) {
- adnString[i] = (byte) 0xFF;
- }
-
bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(number);
System.arraycopy(bcdNumber, 0, adnString,
@@ -222,16 +232,17 @@
adnString[footerOffset + ADN_BCD_NUMBER_LENGTH]
= (byte) (bcdNumber.length);
adnString[footerOffset + ADN_CAPABILITY_ID]
- = (byte) 0xFF; // Capacility Id
+ = (byte) 0xFF; // Capability Id
adnString[footerOffset + ADN_EXTENSION_ID]
= (byte) 0xFF; // Extension Record Id
- byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag);
- System.arraycopy(byteTag, 0, adnString, 0, byteTag.length);
+ if (!TextUtils.isEmpty(alphaTag)) {
+ byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag);
+ System.arraycopy(byteTag, 0, adnString, 0, byteTag.length);
+ }
+ return adnString;
}
-
- return adnString;
}
/**
diff --git a/telephony/java/com/android/internal/telephony/AdnRecordLoader.java b/telephony/java/com/android/internal/telephony/AdnRecordLoader.java
index cfb5aaa..55bdc06 100644
--- a/telephony/java/com/android/internal/telephony/AdnRecordLoader.java
+++ b/telephony/java/com/android/internal/telephony/AdnRecordLoader.java
@@ -106,7 +106,7 @@
* It will get the record size of EF record and compose hex adn array
* then write the hex array to EF record
*
- * @param adn is set with alphaTag and phoneNubmer
+ * @param adn is set with alphaTag and phone number
* @param ef EF fileid
* @param extensionEF extension EF fileid
* @param recordNumber 1-based record index
@@ -159,7 +159,7 @@
data = adn.buildAdnString(recordSize[0]);
if(data == null) {
- throw new RuntimeException("worong ADN format",
+ throw new RuntimeException("wrong ADN format",
ar.exception);
}
@@ -218,7 +218,7 @@
throw new RuntimeException("load failed", ar.exception);
}
- Log.d(LOG_TAG,"ADN extention EF: 0x"
+ Log.d(LOG_TAG,"ADN extension EF: 0x"
+ Integer.toHexString(extensionEF)
+ ":" + adn.extRecord
+ "\n" + IccUtils.bytesToHexString(data));
diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
index 802e79b..798a5a5 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
@@ -284,7 +284,7 @@
*/
public static CallerInfoAsyncQuery startQuery(int token, Context context, String number,
OnQueryCompleteListener listener, Object cookie) {
- //contruct the URI object and start Query.
+ //construct the URI object and start Query.
Uri contactRef = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
CallerInfoAsyncQuery c = new CallerInfoAsyncQuery();
diff --git a/telephony/java/com/android/internal/telephony/Connection.java b/telephony/java/com/android/internal/telephony/Connection.java
index 0bcb63a..11d0b1b 100644
--- a/telephony/java/com/android/internal/telephony/Connection.java
+++ b/telephony/java/com/android/internal/telephony/Connection.java
@@ -45,7 +45,7 @@
POWER_OFF, /* radio is turned off explicitly */
OUT_OF_SERVICE, /* out of service */
ICC_ERROR, /* No ICC, ICC locked, or other ICC error */
- CALL_BARRED, /* call was blocked by call barrring */
+ CALL_BARRED, /* call was blocked by call barring */
FDN_BLOCKED, /* call was blocked by fixed dial number */
CS_RESTRICTED, /* call was blocked by restricted all voice access */
CS_RESTRICTED_NORMAL, /* call was blocked by restricted normal voice access */
@@ -56,7 +56,7 @@
CDMA_INTERCEPT, /* INTERCEPT order received, MS state idle entered */
CDMA_REORDER, /* MS has been redirected, call is cancelled */
CDMA_SO_REJECT, /* service option rejection */
- CDMA_RETRY_ORDER, /* requeseted service is rejected, retry delay is set */
+ CDMA_RETRY_ORDER, /* requested service is rejected, retry delay is set */
CDMA_ACCESS_FAILURE,
CDMA_PREEMPTED,
CDMA_NOT_EMERGENCY, /* not an emergency call */
@@ -69,8 +69,8 @@
/* Instance Methods */
/**
- * Gets address (e.g., phone number) associated with connection
- * TODO: distinguish reasons for unavailablity
+ * Gets address (e.g. phone number) associated with connection.
+ * TODO: distinguish reasons for unavailability
*
* @return address or null if unavailable
*/
@@ -78,7 +78,7 @@
public abstract String getAddress();
/**
- * Gets cdma CNAP name associated with connection
+ * Gets CDMA CNAP name associated with connection.
* @return cnap name or null if unavailable
*/
public String getCnapName() {
@@ -86,15 +86,15 @@
}
/**
- * Get orignal dial string
- * @return orignal dial string or null if unavailable
+ * Get original dial string.
+ * @return original dial string or null if unavailable
*/
public String getOrigDialString(){
return null;
}
/**
- * Gets cdma CNAP presentation associated with connection
+ * Gets CDMA CNAP presentation associated with connection.
* @return cnap name or null if unavailable
*/
@@ -116,45 +116,45 @@
public abstract long getCreateTime();
/**
- * Connection connect time in currentTimeMillis() format
- * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition
- * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition
- * Returns 0 before then
+ * Connection connect time in currentTimeMillis() format.
+ * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition.
+ * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition.
+ * Returns 0 before then.
*/
public abstract long getConnectTime();
/**
- * Disconnect time in currentTimeMillis() format
- * The time when this Connection makes a transition into ENDED or FAIL
- * Returns 0 before then
+ * Disconnect time in currentTimeMillis() format.
+ * The time when this Connection makes a transition into ENDED or FAIL.
+ * Returns 0 before then.
*/
public abstract long getDisconnectTime();
/**
- * returns the number of milliseconds the call has been connected,
+ * Returns the number of milliseconds the call has been connected,
* or 0 if the call has never connected.
* If the call is still connected, then returns the elapsed
- * time since connect
+ * time since connect.
*/
public abstract long getDurationMillis();
/**
* If this connection is HOLDING, return the number of milliseconds
- * that it has been on hold for (approximently)
- * If this connection is in any other state, return 0
+ * that it has been on hold for (approximately).
+ * If this connection is in any other state, return 0.
*/
public abstract long getHoldDurationMillis();
/**
- * Returns "NOT_DISCONNECTED" if not yet disconnected
+ * Returns "NOT_DISCONNECTED" if not yet disconnected.
*/
public abstract DisconnectCause getDisconnectCause();
/**
* Returns true of this connection originated elsewhere
* ("MT" or mobile terminated; another party called this terminal)
- * or false if this call originated here (MO or mobile originated)
+ * or false if this call originated here (MO or mobile originated).
*/
public abstract boolean isIncoming();
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index 1f8bbcf..6634017 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -164,7 +164,7 @@
NONE,
OPERATOR_BARRED,
INSUFFICIENT_RESOURCES,
- MISSING_UKNOWN_APN,
+ MISSING_UNKNOWN_APN,
UNKNOWN_PDP_ADDRESS,
USER_AUTHENTICATION,
ACTIVATION_REJECT_GGSN,
@@ -181,7 +181,7 @@
RADIO_NOT_AVAILABLE;
public boolean isPermanentFail() {
- return (this == OPERATOR_BARRED) || (this == MISSING_UKNOWN_APN) ||
+ return (this == OPERATOR_BARRED) || (this == MISSING_UNKNOWN_APN) ||
(this == UNKNOWN_PDP_ADDRESS) || (this == USER_AUTHENTICATION) ||
(this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) ||
(this == SERVICE_OPTION_NOT_SUPPORTED) ||
@@ -208,12 +208,12 @@
return "Operator Barred";
case INSUFFICIENT_RESOURCES:
return "Insufficient Resources";
- case MISSING_UKNOWN_APN:
+ case MISSING_UNKNOWN_APN:
return "Missing / Unknown APN";
case UNKNOWN_PDP_ADDRESS:
return "Unknown PDP Address";
case USER_AUTHENTICATION:
- return "Error User Autentication";
+ return "Error User Authentication";
case ACTIVATION_REJECT_GGSN:
return "Activation Reject GGSN";
case ACTIVATION_REJECT_UNSPECIFIED:
diff --git a/telephony/java/com/android/internal/telephony/IccProvider.java b/telephony/java/com/android/internal/telephony/IccProvider.java
index fa91457..3471ec2 100644
--- a/telephony/java/com/android/internal/telephony/IccProvider.java
+++ b/telephony/java/com/android/internal/telephony/IccProvider.java
@@ -417,11 +417,11 @@
}
}
- if (TextUtils.isEmpty(tag)) {
+ if (TextUtils.isEmpty(number)) {
return 0;
}
- if (efType == FDN && TextUtils.isEmpty(pin2)) {
+ if (efType == IccConstants.EF_FDN && TextUtils.isEmpty(pin2)) {
return 0;
}
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index f14ab70..23325f6 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -243,15 +243,14 @@
/**
* Get the current DataState. No change notification exists at this
* interface -- use
- * {@link com.android.telephony.PhoneStateListener PhoneStateListener}
- * instead.
+ * {@link android.telephony.PhoneStateListener} instead.
*/
DataState getDataConnectionState();
/**
* Get the current DataActivityState. No change notification exists at this
* interface -- use
- * {@link TelephonyManager} instead.
+ * {@link android.telephony.TelephonyManager} instead.
*/
DataActivityState getDataActivityState();
@@ -853,7 +852,7 @@
* @param dtmfString is string representing the dialing digit(s) in the active call
* @param on the DTMF ON length in milliseconds, or 0 for default
* @param off the DTMF OFF length in milliseconds, or 0 for default
- * @param onCompelte is the callback message when the action is processed by BP
+ * @param onComplete is the callback message when the action is processed by BP
*
*/
void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete);
@@ -993,7 +992,7 @@
* ((AsyncResult)onComplete.obj) is an array of int, with a length of 2.
*
* @param onComplete a callback message when the action is completed.
- * @see com.android.internal.telephony.CommandsInterface.getCLIR for details.
+ * @see com.android.internal.telephony.CommandsInterface#getCLIR for details.
*/
void getOutgoingCallerIdDisplay(Message onComplete);
@@ -1015,7 +1014,7 @@
* ((AsyncResult)onComplete.obj) is an array of int, with a length of 1.
*
* @param onComplete a callback message when the action is completed.
- * @see com.android.internal.telephony.CommandsInterface.queryCallWaiting for details.
+ * @see com.android.internal.telephony.CommandsInterface#queryCallWaiting for details.
*/
void getCallWaiting(Message onComplete);
@@ -1458,7 +1457,7 @@
* setTTYMode
* sets a TTY mode option.
*
- * @param enable is a boolean representing the state that you are
+ * @param ttyMode is a boolean representing the state that you are
* requesting, true for enabled, false for disabled.
* @param onComplete a callback message when the action is completed
*/
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index a8f4143..74601e6 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -543,7 +543,7 @@
private void setPropertiesByCarrier() {
String carrier = SystemProperties.get("ro.carrier");
- if (null == carrier || 0 == carrier.length()) {
+ if (null == carrier || 0 == carrier.length() || "unknown".equals(carrier)) {
return;
}
diff --git a/telephony/java/com/android/internal/telephony/PhoneSubInfo.java b/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
index 1ac2da3..4f71bb1 100644
--- a/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
+++ b/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
@@ -65,7 +65,7 @@
}
/**
- * Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones.
+ * Retrieves the unique subscriber ID, e.g., IMSI for GSM phones.
*/
public String getSubscriberId() {
mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
diff --git a/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java b/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
index adfbe20..202ded2 100644
--- a/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
@@ -47,7 +47,7 @@
}
/**
- * Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones.
+ * Retrieves the unique subscriber ID, e.g., IMSI for GSM phones.
*/
public String getSubscriberId() {
return mPhoneSubInfo.getSubscriberId();
diff --git a/telephony/java/com/android/internal/telephony/RetryManager.java b/telephony/java/com/android/internal/telephony/RetryManager.java
index 779f358..b1049a2 100644
--- a/telephony/java/com/android/internal/telephony/RetryManager.java
+++ b/telephony/java/com/android/internal/telephony/RetryManager.java
@@ -25,7 +25,7 @@
/**
* Retry manager allows a simple way to declare a series of
- * retires timeouts. After creating a RetryManager the configure
+ * retry timeouts. After creating a RetryManager the configure
* method is used to define the sequence. A simple linear series
* may be initialized using configure with three integer parameters
* The other configure method allows a series to be declared using
@@ -54,18 +54,18 @@
*<p>
* Examples:
* <ul>
- * <li>3 retires with no randomization value which means its 0:
+ * <li>3 retries with no randomization value which means its 0:
* <ul><li><code>"1000, 2000, 3000"</code></ul>
*
- * <li>10 retires with a 500 default randomization value for each and
+ * <li>10 retries with a 500 default randomization value for each and
* the 4..10 retries all using 3000 as the delay:
* <ul><li><code>"max_retries=10, default_randomization=500, 1000, 2000, 3000"</code></ul>
*
- * <li>4 retires with a 100 as the default randomization value for the first 2 values and
+ * <li>4 retries with a 100 as the default randomization value for the first 2 values and
* the other two having specified values of 500:
* <ul><li><code>"default_randomization=100, 1000, 2000, 4000:500, 5000:500"</code></ul>
*
- * <li>Infinite number of retires with the first one at 1000, the second at 2000 all
+ * <li>Infinite number of retries with the first one at 1000, the second at 2000 all
* others will be at 3000.
* <ul><li><code>"max_retries=infinite,1000,2000,3000</code></ul>
* </ul>
@@ -75,9 +75,6 @@
public class RetryManager {
static public final String LOG_TAG = "RetryManager";
static public final boolean DBG = false;
- static public final int RETRYIES_NOT_STARTED = 0;
- static public final int RETRYIES_ON_GOING = 1;
- static public final int RETRYIES_COMPLETED = 2;
/**
* Retry record with times in milli-seconds
@@ -104,7 +101,7 @@
*/
private int mMaxRetryCount;
- /** The current number of retires */
+ /** The current number of retries */
private int mRetryCount;
/** Random number generator */
@@ -125,7 +122,7 @@
* @param randomizationTime a random value between 0 and
* randomizationTime will be added to retryTime. this
* parameter may be 0.
- * @return true if successfull
+ * @return true if successful
*/
public boolean configure(int maxRetryCount, int retryTime, int randomizationTime) {
Pair<Boolean, Integer> value;
@@ -242,7 +239,7 @@
/**
* Report whether data reconnection should be retried
*
- * @return {@code true} if the max retires has not been reached. {@code
+ * @return {@code true} if the max retries has not been reached. {@code
* false} otherwise.
*/
public boolean isRetryNeeded() {
@@ -289,7 +286,7 @@
if (mRetryCount > mMaxRetryCount) {
mRetryCount = mMaxRetryCount;
}
- if (DBG) log("increseRetryCount: " + mRetryCount);
+ if (DBG) log("increaseRetryCount: " + mRetryCount);
}
/**
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index 706f260..e8bbe5e 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -207,8 +207,8 @@
}
/**
- * Reregister network through toggle perferred network type
- * This is a work aorund to deregister and register network since there is
+ * Re-register network by toggling preferred network type.
+ * This is a work-around to deregister and register network since there is
* no ril api to set COPS=2 (deregister) only.
*
* @param onComplete is dispatched when this is complete. it will be
@@ -230,7 +230,7 @@
/**
* These two flags manage the behavior of the cell lock -- the
* lock should be held if either flag is true. The intention is
- * to allow temporary aquisition of the lock to get a single
+ * to allow temporary acquisition of the lock to get a single
* update. Such a lock grab and release can thus be made to not
* interfere with more permanent lock holds -- in other words, the
* lock will only be released if both flags are false, and so
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index 1005d20..3669e60 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -61,7 +61,7 @@
RegistrantList callWaitingRegistrants = new RegistrantList();
- // connections dropped durin last poll
+ // connections dropped during last poll
ArrayList<CdmaConnection> droppedDuringPoll
= new ArrayList<CdmaConnection>(MAX_CONNECTIONS);
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 217e1e8..9f2a44b 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -114,7 +114,7 @@
// if we have no active Apn this is null
protected ApnSetting mActiveApn;
- // Possibly promoate to base class, the only difference is
+ // Possibly promote to base class, the only difference is
// the INTENT_RECONNECT_ALARM action is a different string.
// Do consider technology changes if it is promoted.
BroadcastReceiver mIntentReceiver = new BroadcastReceiver ()
@@ -420,7 +420,7 @@
CdmaDataConnection conn = findFreeDataConnection();
if (conn == null) {
- if (DBG) log("setupData: No free CdmaDataConnectionfound!");
+ if (DBG) log("setupData: No free CdmaDataConnection found!");
return false;
}
@@ -646,7 +646,7 @@
}
/**
- * @override com.android.intenral.telephony.DataConnectionTracker
+ * @override com.android.internal.telephony.DataConnectionTracker
*/
@Override
protected void onEnableNewApn() {
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index 6c71584..2cad6cc 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -66,7 +66,7 @@
CdmaCellLocation cellLoc;
CdmaCellLocation newCellLoc;
- /** if time between NTIZ updates is less than mNitzUpdateSpacing the update may be ignored. */
+ /** if time between NITZ updates is less than mNitzUpdateSpacing the update may be ignored. */
private static final int NITZ_UPDATE_SPACING_DEFAULT = 1000 * 60 * 10;
private int mNitzUpdateSpacing = SystemProperties.getInt("ro.nitz_update_spacing",
NITZ_UPDATE_SPACING_DEFAULT);
@@ -395,7 +395,7 @@
}
// Release any temporary cell lock, which could have been
- // aquired to allow a single-shot location update.
+ // acquired to allow a single-shot location update.
disableSingleLocationUpdate();
break;
@@ -591,7 +591,7 @@
boolean showPlmn = false;
int rule = 0;
if (cm.getRadioState().isRUIMReady()) {
- // TODO RUIM SPN is not implemnted, EF_SPN has to be read and Display Condition
+ // TODO RUIM SPN is not implemented, EF_SPN has to be read and Display Condition
// Character Encoding, Language Indicator and SPN has to be set
// rule = phone.mRuimRecords.getDisplayRule(ss.getOperatorNumeric());
// spn = phone.mSIMRecords.getServiceProvideName();
@@ -872,7 +872,6 @@
* and start over again if the radio notifies us that some
* event has changed
*/
-
private void
pollState() {
pollingContext = new int[1];
@@ -1260,7 +1259,7 @@
return ServiceState.STATE_IN_SERVICE;
case 2: // 2 is "searching", fall through
case 3: // 3 is "registration denied", fall through
- case 4: // 4 is "unknown" no vaild in current baseband
+ case 4: // 4 is "unknown", not valid in current baseband
return ServiceState.STATE_OUT_OF_SERVICE;
case 5:// 5 is "Registered, roaming"
return ServiceState.STATE_IN_SERVICE;
@@ -1299,12 +1298,12 @@
*/
private boolean isRoamIndForHomeSystem(String roamInd) {
// retrieve the carrier-specified list of ERIs for home system
- String homeRoamIndcators = SystemProperties.get("ro.cdma.homesystem");
+ String homeRoamIndicators = SystemProperties.get("ro.cdma.homesystem");
- if (!TextUtils.isEmpty(homeRoamIndcators)) {
+ if (!TextUtils.isEmpty(homeRoamIndicators)) {
// searches through the comma-separated list for a match,
// return true if one is found.
- for (String homeRoamInd : homeRoamIndcators.split(",")) {
+ for (String homeRoamInd : homeRoamIndicators.split(",")) {
if (homeRoamInd.equals(roamInd)) {
return true;
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index be6d27331..65d87f5 100755
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -309,7 +309,7 @@
}
/**
- * Get an SMS-SUBMIT PDU for a data message to a destination address & port
+ * Get an SMS-SUBMIT PDU for a data message to a destination address and port.
*
* @param scAddr Service Centre address. null == use default
* @param destAddr the address of the destination for the message
diff --git a/telephony/java/com/android/internal/telephony/cdma/TtyIntent.java b/telephony/java/com/android/internal/telephony/cdma/TtyIntent.java
index 3813b1d..4907aa9 100644
--- a/telephony/java/com/android/internal/telephony/cdma/TtyIntent.java
+++ b/telephony/java/com/android/internal/telephony/cdma/TtyIntent.java
@@ -56,10 +56,10 @@
/**
* The lookup key for an int that indicates preferred TTY mode.
* Valid modes are:
- * - {@link Phone.TTY_MODE_OFF}
- * - {@link Phone.TTY_MODE_FULL}
- * - {@link Phone.TTY_MODE_HCO}
- * - {@link Phone.TTY_MODE_VCO}
+ * - {@link com.android.internal.telephony.Phone#TTY_MODE_OFF}
+ * - {@link com.android.internal.telephony.Phone#TTY_MODE_FULL}
+ * - {@link com.android.internal.telephony.Phone#TTY_MODE_HCO}
+ * - {@link com.android.internal.telephony.Phone#TTY_MODE_VCO}
*
* {@hide}
*/
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
index 22fc13e..06f310c 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
@@ -66,7 +66,7 @@
RegistrantList voiceCallStartedRegistrants = new RegistrantList();
- // connections dropped durin last poll
+ // connections dropped during last poll
ArrayList<GsmConnection> droppedDuringPoll
= new ArrayList<GsmConnection>(MAX_CONNECTIONS);
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
index d893ec4..09d46dd 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
@@ -134,7 +134,7 @@
cause = FailCause.INSUFFICIENT_RESOURCES;
break;
case PDP_FAIL_MISSING_UKNOWN_APN:
- cause = FailCause.MISSING_UKNOWN_APN;
+ cause = FailCause.MISSING_UNKNOWN_APN;
break;
case PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE:
cause = FailCause.UNKNOWN_PDP_ADDRESS;
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index cbfb550..9bc0b26 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -45,7 +45,6 @@
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
-import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
@@ -150,9 +149,9 @@
static final String APN_ID = "apn_id";
private boolean canSetPreferApn = false;
- // for tracking retrys on the default APN
+ // for tracking retries on the default APN
private RetryManager mDefaultRetryManager;
- // for tracking retrys on a secondary APN
+ // for tracking retries on a secondary APN
private RetryManager mSecondaryRetryManager;
BroadcastReceiver mIntentReceiver = new BroadcastReceiver ()
@@ -189,8 +188,8 @@
WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
if (!enabled) {
- // when wifi got disabeled, the NETWORK_STATE_CHANGED_ACTION
- // quit and wont report disconnected til next enalbing.
+ // when wifi got disabled, the NETWORK_STATE_CHANGED_ACTION
+ // quit and won't report disconnected til next enabling.
mIsWifiConnected = false;
}
}
@@ -447,7 +446,7 @@
waitingApns = buildWaitingApns();
if (waitingApns.isEmpty()) {
if (DBG) log("No APN found");
- notifyNoData(GsmDataConnection.FailCause.MISSING_UKNOWN_APN);
+ notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
return false;
} else {
log ("Create from allApns : " + apnListToString(allApns));
@@ -1125,7 +1124,7 @@
if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) {
SystemProperties.set("gsm.defaultpdpcontext.active", "true");
if (canSetPreferApn && preferredApn == null) {
- Log.d(LOG_TAG, "PREFERED APN is null");
+ Log.d(LOG_TAG, "PREFERRED APN is null");
preferredApn = mActiveApn;
setPreferredApn(preferredApn.id);
}
@@ -1275,7 +1274,7 @@
if (allApns.isEmpty()) {
if (DBG) log("No APN found for carrier: " + operator);
preferredApn = null;
- notifyNoData(GsmDataConnection.FailCause.MISSING_UKNOWN_APN);
+ notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
} else {
preferredApn = getPreferredApn();
Log.d(LOG_TAG, "Get PreferredAPN");
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
index cacf057..aa16fa3 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
@@ -39,7 +39,7 @@
* {@hide}
*
*/
-public final class GsmMmiCode extends Handler implements MmiCode {
+public final class GsmMmiCode extends Handler implements MmiCode {
static final String LOG_TAG = "GSM";
//***** Constants
@@ -51,7 +51,7 @@
static final String ACTION_REGISTER = "**";
static final String ACTION_ERASURE = "##";
- // Supp Service cocdes from TS 22.030 Annex B
+ // Supp Service codes from TS 22.030 Annex B
//Called line presentation
static final String SC_CLIP = "30";
@@ -154,7 +154,7 @@
/**
* Some dial strings in GSM are defined to do non-call setup
- * things, such as modify or query supplementry service settings (eg, call
+ * things, such as modify or query supplementary service settings (eg, call
* forwarding). These are generally referred to as "MMI codes".
* We look to see if the dial string contains a valid MMI code (potentially
* with a dial string at the end as well) and return info here.
@@ -457,12 +457,13 @@
&& !PhoneNumberUtils.isEmergencyNumber(dialString)
&& (phone.isInCall()
|| !((dialString.length() == 2 && dialString.charAt(0) == '1')
- /* While contrary to TS 22.030, there is strong precendence
+ /* While contrary to TS 22.030, there is strong precedence
* for treating "0" and "00" as call setup strings.
*/
|| dialString.equals("0")
|| dialString.equals("00"))));
}
+
/**
* @return true if the Service Code is PIN/PIN2/PUK/PUK2-related
*/
@@ -472,13 +473,12 @@
}
/**
- * *See TS 22.030 Annex B
+ * See TS 22.030 Annex B.
* In temporary mode, to suppress CLIR for a single call, enter:
- * " * 31 # <called number> SEND "
+ * " * 31 # [called number] SEND "
* In temporary mode, to invoke CLIR for a single call enter:
- * " # 31 # <called number> SEND "
+ * " # 31 # [called number] SEND "
*/
-
boolean
isTemporaryModeCLIR() {
return sc != null && sc.equals(SC_CLIR) && dialingNumber != null
@@ -779,7 +779,7 @@
// Note that unlike most everything else, the USSD complete
// response does not complete this MMI code...we wait for
// an unsolicited USSD "Notify" or "Request".
- // The matching up of this is doene in GSMPhone.
+ // The matching up of this is done in GSMPhone.
phone.mCM.sendUSSD(ussdMessage,
obtainMessage(EVENT_USSD_COMPLETE, this));
@@ -1156,7 +1156,7 @@
// Each bit in the service class gets its own result line
// The service classes may be split up over multiple
- // CallForwardInfos. So, for each service classs, find out
+ // CallForwardInfos. So, for each service class, find out
// which CallForwardInfo represents it and then build
// the response text based on that
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 50b8eba..d539f6f1 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -40,7 +40,6 @@
import android.provider.Telephony.Intents;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
-import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.Config;
@@ -130,7 +129,7 @@
*/
private boolean mNeedToRegForSimLoaded;
- /** Started the recheck process after finding gprs should registerd but not. */
+ /** Started the recheck process after finding gprs should registered but not. */
private boolean mStartedGprsRegCheck = false;
/** Already sent the event-log for no gprs register. */
@@ -415,7 +414,7 @@
}
// Release any temporary cell lock, which could have been
- // aquired to allow a single-shot location update.
+ // acquired to allow a single-shot location update.
disableSingleLocationUpdate();
break;
@@ -500,9 +499,9 @@
break;
case EVENT_CHECK_REPORT_GPRS:
- if (ss != null && !isGprsConsistant(gprsState, ss.getState())) {
+ if (ss != null && !isGprsConsistent(gprsState, ss.getState())) {
- // Can't register data sevice while voice service is ok
+ // Can't register data service while voice service is ok
// i.e. CREG is ok while CGREG is not
// possible a network or baseband side error
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
@@ -1027,7 +1026,7 @@
phone.notifyLocationChanged();
}
- if (! isGprsConsistant(gprsState, ss.getState())) {
+ if (! isGprsConsistent(gprsState, ss.getState())) {
if (!mStartedGprsRegCheck && !mReportedGprsNoReg) {
mStartedGprsRegCheck = true;
@@ -1044,13 +1043,13 @@
}
/**
- * Check if GPRS got registred while voice is registered
+ * Check if GPRS got registered while voice is registered.
*
* @param gprsState for GPRS registration state, i.e. CGREG in GSM
* @param serviceState for voice registration state, i.e. CREG in GSM
* @return false if device only register to voice but not gprs
*/
- private boolean isGprsConsistant (int gprsState, int serviceState) {
+ private boolean isGprsConsistent(int gprsState, int serviceState) {
return !((serviceState == ServiceState.STATE_IN_SERVICE) &&
(gprsState != ServiceState.STATE_IN_SERVICE));
}
@@ -1105,13 +1104,13 @@
long nextTime;
- // TODO Done't poll signal strength if screen is off
+ // TODO Don't poll signal strength if screen is off
sendMessageDelayed(msg, POLL_PERIOD_MILLIS);
}
/**
- * send signal-strength-changed notification if changed
- * Called both for solicited and unsolicited signal stength updates
+ * Send signal-strength-changed notification if changed.
+ * Called both for solicited and unsolicited signal strength updates.
*/
private void onSignalStrengthResult(AsyncResult ar) {
SignalStrength oldSignalStrength = mSignalStrength;
@@ -1332,7 +1331,7 @@
/**
* @return true if phone is camping on a technology (eg UMTS)
- * that could support voice and data simultaniously.
+ * that could support voice and data simultaneously.
*/
boolean isConcurrentVoiceAndData() {
return (networkType >= DATA_ACCESS_UMTS);
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
index b456a03..a74c5c2 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
@@ -85,6 +85,16 @@
assertEquals("17005550020",
PhoneNumberUtils.calledPartyBCDToString(b, 0, 7));
+ b[0] = (byte) 0x80; b[1] = (byte) 0x71; b[2] = (byte) 0x00; b[3] = (byte) 0x55;
+ b[4] = (byte) 0x05; b[5] = (byte) 0x20; b[6] = (byte) 0xF0;
+ assertEquals("17005550020",
+ PhoneNumberUtils.calledPartyBCDToString(b, 0, 7));
+
+ b[0] = (byte) 0x90; b[1] = (byte) 0x71; b[2] = (byte) 0x00; b[3] = (byte) 0x55;
+ b[4] = (byte) 0x05; b[5] = (byte) 0x20; b[6] = (byte) 0xF0;
+ assertEquals("+17005550020",
+ PhoneNumberUtils.calledPartyBCDToString(b, 0, 7));
+
b[0] = (byte) 0x91; b[1] = (byte) 0x71; b[2] = (byte) 0x00; b[3] = (byte) 0x55;
b[4] = (byte) 0x05; b[5] = (byte) 0x20; b[6] = (byte) 0xF0;
assertEquals("+17005550020",
diff --git a/test-runner/src/android/test/mock/MockCursor.java b/test-runner/src/android/test/mock/MockCursor.java
index 9b1c0ef..c817532 100644
--- a/test-runner/src/android/test/mock/MockCursor.java
+++ b/test-runner/src/android/test/mock/MockCursor.java
@@ -178,36 +178,11 @@
}
@SuppressWarnings("deprecation")
- public boolean commitUpdates() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean commitUpdates(Map<? extends Long, ? extends Map<String, Object>> values) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean hasUpdates() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
public void setNotificationUri(ContentResolver cr, Uri uri) {
throw new UnsupportedOperationException("unimplemented mock method");
}
@SuppressWarnings("deprecation")
- public boolean supportsUpdates() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean deleteRow() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
public void unregisterContentObserver(ContentObserver observer) {
throw new UnsupportedOperationException("unimplemented mock method");
}
@@ -216,49 +191,4 @@
public void unregisterDataSetObserver(DataSetObserver observer) {
throw new UnsupportedOperationException("unimplemented mock method");
}
-
- @SuppressWarnings("deprecation")
- public boolean updateBlob(int columnIndex, byte[] value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateDouble(int columnIndex, double value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateFloat(int columnIndex, float value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateInt(int columnIndex, int value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateLong(int columnIndex, long value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateShort(int columnIndex, short value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateString(int columnIndex, String value) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public boolean updateToNull(int columnIndex) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("deprecation")
- public void abortUpdates() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
}
\ No newline at end of file
diff --git a/tests/BrowserTestPlugin/jni/PluginObject.h b/tests/BrowserTestPlugin/jni/PluginObject.h
index a058d4a..037367e 100644
--- a/tests/BrowserTestPlugin/jni/PluginObject.h
+++ b/tests/BrowserTestPlugin/jni/PluginObject.h
@@ -65,7 +65,7 @@
public:
SubPlugin(NPP inst) : m_inst(inst) {}
virtual ~SubPlugin() {}
- virtual int16 handleEvent(const ANPEvent* evt) = 0;
+ virtual int16_t handleEvent(const ANPEvent* evt) = 0;
NPP inst() const { return m_inst; }
diff --git a/tests/BrowserTestPlugin/jni/event/EventPlugin.cpp b/tests/BrowserTestPlugin/jni/event/EventPlugin.cpp
index 2eff394..91f1b3d 100644
--- a/tests/BrowserTestPlugin/jni/event/EventPlugin.cpp
+++ b/tests/BrowserTestPlugin/jni/event/EventPlugin.cpp
@@ -138,7 +138,7 @@
browser->memfree(beginMem);
}
-int16 EventPlugin::handleEvent(const ANPEvent* evt) {
+int16_t EventPlugin::handleEvent(const ANPEvent* evt) {
switch (evt->eventType) {
case kDraw_ANPEventType: {
diff --git a/tests/BrowserTestPlugin/jni/event/EventPlugin.h b/tests/BrowserTestPlugin/jni/event/EventPlugin.h
index 88b7c9d..043be85 100644
--- a/tests/BrowserTestPlugin/jni/event/EventPlugin.h
+++ b/tests/BrowserTestPlugin/jni/event/EventPlugin.h
@@ -32,7 +32,7 @@
public:
EventPlugin(NPP inst);
virtual ~EventPlugin();
- virtual int16 handleEvent(const ANPEvent* evt);
+ virtual int16_t handleEvent(const ANPEvent* evt);
private:
void drawPlugin(const ANPBitmap& bitmap, const ANPRectI& clip);
diff --git a/tests/BrowserTestPlugin/jni/main.cpp b/tests/BrowserTestPlugin/jni/main.cpp
index 402a7e2..511180c 100644
--- a/tests/BrowserTestPlugin/jni/main.cpp
+++ b/tests/BrowserTestPlugin/jni/main.cpp
@@ -34,19 +34,19 @@
NPNetscapeFuncs* browser;
#define EXPORT __attribute__((visibility("default")))
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
+NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData* saved);
NPError NPP_Destroy(NPP instance, NPSavedData** save);
NPError NPP_SetWindow(NPP instance, NPWindow* window);
NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
- NPBool seekable, uint16* stype);
+ NPBool seekable, uint16_t* stype);
NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
-int32 NPP_WriteReady(NPP instance, NPStream* stream);
-int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
+int32_t NPP_WriteReady(NPP instance, NPStream* stream);
+int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len,
void* buffer);
void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
void NPP_Print(NPP instance, NPPrint* platformPrint);
-int16 NPP_HandleEvent(NPP instance, void* event);
+int16_t NPP_HandleEvent(NPP instance, void* event);
void NPP_URLNotify(NPP instance, const char* URL, NPReason reason,
void* notifyData);
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
@@ -129,7 +129,7 @@
return "application/x-browsertestplugin:btp:Android Browser Test Plugin";
}
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
+NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData* saved)
{
@@ -188,7 +188,7 @@
return NPERR_NO_ERROR;
}
-NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype)
+NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype)
{
*stype = NP_ASFILEONLY;
return NPERR_NO_ERROR;
@@ -199,12 +199,12 @@
return NPERR_NO_ERROR;
}
-int32 NPP_WriteReady(NPP instance, NPStream* stream)
+int32_t NPP_WriteReady(NPP instance, NPStream* stream)
{
return 0;
}
-int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer)
+int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
{
return 0;
}
@@ -217,7 +217,7 @@
{
}
-int16 NPP_HandleEvent(NPP instance, void* event)
+int16_t NPP_HandleEvent(NPP instance, void* event)
{
PluginObject *obj = reinterpret_cast<PluginObject*>(instance->pdata);
const ANPEvent* evt = reinterpret_cast<const ANPEvent*>(event);
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
index 41e0b2e..2a8cb02 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
@@ -84,8 +84,6 @@
// should pass all tests. They are skipped only temporarily.
// TODO: Fix these failing tests and remove them from this list.
ignoreResultList.add("fast/events/touch/basic-multi-touch-events.html"); // Requires multi-touch
- ignoreResultList.add("fast/events/touch/basic-single-touch-events.html"); // Delta of touch move is not great enough for Android. Fixed upstream in WebKit change 58208.
- ignoreResultList.add("fast/events/touch/send-oncancel-event.html"); // Expected output is incorrect. Fixed upstream in WebKit change 58058.
ignoreResultList.add("fast/events/touch/touch-target.html"); // Requires multi-touch
ignoreResultList.add("http/tests/appcache/empty-manifest.html"); // flaky
ignoreResultList.add("http/tests/appcache/foreign-iframe-main.html"); // flaky - skips states
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
index 0e39054..6b9bd65 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
@@ -361,8 +361,8 @@
// Read settings
mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
mRebaselineResults = runner.mRebaseline;
- // JSC is the default JavaScript engine.
- mJsEngine = runner.mJsEngine == null ? "jsc" : runner.mJsEngine;
+ // V8 is the default JavaScript engine.
+ mJsEngine = runner.mJsEngine == null ? "v8" : runner.mJsEngine;
int timeout = runner.mTimeoutInMillis;
if (timeout <= 0) {
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index f548145..e7a09d1 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -205,6 +205,8 @@
Notification n = new Notification();
n.flags |= Notification.FLAG_SHOW_LIGHTS;
n.ledARGB = 0xff0000ff;
+ n.ledOnMS = 1;
+ n.ledOffMS = 0;
mNM.notify(1, n);
}
},
@@ -215,6 +217,8 @@
Notification n = new Notification();
n.flags |= Notification.FLAG_SHOW_LIGHTS;
n.ledARGB = 0xffff0000;
+ n.ledOnMS = 1;
+ n.ledOffMS = 0;
mNM.notify(1, n);
}
},
@@ -225,6 +229,20 @@
Notification n = new Notification();
n.flags |= Notification.FLAG_SHOW_LIGHTS;
n.ledARGB = 0xffffff00;
+ n.ledOnMS = 1;
+ n.ledOffMS = 0;
+ mNM.notify(1, n);
+ }
+ },
+
+ new Test("Lights off") {
+ public void run()
+ {
+ Notification n = new Notification();
+ n.flags |= Notification.FLAG_SHOW_LIGHTS;
+ n.ledARGB = 0x00000000;
+ n.ledOnMS = 0;
+ n.ledOffMS = 0;
mNM.notify(1, n);
}
},
@@ -234,7 +252,7 @@
{
Notification n = new Notification();
n.flags |= Notification.FLAG_SHOW_LIGHTS;
- n.ledARGB = 0xffffff00;
+ n.ledARGB = 0xff0000ff;
n.ledOnMS = 1300;
n.ledOffMS = 1300;
mNM.notify(1, n);
@@ -246,7 +264,7 @@
{
Notification n = new Notification();
n.flags |= Notification.FLAG_SHOW_LIGHTS;
- n.ledARGB = 0xffffff00;
+ n.ledARGB = 0xff0000ff;
n.ledOnMS = 300;
n.ledOffMS = 300;
mNM.notify(1, n);