summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/DecoderCapabilities.java84
-rw-r--r--media/jni/android_media_MediaProfiles.cpp71
2 files changed, 147 insertions, 8 deletions
diff --git a/media/java/android/media/DecoderCapabilities.java b/media/java/android/media/DecoderCapabilities.java
new file mode 100644
index 0000000..f16cccf
--- /dev/null
+++ b/media/java/android/media/DecoderCapabilities.java
@@ -0,0 +1,84 @@
+/*
+ * 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.media;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * {@hide}
+ *
+ * The DecoderCapabilities class is used to retrieve the types of the
+ * video and audio decoder(s) supported on a specific Android platform.
+ */
+public class DecoderCapabilities
+{
+ /**
+ * The VideoDecoder class represents the type of a video decoder
+ *
+ */
+ public enum VideoDecoder {
+ VIDEO_DECODER_WMV,
+ };
+
+ /**
+ * The AudioDecoder class represents the type of an audio decoder
+ */
+ public enum AudioDecoder {
+ AUDIO_DECODER_WMA,
+ };
+
+ static {
+ System.loadLibrary("media_jni");
+ native_init();
+ }
+
+ /**
+ * Returns the list of video decoder types
+ * @see android.media.DecoderCapabilities.VideoDecoder
+ */
+ public static List<VideoDecoder> getVideoDecoders() {
+ List<VideoDecoder> decoderList = new ArrayList<VideoDecoder>();
+ int nDecoders = native_get_num_video_decoders();
+ for (int i = 0; i < nDecoders; ++i) {
+ decoderList.add(VideoDecoder.values()[native_get_video_decoder_type(i)]);
+ }
+ return decoderList;
+ }
+
+ /**
+ * Returns the list of audio decoder types
+ * @see android.media.DecoderCapabilities.AudioDecoder
+ */
+ public static List<AudioDecoder> getAudioDecoders() {
+ List<AudioDecoder> decoderList = new ArrayList<AudioDecoder>();
+ int nDecoders = native_get_num_audio_decoders();
+ for (int i = 0; i < nDecoders; ++i) {
+ decoderList.add(AudioDecoder.values()[native_get_audio_decoder_type(i)]);
+ }
+ return decoderList;
+ }
+
+ private DecoderCapabilities() {} // Don't call me
+
+ // Implemented by JNI
+ private static native final void native_init();
+ private static native final int native_get_num_video_decoders();
+ private static native final int native_get_video_decoder_type(int index);
+ private static native final int native_get_num_audio_decoders();
+ private static native final int native_get_audio_decoder_type(int index);
+}
diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp
index 50380c1..19132c5 100644
--- a/media/jni/android_media_MediaProfiles.cpp
+++ b/media/jni/android_media_MediaProfiles.cpp
@@ -44,14 +44,14 @@ android_media_MediaProfiles_native_init(JNIEnv *env)
}
}
-static int
+static jint
android_media_MediaProfiles_native_get_num_file_formats(JNIEnv *env, jobject thiz)
{
LOGV("native_get_num_file_formats");
return sProfiles->getOutputFileFormats().size();
}
-static int
+static jint
android_media_MediaProfiles_native_get_file_format(JNIEnv *env, jobject thiz, jint index)
{
LOGV("native_get_file_format: %d", index);
@@ -61,11 +61,10 @@ android_media_MediaProfiles_native_get_file_format(JNIEnv *env, jobject thiz, ji
jniThrowException(env, "java/lang/IllegalArgumentException", "out of array boundary");
return -1;
}
- int format = static_cast<int>(formats[index]);
- return format;
+ return static_cast<jint>(formats[index]);
}
-static int
+static jint
android_media_MediaProfiles_native_get_num_video_encoders(JNIEnv *env, jobject thiz)
{
LOGV("native_get_num_video_encoders");
@@ -116,7 +115,7 @@ android_media_MediaProfiles_native_get_video_encoder_cap(JNIEnv *env, jobject th
return cap;
}
-static int
+static jint
android_media_MediaProfiles_native_get_num_audio_encoders(JNIEnv *env, jobject thiz)
{
LOGV("native_get_num_audio_encoders");
@@ -209,6 +208,48 @@ android_media_MediaProfiles_native_get_camcorder_profile(JNIEnv *env, jobject th
audioChannels);
}
+static jint
+android_media_MediaProfiles_native_get_num_video_decoders(JNIEnv *env, jobject thiz)
+{
+ LOGV("native_get_num_video_decoders");
+ return sProfiles->getVideoDecoders().size();
+}
+
+static jint
+android_media_MediaProfiles_native_get_video_decoder_type(JNIEnv *env, jobject thiz, jint index)
+{
+ LOGV("native_get_video_decoder_type: %d", index);
+ Vector<video_decoder> decoders = sProfiles->getVideoDecoders();
+ int nSize = decoders.size();
+ if (index < 0 || index >= nSize) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", "out of array boundary");
+ return -1;
+ }
+
+ return static_cast<jint>(decoders[index]);
+}
+
+static jint
+android_media_MediaProfiles_native_get_num_audio_decoders(JNIEnv *env, jobject thiz)
+{
+ LOGV("native_get_num_audio_decoders");
+ return sProfiles->getAudioDecoders().size();
+}
+
+static jint
+android_media_MediaProfiles_native_get_audio_decoder_type(JNIEnv *env, jobject thiz, jint index)
+{
+ LOGV("native_get_audio_decoder_type: %d", index);
+ Vector<audio_decoder> decoders = sProfiles->getAudioDecoders();
+ int nSize = decoders.size();
+ if (index < 0 || index >= nSize) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", "out of array boundary");
+ return -1;
+ }
+
+ return static_cast<jint>(decoders[index]);
+}
+
static JNINativeMethod gMethodsForEncoderCapabilitiesClass[] = {
{"native_init", "()V", (void *)android_media_MediaProfiles_native_init},
{"native_get_num_file_formats", "()I", (void *)android_media_MediaProfiles_native_get_num_file_formats},
@@ -229,7 +270,16 @@ static JNINativeMethod gMethodsForCamcorderProfileClass[] = {
(void *)android_media_MediaProfiles_native_get_camcorder_profile},
};
+static JNINativeMethod gMethodsForDecoderCapabilitiesClass[] = {
+ {"native_init", "()V", (void *)android_media_MediaProfiles_native_init},
+ {"native_get_num_video_decoders", "()I", (void *)android_media_MediaProfiles_native_get_num_video_decoders},
+ {"native_get_num_audio_decoders", "()I", (void *)android_media_MediaProfiles_native_get_num_audio_decoders},
+ {"native_get_video_decoder_type", "(I)I", (void *)android_media_MediaProfiles_native_get_video_decoder_type},
+ {"native_get_audio_decoder_type", "(I)I", (void *)android_media_MediaProfiles_native_get_audio_decoder_type},
+};
+
static const char* const kEncoderCapabilitiesClassPathName = "android/media/EncoderCapabilities";
+static const char* const kDecoderCapabilitiesClassPathName = "android/media/DecoderCapabilities";
static const char* const kCamcorderProfileClassPathName = "android/media/CamcorderProfile";
// This function only registers the native methods, and is called from
@@ -246,6 +296,11 @@ int register_android_media_MediaProfiles(JNIEnv *env)
gMethodsForCamcorderProfileClass,
NELEM(gMethodsForCamcorderProfileClass));
- // Success if ret1 == 0 && ret2 == 0
- return (ret1 || ret2);
+ int ret3 = AndroidRuntime::registerNativeMethods(env,
+ kDecoderCapabilitiesClassPathName,
+ gMethodsForDecoderCapabilitiesClass,
+ NELEM(gMethodsForDecoderCapabilitiesClass));
+
+ // Success if ret1 == 0 && ret2 == 0 && ret3 == 0
+ return (ret1 || ret2 || ret3);
}