MediaCodec: add VP8 and VP9 codecs

This commit is contained in:
Julian Winkler
2025-06-02 20:20:59 +02:00
parent 5383360c38
commit 542e6222b7
3 changed files with 20 additions and 10 deletions

View File

@@ -205,20 +205,26 @@ JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1configure_1video(JN
AVCodecContext *codec_ctx = ctx->codec; AVCodecContext *codec_ctx = ctx->codec;
jarray array_ref; jarray array_ref;
jbyte *array; jbyte *array;
int sps_size; int sps_size = 0;
int pps_size; int pps_size = 0;
printf("Java_android_media_MediaCodec_native_1configure_video(%s)\n", codec_ctx->codec->name); printf("Java_android_media_MediaCodec_native_1configure_video(%s)\n", codec_ctx->codec->name);
if (csd0)
sps_size = get_nio_buffer_size(env, csd0); sps_size = get_nio_buffer_size(env, csd0);
if (csd1)
pps_size = get_nio_buffer_size(env, csd1); pps_size = get_nio_buffer_size(env, csd1);
size_t extradata_size = sps_size + pps_size; size_t extradata_size = sps_size + pps_size;
uint8_t *extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); uint8_t *extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (csd0) {
memcpy(extradata, get_nio_buffer(env, csd0, &array_ref, &array), extradata_size); memcpy(extradata, get_nio_buffer(env, csd0, &array_ref, &array), extradata_size);
release_nio_buffer(env, array_ref, array); release_nio_buffer(env, array_ref, array);
}
if (csd1) {
memcpy(extradata + sps_size, get_nio_buffer(env, csd1, &array_ref, &array), extradata_size); memcpy(extradata + sps_size, get_nio_buffer(env, csd1, &array_ref, &array), extradata_size);
release_nio_buffer(env, array_ref, array); release_nio_buffer(env, array_ref, array);
}
for (int i = 0; i < extradata_size; i++) { for (int i = 0; i < extradata_size; i++) {
printf("extradata[%d] = %x\n", i, extradata[i]); printf("extradata[%d] = %x\n", i, extradata[i]);

View File

@@ -60,7 +60,7 @@ public class MediaCodec {
if ("aac".equals(codecName) || "mp3".equals(codecName) || "opus".equals(codecName)) { 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")); 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); native_configure_video(native_codec, format.getByteBuffer("csd-0"), format.getByteBuffer("csd-1"), surface);
} else { } else {
System.out.println("configure: format " + format + " not implemented"); System.out.println("configure: format " + format + " not implemented");

View File

@@ -3,7 +3,7 @@ package android.media;
public class MediaCodecList { public class MediaCodecList {
public static int getCodecCount() { public static int getCodecCount() {
return 4; return 6;
} }
public static MediaCodecInfo getCodecInfoAt(int index) { public static MediaCodecInfo getCodecInfoAt(int index) {
@@ -16,6 +16,10 @@ public class MediaCodecList {
return new MediaCodecInfo("mp3", "audio/mpeg"); return new MediaCodecInfo("mp3", "audio/mpeg");
case 3: case 3:
return new MediaCodecInfo("opus", "audio/opus"); 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: default:
return null; return null;
} }