diff --git a/src/api-impl-jni/media/android_media_MediaCodec.c b/src/api-impl-jni/media/android_media_MediaCodec.c index 119ad856..884873c9 100644 --- a/src/api-impl-jni/media/android_media_MediaCodec.c +++ b/src/api-impl-jni/media/android_media_MediaCodec.c @@ -205,20 +205,26 @@ JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1configure_1video(JN AVCodecContext *codec_ctx = ctx->codec; jarray array_ref; jbyte *array; - int sps_size; - int pps_size; + int sps_size = 0; + int pps_size = 0; printf("Java_android_media_MediaCodec_native_1configure_video(%s)\n", codec_ctx->codec->name); - sps_size = get_nio_buffer_size(env, csd0); - pps_size = get_nio_buffer_size(env, csd1); + if (csd0) + sps_size = get_nio_buffer_size(env, csd0); + if (csd1) + pps_size = get_nio_buffer_size(env, csd1); size_t extradata_size = sps_size + pps_size; uint8_t *extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); - memcpy(extradata, get_nio_buffer(env, csd0, &array_ref, &array), extradata_size); - release_nio_buffer(env, array_ref, array); - memcpy(extradata + sps_size, get_nio_buffer(env, csd1, &array_ref, &array), extradata_size); - release_nio_buffer(env, array_ref, array); + if (csd0) { + memcpy(extradata, get_nio_buffer(env, csd0, &array_ref, &array), extradata_size); + release_nio_buffer(env, array_ref, array); + } + if (csd1) { + memcpy(extradata + sps_size, get_nio_buffer(env, csd1, &array_ref, &array), extradata_size); + release_nio_buffer(env, array_ref, array); + } for (int i = 0; i < extradata_size; i++) { printf("extradata[%d] = %x\n", i, extradata[i]); diff --git a/src/api-impl/android/media/MediaCodec.java b/src/api-impl/android/media/MediaCodec.java index 613726fe..f48564fb 100644 --- a/src/api-impl/android/media/MediaCodec.java +++ b/src/api-impl/android/media/MediaCodec.java @@ -60,7 +60,7 @@ public class MediaCodec { if ("aac".equals(codecName) || "mp3".equals(codecName) || "opus".equals(codecName)) { native_configure_audio(native_codec, format.getByteBuffer("csd-0"), format.getInteger("sample-rate"), format.getInteger("channel-count")); - } else if ("h264".equals(codecName)) { + } else if ("h264".equals(codecName) || "vp8".equals(codecName) || "vp9".equals(codecName)) { native_configure_video(native_codec, format.getByteBuffer("csd-0"), format.getByteBuffer("csd-1"), surface); } else { System.out.println("configure: format " + format + " not implemented"); diff --git a/src/api-impl/android/media/MediaCodecList.java b/src/api-impl/android/media/MediaCodecList.java index 9bc938a9..80ad0dc6 100644 --- a/src/api-impl/android/media/MediaCodecList.java +++ b/src/api-impl/android/media/MediaCodecList.java @@ -3,7 +3,7 @@ package android.media; public class MediaCodecList { public static int getCodecCount() { - return 4; + return 6; } public static MediaCodecInfo getCodecInfoAt(int index) { @@ -16,6 +16,10 @@ public class MediaCodecList { return new MediaCodecInfo("mp3", "audio/mpeg"); case 3: return new MediaCodecInfo("opus", "audio/opus"); + case 4: + return new MediaCodecInfo("vp8", "video/x-vnd.on2.vp8"); + case 5: + return new MediaCodecInfo("vp9", "video/x-vnd.on2.vp9"); default: return null; }