From patchwork Sun Nov 20 06:49:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 39355 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp1406850pzb; Sat, 19 Nov 2022 22:52:07 -0800 (PST) X-Google-Smtp-Source: AA0mqf7i3SuPt74LlkQ4XsxkSfIrK9z2lpHJw/r0JwsOpY09dVa6O2P5aVNuqbO1c5EF+cGBnCaL X-Received: by 2002:a17:907:c24a:b0:7ac:2e16:bc31 with SMTP id tj10-20020a170907c24a00b007ac2e16bc31mr11255843ejc.242.1668927126870; Sat, 19 Nov 2022 22:52:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668927126; cv=none; d=google.com; s=arc-20160816; b=B5CSZnlNaEy2JZ5gluOnB0SLd1d0jiVBukaBTyGElO2BUuNRi5uBH4qJFCBlYqRRJX EfNsjHe5iht8pJvDsyDvw49yXPQRpr8nrSZdThJSIeLErCvkD+q4UHY/wuch4PwVLr1Z U+fOWmjDqDs5/vosNKKtq431G/OFYemFR/uXLnEaDuTEX/skGWpFGf4QlNqTvu3n9LB6 HkoWZ71rMsD2bTt9qt0EefufuTjl1oIm+U0VBRgr4IeHzxHFXFzSdXmU0D6MfQ99FQDr oD4O0oDjxQYGlVBzyM58wvi24DC5tbFG0ATBm6ZTDYeZsb/sVvXGNYHZ9I+neihlXkDG Wzrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to:date :to:from:message-id:dkim-signature:delivered-to; bh=GU28Hxbpi4f+zmymUfFYyN1Df+1kRxee1ISsK0y7doQ=; b=Dbyls1E6YyDmUbdN/ufKRzQPvdnl1TlpgNSFVkTXg67o4AzrZJ4bQniPvuW8MKeYmc Xs5NemyjSTXfuQa1lhVBLbk+uxq8eOYltLmUogcc7+PdYCpWaf4hsmLjygl3Sn9KjuOg gehhR79HuSqXdv5CVsRqzTtejKPsbW77aTdi/3lydw/+ysRnScg3vrm3Ne1hbPyfqGx+ /5POBduisinJYPPd889+vycLGSTH57QV+B7AXOXP4l7sg59C3taI6GTjyZs9VS0WXlFk AnIOELhLiM8Jym0jNNQf3QJFmgoUXPq0cTZ1bxOGD+zMHcmVeSM/a3Temu1+ItR3qFcO S/9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=cUpXQ5w3; 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=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h9-20020a056402280900b0046189831142si7568243ede.7.2022.11.19.22.52.06; Sat, 19 Nov 2022 22:52:06 -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=@foxmail.com header.s=s201512 header.b=cUpXQ5w3; 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=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E6B5E68BC64; Sun, 20 Nov 2022 08:50:54 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-49.mail.qq.com (out162-62-57-49.mail.qq.com [162.62.57.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A45F68BBA0 for ; Sun, 20 Nov 2022 08:50:40 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1668927038; bh=XeRbgW+n0OnOAIY6s1NU9qBVQGTmD9BSYhW4lwMLJJM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=cUpXQ5w3mva1wTtXWxoUhQRokD8pfAVncGQjln7wNjQ01nt/PBXbbK0mArqJNVwGR T5Hg2oCTb5dZ7UB7YwKW0NVhz5EVBo4DdA35Ri2oZABW1gRTh2/NXmFBqfUBy1RNUB gY343eLO9q3uDmpsvWsLBEvUYn2mlQ/hisMsjHqU= Received: from localhost.localdomain ([14.153.77.200]) by newxmesmtplogicsvrszc2-1.qq.com (NewEsmtp) with SMTP id C8F0626E; Sun, 20 Nov 2022 14:50:15 +0800 X-QQ-mid: xmsmtpt1668927037tg8qaw80a Message-ID: X-QQ-XMAILINFO: MyIXMys/8kCtF3u4C86if76S3kJaefhly9SgFc4I717WJLZP0FGA9kDpiD6Hhx uj/tYUBa79RtN413p9TUHyz+eMOZC8RvAvWWHXW8QdWeRCXsyatEWDdQQr7eP37sm+NiDrXjGKY4 kDJxLFYalfUrj4fAaQsraWXtf1Fb0hwcwC7TnPdlSAmCxThw9UW8nPCyPSwIykU0mjHp9sPi2uNU OjHiofyI8QZe7J8FHnn+utpPKmNa4poYQGaviB+9faKA7HltAiJ6YPU3VjlTraLkU93rFCmwKEpw PeB1rf7amjruz/EXMy/sk8FaR1QdifgX6iX/M4DNfvCmdbPGqWV0yTnL6X+DUZU74NcAlNKExTvg YOYhSDD/nATd7FtiYVmCusdNHyma/LEei2uPwDZvAWgMdHQyMqMxzAsDEqiLaGFjPkbr+qgSbU68 tWxX84d9bmU5H9//UkqFUUCxIEvfGmn9Myhdp+n1HNatx60q9FmxHBy+Xjslt6sDvPuvTKu95ezO qtmQsIE+0cY+4rT2sxI+UPLCTCoRPHUYiedMosx1nQ8N2ne7g8zZb3x1bVXqA44tgmcgSAkMG0Dv e6ZyaEkDRZC2GERImO7h3nA/4LDb/Ib2FNex+zDxyDHbydhdl3N3eE+xpc1w2UjGod4Tf0sZ1lcz uwen3E5DmW0PjXIRBao89LdoWBTRGx7VR4AxfuBYMllwAjgBLBKFdAz5ZkptT7PgKeQvj066kB34 s42rdFiSfbmLPHk1LAv6fLu/A3wYpPiZhgs7qNdEIjw29sIa9GVm29x1HIEFYehM0Rjp7PA8ExHw O78Zag1nraw8CG/cjsl/BJEVLSJHq2jIzBjvNIDy8AfMJmixDRPUpDz1G1uBC00OSXSKBmIxQLP6 cyyLV/eszbYdPnZcIgEyuKJ8E5xptIGsYk8gp3b+bYyX3dB8xd5MVR3wOGCrRtaU6/M/aNJdtfCF g+y2DN5PAezFmQz4ZbTV81rXCPl3huakTVXALiT9tPMNHgCrDiKGFNgMPcsDa9+WRdvpmh2bg= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sun, 20 Nov 2022 14:49:42 +0800 X-OQ-MSGID: <20221120064947.94540-8-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221120064947.94540-1-quinkblack@foxmail.com> References: <20221120064947.94540-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 07/12] avcodec/mediacodecdec: enable NDK mediacodec X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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@stupeflix.com, Zhao Zhili , aman@tmm1.net Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vWlZgDqZ7RCd From: Zhao Zhili Signed-off-by: Zhao Zhili --- Changelog | 1 + libavcodec/mediacodecdec.c | 10 +++++++++- libavcodec/mediacodecdec_common.c | 23 +++++++++++++++++++---- libavcodec/mediacodecdec_common.h | 1 + libavcodec/version.h | 4 ++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Changelog b/Changelog index 166aa8b5e7..eb8eb72127 100644 --- a/Changelog +++ b/Changelog @@ -20,6 +20,7 @@ version : - ViewQuest VQC decoder - backgroundkey filter - nvenc AV1 encoding support +- MediaCodec decoder via NDKMediaCodec version 5.1: diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 2e07548b77..2c231d1a34 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -40,6 +40,7 @@ #include "hevc_parse.h" #include "hwconfig.h" #include "internal.h" +#include "jni.h" #include "mediacodec_wrapper.h" #include "mediacodecdec_common.h" @@ -54,6 +55,7 @@ typedef struct MediaCodecH264DecContext { int delay_flush; int amlogic_mpeg2_api23_workaround; + int use_ndk_codec; } MediaCodecH264DecContext; static av_cold int mediacodec_decode_close(AVCodecContext *avctx) @@ -310,7 +312,10 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) FFAMediaFormat *format = NULL; MediaCodecH264DecContext *s = avctx->priv_data; - format = ff_AMediaFormat_new(0); + if (s->use_ndk_codec < 0) + s->use_ndk_codec = !av_jni_get_java_vm(avctx); + + format = ff_AMediaFormat_new(s->use_ndk_codec); if (!format) { av_log(avctx, AV_LOG_ERROR, "Failed to create media format\n"); ret = AVERROR_EXTERNAL; @@ -388,6 +393,7 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) } s->ctx->delay_flush = s->delay_flush; + s->ctx->use_ndk_codec = s->use_ndk_codec; if ((ret = ff_mediacodec_dec_init(avctx, s->ctx, codec_mime, format)) < 0) { s->ctx = NULL; @@ -528,6 +534,8 @@ static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { static const AVOption ff_mediacodec_vdec_options[] = { { "delay_flush", "Delay flush until hw output buffers are returned to the decoder", OFFSET(delay_flush), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VD }, + { "ndk_codec", "Use MediaCodec from NDK", + OFFSET(use_ndk_codec), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VD }, { NULL } }; diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index 4a9e50b0df..ae82efaa0a 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -608,12 +608,27 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s, s->codec_name = ff_AMediaCodecList_getCodecNameByType(mime, profile, 0, avctx); if (!s->codec_name) { - ret = AVERROR_EXTERNAL; - goto fail; + // getCodecNameByType() can fail due to missing JVM, while NDK + // mediacodec can be used without JVM. + if (!s->use_ndk_codec) { + ret = AVERROR_EXTERNAL; + goto fail; + } + av_log(avctx, AV_LOG_INFO, "Failed to getCodecNameByType\n"); + } else { + av_log(avctx, AV_LOG_DEBUG, "Found decoder %s\n", s->codec_name); } - av_log(avctx, AV_LOG_DEBUG, "Found decoder %s\n", s->codec_name); - s->codec = ff_AMediaCodec_createCodecByName(s->codec_name, 0); + if (s->codec_name) + s->codec = ff_AMediaCodec_createCodecByName(s->codec_name, s->use_ndk_codec); + else { + s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec); + if (s->codec) { + s->codec_name = ff_AMediaCodec_getName(s->codec); + if (!s->codec_name) + s->codec_name = av_strdup(mime); + } + } if (!s->codec) { av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for type %s and name %s\n", mime, s->codec_name); ret = AVERROR_EXTERNAL; diff --git a/libavcodec/mediacodecdec_common.h b/libavcodec/mediacodecdec_common.h index 0b21129fee..0ab29036bd 100644 --- a/libavcodec/mediacodecdec_common.h +++ b/libavcodec/mediacodecdec_common.h @@ -70,6 +70,7 @@ typedef struct MediaCodecDecContext { bool delay_flush; atomic_int serial; + bool use_ndk_codec; } MediaCodecDecContext; int ff_mediacodec_dec_init(AVCodecContext *avctx, diff --git a/libavcodec/version.h b/libavcodec/version.h index 480dbd3b67..fcf589f61f 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,8 +29,8 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 52 -#define LIBAVCODEC_VERSION_MICRO 102 +#define LIBAVCODEC_VERSION_MINOR 53 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \