From patchwork Wed Jan 3 14:05:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Bouron X-Patchwork-Id: 7104 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp15937366jad; Wed, 3 Jan 2018 06:05:17 -0800 (PST) X-Google-Smtp-Source: ACJfBosppo32qoGpfECCOoFtDf8s0IjgasKD2YJ7QCc9/CuyHHlW2WAS/IQ/1Y5/yB7yp7wCh6cE X-Received: by 10.223.184.200 with SMTP id c8mr1604250wrg.268.1514988317544; Wed, 03 Jan 2018 06:05:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514988317; cv=none; d=google.com; s=arc-20160816; b=dmp/ltfRxZc2e7mT+mFRoWYTRrbv0a/G+SxquB4j/QuSUCS/Vf5sMatjKWQp8EfoVE VANCXe+kgggk9Yx43SC6EXmUx6Wq7R3EWqRY/vfYgxDMbNBfIVevfy4yWci1K52GHqEb pB4kexnC8LDxIbl3ac+4wAvTsuyTJf2yMHfci/XU5TruS2sIS+fia0w+RgLcTQ4Zpifl ihwjpq7czoWsF3s0ArI/i1fsYQI5NZnL7umKYyfPAxxZ5bM8UQ9jV0D+gPo9dnXL7kiF OKZUR8mIM8e9PQrqIzQMFCZBjYua9qQaMGBR5rpAoofDN/5t/03WV2Txyn7Ogir42/u+ 0DCw== 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=p2LLTfcCGwqf5ENgscON7Oeq5X+5KU3BIznJJRjKZ7U=; b=uJRHmTNXbSYvB0Ugcrt1pyWZzvpfEJKRGXE99ED12JP2gIQ0o+suJQsqA/a3Py6DFJ VTa8Ou7pIAJr1oahqIQ69i4dYVP11CELhCreMw49C+r1rFYfF3asoScfHdlqb4mVMWlW 9vqidRXhYVPKOxI/wEm2vExIWMynMGO+HQpllE4VReL1hJz+KKbtXod2OH0ZdqTYdSYM IaEreLyoX1bNrBz69d9wREpNgAp35pFJmoPN2Lqb7A/DRiSeV89WvvoQx/VyRLPz8LjH c/YEoYudNjyUIL/6TK6G37ZhA3Xr+S+U4aK+ybnzKLRMFaPUFSgapPtwqUKXFuAAtCfH bbLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=nfQjWUQu; 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 w19si823505wmw.119.2018.01.03.06.05.16; Wed, 03 Jan 2018 06:05:17 -0800 (PST) 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 header.s=20161025 header.b=nfQjWUQu; 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 4126068837F; Wed, 3 Jan 2018 16:04:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f181.google.com (mail-wr0-f181.google.com [209.85.128.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 29BE9680BA2 for ; Wed, 3 Jan 2018 16:04:52 +0200 (EET) Received: by mail-wr0-f181.google.com with SMTP id w107so1671357wrb.9 for ; Wed, 03 Jan 2018 06:05:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=uyBHgDhXlFqUmyR/JvGolKtTjxM4plt4DMHMwLAhBhY=; b=nfQjWUQuCXw2T4Br8rY/NfiXa37aR3HJBSkqmRm6ihaCUUCeARXvYlCjf5Ke6jQXj0 m3sI8LMN2QHOXm8MNkal1GvrWcL1tVrcC8W8keSqDZEPcYSobQHJSudv8KBMRoptmXO7 IJFR1vhIl6AkHjTZlGB136qDY+m5+/19aeaOsuDLkBTD9KKgfdU9EcgShJE9LDGBZ5c0 teKYvmMvoC5Q0ttOopdY3qeRFWeWPkPNCvKQpZ9LcbcRPEiu6x51BakR8raBRrnP6Mob znPQgiQ832K96+aPxRcuW57dZC1v8D05SlHl7LwWvDD7XmCh6f+3aBR1Eyv+0hIpGIHV S7jw== 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=uyBHgDhXlFqUmyR/JvGolKtTjxM4plt4DMHMwLAhBhY=; b=cuCIDauwgWtDo7HchF4Nz4cpj/ajwY1OCzlkgKdVkiNWWl4L2BY/TfjWVB/oUnTbBq 1NCTrMh9bVJxn+MZWWDXpIRyXFw9v2YSds3qLkh3yIwQm97bvwIQgJRqOjSXFEXpAdmY 4xEgusKHs6A51fChUOsq9Bb+gVDwprUXJbcXPsq1wv1TFO2r2lg9EEFmib3nW88qlWOc GSg6pjezkrtGSdbqLzPuMGsIkOfZtqpOYS8qeCxHmTMsiiOaH75bAkbmOPbo5idunOtq Vv2hRRMteVrYntWMDqMEbNaw0aPD1IwYTrn4pLE5u3GnOlahIFsqFtZfASr3ydh9our+ uhTQ== X-Gm-Message-State: AKGB3mJ74j88i3qIk9A6QFMfZ7lHjNQNE8Dgf09cGJJeZoM0D6ANOXML IyiS8dKSTGQCO9+1SxgESyl3iw== X-Received: by 10.223.164.5 with SMTP id d5mr1522815wra.172.1514988307752; Wed, 03 Jan 2018 06:05:07 -0800 (PST) Received: from kusa.lan (AMontsouris-653-1-231-218.w86-212.abo.wanadoo.fr. [86.212.90.218]) by smtp.gmail.com with ESMTPSA id y14sm917355wrh.33.2018.01.03.06.05.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Jan 2018 06:05:07 -0800 (PST) From: Matthieu Bouron To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Jan 2018 15:05:00 +0100 Message-Id: <20180103140500.2194-1-matthieu.bouron@gmail.com> X-Mailer: git-send-email 2.15.1 Subject: [FFmpeg-devel] [PATCH] lavc/mediacodec_wrapper: allocate MediaCodec.BufferInfo once 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 | 61 +++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index d9f0e27a7d..dbc37bf463 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -274,6 +274,7 @@ struct FFAMediaCodec { struct JNIAMediaCodecFields jfields; jobject object; + jobject buffer_info; jobject input_buffers; jobject output_buffers; @@ -1143,6 +1144,7 @@ static inline FFAMediaCodec *codec_create(int method, const char *arg) FFAMediaCodec *codec = NULL; jstring jarg = NULL; jobject object = NULL; + jobject buffer_info = NULL; jmethodID create_id = NULL; codec = av_mallocz(sizeof(FFAMediaCodec)); @@ -1195,6 +1197,16 @@ static inline FFAMediaCodec *codec_create(int method, const char *arg) codec->has_get_i_o_buffer = 1; } + buffer_info = (*env)->NewObject(env, codec->jfields.mediainfo_class, codec->jfields.init_id); + if (ff_jni_exception_check(env, 1, codec) < 0) { + goto fail; + } + + codec->buffer_info = (*env)->NewGlobalRef(env, buffer_info); + if (!codec->buffer_info) { + goto fail; + } + ret = 0; fail: if (jarg) { @@ -1205,10 +1217,19 @@ fail: (*env)->DeleteLocalRef(env, object); } + if (buffer_info) { + (*env)->DeleteLocalRef(env, buffer_info); + } + if (ret < 0) { if (codec->object) { (*env)->DeleteGlobalRef(env, codec->object); } + + if (codec->buffer_info) { + (*env)->DeleteGlobalRef(env, codec->buffer_info); + } + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); av_freep(&codec); } @@ -1246,6 +1267,9 @@ int ff_AMediaCodec_delete(FFAMediaCodec* codec) (*env)->DeleteGlobalRef(env, codec->object); codec->object = NULL; + (*env)->DeleteGlobalRef(env, codec->buffer_info); + codec->buffer_info = NULL; + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); av_freep(&codec); @@ -1413,48 +1437,31 @@ ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec* codec, FFAMediaCodecBu int ret = 0; JNIEnv *env = NULL; - jobject mediainfo = NULL; - JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); - mediainfo = (*env)->NewObject(env, codec->jfields.mediainfo_class, codec->jfields.init_id); + ret = (*env)->CallIntMethod(env, codec->object, codec->jfields.dequeue_output_buffer_id, codec->buffer_info, timeoutUs); if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; + return AVERROR_EXTERNAL; } - ret = (*env)->CallIntMethod(env, codec->object, codec->jfields.dequeue_output_buffer_id, mediainfo, timeoutUs); + info->flags = (*env)->GetIntField(env, codec->buffer_info, codec->jfields.flags_id); if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; + return AVERROR_EXTERNAL; } - info->flags = (*env)->GetIntField(env, mediainfo, codec->jfields.flags_id); + info->offset = (*env)->GetIntField(env, codec->buffer_info, codec->jfields.offset_id); if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; + return AVERROR_EXTERNAL; } - info->offset = (*env)->GetIntField(env, mediainfo, codec->jfields.offset_id); + info->presentationTimeUs = (*env)->GetLongField(env, codec->buffer_info, codec->jfields.presentation_time_us_id); if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; + return AVERROR_EXTERNAL; } - info->presentationTimeUs = (*env)->GetLongField(env, mediainfo, codec->jfields.presentation_time_us_id); + info->size = (*env)->GetIntField(env, codec->buffer_info, codec->jfields.size_id); if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; - } - - info->size = (*env)->GetIntField(env, mediainfo, codec->jfields.size_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - ret = AVERROR_EXTERNAL; - goto fail; - } -fail: - if (mediainfo) { - (*env)->DeleteLocalRef(env, mediainfo); + return AVERROR_EXTERNAL; } return ret;