diff options
-rw-r--r-- | api/current.xml | 22 | ||||
-rwxr-xr-x | core/java/android/animation/Animator.java | 109 | ||||
-rw-r--r-- | core/java/android/animation/PropertyAnimator.java | 21 | ||||
-rw-r--r-- | core/java/android/animation/PropertyValuesHolder.java | 9 | ||||
-rw-r--r-- | core/java/android/bluetooth/BluetoothClass.java | 10 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 23 |
6 files changed, 133 insertions, 61 deletions
diff --git a/api/current.xml b/api/current.xml index d935c38..54ba4a3 100644 --- a/api/current.xml +++ b/api/current.xml @@ -20080,6 +20080,17 @@ visibility="public" > </method> +<method name="getDuration" + return="long" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getFrameDelay" return="long" abstract="false" @@ -20091,6 +20102,17 @@ visibility="public" > </method> +<method name="getInterpolator" + return="android.view.animation.Interpolator" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getRepeatCount" return="int" abstract="false" diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java index 951d104..385e75d 100755 --- a/core/java/android/animation/Animator.java +++ b/core/java/android/animation/Animator.java @@ -19,6 +19,7 @@ package android.animation; import android.content.Context; import android.content.res.TypedArray; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator; @@ -197,15 +198,13 @@ public class Animator<T> extends Animatable { /** * The property/value sets being animated. */ - HashMap<String, PropertyValuesHolder> mValues; + PropertyValuesHolder[] mValues; /** - * This value is used in the simple/common case of animating just one value; the user - * may call getAnimatedValue(), which should return the value of the first (and only) - * ProeprtyValuesHolder animated value, which is looked up using this string. + * A hashmap of the PropertyValuesHolder objects. This map is used to lookup animated values + * by property name during calls to getAnimatedValue(String). */ - String mFirstPropertyName; - + HashMap<String, PropertyValuesHolder> mValuesMap; /** * The type of the values, as determined by the valueFrom/valueTo properties. @@ -290,11 +289,11 @@ public class Animator<T> extends Animatable { break; } - mValues = new HashMap<String, PropertyValuesHolder>(1); - mFirstPropertyName = ""; - PropertyValuesHolder valuesHolder = new PropertyValuesHolder(mFirstPropertyName, - valueFrom, valueTo); - mValues.put(mFirstPropertyName, valuesHolder); + PropertyValuesHolder valuesHolder = new PropertyValuesHolder("", valueFrom, valueTo); + mValues = new PropertyValuesHolder[1]; + mValues[0] = valuesHolder; + mValuesMap = new HashMap<String, PropertyValuesHolder>(1); + mValuesMap.put("", valuesHolder); mRepeatCount = a.getInt(com.android.internal.R.styleable.Animator_repeatCount, mRepeatCount); mRepeatMode = a.getInt(com.android.internal.R.styleable.Animator_repeatMode, RESTART); @@ -323,15 +322,11 @@ public class Animator<T> extends Animatable { public void setValues(PropertyValuesHolder... values) { int numValues = values.length; - mValues = new HashMap<String, PropertyValuesHolder>(numValues); + mValues = values; + mValuesMap = new HashMap<String, PropertyValuesHolder>(numValues); for (int i = 0; i < numValues; ++i) { PropertyValuesHolder valuesHolder = (PropertyValuesHolder) values[i]; - mValues.put(valuesHolder.getPropertyName(), valuesHolder); - } - if (numValues > 0 && values[0] != null) { - mFirstPropertyName = ((PropertyValuesHolder) values[0]).getPropertyName(); - } else { - mFirstPropertyName = ""; + mValuesMap.put(valuesHolder.getPropertyName(), valuesHolder); } } @@ -348,26 +343,12 @@ public class Animator<T> extends Animatable { * @param values The set of values to animate between. */ public void setValues(T... values) { - if (values[0] instanceof PropertyValuesHolder) { - int numValues = values.length; - mValues = new HashMap<String, PropertyValuesHolder>(numValues); - for (int i = 0; i < numValues; ++i) { - PropertyValuesHolder valuesHolder = (PropertyValuesHolder) values[i]; - mValues.put(valuesHolder.getPropertyName(), valuesHolder); - } - if (numValues > 0 && values[0] != null) { - mFirstPropertyName = ((PropertyValuesHolder) values[0]).getPropertyName(); - } else { - mFirstPropertyName = ""; - } + if (mValues == null || mValues.length == 0) { + setValues(new PropertyValuesHolder[]{ + new PropertyValuesHolder("", (Object[])values)}); } else { - if (mValues == null) { - setValues(new PropertyValuesHolder[]{ - new PropertyValuesHolder("", (Object[])values)}); - } else { - PropertyValuesHolder valuesHolder = mValues.get(mFirstPropertyName); - valuesHolder.setValues(values); - } + PropertyValuesHolder valuesHolder = mValues[0]; + valuesHolder.setValues(values); } } @@ -382,8 +363,9 @@ public class Animator<T> extends Animatable { * that internal mechanisms for the animation are set up correctly.</p> */ void initAnimation() { - for (PropertyValuesHolder pvHolder: mValues.values()) { - pvHolder.init(); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].init(); } mCurrentIteration = 0; mInitialized = true; @@ -394,8 +376,8 @@ public class Animator<T> extends Animatable { * be between 0 and the total duration of the animation, including any repetition. If * the animation has not yet been started, then it will not advance forward after it is * set to this time; it will simply set the time to this value and perform any appropriate - * actions based on that time. If the animation is already running, then seek() will - * set the current playing time to this value and continue playing from that point. + * actions based on that time. If the animation is already running, then setCurrentPlayTime() + * will set the current playing time to this value and continue playing from that point. * * @param playTime The time, in milliseconds, to which the animation is advanced or rewound. */ @@ -587,7 +569,11 @@ public class Animator<T> extends Animatable { * returns the animated value for the first of those objects. */ public Object getAnimatedValue() { - return getAnimatedValue(mFirstPropertyName); + if (mValues != null && mValues.length > 0) { + return mValues[0].getAnimatedValue(); + } + // Shouldn't get here; should always have values unless Animator was set up wrong + return null; } /** @@ -601,7 +587,13 @@ public class Animator<T> extends Animatable { * by this <code>Animator</code>. */ public Object getAnimatedValue(String propertyName) { - return mValues.get(mFirstPropertyName).getAnimatedValue(); + PropertyValuesHolder valuesHolder = mValuesMap.get(propertyName); + if (valuesHolder != null) { + return valuesHolder.getAnimatedValue(); + } else { + // At least avoid crashing if called with bogus propertyName + return null; + } } /** @@ -691,6 +683,15 @@ public class Animator<T> extends Animatable { } /** + * Returns the timing interpolator that this Animator uses. + * + * @return The timing interpolator for this Animator. + */ + public Interpolator getInterpolator() { + return mInterpolator; + } + + /** * The type evaluator to be used when calculating the animated values of this animation. * The system will automatically assign a float, int, or double evaluator based on the type * of <code>startValue</code> and <code>endValue</code> in the constructor. But if these values @@ -707,8 +708,8 @@ public class Animator<T> extends Animatable { * @param value the evaluator to be used this animation */ public void setEvaluator(TypeEvaluator value) { - if (value != null && mValues != null) { - mValues.get(mFirstPropertyName).setEvaluator(value); + if (value != null && mValues != null && mValues.length > 0) { + mValues[0].setEvaluator(value); } } @@ -720,6 +721,10 @@ public class Animator<T> extends Animatable { * @param playBackwards Whether the Animator should start playing in reverse. */ private void start(boolean playBackwards) { + if ((mStartDelay == 0) && (Thread.currentThread() == Looper.getMainLooper().getThread())) { + // This sets the initial value of the animation, prior to actually starting it running + setCurrentPlayTime(getCurrentPlayTime()); + } mPlayingBackwards = playBackwards; mPlayingState = STOPPED; sPendingAnimations.add(this); @@ -731,6 +736,15 @@ public class Animator<T> extends Animatable { sAnimationHandler.sendEmptyMessage(ANIMATION_START); } + /** + * Returns the duration that this animation will run for. + * + * @return The length in time of the animation, in milliseconds. + */ + public long getDuration() { + return mDuration; + } + @Override public void start() { start(false); @@ -928,8 +942,9 @@ public class Animator<T> extends Animatable { */ void animateValue(float fraction) { fraction = mInterpolator.getInterpolation(fraction); - for (PropertyValuesHolder valuesHolder : mValues.values()) { - valuesHolder.calculateValue(fraction); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].calculateValue(fraction); } if (mUpdateListeners != null) { int numListeners = mUpdateListeners.size(); diff --git a/core/java/android/animation/PropertyAnimator.java b/core/java/android/animation/PropertyAnimator.java index 9366a71..1a010a9 100644 --- a/core/java/android/animation/PropertyAnimator.java +++ b/core/java/android/animation/PropertyAnimator.java @@ -21,10 +21,7 @@ import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.concurrent.locks.ReentrantReadWriteLock; /** * This subclass of {@link Animator} provides support for animating properties on target objects. @@ -61,10 +58,12 @@ public final class PropertyAnimator<T> extends Animator<T> { */ public void setPropertyName(String propertyName) { if (mValues != null) { - // should always be the case - PropertyValuesHolder valuesHolder = mValues.get(mFirstPropertyName); + // mValues should always be non-null + PropertyValuesHolder valuesHolder = mValues[0]; + String oldName = valuesHolder.getPropertyName(); valuesHolder.setPropertyName(propertyName); - mFirstPropertyName = propertyName; + mValuesMap.remove(oldName); + mValuesMap.put(propertyName, valuesHolder); } mPropertyName = propertyName; } @@ -184,8 +183,9 @@ public final class PropertyAnimator<T> extends Animator<T> { @Override void initAnimation() { super.initAnimation(); - for (PropertyValuesHolder valuesHolder : mValues.values()) { - valuesHolder.setupSetterAndGetter(mTarget); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setupSetterAndGetter(mTarget); } } @@ -223,8 +223,9 @@ public final class PropertyAnimator<T> extends Animator<T> { @Override void animateValue(float fraction) { super.animateValue(fraction); - for (PropertyValuesHolder valuesHolder : mValues.values()) { - valuesHolder.setAnimatedValue(mTarget); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setAnimatedValue(mTarget); } } } diff --git a/core/java/android/animation/PropertyValuesHolder.java b/core/java/android/animation/PropertyValuesHolder.java index 05e0bc1..fc829b8 100644 --- a/core/java/android/animation/PropertyValuesHolder.java +++ b/core/java/android/animation/PropertyValuesHolder.java @@ -261,11 +261,12 @@ public class PropertyValuesHolder<T> { // Swallow the error and keep trying other variants } } + // If we got here, then no appropriate function was found + Log.e("PropertyValuesHolder", + "Couldn't find setter/getter for property " + mPropertyName + + "with value type "+ mValueType); } - // If we got here, then no appropriate function was found - Log.e("PropertyValuesHolder", - "Couldn't find setter/getter for property " + mPropertyName + - "with value type "+ mValueType); + return returnVal; } diff --git a/core/java/android/bluetooth/BluetoothClass.java b/core/java/android/bluetooth/BluetoothClass.java index 0c9bab2..c8381c9 100644 --- a/core/java/android/bluetooth/BluetoothClass.java +++ b/core/java/android/bluetooth/BluetoothClass.java @@ -261,6 +261,10 @@ public final class BluetoothClass implements Parcelable { public static final int PROFILE_OPP = 2; /** @hide */ public static final int PROFILE_HID = 3; + /** @hide */ + public static final int PROFILE_PANU = 4; + /** @hide */ + public static final int PROFILE_NAP = 5; /** * Check class bits for possible bluetooth profile support. @@ -328,6 +332,12 @@ public final class BluetoothClass implements Parcelable { } } else if (profile == PROFILE_HID) { return (getDeviceClass() & Device.Major.PERIPHERAL) == Device.Major.PERIPHERAL; + } else if (profile == PROFILE_PANU || profile == PROFILE_NAP){ + // No good way to distinguish between the two, based on class bits. + if (hasService(Service.NETWORKING)) { + return true; + } + return (getDeviceClass() & Device.Major.NETWORKING) == Device.Major.NETWORKING; } else { return false; } diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 4741b1d..b39157e 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -146,29 +146,36 @@ static sp<MediaSource> InstantiateSoftwareCodec( static const CodecInfo kDecoderInfo[] = { { MEDIA_MIMETYPE_IMAGE_JPEG, "OMX.TI.JPEG.decode" }, + { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.Nvidia.mp3.decoder" }, // { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.TI.MP3.decode" }, { MEDIA_MIMETYPE_AUDIO_MPEG, "MP3Decoder" }, // { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.PV.mp3dec" }, // { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.decode" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.Nvidia.amr.decoder" }, { MEDIA_MIMETYPE_AUDIO_AMR_NB, "AMRNBDecoder" }, // { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.PV.amrdec" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.Nvidia.amrwb.decoder" }, { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.decode" }, { MEDIA_MIMETYPE_AUDIO_AMR_WB, "AMRWBDecoder" }, // { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.PV.amrdec" }, + { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.Nvidia.aac.decoder" }, { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.decode" }, { MEDIA_MIMETYPE_AUDIO_AAC, "AACDecoder" }, // { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacdec" }, { MEDIA_MIMETYPE_AUDIO_G711_ALAW, "G711Decoder" }, { MEDIA_MIMETYPE_AUDIO_G711_MLAW, "G711Decoder" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.Nvidia.mp4.decode" }, { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.7x30.video.decoder.mpeg4" }, { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.decoder.mpeg4" }, { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" }, { MEDIA_MIMETYPE_VIDEO_MPEG4, "M4vH263Decoder" }, // { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.PV.mpeg4dec" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.Nvidia.h263.decode" }, { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.7x30.video.decoder.h263" }, { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.decoder.h263" }, { MEDIA_MIMETYPE_VIDEO_H263, "M4vH263Decoder" }, // { MEDIA_MIMETYPE_VIDEO_H263, "OMX.PV.h263dec" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.Nvidia.h264.decode" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.7x30.video.decoder.avc" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.video.decoder.avc" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.Decoder" }, @@ -199,6 +206,7 @@ static const CodecInfo kEncoderInfo[] = { { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.7x30.video.encoder.avc" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.video.encoder.avc" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.encoder" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.Nvidia.h264.encoder" }, { MEDIA_MIMETYPE_VIDEO_AVC, "AVCEncoder" }, // { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcenc" }, }; @@ -337,6 +345,13 @@ static int CompareSoftwareCodecsFirst( uint32_t OMXCodec::getComponentQuirks(const char *componentName) { uint32_t quirks = 0; + if (!strcmp(componentName, "OMX.Nvidia.amr.decoder") || + !strcmp(componentName, "OMX.Nvidia.amrwb.decoder") || + !strcmp(componentName, "OMX.Nvidia.aac.decoder") || + !strcmp(componentName, "OMX.Nvidia.mp3.decoder")) { + quirks |= kDecoderLiesAboutNumberOfChannels; + } + if (!strcmp(componentName, "OMX.PV.avcdec")) { quirks |= kWantsNALFragments; } @@ -854,6 +869,10 @@ void OMXCodec::setVideoInputFormat( OMX_COLOR_FORMATTYPE colorFormat; CHECK_EQ(OK, findTargetColorFormat(meta, &colorFormat)); + if (!strcasecmp("OMX.Nvidia.h264.encoder", mComponentName)) { + colorFormat = OMX_COLOR_FormatYUV420Planar; + } + status_t err; OMX_PARAM_PORTDEFINITIONTYPE def; OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; @@ -1193,6 +1212,10 @@ status_t OMXCodec::setupAVCEncoderParameters(const sp<MetaData>& meta) { h264type.bMBAFF = OMX_FALSE; h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; + if (!strcasecmp("OMX.Nvidia.h264.encoder", mComponentName)) { + h264type.eLevel = OMX_VIDEO_AVCLevelMax; + } + err = mOMX->setParameter( mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); CHECK_EQ(err, OK); |