summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chong Zhang <chz@google.com> 2014-01-06 19:05:09 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-01-06 19:05:09 +0000
commitf12aa45bcbcd3d41b51c70401fac5786d3d881a5 (patch)
tree372a38ec90f5fdde31fdda787ddd5f2fed0a6ab5
parentdcd8258e2447afacb6d6f793c2cfb7ad94d2acec (diff)
parent83cc994ba40a7227c62a65ccb5addf3a23ff6350 (diff)
Merge "MediaRecorder: add getSurface() api and SURFACE video source"
-rw-r--r--api/current.txt2
-rw-r--r--media/java/android/media/MediaRecorder.java31
-rw-r--r--media/jni/android_media_MediaRecorder.cpp21
3 files changed, 51 insertions, 3 deletions
diff --git a/api/current.txt b/api/current.txt
index 243c412d4253..14952772778e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -13187,6 +13187,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();
@@ -13271,6 +13272,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
@@ -124,6 +124,18 @@ public class MediaRecorder
public native void setCamera(Camera c);
/**
+ * Gets the surface to record from when using SURFACE video source.
+ * <p>
+ * Should only be called after prepare(). Frames rendered before start()
+ * will be discarded.
+ * </p>
+ * @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
* set. If {@link #setCamera(Camera)} is used and the surface has been
@@ -225,10 +237,23 @@ public class MediaRecorder
*/
private VideoSource() {}
public static final int DEFAULT = 0;
- /** Camera video source */
+ /** Camera video source
+ * <p>
+ * Using android.hardware.Camera as video source.
+ * </p>
+ */
public static final int CAMERA = 1;
- /** @hide */
- public static final int GRALLOC_BUFFER = 2;
+ /** Surface video source
+ * <p>
+ * Using a Surface as video source.
+ * </p><p>
+ * This flag must be used when recording from an
+ * android.hardware.camera2.CameraDevice source.
+ * </p><p>
+ * 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<MediaRecorder> mr = getMediaRecorder(env, thiz);
+
+ sp<IGraphicBufferProducer> 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},