From 83cc994ba40a7227c62a65ccb5addf3a23ff6350 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Thu, 2 Jan 2014 12:10:04 -0800 Subject: MediaRecorder: add getSurface() api and SURFACE video source Bug: 12305192 Change-Id: If833c5ac8a738ffa284307e0435b5cbd1b7379b1 --- api/current.txt | 2 ++ media/java/android/media/MediaRecorder.java | 31 ++++++++++++++++++++++++++--- media/jni/android_media_MediaRecorder.cpp | 21 +++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/api/current.txt b/api/current.txt index e6aebd23351d..951e5a8d432e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -13188,6 +13188,7 @@ package android.media { ctor public MediaRecorder(); method public static final int getAudioSourceMax(); method public int getMaxAmplitude() throws java.lang.IllegalStateException; + method public android.view.Surface getSurface(); method public void prepare() throws java.io.IOException, java.lang.IllegalStateException; method public void release(); method public void reset(); @@ -13272,6 +13273,7 @@ package android.media { public final class MediaRecorder.VideoSource { field public static final int CAMERA = 1; // 0x1 field public static final int DEFAULT = 0; // 0x0 + field public static final int SURFACE = 2; // 0x2 } public class MediaRouter { diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 8dcbd6b6f8d9..7b7c06c4ceeb 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -123,6 +123,18 @@ public class MediaRecorder */ public native void setCamera(Camera c); + /** + * Gets the surface to record from when using SURFACE video source. + *

+ * Should only be called after prepare(). Frames rendered before start() + * will be discarded. + *

+ * @throws IllegalStateException if it is called before prepare(), after + * stop() or is called when VideoSource is not set to SURFACE. + * @see android.media.MediaRecorder.VideoSource + */ + public native Surface getSurface(); + /** * Sets a Surface to show a preview of recorded media (video). Calls this * before prepare() to make sure that the desirable preview display is @@ -225,10 +237,23 @@ public class MediaRecorder */ private VideoSource() {} public static final int DEFAULT = 0; - /** Camera video source */ + /** Camera video source + *

+ * Using android.hardware.Camera as video source. + *

+ */ public static final int CAMERA = 1; - /** @hide */ - public static final int GRALLOC_BUFFER = 2; + /** Surface video source + *

+ * Using a Surface as video source. + *

+ * This flag must be used when recording from an + * android.hardware.camera2.CameraDevice source. + *

+ * When using this video source type, use {@link MediaRecorder#getSurface()} + * to retrieve the surface created by MediaRecorder. + */ + public static final int SURFACE = 2; } /** diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp index 98885911b86f..ac863e1f436b 100644 --- a/media/jni/android_media_MediaRecorder.cpp +++ b/media/jni/android_media_MediaRecorder.cpp @@ -344,6 +344,26 @@ android_media_MediaRecorder_native_getMaxAmplitude(JNIEnv *env, jobject thiz) return result; } +static jobject +android_media_MediaRecorder_getSurface(JNIEnv *env, jobject thiz) +{ + ALOGV("getSurface"); + sp mr = getMediaRecorder(env, thiz); + + sp bufferProducer = mr->querySurfaceMediaSourceFromMediaServer(); + if (bufferProducer == NULL) { + jniThrowException( + env, + "java/lang/IllegalStateException", + "failed to get surface"); + return NULL; + } + + // Wrap the IGBP in a Java-language Surface. + return android_view_Surface_createFromIGraphicBufferProducer(env, + bufferProducer); +} + static void android_media_MediaRecorder_start(JNIEnv *env, jobject thiz) { @@ -470,6 +490,7 @@ static JNINativeMethod gMethods[] = { {"setMaxDuration", "(I)V", (void *)android_media_MediaRecorder_setMaxDuration}, {"setMaxFileSize", "(J)V", (void *)android_media_MediaRecorder_setMaxFileSize}, {"_prepare", "()V", (void *)android_media_MediaRecorder_prepare}, + {"getSurface", "()Landroid/view/Surface;", (void *)android_media_MediaRecorder_getSurface}, {"getMaxAmplitude", "()I", (void *)android_media_MediaRecorder_native_getMaxAmplitude}, {"start", "()V", (void *)android_media_MediaRecorder_start}, {"stop", "()V", (void *)android_media_MediaRecorder_stop}, -- cgit v1.2.3-59-g8ed1b