diff options
| author | 2012-11-30 13:26:51 -0800 | |
|---|---|---|
| committer | 2012-11-30 13:26:51 -0800 | |
| commit | 2644494a9841c1f842d790b60911699f09eb63d1 (patch) | |
| tree | 8d697dadcc2b693b44b2b84402e7ed145ab13c0b | |
| parent | 940ad4aaef6ad27a2a214559100a18100b2b3b24 (diff) | |
| parent | 93077a2902a74256b7eb4795e1ef92bbc5c50f10 (diff) | |
Merge changes I8462f040,Ie471f40f
* changes:
MediaCodec: Allow getting the codec info directly
MediaCodec: Allow getting the chosen component name
| -rw-r--r-- | api/current.txt | 2 | ||||
| -rw-r--r-- | media/java/android/media/MediaCodec.java | 18 | ||||
| -rw-r--r-- | media/java/android/media/MediaCodecList.java | 2 | ||||
| -rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 40 | ||||
| -rw-r--r-- | media/jni/android_media_MediaCodec.h | 2 | ||||
| -rw-r--r-- | media/jni/android_media_MediaCodecList.cpp | 22 |
6 files changed, 86 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt index 6b893d52372e..f409526c4458 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11199,7 +11199,9 @@ package android.media { method public final int dequeueInputBuffer(long); method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long); method public final void flush(); + method public android.media.MediaCodecInfo getCodecInfo(); method public java.nio.ByteBuffer[] getInputBuffers(); + method public final java.lang.String getName(); method public java.nio.ByteBuffer[] getOutputBuffers(); method public final android.media.MediaFormat getOutputFormat(); method public final void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException; diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 99db0663b032..d5515eb7839f 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -16,6 +16,8 @@ package android.media; +import android.media.MediaCodecInfo; +import android.media.MediaCodecList; import android.media.MediaCrypto; import android.media.MediaFormat; import android.view.Surface; @@ -498,6 +500,22 @@ final public class MediaCodec { */ public native final void setVideoScalingMode(int mode); + /** + * Get the component name. If the codec was created by createDecoderByType + * or createEncoderByType, what component is chosen is not known beforehand. + */ + public native final String getName(); + + /** + * Get the codec info. If the codec was created by createDecoderByType + * or createEncoderByType, what component is chosen is not known beforehand, + * and thus the caller does not have the MediaCodecInfo. + */ + public MediaCodecInfo getCodecInfo() { + return MediaCodecList.getCodecInfoAt( + MediaCodecList.findCodecByName(getName())); + } + private native final ByteBuffer[] getBuffers(boolean input); private static native final void native_init(); diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java index 174993434b25..2a601133fdb6 100644 --- a/media/java/android/media/MediaCodecList.java +++ b/media/java/android/media/MediaCodecList.java @@ -46,6 +46,8 @@ final public class MediaCodecList { /* package private */ static native final MediaCodecInfo.CodecCapabilities getCodecCapabilities(int index, String type); + /* package private */ static native final int findCodecByName(String codec); + private static native final void native_init(); private MediaCodecList() {} diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index f91c9a001236..dab2de1b6b9e 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -264,6 +264,20 @@ status_t JMediaCodec::getBuffers( return OK; } +status_t JMediaCodec::getName(JNIEnv *env, jstring *nameStr) const { + AString name; + + status_t err = mCodec->getName(&name); + + if (err != OK) { + return err; + } + + *nameStr = env->NewStringUTF(name.c_str()); + + return OK; +} + void JMediaCodec::setVideoScalingMode(int mode) { if (mSurfaceTextureClient != NULL) { native_window_set_scaling_mode(mSurfaceTextureClient.get(), mode); @@ -706,6 +720,29 @@ static jobjectArray android_media_MediaCodec_getBuffers( return NULL; } +static jobject android_media_MediaCodec_getName( + JNIEnv *env, jobject thiz) { + ALOGV("android_media_MediaCodec_getName"); + + sp<JMediaCodec> codec = getMediaCodec(env, thiz); + + if (codec == NULL) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + return NULL; + } + + jstring name; + status_t err = codec->getName(env, &name); + + if (err == OK) { + return name; + } + + throwExceptionAsNecessary(env, err); + + return NULL; +} + static void android_media_MediaCodec_setVideoScalingMode( JNIEnv *env, jobject thiz, jint mode) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); @@ -826,6 +863,9 @@ static JNINativeMethod gMethods[] = { { "getBuffers", "(Z)[Ljava/nio/ByteBuffer;", (void *)android_media_MediaCodec_getBuffers }, + { "getName", "()Ljava/lang/String;", + (void *)android_media_MediaCodec_getName }, + { "setVideoScalingMode", "(I)V", (void *)android_media_MediaCodec_setVideoScalingMode }, diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index 4936b53b978f..bc9ad50c4961 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -81,6 +81,8 @@ struct JMediaCodec : public RefBase { status_t getBuffers( JNIEnv *env, bool input, jobjectArray *bufArray) const; + status_t getName(JNIEnv *env, jstring *name) const; + void setVideoScalingMode(int mode); protected: diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp index 0638b4ab7dda..04430ec26609 100644 --- a/media/jni/android_media_MediaCodecList.cpp +++ b/media/jni/android_media_MediaCodecList.cpp @@ -44,6 +44,25 @@ static jstring android_media_MediaCodecList_getCodecName( return env->NewStringUTF(name); } +static jint android_media_MediaCodecList_findCodecByName( + JNIEnv *env, jobject thiz, jstring name) { + if (name == NULL) { + jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + return -ENOENT; + } + + const char *nameStr = env->GetStringUTFChars(name, NULL); + + if (nameStr == NULL) { + // Out of memory exception already pending. + return -ENOENT; + } + + jint ret = MediaCodecList::getInstance()->findCodecByName(nameStr); + env->ReleaseStringUTFChars(name, nameStr); + return ret; +} + static jboolean android_media_MediaCodecList_isEncoder( JNIEnv *env, jobject thiz, jint index) { return MediaCodecList::getInstance()->isEncoder(index); @@ -180,6 +199,9 @@ static JNINativeMethod gMethods[] = { "(ILjava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;", (void *)android_media_MediaCodecList_getCodecCapabilities }, + { "findCodecByName", "(Ljava/lang/String;)I", + (void *)android_media_MediaCodecList_findCodecByName }, + { "native_init", "()V", (void *)android_media_MediaCodecList_native_init }, }; |