From 7c9a32d0415b4a2a745172b40fb95b934af2d9eb Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Wed, 6 Nov 2024 23:25:28 +0100 Subject: [PATCH] MediaCodec: release all output buffers on release This prevents leaking video memory --- src/api-impl-jni/media/android_media_MediaCodec.c | 7 +++++++ src/api-impl/android/media/MediaCodec.java | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/media/android_media_MediaCodec.c b/src/api-impl-jni/media/android_media_MediaCodec.c index 2754326a..3aa4fcad 100644 --- a/src/api-impl-jni/media/android_media_MediaCodec.c +++ b/src/api-impl-jni/media/android_media_MediaCodec.c @@ -465,6 +465,10 @@ JNIEXPORT jint JNICALL Java_android_media_MediaCodec_native_1dequeueOutputBuffer _SET_INT_FIELD(buffer_info, "size", 0); _SET_LONG_FIELD(buffer_info, "presentationTimeUs", 0); av_frame_free(&frame); + // set the buffer to NULL, so we don't try to render it + uint8_t *raw_buffer = get_nio_buffer(env, buffer, &array_ref, &array); + *((AVFrame **)raw_buffer) = NULL; + release_nio_buffer(env, array_ref, array); return 0; } if (ret != AVERROR(EAGAIN)) { @@ -569,6 +573,9 @@ JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1releaseOutputBuffer *raw_buffer = NULL; release_nio_buffer(env, array_ref, array); + if (!frame) + return; + if (!render) { fprintf(stderr, "skipping %dx%d frame!\n", frame->width, frame->height); av_frame_free(&frame); diff --git a/src/api-impl/android/media/MediaCodec.java b/src/api-impl/android/media/MediaCodec.java index ce21a7bc..e95d01bd 100644 --- a/src/api-impl/android/media/MediaCodec.java +++ b/src/api-impl/android/media/MediaCodec.java @@ -147,8 +147,15 @@ public class MediaCodec { public void release() { System.out.println("MediaCodec.release(): codecName=" + codecName); - if (native_codec != 0) + if (native_codec != 0) { + if (outputBuffers != null) { + for (int i=0; i