From e4cd15d379b1a0bf1f91aaf873cfa07b0998f295 Mon Sep 17 00:00:00 2001 From: magjed Date: Thu, 30 Mar 2017 01:08:36 -0700 Subject: [PATCH] Fix JNI reference leak in MediaCodecVideoDecoder We currently leak one local reference to MediaCodecVideoDecoder in every call to MediaCodecVideoDecoderFactory::CreateVideoDecoder. After the decoder has been re-initialized 512 times, JNI will crash due to local reference table overflow (max=512). The actual leak is in the member initializer list of MediaCodecVideoDecoder. This CL fixes the leak by adding a ScopedLocalRefFrame outside of the ctor. All JNI code that originate from a C++ thread (i.e. the entry point is not a Java thread) must use a ScopedLocalRefFrame in order to avoid leaking local references. BUG=webrtc:6969,b/36713034 Review-Url: https://codereview.webrtc.org/2780273002 Cr-Commit-Position: refs/heads/master@{#17464} --- webrtc/sdk/android/src/jni/androidmediadecoder_jni.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webrtc/sdk/android/src/jni/androidmediadecoder_jni.cc b/webrtc/sdk/android/src/jni/androidmediadecoder_jni.cc index d30e94c58f..8f50fc2107 100644 --- a/webrtc/sdk/android/src/jni/androidmediadecoder_jni.cc +++ b/webrtc/sdk/android/src/jni/androidmediadecoder_jni.cc @@ -199,7 +199,6 @@ MediaCodecVideoDecoder::MediaCodecVideoDecoder( *j_media_codec_video_decoder_class_, "", "()V"))) { - ScopedLocalRefFrame local_ref_frame(jni); codec_thread_->SetName("MediaCodecVideoDecoder", NULL); RTC_CHECK(codec_thread_->Start()) << "Failed to start MediaCodecVideoDecoder"; @@ -1014,8 +1013,9 @@ webrtc::VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder( for (VideoCodecType codec_type : supported_codec_types_) { if (codec_type == type) { ALOGD << "Create HW video decoder for type " << (int)type; - return new MediaCodecVideoDecoder(AttachCurrentThreadIfNeeded(), type, - egl_context_); + JNIEnv* jni = AttachCurrentThreadIfNeeded(); + ScopedLocalRefFrame local_ref_frame(jni); + return new MediaCodecVideoDecoder(jni, type, egl_context_); } } ALOGW << "Can not find HW video decoder for type " << (int)type;