diff options
author | Andreas Huber <andih@google.com> | 2012-04-30 14:18:33 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-30 14:46:22 -0700 |
commit | b12a5390694e8525ac61d7377e266e31d124c815 (patch) | |
tree | 5b89d841558fe41d6799ef8406b645c64da8ad2b /media/jni | |
parent | f1790eb595d009118f477967b93b5814b7863a34 (diff) | |
download | frameworks_base-b12a5390694e8525ac61d7377e266e31d124c815.zip frameworks_base-b12a5390694e8525ac61d7377e266e31d124c815.tar.gz frameworks_base-b12a5390694e8525ac61d7377e266e31d124c815.tar.bz2 |
New API to set the video rendering mode on a MediaCodec instance.
Change-Id: I6d765bb4cab7bcf29f09364293c24e8a6930078b
related-to-bug: 6364139
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 38 | ||||
-rw-r--r-- | media/jni/android_media_MediaCodec.h | 4 |
2 files changed, 40 insertions, 2 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 8009fb5..f98c063 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -39,6 +39,8 @@ #include <media/stagefright/foundation/AString.h> #include <media/stagefright/MediaErrors.h> +#include <system/window.h> + namespace android { // Keep these in sync with their equivalents in MediaCodec.java !!! @@ -111,9 +113,12 @@ status_t JMediaCodec::configure( int flags) { sp<SurfaceTextureClient> client; if (surfaceTexture != NULL) { - client = new SurfaceTextureClient(surfaceTexture); + mSurfaceTextureClient = new SurfaceTextureClient(surfaceTexture); + } else { + mSurfaceTextureClient.clear(); } - return mCodec->configure(format, client, crypto, flags); + + return mCodec->configure(format, mSurfaceTextureClient, crypto, flags); } status_t JMediaCodec::start() { @@ -121,6 +126,8 @@ status_t JMediaCodec::start() { } status_t JMediaCodec::stop() { + mSurfaceTextureClient.clear(); + return mCodec->stop(); } @@ -227,6 +234,12 @@ status_t JMediaCodec::getBuffers( return OK; } +void JMediaCodec::setVideoScalingMode(int mode) { + if (mSurfaceTextureClient != NULL) { + native_window_set_scaling_mode(mSurfaceTextureClient.get(), mode); + } +} + } // namespace android //////////////////////////////////////////////////////////////////////////////// @@ -663,6 +676,24 @@ static jobjectArray android_media_MediaCodec_getBuffers( return NULL; } +static void android_media_MediaCodec_setVideoScalingMode( + JNIEnv *env, jobject thiz, jint mode) { + sp<JMediaCodec> codec = getMediaCodec(env, thiz); + + if (codec == NULL) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + return; + } + + if (mode != NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW + && mode != NATIVE_WINDOW_SCALING_MODE_SCALE_CROP) { + jniThrowException(env, "java/lang/InvalidArgumentException", NULL); + return; + } + + codec->setVideoScalingMode(mode); +} + static void android_media_MediaCodec_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/MediaCodec"); CHECK(clazz != NULL); @@ -765,6 +796,9 @@ static JNINativeMethod gMethods[] = { { "getBuffers", "(Z)[Ljava/nio/ByteBuffer;", (void *)android_media_MediaCodec_getBuffers }, + { "setVideoScalingMode", "(I)V", + (void *)android_media_MediaCodec_setVideoScalingMode }, + { "native_init", "()V", (void *)android_media_MediaCodec_native_init }, { "native_setup", "(Ljava/lang/String;ZZ)V", diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index e2688be..4936b53 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -32,6 +32,7 @@ struct AString; struct ICrypto; struct ISurfaceTexture; struct MediaCodec; +struct SurfaceTextureClient; struct JMediaCodec : public RefBase { JMediaCodec( @@ -80,12 +81,15 @@ struct JMediaCodec : public RefBase { status_t getBuffers( JNIEnv *env, bool input, jobjectArray *bufArray) const; + void setVideoScalingMode(int mode); + protected: virtual ~JMediaCodec(); private: jclass mClass; jweak mObject; + sp<SurfaceTextureClient> mSurfaceTextureClient; sp<ALooper> mLooper; sp<MediaCodec> mCodec; |