From patchwork Mon Mar 27 15:21:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Raposo Vieira Mira X-Patchwork-Id: 40874 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7a30:b0:df:834d:2c1a with SMTP id t48csp1419758pzh; Mon, 27 Mar 2023 08:21:55 -0700 (PDT) X-Google-Smtp-Source: AKy350Z/QNfUTJnj5ih0MiemxooWMTNDirkjKhbfUWDdi80G2ZYmQav8LcM613TLJlXBwQX5hX/I X-Received: by 2002:a05:6402:10d7:b0:501:c839:cf90 with SMTP id p23-20020a05640210d700b00501c839cf90mr11180496edu.3.1679930514499; Mon, 27 Mar 2023 08:21:54 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s16-20020aa7d790000000b005002aad5850si26352287edq.589.2023.03.27.08.21.54; Mon, 27 Mar 2023 08:21:54 -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=@qt.io header.s=selector2 header.b=vFP2rtYk; arc=fail (body hash mismatch); 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qt.io Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AD98868CB0E; Mon, 27 Mar 2023 18:21:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2094.outbound.protection.outlook.com [40.107.20.94]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D182468CB08 for ; Mon, 27 Mar 2023 18:21:36 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gnaCs5sbdX7TLcTekuO+yI3rHQRVPSayU3JxPHYlN2HUET5aaDv2aBADbTuSq2ZKIEeiZIz7lCJg6vASWMqNICb565fmTuHt5fsnRnH7L59trBZuvVHw3IqX70iR3iVnPN6FPD0wKEMj+UmrqOsdoHk4qxZEWSGeOIal2UTRZ0J259wGCc6rI1LQRFgYG00S4BASPSPfAJHc/RwovFaFB0I0AbEb0tq472bLuy5FXnc9VEcaF/LUDNOAhQOKoWuK6HSttOe74pnEcjvGbisT0twEsvavGpmwvmpny7tPx3K/dawPU5CZPpX136/l5d/VMw6ZbnBeEsZORJb+YLYIOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+GCL/kdMan9HBWnbYGSLFKGQUUVIboEftLBN5a2jNjE=; b=C4Rt/gshg7GbK5a2GnEqHYo4AYzYxNZ5R2SUUoFSFLWygHA/X8oPHIgiDTr2GA76epDQaKrzsMNp6wuEf1w1iXvFdzNHt1bsIlQ43vVQNmiYzwpKOD18N66cxjjzXB1x3bpfX+BLCb4V3sPJdQ2MfzteSd0NN6vOv4R9J3T2XGk0NzPsCiQGwM2neCPTAD9IVRUjHh1iLNH7qUY+pTdOQcz9V7fDGX/IfpCZmGjQWTGOcGcYE8l6vF9pofaTUy51NS4LqJAIQFIREleXEEu0SZwyt014PT3j8rtah3cPY/RvVw6/MAsg1ugQPdpUsFc5wMVVCaUmMI7m2k2ud8D9Qg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=qt.io; dmarc=pass action=none header.from=qt.io; dkim=pass header.d=qt.io; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qt.io; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+GCL/kdMan9HBWnbYGSLFKGQUUVIboEftLBN5a2jNjE=; b=vFP2rtYkBLwAW9mLi1rni/p8YRIRLIT162LIN+yfvHvVJbuBfF8JAkn87St8u+AQom20sGii/8U5eNQO+4Q6cH3hd+JZK4a1ZSWRmIJOI6+rI2e/vbB3hutkZdFtsDvHKkO0YwWN5hrM5quYOCCccadrP05XgeMR8lrt2DuC/CI= Received: from DBAPR02MB6165.eurprd02.prod.outlook.com (2603:10a6:10:18e::8) by AS4PR02MB8646.eurprd02.prod.outlook.com (2603:10a6:20b:58d::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6222.28; Mon, 27 Mar 2023 15:21:34 +0000 Received: from DBAPR02MB6165.eurprd02.prod.outlook.com ([fe80::fcdd:550f:463b:bd2d]) by DBAPR02MB6165.eurprd02.prod.outlook.com ([fe80::fcdd:550f:463b:bd2d%3]) with mapi id 15.20.6222.030; Mon, 27 Mar 2023 15:21:34 +0000 From: Samuel Raposo Vieira Mira To: FFmpeg development discussions and patches Thread-Topic: [PATCH 1/2] avcodec/mediacodec add vp9 encoder using mediacodec Thread-Index: AQHZYL1ZNhOielR72EWVQASPnJ54jA== Date: Mon, 27 Mar 2023 15:21:34 +0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=qt.io; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DBAPR02MB6165:EE_|AS4PR02MB8646:EE_ x-ms-office365-filtering-correlation-id: 8a117ccd-a13d-42af-96b1-08db2ed6f34a x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: QFCnPM7JbESWgqCUZVr6MBUAbBR9BpPWrmzVMn9enH3XgpoLc0kpDyZs4PWnVFDjxQ73lnh6WhHLP38uymn8tg86A6Y3Sjpo3AZbabjY8yid4yUmFkSgXdsYPBSgcdKUN6mHAPsLuN8pDCrJnU87Rop4Gav1V+1JHNCWGaMj0aoq8Mn10CelCewCD591zphpeBoRNVesLjegB+QaQbHXyOMqlUVsc0AcdBsbtTdg18ByVsdrtoIlfx8UCkn9+YYr+yiD6QvTEj6nwQsmoqSW1yBVpAHVgjkC0eOQu2R+YzWEWwm+GsKO0GgRbOPQ62fRKocqJJHtavZYQcvFHoD4TKLOiZu/zkYpurDgRpya/qHl/RF253eXHZnNfzsDjBzdWvDQzN4BunmzbgWxLRoe638rot/UGmHMnWK0tgVMyla37AZMiYxVWiAsRl1Yt5hCy5AhO08DY0aHHflxyFRhsxpXh8Pg1/UosMj5TsCZX78XnDUSZl5fdZCHwWat7HzVJU8bwAAhKNdZus/+N/HCwUdeqBDNosJm8f/8orzYglYnNK8XrztFSR+HtD08B71Wi4LuY6a5ivoYoWVBQA2PezFsUKMvVsDwOkSdxyjrJbs3A6q/gz/wRztwooLZhpzmW8gB8yoEflj617LlPyRylQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DBAPR02MB6165.eurprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(4636009)(346002)(396003)(376002)(39850400004)(136003)(366004)(451199021)(91956017)(166002)(52536014)(41300700001)(33656002)(86362001)(99936003)(5660300002)(38100700002)(8936002)(122000001)(66446008)(7696005)(478600001)(71200400001)(76116006)(64756008)(8676002)(66946007)(66556008)(6916009)(2906002)(66476007)(38070700005)(55016003)(19627235002)(6506007)(26005)(186003)(9686003)(316002); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: xgtkQFkT9zcOQNO/uJV7kHegaZoMPGxYjKEeW9BeylHvFQZjIbi+js6i2THJx3uZqigDi/QLSRK1O1dBjxnAPjMV9kcxny1/emLuaAR5/7NJ5v25Kfzya8Pj3Xb12orjLxWQdvLUTmy5pL1f1kwmyDWDURSDUkS5gLPbEYshmcznKyKbvJbTxwZ7clAZUXYVt3qUW5sccqoPS/hSo8hvXtzQqJhtK+CfNCo3msOKAnPLg9KDq7GDbMZVvWXYE7ZqcJIexw9OTr3xn0lpnLqagZuo3if6lJIK2jHYtHJpJ8qlW6eCmOP4eOV6e8Nz+xWMnQ53pNuRRuOLjae/ppAmfF1wqs96552+jqzzXOpJj9bfIYR+NbVHjqT1fX3nMPPPvXfRYimQ7MV6xTsJpS3OwTwalKvrJ9Ict3ha6XdRKGeir3y7CcQEtmnvLNoJa0nRLvT+BnPy8Dz0aFYBbcQniwF+8efyPya9SGEVTdg8pxG8IRm1KUN+vvlFev8F8FFPqqZQVAStawdotrpSxxRs4D4QLaFYTcGzGcZVx+sWn4eHHKp1yQAMufJXGCzNT73XMSyITI5W/NCX4AarE7Z+/w1SmJQajjT761P0rGNalET6gq5ziLPPCCr9OoZMBINq+//C7MlS1DDWcAZCXk9lqYk222FHkQ+kTGyPvgJcUNcq35SnDNb/pwinNtam5FFln/FnBKml79kvkbVSgHspHSBtQLC9DlSGkmqLK4qBGBncaej90ohS7i6JjDpxMkjBIgkuOVrwLhJd8CWUiDU3drc/o6OvvP0DWeckP/sGa/yYlgZ60lDSh5iO6+JPw6DQgI/7V/y/wSQGCoQGKj2SanIZSlC07CgRTIf2p4yNpT4HQVabsAyid8KatL67NS6ErOfAY3xfmXu9AmC468CWirXTwkp0A42ivC0UueJ6H5eM/g/4GnK7S2IX6A2BdWXZezk3+z25prVcjiEYvga1Ib6gLYlw2bA6km8Nr+U0gLAha+/BvObEeYbv48dJkfmDQ/w89Yn50pZxpnsaYjOeOrO2s+9UVUkHadf1FFc95QqGeC+j8p0ZNvy6kELHi7iBbDx/iEePG6SJUjPVrEmAJfqM+eCQ3d5gL385NM9fPvtgxII2gWEl2icDyOcSwthkYRYqYRbFP3RX495MoXu6hRMVRGmjDecf7uF9yX53Fnmrls6RXY+AytLho4z7qa4lS8pSCcpQIp6mbAVrez/D6UpgbvJIC0trxAWkIRkklTMqZpxNg0tK2xbsjcMT5Ut3hXMqcnawH6tXm8h+Qs64Sgsh0nkBIUh2jfmrUJC3EaLPWzbSbiraO2bQRLu4Q3pXQdguedgTbf9ZPEzbrHuwuN0JoYdLOi3uY0qVXX5SiAlcNhrylTk1BrInF9twxGDKqHzn4xVd/GfQYIRVAjdG9Xh7ySyGp0GpdPwHo9tzu6RTZ0HK3++qcOjuYa86Ao4IY9FcOn5QrLCPmBALMv8a24XKCy2Yq3kmDNMo9dbpX0BpgaVm2I4d8pomx7F8t+ofKAS/DrUQdsIKUHzPsgCRPm6IntRUEs/bdNCcZITD8HHnM+Mco4OjXIc64qMncvPIDVoLeqin5t4M762XAp3nAQ== MIME-Version: 1.0 X-OriginatorOrg: qt.io X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DBAPR02MB6165.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8a117ccd-a13d-42af-96b1-08db2ed6f34a X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Mar 2023 15:21:34.2162 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 20d0b167-794d-448a-9d01-aaeccc1124ac X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: z94bot9vMJXu5ZHLbfjpLKobLB6JemPKI+9w5pIbTHNitJtVXxDd9Mc5QMBtXbDOfcUjHmLf4bbYL5lSLydPMA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR02MB8646 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodec add vp9 encoder using 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: iHsOQbrQMLek The only encoders avaliable using mediacodec were h264 and hevc. This patch adds the vp9 encoder. Signed-off-by: Samuel Mira > --- configure | 3 ++ libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/mediacodec_wrapper.c | 24 +++++++++++++ libavcodec/mediacodecenc.c | 61 +++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) -- 2.35.2 Samuel Mira Senior Software Developer The Qt Company Tutkijantie 4C FI-90590 Oulu Finland samuel.mira@qt.io www.qt.io [signature_3255782021] [signature_3655584933] [signature_3785140935] [signature_765191051] [signature_2165164460] diff --git a/configure b/configure index cec001fb16..101bc7b2f1 100755 --- a/configure +++ b/configure @@ -3246,6 +3246,9 @@ vp8_v4l2m2m_decoder_deps="v4l2_m2m vp8_v4l2_m2m" vp8_v4l2m2m_encoder_deps="v4l2_m2m vp8_v4l2_m2m" vp9_cuvid_decoder_deps="cuvid" vp9_mediacodec_decoder_deps="mediacodec" +vp9_mediacodec_decoder_extralibs="-landroid" +vp9_mediacodec_encoder_deps="mediacodec" +vp9_mediacodec_encoder_extralibs="-landroid" vp9_qsv_decoder_select="qsvdec" vp9_rkmpp_decoder_deps="rkmpp" vp9_vaapi_encoder_deps="VAEncPictureParameterBufferVP9" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 408ecd1e31..3d213014c6 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -774,6 +774,7 @@ OBJS-$(CONFIG_VP9_DECODER) += vp9.o vp9data.o vp9dsp.o vp9lpf.o vp9r vp9dsp_8bpp.o vp9dsp_10bpp.o vp9dsp_12bpp.o OBJS-$(CONFIG_VP9_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec.o +OBJS-$(CONFIG_VP9_MEDIACODEC_ENCODER) += mediacodecenc.o OBJS-$(CONFIG_VP9_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_VP9_VAAPI_ENCODER) += vaapi_encode_vp9.o OBJS-$(CONFIG_VP9_QSV_ENCODER) += qsvenc_vp9.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 385ee34803..6333844868 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -882,6 +882,7 @@ extern const FFCodec ff_vp8_v4l2m2m_encoder; extern const FFCodec ff_vp8_vaapi_encoder; extern const FFCodec ff_vp9_cuvid_decoder; extern const FFCodec ff_vp9_mediacodec_decoder; +extern const FFCodec ff_vp9_mediacodec_encoder; extern const FFCodec ff_vp9_qsv_decoder; extern const FFCodec ff_vp9_vaapi_encoder; extern const FFCodec ff_vp9_qsv_encoder; diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index d1fb640ec2..b13211d435 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -319,10 +319,23 @@ int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx) static const int HEVCProfileMain10HDR10 = 0x1000; static const int HEVCProfileMain10HDR10Plus = 0x2000; + static const int VP9Profile0 = 0x01; + static const int VP9Profile1 = 0x02; + static const int VP9Profile2 = 0x04; + static const int VP9Profile3 = 0x08; + static const int VP9Profile2HDR = 0x1000; + static const int VP9Profile3HDR = 0x2000; + static const int VP9Profile2HDR10Plus = 0x4000; + static const int VP9Profile3HDR10Plus = 0x8000; + // Unused yet. (void)AVCProfileConstrainedHigh; (void)HEVCProfileMain10HDR10; (void)HEVCProfileMain10HDR10Plus; + (void)VP9Profile2HDR; + (void)VP9Profile3HDR; + (void)VP9Profile2HDR10Plus; + (void)VP9Profile3HDR10Plus; if (avctx->codec_id == AV_CODEC_ID_H264) { switch(avctx->profile) { @@ -357,6 +370,17 @@ int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx) case FF_PROFILE_HEVC_MAIN_10: return HEVCProfileMain10; } + } else if (avctx->codec_id == AV_CODEC_ID_VP9) { + switch (avctx->profile) { + case FF_PROFILE_VP9_0: + return VP9Profile0; + case FF_PROFILE_VP9_1: + return VP9Profile1; + case FF_PROFILE_VP9_2: + return VP9Profile2; + case FF_PROFILE_VP9_3: + return VP9Profile3; + } } return -1; diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c index 2ab56597fe..c7e2beb1ae 100644 --- a/libavcodec/mediacodecenc.c +++ b/libavcodec/mediacodecenc.c @@ -164,6 +164,9 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) case AV_CODEC_ID_HEVC: codec_mime = "video/hevc"; break; + case AV_CODEC_ID_VP9: + codec_mime = "video/x-vnd.on2.vp9"; + break; default: av_assert0(0); } @@ -764,3 +767,61 @@ static const AVOption hevc_options[] = { DECLARE_MEDIACODEC_ENCODER(hevc, "H.265", AV_CODEC_ID_HEVC) #endif // CONFIG_HEVC_MEDIACODEC_ENCODER + +#if CONFIG_VP9_MEDIACODEC_ENCODER + +enum MediaCodecVP9Level { + VP9Level1 = 0x1, + VP9Level11 = 0x2, + VP9Level2 = 0x4, + VP9Level21 = 0x8, + VP9Level3 = 0x10, + VP9Level31 = 0x20, + VP9Level4 = 0x40, + VP9Level41 = 0x80, + VP9Level5 = 0x100, + VP9Level51 = 0x200, + VP9Level52 = 0x400, + VP9Level6 = 0x800, + VP9Level61 = 0x1000, + VP9Level62 = 0x2000, +}; + +static const AVOption vp9_options[] = { + COMMON_OPTION + { "level", "Specify tier and level", + OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE, "level" }, + { "1", "Level 1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level1 }, 0, 0, VE, "level" }, + { "1.1", "Level 1.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level11 }, 0, 0, VE, "level" }, + { "2", "Level 2", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level2 }, 0, 0, VE, "level" }, + { "2.1", "Level 2.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level21 }, 0, 0, VE, "level" }, + { "3", "Level 3", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level3 }, 0, 0, VE, "level" }, + { "3.1", "Level 3.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level31 }, 0, 0, VE, "level" }, + { "4", "Level 4", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level4 }, 0, 0, VE, "level" }, + { "4.1", "Level 4.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level41 }, 0, 0, VE, "level" }, + { "5", "Level 5", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level5 }, 0, 0, VE, "level" }, + { "5.1", "Level 5.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level51 }, 0, 0, VE, "level" }, + { "5.2", "Level 5.2", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level52 }, 0, 0, VE, "level" }, + { "6", "Level 6", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level6 }, 0, 0, VE, "level" }, + { "6.1", "Level 4.1", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level61 }, 0, 0, VE, "level" }, + { "6.2", "Level 6.2", + 0, AV_OPT_TYPE_CONST, { .i64 = VP9Level62 }, 0, 0, VE, "level" }, + { NULL, } +}; + +DECLARE_MEDIACODEC_ENCODER(vp9, "VP9", AV_CODEC_ID_VP9) + +#endif // CONFIG_VP9_MEDIACODEC_ENCODER From patchwork Mon Mar 27 15:21:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Raposo Vieira Mira X-Patchwork-Id: 40873 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7a30:b0:df:834d:2c1a with SMTP id t48csp1419588pzh; Mon, 27 Mar 2023 08:21:43 -0700 (PDT) X-Google-Smtp-Source: AKy350bQFddnD7cZuKJapnmEEt9nnyJSZjbTzM9GELhlI/FrkYy6ryg0ZqDl1fCWoKhDwzIMtW8T X-Received: by 2002:a05:6402:1356:b0:4fb:1c02:8750 with SMTP id y22-20020a056402135600b004fb1c028750mr13007472edw.23.1679930502610; Mon, 27 Mar 2023 08:21:42 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x16-20020aa7d6d0000000b004ad0287dbafsi28472128edr.203.2023.03.27.08.21.41; Mon, 27 Mar 2023 08:21:42 -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=@qt.io header.s=selector2 header.b="agc/96tU"; arc=fail (body hash mismatch); 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qt.io Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6437068CB03; Mon, 27 Mar 2023 18:21:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2094.outbound.protection.outlook.com [40.107.20.94]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 948DB68C506 for ; Mon, 27 Mar 2023 18:21:31 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PhmDFv2Q8lENfzMJ30dflVJ8/ilSPLZQ8dJZAnuXzjP7Q/47zuhRx00VuCkkMom+32ygy8OOzaQEc/ZKF9pVlc8K2qntdSjuKXVahRYn5TM8hMFocHev3xRQBS1YHlCsnWCsGvGbJaETbOhmx21nbVQcDNUy3IEVhHxHxt41YOMbKloFzxipUCCdfTA+QN8NWDhlEjcQU3Wj5mWGPfS1Fv1xd3hUGslfNUriF1V4w0X4GhlmO5IWw94SkFns8Qxt1hiAlYPDH0qo4xKjzUTiYsCUeDKQ53Ibi8WQrZti2BPlu3mv3oJTMPI0Ae9DvXUElgYr628FnQX224IG8zvcUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UHRrBQH/j94mexiK4biMWdrlk5Lc+IBH1K0X5QGMWsI=; b=kPZwwUiMSE079hOLsjRwuoqNRpQejwLyY8GGE0K89XOngs5JLEL5EOfnjE8fEkW1MWRgJ0TgeCPwYnFbj00ATMfmesBcC79pRt+OKdXqPcyJDKOUeTlzclLypR2QSoC8lNM4S2tVchaJfNeIsqdLZMDt2H54zxC9vRO49hmXObIXwSI8BBPQFwebOrSA6sbD3CO3CNtTMlrQmmBC5xO9Ppwiai9w1IYu16kXdueIN5xxJutAjQwhukN4EOCK2oJljs+rGFRW1K0zyGo2YXJdJcdyNdJBVjKtVnHQyCvt8Pv/o49vWpnYeHHlMPxotzOCPjLZmQjFc0zIYahjQHq98g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=qt.io; dmarc=pass action=none header.from=qt.io; dkim=pass header.d=qt.io; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qt.io; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UHRrBQH/j94mexiK4biMWdrlk5Lc+IBH1K0X5QGMWsI=; b=agc/96tUeLqChntB0Y6szqqalxfWFtHVxb5xP1Ju1Jbjy3LeypM5oqzChXqLFSmMdM3tYcoIMKKhT5U18NJK/IyG9xTiFcst3TpY/zaPdd5RX2Z4jI0ERgfA5EdCpXMJGQviDPMLVtRCWA+gPVAI6Kf0l66xEqZcI0MalEvrmfk= Received: from DBAPR02MB6165.eurprd02.prod.outlook.com (2603:10a6:10:18e::8) by AS4PR02MB8646.eurprd02.prod.outlook.com (2603:10a6:20b:58d::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6222.28; Mon, 27 Mar 2023 15:21:28 +0000 Received: from DBAPR02MB6165.eurprd02.prod.outlook.com ([fe80::fcdd:550f:463b:bd2d]) by DBAPR02MB6165.eurprd02.prod.outlook.com ([fe80::fcdd:550f:463b:bd2d%3]) with mapi id 15.20.6222.030; Mon, 27 Mar 2023 15:21:27 +0000 From: Samuel Raposo Vieira Mira To: FFmpeg development discussions and patches Thread-Topic: [PATCH 2/2] avcodec/mediacodec: add mpeg4 encoder Thread-Index: AQHZYL9uHE1rkVhUy06K6jBcukSswA== Date: Mon, 27 Mar 2023 15:21:27 +0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=qt.io; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DBAPR02MB6165:EE_|AS4PR02MB8646:EE_ x-ms-office365-filtering-correlation-id: d7ea797a-ec2c-4a35-209e-08db2ed6ef68 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: xkDjRVc1jvCMssfLVA1+yMPGtNyyp7TOcDhDslznv4H7N9WPEOSp1TgYWEh5J8sPEZ3N0iEZlFAyVbZ8QJYN/FCf/T8Qd2jzn7IHsnG3bnrafTFfwrz14PmusE3bgBDnJoG847kIHDXO+vmY8pVf5RSdco1Qa22aYbL6X71Cum7PoXGsbEeI1+nFdu/Cjr9BkPn4YJjlAmh7c6IGzJGrMcxVFIEh4FPcMDlkCccJMycXRM9GWDrBizGgvKp3R22OA3FqhElJZmAn+zVUbutowrmovOXmAVG5lIQWOGxrfAMQpPm/0Mc1uckfTmAz9HWDnLkAq1EqMcKJTSgiUZnFg/JemHwlQxsBvCOybChcnLeA8QdhlV8hLi8Wi1CwcT9R0GOK670k812z1nZTqy3YZrSXJ9aWPgC5E+/v9/2ye9IL2Al7iIK9HMh+3mWDLlm/JevV9KKVKVIbeCP+XPwC1jXjH8ZikkSxCmBbFA/tzRM4Y8Dc1FCYXXFdoRXXO9Vx4eSZoJvvoX+kXXiKS4D8nsktdzETz0iS9IYkaZfePMuMJFyYAvINwmJoXiKyfTx60ODojQ79opNmZUZh6+h7yCWePA8vUh4RqLKpJ61R3lV+H9wahoInkOqiBtS4kEtmJIDrqZvCPboAdNX6s1lvlA== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DBAPR02MB6165.eurprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(4636009)(346002)(396003)(376002)(39850400004)(136003)(366004)(451199021)(91956017)(166002)(52536014)(41300700001)(33656002)(86362001)(99936003)(5660300002)(38100700002)(8936002)(122000001)(66446008)(7696005)(478600001)(71200400001)(76116006)(64756008)(8676002)(66946007)(66556008)(6916009)(2906002)(66476007)(38070700005)(55016003)(19627235002)(6506007)(26005)(186003)(9686003)(316002); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: uNdyeWYJDW/FyqL+8vd4fZjnfsgdKamymnhLze4FBcWla2dXZc73TJq1vlDXcTco+si2kGDHCxRnSu1dRroYvWi90DCJHfhM9aNiFHyjCF0R310haMGWuJOW2trQHf2jfSxvqz5NtqfngbXEDtamj55RL2+hQ3weXQaHmZ68HV3dyOoCvf1Qap22C4Bx90qR79DIMK6D9BsRzLFM3OdyUvU/YqN8z6E1LtTRv411XHanHeByvRxfYt1SfHnXMpbFihZ0aeH3NXijT3RRitAJJWNpn3GnanBLSYEqqfhHLiDUcpWaztHc8gGB/01V95zzc71gzWxwNccdf/2RLpZMQl+k73bBtuoF0+rSSOj76GHrK7b/NVhwmyk1GsgSXs7cJKB6GNDLGe2tP+E3TC8b1JQng8vZjUfW2sBX6znUjRg6hJ/SYo8dm0y5wo2FEL5Yb0J4GLWkRSon0jPV+Y5TQ8yDLUGHy0sahqLraHFkGlLXlwW4BnLCwkq6h6Lso6h5W4o70rThVrcxkvqbAChKHsIgJpSEowmNq8/npaf0W/SPE8iRrIZcHRw+773/A+TUXzQKd6lCIu+59mx4SQCtzB2lo/gGCPq84odnWLH2+AmNeK3O4q9pY2Ho8qGNobaqSeN0tXN0TVkfHaSxQeBcfaSIYkgDpCUDQ1vgLDiRYC5NobvtkmcCNpw/AjoyTK8eB34iRW53BKtlMLmXtTJHMO8yyxOqlZ/mNeP9BvswwqkiJNkWPRvqMaz/JMTHtO0I888pTdg+mKhiHVGMSq0tywpQB7+04J4lSglTPjXwwhMPtMAGKmM/9k5v6Z2t2zlPrt0wdTBL4VPpBNKtz8rvxJvpoEKUOPSd4hGTvGMO5PLslyWHpyaRp8BdXloQ57AWbJKrfItO+PxK0OIIL+5mczsH8GMKtJjCPttzoDfR5xCWDhlb3Hm16FzYvCx/DuN+h7KL2PJG4X2fOxEY9BWqTB6XGOLUTuHC/OBbz6BR2CL6Pajj5THHoG2Q8GjJuM0QqlVv5l2S/CGM5L5Hc7mQlbq4FMw9eodt9MqWlMH/EDkKdJw6poVzx69BypZTHVoeN5xC5RSgZlBGahU2HJ6wGh+sNoKjsvREYJm9HomfEVKr7y7tYUi0XL+FvNzTaKY/uE6XphHxHEDSANfNoYMBimQ69kxu4iwWMV/tMCJpcu5rwYeGRFCCQQho80dNjxtl1cYHwpkHTKTN5OGsQ0BGXWN16HzCjTHuvU5wbnLoSAJPYF0j+gpcu/BL0OdNtzS3zjmlHWlaSnox59QCoT0jNs8NyTF5QFKMiEMrDM6w2MLZmroes49NguDAqasT/kJYnrmJS9GUezNCmL+HLn8gP+hN99mehaXirIxYQUHVU4VP3rjJf9ZZXN7X5dq3ulzK0Nn/UthBq9A2uH9qnEmrjUqnt1NuKlCbXNzSU0e58Ohs8wpwU9ltbDJDVShLGKpt1WrcT13/qtP+nwp60fKF41G3xV/qz91HJAZ8F0KLkOVgQUYSIu2OrOhMrob3IMCacW7X1mVEWqpScOKEBxNgtepZGM12rweyoZtU8UmkqCN9n7XSgn+B/IuD+nSyhr4e4xi8mb9an2jMWd0Fslbv+w== MIME-Version: 1.0 X-OriginatorOrg: qt.io X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DBAPR02MB6165.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d7ea797a-ec2c-4a35-209e-08db2ed6ef68 X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Mar 2023 15:21:27.6917 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 20d0b167-794d-448a-9d01-aaeccc1124ac X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: HfFSmxwmWuVBtM44TfinMoIydYFMpI8lFj4DzwESDjbaX5IqnvAaedKWV6duL0lPkHahGVa/wkBJKquDz+uEZQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR02MB8646 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/mediacodec: add mpeg4 encoder 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: BHsyssRrWV06 This patch will add MPEG4 encoder using Android Mediacodec Signed-off-by: Samuel Mira > --- configure | 2 ++ libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/mediacodec_wrapper.c | 55 +++++++++++++++++++++++++++++++++ libavcodec/mediacodecenc.c | 49 +++++++++++++++++++++++++++++ 5 files changed, 108 insertions(+) -- 2.35.2 Samuel Mira Senior Software Developer The Qt Company Tutkijantie 4C FI-90590 Oulu Finland samuel.mira@qt.io www.qt.io [signature_4074551992] [signature_183607293] [signature_465813548] [signature_1516411291] [signature_1076561480] diff --git a/configure b/configure index 101bc7b2f1..be0c201414 100755 --- a/configure +++ b/configure @@ -3226,6 +3226,8 @@ mpeg2_v4l2m2m_decoder_deps="v4l2_m2m mpeg2_v4l2_m2m" mpeg4_crystalhd_decoder_select="crystalhd" mpeg4_cuvid_decoder_deps="cuvid" mpeg4_mediacodec_decoder_deps="mediacodec" +mpeg4_mediacodec_encoder_deps="mediacodec" +mpeg4_mediacodec_encoder_extralibs="-landroid" mpeg4_mmal_decoder_deps="mmal" mpeg4_omx_encoder_deps="omx" mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 3d213014c6..77b7c988c5 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -542,6 +542,7 @@ OBJS-$(CONFIG_MPEG4_DECODER) += mpeg4videodsp.o xvididct.o OBJS-$(CONFIG_MPEG4_ENCODER) += mpeg4videoenc.o OBJS-$(CONFIG_MPEG4_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o +OBJS-$(CONFIG_MPEG4_MEDIACODEC_ENCODER) += mediacodecenc.o OBJS-$(CONFIG_MPEG4_OMX_ENCODER) += omx.o OBJS-$(CONFIG_MPEG4_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_MPEG4_V4L2M2M_ENCODER) += v4l2_m2m_enc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6333844868..24fd935211 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -871,6 +871,7 @@ extern const FFCodec ff_mpeg2_qsv_encoder; extern const FFCodec ff_mpeg2_vaapi_encoder; extern const FFCodec ff_mpeg4_cuvid_decoder; extern const FFCodec ff_mpeg4_mediacodec_decoder; +extern const FFCodec ff_mpeg4_mediacodec_encoder; extern const FFCodec ff_mpeg4_omx_encoder; extern const FFCodec ff_mpeg4_v4l2m2m_encoder; extern const FFCodec ff_prores_videotoolbox_encoder; diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index b13211d435..46445bc7d6 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -327,6 +327,23 @@ int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx) static const int VP9Profile3HDR = 0x2000; static const int VP9Profile2HDR10Plus = 0x4000; static const int VP9Profile3HDR10Plus = 0x8000; + + static const int MPEG4ProfileSimple = 0x01; + static const int MPEG4ProfileSimpleScalable = 0x02; + static const int MPEG4ProfileCore = 0x04; + static const int MPEG4ProfileMain = 0x08; + static const int MPEG4ProfileNbit = 0x10; + static const int MPEG4ProfileScalableTexture = 0x20; + static const int MPEG4ProfileSimpleFBA = 0x80; + static const int MPEG4ProfileSimpleFace = 0x40; + static const int MPEG4ProfileBasicAnimated = 0x100; + static const int MPEG4ProfileHybrid = 0x200; + static const int MPEG4ProfileAdvancedRealTime = 0x400; + static const int MPEG4ProfileCoreScalable = 0x800; + static const int MPEG4ProfileAdvancedCoding = 0x1000; + static const int MPEG4ProfileAdvancedCore = 0x2000; + static const int MPEG4ProfileAdvancedScalable = 0x4000; + static const int MPEG4ProfileAdvancedSimple = 0x8000; // Unused yet. (void)AVCProfileConstrainedHigh; @@ -381,6 +398,44 @@ int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx) case FF_PROFILE_VP9_3: return VP9Profile3; } + } else if(avctx->codec_id == AV_CODEC_ID_MPEG4) { + switch (avctx->profile) + { + case FF_PROFILE_MPEG4_SIMPLE: + return MPEG4ProfileSimple; + case FF_PROFILE_MPEG4_SIMPLE_SCALABLE: + return MPEG4ProfileSimpleScalable; + case FF_PROFILE_MPEG4_CORE: + return MPEG4ProfileCore; + case FF_PROFILE_MPEG4_MAIN: + return MPEG4ProfileMain; + case FF_PROFILE_MPEG4_N_BIT: + return MPEG4ProfileNbit; + case FF_PROFILE_MPEG4_SCALABLE_TEXTURE: + return MPEG4ProfileScalableTexture; + case FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION: + return MPEG4ProfileSimpleFBA; + case FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE: + return MPEG4ProfileBasicAnimated; + case FF_PROFILE_MPEG4_HYBRID: + return MPEG4ProfileHybrid; + case FF_PROFILE_MPEG4_ADVANCED_REAL_TIME: + return MPEG4ProfileAdvancedRealTime; + case FF_PROFILE_MPEG4_CORE_SCALABLE: + return MPEG4ProfileCoreScalable; + case FF_PROFILE_MPEG4_ADVANCED_CODING: + return MPEG4ProfileAdvancedCoding; + case FF_PROFILE_MPEG4_ADVANCED_CORE: + return MPEG4ProfileAdvancedCore; + case FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE: + return MPEG4ProfileAdvancedScalable; + case FF_PROFILE_MPEG4_ADVANCED_SIMPLE: + return MPEG4ProfileAdvancedSimple; + case FF_PROFILE_MPEG4_SIMPLE_STUDIO: + // Studio profiles are not supported by mediacodec. + default: + break; + } } return -1; diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c index c7e2beb1ae..6baa7eda14 100644 --- a/libavcodec/mediacodecenc.c +++ b/libavcodec/mediacodecenc.c @@ -167,6 +167,9 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) case AV_CODEC_ID_VP9: codec_mime = "video/x-vnd.on2.vp9"; break; + case AV_CODEC_ID_MPEG4: + codec_mime = "video/mp4v-es"; + break; default: av_assert0(0); } @@ -825,3 +828,49 @@ static const AVOption vp9_options[] = { DECLARE_MEDIACODEC_ENCODER(vp9, "VP9", AV_CODEC_ID_VP9) #endif // CONFIG_VP9_MEDIACODEC_ENCODER + +#if CONFIG_MPEG4_MEDIACODEC_ENCODER + +enum MediaCodecMpeg4Level { + MPEG4Level0 = 0x01, + MPEG4Level0b = 0x02, + MPEG4Level1 = 0x04, + MPEG4Level2 = 0x08, + MPEG4Level3 = 0x10, + MPEG4Level3b = 0x18, + MPEG4Level4 = 0x20, + MPEG4Level4a = 0x40, + MPEG4Level5 = 0x80, + MPEG4Level6 = 0x100, +}; + +static const AVOption mpeg4_options[] = { + COMMON_OPTION + { "level", "Specify tier and level", + OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE, "level" }, + { "0", "Level 0", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level0 }, 0, 0, VE, "level" }, + { "0b", "Level 0b", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level0b }, 0, 0, VE, "level" }, + { "1", "Level 1", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level1 }, 0, 0, VE, "level" }, + { "2", "Level 2", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level2 }, 0, 0, VE, "level" }, + { "3", "Level 3", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level3 }, 0, 0, VE, "level" }, + { "3b", "Level 3b", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level3b }, 0, 0, VE, "level" }, + { "4", "Level 4", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level4 }, 0, 0, VE, "level" }, + { "4a", "Level 4a", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level4a }, 0, 0, VE, "level" }, + { "5", "Level 5", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level5 }, 0, 0, VE, "level" }, + { "6", "Level 6", + 0, AV_OPT_TYPE_CONST, { .i64 = MPEG4Level6 }, 0, 0, VE, "level" }, + { NULL, } +}; + +DECLARE_MEDIACODEC_ENCODER(mpeg4, "MPEG-4", AV_CODEC_ID_MPEG4) + +#endif // CONFIG_MPEG4_MEDIACODEC_ENCODER