summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andreas Huber <andih@google.com> 2012-11-30 13:26:51 -0800
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2012-11-30 13:26:51 -0800
commit2644494a9841c1f842d790b60911699f09eb63d1 (patch)
tree8d697dadcc2b693b44b2b84402e7ed145ab13c0b
parent940ad4aaef6ad27a2a214559100a18100b2b3b24 (diff)
parent93077a2902a74256b7eb4795e1ef92bbc5c50f10 (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.txt2
-rw-r--r--media/java/android/media/MediaCodec.java18
-rw-r--r--media/java/android/media/MediaCodecList.java2
-rw-r--r--media/jni/android_media_MediaCodec.cpp40
-rw-r--r--media/jni/android_media_MediaCodec.h2
-rw-r--r--media/jni/android_media_MediaCodecList.cpp22
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 },
};