From b7f06e41c1422ac6dc9dc4594c66649d70f3e08d Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sat, 17 Feb 2024 15:17:37 +0100 Subject: [PATCH] implement release() methods in MediaCodec and related classes --- src/api-impl-jni/audio/android_media_AudioTrack.c | 6 ++++++ .../generated_headers/android_media_AudioTrack.h | 8 ++++++++ .../generated_headers/android_media_MediaCodec.h | 8 ++++++++ src/api-impl-jni/media/android_media_MediaCodec.c | 7 +++++++ src/api-impl/android/media/AudioTrack.java | 2 ++ src/api-impl/android/media/MediaCodec.java | 6 ++++++ src/api-impl/android/media/session/MediaSession.java | 2 ++ 7 files changed, 39 insertions(+) diff --git a/src/api-impl-jni/audio/android_media_AudioTrack.c b/src/api-impl-jni/audio/android_media_AudioTrack.c index d5785ff7..d0255c0e 100644 --- a/src/api-impl-jni/audio/android_media_AudioTrack.c +++ b/src/api-impl-jni/audio/android_media_AudioTrack.c @@ -248,3 +248,9 @@ JNIEXPORT void JNICALL Java_android_media_AudioTrack_native_1pause(JNIEnv *env, snd_pcm_t *pcm_handle = _PTR(_GET_LONG_FIELD(this, "pcm_handle")); snd_pcm_pause(pcm_handle, TRUE); } + +JNIEXPORT void JNICALL Java_android_media_AudioTrack_native_1release(JNIEnv *env, jobject this) +{ + snd_pcm_t *pcm_handle = _PTR(_GET_LONG_FIELD(this, "pcm_handle")); + snd_pcm_close(pcm_handle); +} diff --git a/src/api-impl-jni/generated_headers/android_media_AudioTrack.h b/src/api-impl-jni/generated_headers/android_media_AudioTrack.h index d2a1dc95..4795849c 100644 --- a/src/api-impl-jni/generated_headers/android_media_AudioTrack.h +++ b/src/api-impl-jni/generated_headers/android_media_AudioTrack.h @@ -53,6 +53,14 @@ JNIEXPORT void JNICALL Java_android_media_AudioTrack_native_1pause JNIEXPORT jint JNICALL Java_android_media_AudioTrack_native_1write (JNIEnv *, jobject, jbyteArray, jint, jint); +/* + * Class: android_media_AudioTrack + * Method: native_release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_android_media_AudioTrack_native_1release + (JNIEnv *, jobject); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/generated_headers/android_media_MediaCodec.h b/src/api-impl-jni/generated_headers/android_media_MediaCodec.h index 2ce5a92c..f23fd5cf 100644 --- a/src/api-impl-jni/generated_headers/android_media_MediaCodec.h +++ b/src/api-impl-jni/generated_headers/android_media_MediaCodec.h @@ -63,6 +63,14 @@ JNIEXPORT jint JNICALL Java_android_media_MediaCodec_native_1dequeueOutputBuffer JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1releaseOutputBuffer (JNIEnv *, jobject, jlong, jobject, jboolean); +/* + * Class: android_media_MediaCodec + * Method: native_release + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1release + (JNIEnv *, jobject, jlong); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/media/android_media_MediaCodec.c b/src/api-impl-jni/media/android_media_MediaCodec.c index 4332bbe6..b564614b 100644 --- a/src/api-impl-jni/media/android_media_MediaCodec.c +++ b/src/api-impl-jni/media/android_media_MediaCodec.c @@ -481,3 +481,10 @@ JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1releaseOutputBuffer g_idle_add(render_frame, data); } } + +JNIEXPORT void JNICALL Java_android_media_MediaCodec_native_1release(JNIEnv *env, jobject this, jlong codec) +{ + struct ATL_codec_context *ctx = _PTR(codec); + avcodec_free_context(&ctx->codec); + free(ctx); +} diff --git a/src/api-impl/android/media/AudioTrack.java b/src/api-impl/android/media/AudioTrack.java index e6ffa502..bfa11c6b 100644 --- a/src/api-impl/android/media/AudioTrack.java +++ b/src/api-impl/android/media/AudioTrack.java @@ -92,6 +92,7 @@ public class AudioTrack { public void release() { System.out.println("calling release(), how did this not get reported before DIDREEEEEEEEEEEEEEEEEEEEEEEEE\n"); + native_release(); } public int getState() { @@ -136,4 +137,5 @@ public class AudioTrack { public native void native_play(); public native void native_pause(); private native int native_write(byte[] audioData, int offsetInBytes, int sizeInBytes); + public native void native_release(); } diff --git a/src/api-impl/android/media/MediaCodec.java b/src/api-impl/android/media/MediaCodec.java index 3508f46c..5f64a92a 100644 --- a/src/api-impl/android/media/MediaCodec.java +++ b/src/api-impl/android/media/MediaCodec.java @@ -128,6 +128,11 @@ public class MediaCodec { System.out.println("MediaCodec.setVideoScalingMode(" + mode + "): codecName=" + codecName); } + public void release() { + System.out.println("MediaCodec.release(): codecName=" + codecName); + native_release(native_codec); + } + private native long native_constructor(String codecName); private native void native_configure_audio(long codec, ByteBuffer extradata, int sampleRate, int channelCount); private native void native_configure_video(long codec, ByteBuffer csd0, ByteBuffer csd1, Surface surface); @@ -135,6 +140,7 @@ public class MediaCodec { private native int native_queueInputBuffer(long codec, ByteBuffer buffer, long presentationTimeUs); private native int native_dequeueOutputBuffer(long codec, ByteBuffer buffer, BufferInfo info); private native void native_releaseOutputBuffer(long codec, ByteBuffer buffer, boolean render); + private native void native_release(long codec); public static final class CryptoInfo {} diff --git a/src/api-impl/android/media/session/MediaSession.java b/src/api-impl/android/media/session/MediaSession.java index 43fe90fa..660d786d 100644 --- a/src/api-impl/android/media/session/MediaSession.java +++ b/src/api-impl/android/media/session/MediaSession.java @@ -39,4 +39,6 @@ public class MediaSession { public void setMetadata(MediaMetadata metadata) {} public void setQueue(List queue) {} + + public void release() {} }