From patchwork Sun Nov 27 16:55:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 39490 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp6952599pzb; Sun, 27 Nov 2022 08:55:52 -0800 (PST) X-Google-Smtp-Source: AA0mqf6ALIQJRjP9r6rz3hTtsmouDJlUQHxiJTfbYvcykEyPE8bi24XQcm3vt5155KYL8aSjDBWW X-Received: by 2002:a17:906:9493:b0:7ad:83cb:85e6 with SMTP id t19-20020a170906949300b007ad83cb85e6mr41209035ejx.108.1669568152268; Sun, 27 Nov 2022 08:55:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669568152; cv=none; d=google.com; s=arc-20160816; b=VRBeyz8Ji/n9VvogWKDkR/yL8MhTCe4Pn3+CBD8q5b+BynncdlCjnJj14uNR1PS1E6 LaJo3vEHJZkkQu0eeqJdI1RJ/cpaG74kuUKQptC3PCi2QsZUVSKm/M4DIoKHs7LOYO60 VcHPSWz9keqzis3w5msVKNL2K71Lwv6hAyZ1rurAhdqnSzr4aMEqKwaMUaJEpvsbCJGo UeEEXmDGXo/iFCCwNlS1zYJLRQ0KhhOIIhCftxs51YQP0PJHDQ02ajYxaKLDF4abOTeL IP5Oh6wOIU9KfUQWoWqYfkqmRp9VacYGAAm2zs28EqJnA/RfEoQLGgEOleY003kEF3MO hmvQ== 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=icOTD2wGUSCsD0SzioDeDhlQvbmauZV+COhdSW14Roc=; b=iiepN+oZD/pfwHWxkU4qaIpUS+jRl/T8pkIqrkeE7ISoyKsQUmY/R4UE+ag9fKeA3H SfrcNgA8mTAm4hi0zEjALJBUmJR+DA/1OZtWNWNqFMNiWjJZs+LxU5WfIzaP11cIC71G LPQy3EiKjspdlTGeO2nvF4co1O+Jr7YPXkHpnKVn+lMdk+2XGf5pgYu2+SVs18op716Q R7zBXg87CgGRsxNeNixi1qjqruA4lVNLYrI8M8Zq+jR/TwIBlclytvWc/qdkYN/Zg5Pq i8aZZJekPXl+adHxjfbySalbXo4oy4q4QqUZx+3LNej5zZftvKahAnTGB+bp9bZk3IM9 oNwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=ZXeBCajw; 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 bm8-20020a0564020b0800b0046b1827ed9dsi1648760edb.618.2022.11.27.08.55.51; Sun, 27 Nov 2022 08:55:52 -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=ZXeBCajw; 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 03CA468B6EC; Sun, 27 Nov 2022 18:55:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-252.mail.qq.com (out162-62-57-252.mail.qq.com [162.62.57.252]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 91E7468B5DA for ; Sun, 27 Nov 2022 18:55:33 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1669568129; bh=WmTdEWkNoYOpTFBnhaqH1mT/44gNzq93QYHqf6iR3FE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZXeBCajwAK/yylnaOp1EiQEhuFm2Ecl38Sxq36iPmuseM+SZ2PZazd5VrBGMX+SNJ bakaz7TaBXONDx7yimFwTeSfw+JmhdLwV1CRHJ7yCbrNm4V6s/3NSukEKrUKEBwpQZ NGSVDwMAG8EIUtciCY3qcUs1n6v6KBG5O+qTXhLs= Received: from localhost.localdomain ([121.35.184.176]) by newxmesmtplogicsvrsza10-0.qq.com (NewEsmtp) with SMTP id DDC26A28; Mon, 28 Nov 2022 00:55:28 +0800 X-QQ-mid: xmsmtpt1669568129tuddq1pe7 Message-ID: X-QQ-XMAILINFO: MyIXMys/8kCtftVxjFh29V2FX59M3KYo8uzY7uHkbuRysB1QtcTjvZXZW6pH8j NOkdfCXq5YamrGRLlI/tgrnP+p+sjKKYc44d8QYOclNaFnzACsRABzpLFdyaM+5BM6DZdqkHP28w 6wL8VKi2T9+Qzqh9I55mXSugGX6m7otQeZKKv8+e8HYiPz8ne8QO0Oeq8u7ejUOMlSc9vzYGkvbL lX1yfiQReabbBVg2HZQ7khr2lxDS+XZ/T+NQtcOgWBl6dFZNyI8tmbG/d8tL5A5wn64daogvpa4c kGUDZiClW8yDi6psAeSmXNd47wqfEtVcAZPePoyD8KGfCK9i1+4ARNFuEt1/tE7NWaJvCX/JyauP /3sGCpojelLiwX9Kupb+8xRPOAa3Z7tpct7kI3FIK/inJOcYnpcCg+Mj9Jv0a1FnxfSJjYVjRl9B swloRg2Hwwc9Oa4shym9+ZrSAZWBqILL2AptYMaYXhumZkz+wPp9HAmgXxMQhKExMjILDVfCc0Yu NIWaBs3GfV48eTimWvSm3Nf3In/hb9LJ6qkPpxnjBpYs/SoLUoBklolC8HVtf2xTXTExc5qpSBP+ dCIgGrQRbVVOsM1PBh6NZGZ+FuORS9SRRNQbHwraYliUQ4ef68SV3fHwXXohywPeVetnM6Ldx211 UQ8sTxBfn6zp9czETRrJB99WJLlGql+SQW9VHYjZRl5YpiCU411olVF3GqeLhCkGWmdwFNAD3caq RX+wSCXfjHgWlbO9zAQARgKj4gdlwD2QLMu2zsqqu6snl9RlxC3kocOoThkjZbrmDf1Ty6WQVJew 8quOdCzOHENtOIdLLQdPGUW2KuLDfPDzMERn6Eeg3FH/u3Cgqs0IMO5FZP/FVdxXb30ZAMdS9Mpr OfmIsnNYoDa5Nog0AuQG6RIw2s46WeTmh1wIeJNdQlEOAdQPDuqiXmilsYQDCjZkAHRaMxCzeq4k moLNYWAYbP62oQHe/0LQ6Hr8v6PNDSNfdm4JtRxns= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 28 Nov 2022 00:55:03 +0800 X-OQ-MSGID: <20221127165504.24796-2-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221127165504.24796-1-quinkblack@foxmail.com> References: <20221127165504.24796-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/mediacodec_wrapper: use hardcoded value of profiles from MediaCodecInfo 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: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: k0oWLPB0FSPF From: Zhao Zhili Those are static const values and documented at https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel No runtime query is needed. Now the method can be used without JVM. --- libavcodec/mediacodec_wrapper.c | 98 +++++++++++---------------------- 1 file changed, 33 insertions(+), 65 deletions(-) diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index 193eac8da6..7ddf93ccc7 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -57,19 +57,6 @@ struct JNIAMediaCodecListFields { jclass codec_profile_level_class; jfieldID profile_id; jfieldID level_id; - - jfieldID avc_profile_baseline_id; - jfieldID avc_profile_main_id; - jfieldID avc_profile_extended_id; - jfieldID avc_profile_high_id; - jfieldID avc_profile_high10_id; - jfieldID avc_profile_high422_id; - jfieldID avc_profile_high444_id; - - jfieldID hevc_profile_main_id; - jfieldID hevc_profile_main10_id; - jfieldID hevc_profile_main10_hdr10_id; - }; static const struct FFJniField jni_amediacodeclist_mapping[] = { @@ -95,18 +82,6 @@ static const struct FFJniField jni_amediacodeclist_mapping[] = { { "android/media/MediaCodecInfo$CodecProfileLevel", "profile", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, profile_id), 1 }, { "android/media/MediaCodecInfo$CodecProfileLevel", "level", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, level_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileBaseline", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_baseline_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileMain", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_main_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileExtended", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_extended_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high10_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh422", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high422_id), 1 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh444", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high444_id), 1 }, - - { "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main_id), 0 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main10_id), 0 }, - { "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain10HDR10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main10_hdr10_id), 0 }, - { NULL } }; @@ -326,71 +301,64 @@ static const FFAMediaCodec media_codec_jni; int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx) { - int ret = -1; - - JNIEnv *env = NULL; - struct JNIAMediaCodecListFields jfields = { 0 }; - jfieldID field_id = 0; - - JNI_GET_ENV_OR_RETURN(env, avctx, -1); - - if (ff_jni_init_jfields(env, &jfields, jni_amediacodeclist_mapping, 0, avctx) < 0) { - goto done; - } + // Copy and modified from MediaCodecInfo.java + static const int AVCProfileBaseline = 0x01; + static const int AVCProfileMain = 0x02; + static const int AVCProfileExtended = 0x04; + static const int AVCProfileHigh = 0x08; + static const int AVCProfileHigh10 = 0x10; + static const int AVCProfileHigh422 = 0x20; + static const int AVCProfileHigh444 = 0x40; + static const int AVCProfileConstrainedBaseline = 0x10000; + static const int AVCProfileConstrainedHigh = 0x80000; + + static const int HEVCProfileMain = 0x01; + static const int HEVCProfileMain10 = 0x02; + static const int HEVCProfileMainStill = 0x04; + static const int HEVCProfileMain10HDR10 = 0x1000; + static const int HEVCProfileMain10HDR10Plus = 0x2000; + + // Unused yet. + (void)AVCProfileConstrainedHigh; + (void)HEVCProfileMain10HDR10; + (void)HEVCProfileMain10HDR10Plus; if (avctx->codec_id == AV_CODEC_ID_H264) { switch(avctx->profile) { case FF_PROFILE_H264_BASELINE: + return AVCProfileBaseline; case FF_PROFILE_H264_CONSTRAINED_BASELINE: - field_id = jfields.avc_profile_baseline_id; - break; + return AVCProfileConstrainedBaseline; case FF_PROFILE_H264_MAIN: - field_id = jfields.avc_profile_main_id; + return AVCProfileMain; break; case FF_PROFILE_H264_EXTENDED: - field_id = jfields.avc_profile_extended_id; - break; + return AVCProfileExtended; case FF_PROFILE_H264_HIGH: - field_id = jfields.avc_profile_high_id; - break; + return AVCProfileHigh; case FF_PROFILE_H264_HIGH_10: case FF_PROFILE_H264_HIGH_10_INTRA: - field_id = jfields.avc_profile_high10_id; - break; + return AVCProfileHigh10; case FF_PROFILE_H264_HIGH_422: case FF_PROFILE_H264_HIGH_422_INTRA: - field_id = jfields.avc_profile_high422_id; - break; + return AVCProfileHigh422; case FF_PROFILE_H264_HIGH_444: case FF_PROFILE_H264_HIGH_444_INTRA: case FF_PROFILE_H264_HIGH_444_PREDICTIVE: - field_id = jfields.avc_profile_high444_id; - break; + return AVCProfileHigh444; } } else if (avctx->codec_id == AV_CODEC_ID_HEVC) { switch (avctx->profile) { case FF_PROFILE_HEVC_MAIN: + return HEVCProfileMain; case FF_PROFILE_HEVC_MAIN_STILL_PICTURE: - field_id = jfields.hevc_profile_main_id; - break; + return HEVCProfileMainStill; case FF_PROFILE_HEVC_MAIN_10: - field_id = jfields.hevc_profile_main10_id; - break; + return HEVCProfileMain10; } } - if (field_id) { - ret = (*env)->GetStaticIntField(env, jfields.codec_profile_level_class, field_id); - if (ff_jni_exception_check(env, 1, avctx) < 0) { - ret = -1; - goto done; - } - } - -done: - ff_jni_reset_jfields(env, &jfields, jni_amediacodeclist_mapping, 0, avctx); - - return ret; + return -1; } char *ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int encoder, void *log_ctx)