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