summaryrefslogtreecommitdiffstats
path: root/media/jni/android_media_MediaCodec.cpp
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2013-02-19 07:29:21 -0800
committerAndy McFadden <fadden@android.com>2013-03-04 15:04:12 -0800
commit2621e40d0e0a496a96575768b7e2b70e3b3be640 (patch)
tree25a3bbd0efdbfa24c637eda15cb505e7e665f101 /media/jni/android_media_MediaCodec.cpp
parentcdac497289fd2c39a352f6167dae3f77cc608cb8 (diff)
downloadframeworks_base-2621e40d0e0a496a96575768b7e2b70e3b3be640.zip
frameworks_base-2621e40d0e0a496a96575768b7e2b70e3b3be640.tar.gz
frameworks_base-2621e40d0e0a496a96575768b7e2b70e3b3be640.tar.bz2
Implement Surface input to MediaCodec.
Adds two new public methods to MediaCodec, and one new public constant to MediaCodecInfo (currently @hidden). Bug 7991062 Change-Id: I830a9794e92334ad05c870cc5fc90be4652147a5
Diffstat (limited to 'media/jni/android_media_MediaCodec.cpp')
-rw-r--r--media/jni/android_media_MediaCodec.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 86700b3..3a42db2 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -123,6 +123,11 @@ status_t JMediaCodec::configure(
return mCodec->configure(format, mSurfaceTextureClient, crypto, flags);
}
+status_t JMediaCodec::createInputSurface(
+ sp<IGraphicBufferProducer>* bufferProducer) {
+ return mCodec->createInputSurface(bufferProducer);
+}
+
status_t JMediaCodec::start() {
return mCodec->start();
}
@@ -190,6 +195,10 @@ status_t JMediaCodec::releaseOutputBuffer(size_t index, bool render) {
: mCodec->releaseOutputBuffer(index);
}
+status_t JMediaCodec::signalEndOfInputStream() {
+ return mCodec->signalEndOfInputStream();
+}
+
status_t JMediaCodec::getOutputFormat(JNIEnv *env, jobject *format) const {
sp<AMessage> msg;
status_t err;
@@ -417,6 +426,29 @@ static void android_media_MediaCodec_native_configure(
throwExceptionAsNecessary(env, err);
}
+static jobject android_media_MediaCodec_createInputSurface(JNIEnv* env,
+ jobject thiz) {
+ ALOGV("android_media_MediaCodec_createInputSurface");
+
+ sp<JMediaCodec> codec = getMediaCodec(env, thiz);
+ if (codec == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return NULL;
+ }
+
+ // Tell the MediaCodec that we want to use a Surface as input.
+ sp<IGraphicBufferProducer> bufferProducer;
+ status_t err = codec->createInputSurface(&bufferProducer);
+ if (err != NO_ERROR) {
+ throwExceptionAsNecessary(env, err);
+ return NULL;
+ }
+
+ // Wrap the IGBP in a Java-language Surface.
+ return android_view_Surface_createFromIGraphicBufferProducer(env,
+ bufferProducer);
+}
+
static void android_media_MediaCodec_start(JNIEnv *env, jobject thiz) {
ALOGV("android_media_MediaCodec_start");
@@ -685,6 +717,21 @@ static void android_media_MediaCodec_releaseOutputBuffer(
throwExceptionAsNecessary(env, err);
}
+static void android_media_MediaCodec_signalEndOfInputStream(JNIEnv* env,
+ jobject thiz) {
+ ALOGV("android_media_MediaCodec_signalEndOfInputStream");
+
+ sp<JMediaCodec> codec = getMediaCodec(env, thiz);
+ if (codec == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return;
+ }
+
+ status_t err = codec->signalEndOfInputStream();
+
+ throwExceptionAsNecessary(env, err);
+}
+
static jobject android_media_MediaCodec_getOutputFormatNative(
JNIEnv *env, jobject thiz) {
ALOGV("android_media_MediaCodec_getOutputFormatNative");
@@ -852,6 +899,9 @@ static JNINativeMethod gMethods[] = {
"Landroid/media/MediaCrypto;I)V",
(void *)android_media_MediaCodec_native_configure },
+ { "createInputSurface", "()Landroid/view/Surface;",
+ (void *)android_media_MediaCodec_createInputSurface },
+
{ "start", "()V", (void *)android_media_MediaCodec_start },
{ "stop", "()V", (void *)android_media_MediaCodec_stop },
{ "flush", "()V", (void *)android_media_MediaCodec_flush },
@@ -871,6 +921,9 @@ static JNINativeMethod gMethods[] = {
{ "releaseOutputBuffer", "(IZ)V",
(void *)android_media_MediaCodec_releaseOutputBuffer },
+ { "signalEndOfInputStream", "()V",
+ (void *)android_media_MediaCodec_signalEndOfInputStream },
+
{ "getOutputFormatNative", "()Ljava/util/Map;",
(void *)android_media_MediaCodec_getOutputFormatNative },