From patchwork Sun May 21 16:15:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Bouron X-Patchwork-Id: 3708 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp1086089vsk; Sun, 21 May 2017 09:15:50 -0700 (PDT) X-Received: by 10.28.87.72 with SMTP id l69mr22537893wmb.111.1495383350472; Sun, 21 May 2017 09:15:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495383350; cv=none; d=google.com; s=arc-20160816; b=C3G50LJV01tz/y/EZjdOD8V1vvuNJnmBLSkNljKsS2ngl0TMv3omA19XQ6eb7JRSLc +W0qENm50Yiwizuq9yHFhGNwl9ip/PrRyBw1a+pp21gEjhETlz5BE/t/dvRUwYsO1+ih TvuiRnPPG+HfNdghwqF9JS/82KRUcghZPTCyF0mVB6j3Ft0O3gPPgmcsdC4MLD2cekRb /AVgzR2kDe0MZk/lUXSj0Urb2OKj4nzM4rf3T90LNpfs6GSJPKjo3OkOf7dPETlbWV+c WTZhbB31oKgkyY/ElwXnDfo6UnSdXiEDezBVHa2GZ9u9jiqg+0Rsr2hV22q+dy71s4do dJzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=XnpIWS5fCeew9963xUgcmuNDU0O9jjCXVyMIbU+GpqE=; b=YuGLOmFWxDDn0Ju65BMEczaI2rkZsOpaj6ZosTNX9kNc3/ST/ntF2r5NNa9fH5u7eW YJEuGCELKTw+l7XU4G3a3gj4aUWvrO5bF7AyveWR7AoDyDIm2HtIB8cZwrgP/z6c0jgI WExjMZT6lNGPqUoWYAEMPHykQwXYhC47ugEUGDd3vI7MYb0+i3WTj5u0h7UqTFaXW3YD Z2Q9J473PyNU0Y+ljw/fvTF8FZX4JQpg+kVf3Yg0FEb5Jc0StYS9t06uNY25d3mTswER ouOpT0VDklfFO8HZD9HZs0bV1EoLDIZcKLWxuUH+QeyC3GFWGZGjn6tgeW8ZB+6yHD95 Xayw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p14si32740761wmi.47.2017.05.21.09.15.49; Sun, 21 May 2017 09:15:50 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 09082689934; Sun, 21 May 2017 19:15:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1523B688379 for ; Sun, 21 May 2017 19:15:38 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id k15so26186664wmh.3 for ; Sun, 21 May 2017 09:15:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=+bsYcC4YAKD85C/aYZ1jnBlbA6SzpI6HPbgXP+BAWik=; b=mNj/KT/4zg9BIufoWe8Z7tyYhQfeIdQpAIPQmuMS7E6YcrNf/cTlpsYqk1vSOtKFqP kmoccfa6WusODWAXZ2LvfkcnO2PK6zmBn9EQlRnE75n2W/roCMepvGJHVCmgr/Sg06AQ bJu1JUnKylDOvZ8cMCGKKOFqrayqsZ/tUxD9pYjYHA13TQeTvo/LfRLAqI9LJylrlzHb N6kWpUbD05QQ/nDHnTjSxENtfpg0slGHHHipP+oA5P8Po1/LsRF9i6IIkOqXNWE9wDUw U0NQwRxx4/AHtQIvLL+L8JSrWL04J8jydwf6rhIpkqtLofUfdR3IP+BezZ/RiCTSOl26 t5Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=+bsYcC4YAKD85C/aYZ1jnBlbA6SzpI6HPbgXP+BAWik=; b=oOZRuMCv3A23o7siDW3cd+yIvpditve+C0FuEePsPZa+WJzXpT7dld2VSfj4ASWnmE erHA+8OUsYc8Kz5/BjKK/8qhyD1Z8sHGcFMBlufv3eWqazSa22/zabXygNaf06eAzDq5 VDjUkRdi5WrSs4+VAdc3g99Nz1xL3fGKpI5ujcVlj63PQtyFrYAsouvb583iWSMQQBJQ xXwx0291Z/oEJNN4J6ltuV0wXZ8mOTs1wk120ENCR61m0QEohv7Ur9uqcdvrhSbDjMOS a/Z6DhOw0nzpMVqbTp3F+0kp0LWpQ8KpaqFfzOGx06u3JUAV9YTmsrGEzuC8Jx+w29zS q0Eg== X-Gm-Message-State: AODbwcDiGOfMo5ciz/mF+yLVnw3ALBKeKsiEzJ4B4MBELT0kOoCO+Jbe qc2DElVyxoUcHg== X-Received: by 10.223.176.36 with SMTP id f33mr9221456wra.124.1495383338920; Sun, 21 May 2017 09:15:38 -0700 (PDT) Received: from localhost.localdomain (AMontsouris-653-1-6-238.w86-212.abo.wanadoo.fr. [86.212.85.238]) by smtp.gmail.com with ESMTPSA id k18sm9126320wre.9.2017.05.21.09.15.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 May 2017 09:15:38 -0700 (PDT) From: Matthieu Bouron To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 May 2017 18:15:29 +0200 Message-Id: <20170521161531.30958-1-matthieu.bouron@gmail.com> X-Mailer: git-send-email 2.12.0 Subject: [FFmpeg-devel] [PATCH 1/3] lavc/mediacodec_wrapper: fix local reference leaks X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Matthieu Bouron MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/mediacodec_wrapper.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index 43fbb511fd..5e1beed43a 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -608,6 +608,7 @@ FFAMediaFormat *ff_AMediaFormat_new(void) { JNIEnv *env = NULL; FFAMediaFormat *format = NULL; + jobject object = NULL; format = av_mallocz(sizeof(FFAMediaFormat)); if (!format) { @@ -625,23 +626,27 @@ FFAMediaFormat *ff_AMediaFormat_new(void) goto fail; } - format->object = (*env)->NewObject(env, format->jfields.mediaformat_class, format->jfields.init_id); - if (!format->object) { + object = (*env)->NewObject(env, format->jfields.mediaformat_class, format->jfields.init_id); + if (!object) { goto fail; } - format->object = (*env)->NewGlobalRef(env, format->object); + format->object = (*env)->NewGlobalRef(env, object); if (!format->object) { goto fail; } - return format; fail: - ff_jni_reset_jfields(env, &format->jfields, jni_amediaformat_mapping, 1, format); + if (object) { + (*env)->DeleteLocalRef(env, object); + } - av_freep(&format); + if (!format->object) { + ff_jni_reset_jfields(env, &format->jfields, jni_amediaformat_mapping, 1, format); + av_freep(&format); + } - return NULL; + return format; } static FFAMediaFormat *ff_AMediaFormat_newFromObject(void *object) @@ -1562,6 +1567,7 @@ uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t JNIEnv *env = NULL; jobject buffer = NULL; + jobject input_buffers = NULL; JNI_GET_ENV_OR_RETURN(env, codec, NULL); @@ -1572,12 +1578,12 @@ uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t } } else { if (!codec->input_buffers) { - codec->input_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_input_buffers_id); + input_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_input_buffers_id); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->input_buffers = (*env)->NewGlobalRef(env, codec->input_buffers); + codec->input_buffers = (*env)->NewGlobalRef(env, input_buffers); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } @@ -1596,6 +1602,10 @@ fail: (*env)->DeleteLocalRef(env, buffer); } + if (input_buffers) { + (*env)->DeleteLocalRef(env, input_buffers); + } + return ret; } @@ -1605,6 +1615,7 @@ uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t JNIEnv *env = NULL; jobject buffer = NULL; + jobject output_buffers = NULL; JNI_GET_ENV_OR_RETURN(env, codec, NULL); @@ -1615,12 +1626,12 @@ uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t } } else { if (!codec->output_buffers) { - codec->output_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_output_buffers_id); + output_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_output_buffers_id); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->output_buffers = (*env)->NewGlobalRef(env, codec->output_buffers); + codec->output_buffers = (*env)->NewGlobalRef(env, output_buffers); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } @@ -1639,6 +1650,10 @@ fail: (*env)->DeleteLocalRef(env, buffer); } + if (output_buffers) { + (*env)->DeleteLocalRef(env, output_buffers); + } + return ret; }