diff --git a/api/current.txt b/api/current.txt index 50f733869b1c7..949f26e7e0186 100644 --- a/api/current.txt +++ b/api/current.txt @@ -21992,6 +21992,7 @@ package android.media { method public boolean advance(); method public long getCachedDuration(); method public android.media.DrmInitData getDrmInitData(); + method public android.os.Bundle getMetrics(); method public java.util.Map getPsshInfo(); method public boolean getSampleCryptoInfo(android.media.MediaCodec.CryptoInfo); method public int getSampleFlags(); diff --git a/api/system-current.txt b/api/system-current.txt index e73ad4dfa805c..7a726e826a361 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -23603,6 +23603,7 @@ package android.media { method public boolean advance(); method public long getCachedDuration(); method public android.media.DrmInitData getDrmInitData(); + method public android.os.Bundle getMetrics(); method public java.util.Map getPsshInfo(); method public boolean getSampleCryptoInfo(android.media.MediaCodec.CryptoInfo); method public int getSampleFlags(); diff --git a/api/test-current.txt b/api/test-current.txt index 3cb21d2a3177c..144e071d6828c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -22084,6 +22084,7 @@ package android.media { method public boolean advance(); method public long getCachedDuration(); method public android.media.DrmInitData getDrmInitData(); + method public android.os.Bundle getMetrics(); method public java.util.Map getPsshInfo(); method public boolean getSampleCryptoInfo(android.media.MediaCodec.CryptoInfo); method public int getSampleFlags(); diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index 4d332a81f4f4b..2ca36ea68e479 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -26,6 +26,7 @@ import android.media.MediaCodec; import android.media.MediaFormat; import android.media.MediaHTTPService; import android.net.Uri; +import android.os.Bundle; import android.os.IBinder; import com.android.internal.util.Preconditions; @@ -598,6 +599,16 @@ final public class MediaExtractor { */ public native boolean hasCacheReachedEndOfStream(); + /** + * Returns Analytics/Metrics data about the current media container. + * + * @return the set of keys and values available for the media being + * handled by this instance of MediaExtractor + * + */ + public native Bundle getMetrics(); + + private static native final void native_init(); private native final void native_setup(); private native final void native_finalize(); diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index 4de1d0090f60a..2008f8dfdc7e7 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -19,6 +19,7 @@ #include #include "android_media_MediaExtractor.h" +#include "android_media_MediaMetricsJNI.h" #include "android_media_Utils.h" #include "android_runtime/AndroidRuntime.h" @@ -240,6 +241,13 @@ status_t JMediaExtractor::getSampleFlags(uint32_t *sampleFlags) { return OK; } +status_t JMediaExtractor::getMetrics(Parcel *reply) const { + + status_t status = mImpl->getMetrics(reply); + return status; +} + + status_t JMediaExtractor::getSampleMeta(sp *sampleMeta) { return mImpl->getSampleMeta(sampleMeta); } @@ -767,6 +775,38 @@ static void android_media_MediaExtractor_native_finalize( android_media_MediaExtractor_release(env, thiz); } +static jobject +android_media_MediaExtractor_getMetrics(JNIEnv * env, jobject thiz) +{ + ALOGV("android_media_MediaExtractor_getMetrics"); + + sp extractor = getMediaExtractor(env, thiz); + if (extractor == NULL ) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + return NULL; + } + + // get what we have for the metrics from the codec + Parcel reply; + status_t err = extractor->getMetrics(&reply); + if (err != OK) { + ALOGE("getMetrics failed"); + return (jobject) NULL; + } + + // build and return the Bundle + MediaAnalyticsItem *item = new MediaAnalyticsItem; + item->readFromParcel(reply); + jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL); + + // housekeeping + delete item; + item = NULL; + + return mybundle; +} + + static const JNINativeMethod gMethods[] = { { "release", "()V", (void *)android_media_MediaExtractor_release }, @@ -826,6 +866,9 @@ static const JNINativeMethod gMethods[] = { { "hasCacheReachedEndOfStream", "()Z", (void *)android_media_MediaExtractor_hasCacheReachedEOS }, + + {"getMetrics", "()Landroid/os/Bundle;", + (void *)android_media_MediaExtractor_getMetrics}, }; int register_android_media_MediaExtractor(JNIEnv *env) { diff --git a/media/jni/android_media_MediaExtractor.h b/media/jni/android_media_MediaExtractor.h index 9f6250628869b..c747ef5939b49 100644 --- a/media/jni/android_media_MediaExtractor.h +++ b/media/jni/android_media_MediaExtractor.h @@ -60,6 +60,7 @@ struct JMediaExtractor : public RefBase { status_t getSampleTime(int64_t *sampleTimeUs); status_t getSampleFlags(uint32_t *sampleFlags); status_t getSampleMeta(sp *sampleMeta); + status_t getMetrics(Parcel *reply) const; bool getCachedDuration(int64_t *durationUs, bool *eos) const;