NdkMediaCodec: implement createInputSurface
Expose createInputSurface() via NDK-mediaCodec to enable native
encoder apps to record from an input surface.
Bug: 32746065
Change-Id: I654f2c0deadb336d492cdd6ba290e09c8996ce40
diff --git a/include/ndk/NdkMediaCodec.h b/include/ndk/NdkMediaCodec.h
index a63f39a..2ecbfcf 100644
--- a/include/ndk/NdkMediaCodec.h
+++ b/include/ndk/NdkMediaCodec.h
@@ -179,6 +179,19 @@
media_status_t AMediaCodec_releaseOutputBufferAtTime(
AMediaCodec *mData, size_t idx, int64_t timestampNs);
+/**
+ * Creates a Surface that can be used as the input to encoder, in place of input buffers
+ *
+ * This can only be called after the codec has been configured via
+ * AMediaCodec_configure(..); and before AMediaCodec_start() has been called.
+ *
+ * The application is responsible for releasing the surface by calling
+ * ANativeWindow_release() when done.
+ *
+ * For more details, see the Java documentation for MediaCodec.createInputSurface.
+ */
+media_status_t AMediaCodec_createInputSurface(AMediaCodec*, ANativeWindow** surface);
+
typedef enum {
AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1,
diff --git a/media/ndk/Android.mk b/media/ndk/Android.mk
index 67b0ab1..01c9610 100644
--- a/media/ndk/Android.mk
+++ b/media/ndk/Android.mk
@@ -38,6 +38,7 @@
frameworks/base/core/jni \
frameworks/base/media/jni \
frameworks/av/include/ndk \
+ frameworks/native/include \
system/media/camera/include \
$(call include-path-for, libhardware)/hardware \
@@ -60,6 +61,7 @@
libbinder \
libgui \
libui \
+ libandroid \
include $(BUILD_SHARED_LIBRARY)
diff --git a/media/ndk/NdkMediaCodec.cpp b/media/ndk/NdkMediaCodec.cpp
index 22c90e2..ecbdc2e 100644
--- a/media/ndk/NdkMediaCodec.cpp
+++ b/media/ndk/NdkMediaCodec.cpp
@@ -34,6 +34,7 @@
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaErrors.h>
#include <media/MediaCodecBuffer.h>
+#include <android/native_window.h>
using namespace android;
@@ -377,6 +378,24 @@
return translate_error(mData->mCodec->setSurface(surface));
}
+EXPORT
+media_status_t AMediaCodec_createInputSurface(AMediaCodec *mData, ANativeWindow **surface) {
+ if (surface == NULL || mData == NULL) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+ *surface = NULL;
+
+ sp<IGraphicBufferProducer> igbp = NULL;
+ status_t err = mData->mCodec->createInputSurface(&igbp);
+ if (err != NO_ERROR) {
+ return translate_error(err);
+ }
+
+ *surface = new Surface(igbp);
+ ANativeWindow_acquire(*surface);
+ return AMEDIA_OK;
+}
+
//EXPORT
media_status_t AMediaCodec_setNotificationCallback(AMediaCodec *mData, OnCodecEvent callback,
void *userdata) {