Expose MediaCodec.setParameters API to
- change video target bitrate on the fly
- request sync frames
- temporarily suspend feeding input buffers to the encoder
Change-Id: If5cf1162b2eeb28ac08288ecfa9f0e9823dd972e
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index ae1db87..a859506 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -310,6 +310,10 @@
return OK;
}
+status_t JMediaCodec::setParameters(const sp<AMessage> &msg) {
+ return mCodec->setParameters(msg);
+}
+
void JMediaCodec::setVideoScalingMode(int mode) {
if (mSurfaceTextureClient != NULL) {
native_window_set_scaling_mode(mSurfaceTextureClient.get(), mode);
@@ -837,6 +841,27 @@
return NULL;
}
+static void android_media_MediaCodec_setParameters(
+ JNIEnv *env, jobject thiz, jobjectArray keys, jobjectArray vals) {
+ ALOGV("android_media_MediaCodec_setParameters");
+
+ sp<JMediaCodec> codec = getMediaCodec(env, thiz);
+
+ if (codec == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return;
+ }
+
+ sp<AMessage> params;
+ status_t err = ConvertKeyValueArraysToMessage(env, keys, vals, ¶ms);
+
+ if (err == OK) {
+ err = codec->setParameters(params);
+ }
+
+ throwExceptionAsNecessary(env, err);
+}
+
static void android_media_MediaCodec_setVideoScalingMode(
JNIEnv *env, jobject thiz, jint mode) {
sp<JMediaCodec> codec = getMediaCodec(env, thiz);
@@ -986,6 +1011,9 @@
{ "getName", "()Ljava/lang/String;",
(void *)android_media_MediaCodec_getName },
+ { "setParameters", "([Ljava/lang/String;[Ljava/lang/Object;)V",
+ (void *)android_media_MediaCodec_setParameters },
+
{ "setVideoScalingMode", "(I)V",
(void *)android_media_MediaCodec_setVideoScalingMode },
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index 282d2c5..2fbbd72 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -87,6 +87,8 @@
status_t getName(JNIEnv *env, jstring *name) const;
+ status_t setParameters(const sp<AMessage> ¶ms);
+
void setVideoScalingMode(int mode);
protected: