From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 91D7943FE5 for ; Mon, 24 Oct 2022 05:52:56 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0F67668BC94; Mon, 24 Oct 2022 08:52:53 +0300 (EEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4157568B64A for ; Mon, 24 Oct 2022 08:52:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1666590771; x=1698126771; h=from:to:subject:date:message-id:references:in-reply-to: content-id:content-transfer-encoding:mime-version; bh=6BmVUeYozXRsCIjI1ZSTYfWeqEg8Zy+y7iemud4EwFc=; b=FZDfVC2xHD2Mp/mfXdfED9XWt8RNC+ZYlQEejsAke+Q1WB8vQQrXvtSZ yW970FG6zCqNCAvS78BgR9VvhKRLPcU6ZqMPCTaJTxQk4x9bI9LXfqs1c 5rmwOPlkbuHAQkxIy662CNCahY/oHWifpeUt79dXk1mzXrH4Ic9H6SvSR GaSM3hvU4FhTI2dEd03jmbeNxtpvQ/Q/n/mFkRldYj1xV9183kqYqtiF9 OffY7ORdwk9cwnZr7jr97yzSYRdAZoeoEmKY5njaGL9BO+B3cy9ndi/qK DcIUZlh8f5Sou9Z5QRi+KuFAz3IFHrXXV92NPLOj11RC6jTdWFjCQADBd g==; X-IronPort-AV: E=McAfee;i="6500,9779,10509"; a="294743407" X-IronPort-AV: E=Sophos;i="5.95,207,1661842800"; d="scan'208";a="294743407" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Oct 2022 22:52:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10509"; a="609084023" X-IronPort-AV: E=Sophos;i="5.95,207,1661842800"; d="scan'208";a="609084023" Received: from orsmsx602.amr.corp.intel.com ([10.22.229.15]) by orsmga006.jf.intel.com with ESMTP; 23 Oct 2022 22:52:43 -0700 Received: from orsmsx601.amr.corp.intel.com (10.22.229.14) by ORSMSX602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Sun, 23 Oct 2022 22:52:43 -0700 Received: from ORSEDG601.ED.cps.intel.com (10.7.248.6) by orsmsx601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31 via Frontend Transport; Sun, 23 Oct 2022 22:52:43 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (104.47.58.103) by edgegateway.intel.com (134.134.137.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.31; Sun, 23 Oct 2022 22:52:42 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CBXRrheghdZ9i849JUhCDxlYqruRed9w713ta1u6Dpo84e7SGdNCsUD79lHgieB1D/vhoT4rDvUwr2IV65cqLdUhOia2r5Htg0lDb1d/5+vAck21YesGwm3rig0uub6IWy981RhB2Pv8mRN4S8SXr1mFbl5LDmvPiA1CpWLiFWs0L4K2N4v8ppctGikZGGr6tEuKOerVZra4dkQSWqGXTsIoqiF50Bxu4XaNmQiQN5xB5p1r1nl8DJ0T8e8fWFPufms1mlzxk+bmRGcWicW1B/Bt3myAOhkA8xlG2okx9536zLlkgLGw12c83R2klKQ3n8KUjwEBUDQ4Ertj7scGZA== 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=6BmVUeYozXRsCIjI1ZSTYfWeqEg8Zy+y7iemud4EwFc=; b=PHqpO8+v/BF9CtpZCVBUrKHz5k2bsFBGhySuzJDeEv6/qlZdj5NE3uaRJVh/NbIcMamaDVWVoQG1zmp6ycfL38n4pxzrZBOUvIVv7P/bQHZnfEYikqkZMCwEf3dezbkyKYugf+YLWWmaIgpT1JTkgyESzELJAk0CZrY78zV3/woyBJYny3OhYJqOq+ySf4b5sVeyLUbfwf9wCDRcSBClrsMAbU2Oz/3Wwj2TPoyZFpMNkamCTjfYOdn5GQeHm9pymnI3Jx87H/XKbD0L8W5Iigcfi0IlmnvSqJ0mIkLtUUUBNiynYhBNmik6gLIblMEiTnl1vfvZ6LvD5D8+kI0DyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from BN9PR11MB5515.namprd11.prod.outlook.com (2603:10b6:408:104::8) by DS0PR11MB6374.namprd11.prod.outlook.com (2603:10b6:8:ca::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.21; Mon, 24 Oct 2022 05:52:40 +0000 Received: from BN9PR11MB5515.namprd11.prod.outlook.com ([fe80::81a7:b839:8e79:647d]) by BN9PR11MB5515.namprd11.prod.outlook.com ([fe80::81a7:b839:8e79:647d%7]) with mapi id 15.20.5723.033; Mon, 24 Oct 2022 05:52:40 +0000 From: "Xiang, Haihao" To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [FFmpeg-devel] [PATCH 1/2] libavcodec/qsvenc_av1: add av1_qsv encoder Thread-Index: AQHY3t4Qn7jpmvtPXUe+TlIXO3Qr3a4YKGSAgATzJIA= Date: Mon, 24 Oct 2022 05:52:40 +0000 Message-ID: <51d175a7649704ef173f4fe066430c507d832b9f.camel@intel.com> References: <20221013082524.47409-1-wenbin.chen@intel.com> <8b78920c11309286be715c6b95b53e188cdd545c.camel@intel.com> In-Reply-To: <8b78920c11309286be715c6b95b53e188cdd545c.camel@intel.com> Accept-Language: en-AS, zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Evolution 3.36.5-0ubuntu1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BN9PR11MB5515:EE_|DS0PR11MB6374:EE_ x-ms-office365-filtering-correlation-id: 528071a2-5c6b-4a74-691e-08dab583f682 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 0ZdCOCjHTX7T0fhA1NCPYVNvhu0Sp5ZKpEAW8k/zuEGTj3jykcbzbhNp7Kz1ke4rW8bttYpza8YCwm72ynmFGv7YkQ4X8wUSfEeR7H394HYMGfFRq2pirhXCuQNjL6Nq9Jy41qpSQjJ2xdfYErN0nR2kHDnMJMQtapDLUtNcy5/ZCogut+438kz6mQdDiOHoNnsQgQ0Nd9E2qWGth9L8mSaZxpbEVznBwCJwIRRFpefkUyzyQ6YmXsizkAjoE1S1wy/qM4jcjqtFO9NipFYt2VozqwVTS2m2Z3G12wTbTdO2hVdcrQsKOd25Cd2yxviuPP6aSmb9RzomuyEWx8GturzWlSrvSm2wX2VkefrUhKBmA0rzlUsWW10RRA5n/geNA6i7nrT7N6TBMaoZ5FhXVBKGF5wBzkU10Dlj8VpD9dJXsHgLFM74HqFeLqoSP6pC07gtBaR+tD80UfMGdOAot0i6yL/iWHsLu1YumwEwHUstNAPR2SscjY61pRHmScLk8BwOiRFsNEGNGR2sRoU2NgiCzgcnt7c+rSwXZqW2oFh4AJwf/N6JUwyksUPEpsCCdgl2qP5Ex2pWJrCR1OU0vgMT/faYmuLMxEo56APTdqoDpkkb9QoqxSXAiJQe1qfEFzSHmGzkKK/LqHyx6rDm3tZKwFNBpzyb8XxcYES2SmZ5qDrgS4x/A4ET29A1Av/9CiwdsWe4Fn7aPBjYXRwhjIU7WwPdDYYrwqt3DRsyNuhYk/A8yPFeNtykbmjlGoBEhuVopjD92+FtGE6Pm4jeI6zJbvIVB5KnJ9WHwk0Ms+8= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BN9PR11MB5515.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(366004)(396003)(376002)(346002)(39860400002)(136003)(451199015)(66446008)(186003)(66556008)(6506007)(66476007)(64756008)(8676002)(66946007)(36756003)(91956017)(2906002)(4001150100001)(83380400001)(76116006)(8936002)(6512007)(38100700002)(122000001)(30864003)(5660300002)(2616005)(82960400001)(41300700001)(26005)(6486002)(478600001)(86362001)(71200400001)(38070700005)(6916009)(316002)(19627235002)(2004002)(579004); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?REJlNDBaNUI0b09hMVYxT0NOaFpUdE8yY0MwOE5Ea2FKQlc1S3FXaVdIaFVZ?= =?utf-8?B?bk5EQ2NMdzJpb0UzKzdtVlJMWFk4S2NBWFFUeGRkVlAzbU51YzZWKzRHa1pa?= =?utf-8?B?dkFwWUh2VDlHa2JjbStDUXVQTjdXdW5tMnZwNkp4Mnp0bjEzeFlqU2dJYUVT?= =?utf-8?B?cnVGZDlQamhlUHJPZlhsY2V0TnYwYU9yUFZNZ2d3WEVvcCtqMlUyZVo4YmpJ?= =?utf-8?B?a0w2aS9ORHJxV3JlZFhMSkQvdkM2UWlkSVpYNlRkVTJ1ZzIrS1B1SnJXNlIy?= =?utf-8?B?elV4d2ZoblhqL3NXL0ZtNWt5Skdad3MweTgxV2dSUGViWnZ2ZFRyNzVpZStm?= =?utf-8?B?V2liVHlOTDRObXczZ0gyaXBmUlQ3RTNONUpOMWRoaXlRdDBTakNYUmQwdmVH?= =?utf-8?B?eG14UVVMUkZXdUxyd09UeW5UZ0tXKzNUSWlHSHRLTGtQVzVUS3VpTTZqN1lP?= =?utf-8?B?ZXdWZUNlUlB5MXg2R1ZWQ1I0WXJLL2RaYWtGb3BOMzlUR0lMZk1uTnBpRThs?= =?utf-8?B?YVlXNUQ1WUFSZDI5aVZheTVvWjBkcVEwWUZPcXFkVzRiY0dKWVA1WUlKYldZ?= =?utf-8?B?aUtZZGNBVDhveE83U2dWS2NUd2hmTXJua2ZzZnd6enF1ZDlJZzI3aVc0YVpT?= =?utf-8?B?U05hNUdjd2xJZ1hYdlFsby9IUDZqdmpVeHM0Mlc4eXJzMkZsa1EzSmtHekZj?= =?utf-8?B?WTd5ZGVaVWhDVTBuTEd2MTkvbnR1cGRzN2VMSUJoRG9lY0dNTXJlQ1hFR2hX?= =?utf-8?B?OWxHYkpaYm92c3pET091eUo1WmhlL2RDSDM1UXd6cnBrU2RYeWFUVTFyUVlX?= =?utf-8?B?RDRkUVFQTHkvR2ZhcGRLaHBOU2dDcFNqdFdIbVY1WU1Yc0N3T0hzcXJ5dzZv?= =?utf-8?B?NUJZV3NoMlp2Nm1HTUU2OGRORHgxb2txK2RLYmRoQ1JMNzc0SkFuZUExRlBk?= =?utf-8?B?bjJ6TkFEUXh1K2s4WXF3R0FwL1ZZTjRXSDhXTkFWWkFwWnh2TWtOL005YnRB?= =?utf-8?B?THowNmdYQ0VEbU5sWTdUSXVuM0tRTE5KSVlxVERCbnhKR0JMMGtsSEdFdVZs?= =?utf-8?B?NmwxdHF4VEx5eVc0VVRSODU5NENzNnJkemhmMGQ5dXZPYW5pQkQ2SVBVNnkx?= =?utf-8?B?SFlFRGxrQ2F0b280WHRoeXczelVaU1VwenJQM1R6aTZMZGtrQk1UOVlYdDhk?= =?utf-8?B?dUtBdjJzT29KVkM4cmxaTm1Tc3FMVDNWSHpXRkpIaW9URXlrSWxRSW03aldi?= =?utf-8?B?dUNXK2Iwd05WSUljZGVLaWJDSTdwUDd1UzdtQi9zTlI5eUhqcGgyeWJtaWY3?= =?utf-8?B?bU1lRWdPTWNQVDRqSlorcTMyQ0NveWtIUFRGcUdpTGJ3UXp5RkNaTXZFaFpG?= =?utf-8?B?RUszbjhXTWpnVmZGUXdQZ3lWVWRNcXBSMkRZdFlQcGdTQ0VlQ1FyWU1PSkw3?= =?utf-8?B?V09GaThtY3NCT3N1c3pkVTFIcmUwakhaU1JuejR0aUZCK0RXdmh2NkNzeXlN?= =?utf-8?B?b2kwSk8yMVNwNFQ4WTlsRFFzS2xSazJOMUd5QllkN0lvRlNGQUVoZUNqbzFr?= =?utf-8?B?U2hDekEwQ2d2WGhsT2JsaUllVmlTaElLb1lUVTlnbTJHc1ZrdWNpSHVNSkdr?= =?utf-8?B?MjFqdWQvOXJYaHY3OCt2K0taNDZ1ZEJoOWl4YjI3UStDTDlFME84cGhsZHo2?= =?utf-8?B?RXJENFUwNjAxdXMwcTh4aHRRZ2F3RTk5eElsanZBdXo5VFVzZnFJMlFuSmE4?= =?utf-8?B?N092bVNocDY5TGN6MDlKVW91RDRhU1dEaFN0VDNDMjNpSFgyRWhTSFdZc2R5?= =?utf-8?B?VjV5ZzZ3Q1pyRGJNTENreDRveTdSaCtDb2hFRmxTT2ppMll3YXRZNWVNOStC?= =?utf-8?B?NUkyRUpTN3ZoejY5N0lRSVJvdGVjUmQ2NWNtdlpMTTJ6KzI0WjdjR3JxMjhi?= =?utf-8?B?TFlGSzhtZFpkUDNydG1lM1R2MXNTSkVPUVRyZmszdXRZM3dFbStMNTUxQkc1?= =?utf-8?B?bnBzSkFjQllIaVJVQlE1VWVTT1hadmRLV1dobDRSV1JOWllyYmxBZHlHVkd0?= =?utf-8?B?b0VsK1hIYXBMZy9kQXFPQXJvc2lWcFhybWhQZkRtbWl0QWZqSHk4UEdiL0hD?= =?utf-8?B?OUV6STJkaEtySW83RUNTRHh2dGEwSCtvWmhPY3hyaE9kMVY3bHF5TjM3REZO?= =?utf-8?B?Mmc9PQ==?= Content-ID: <207AF962EACB97469946F914C822CC57@namprd11.prod.outlook.com> MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN9PR11MB5515.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 528071a2-5c6b-4a74-691e-08dab583f682 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Oct 2022 05:52:40.6805 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: gachAv3SUbGf1qlxv9sibAP0jDKElac32W2maRzhJZjwWjRaRrko7H1OVwMu0fOkR+RaA5QhGBoKM1CG839q8g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR11MB6374 X-OriginatorOrg: intel.com Subject: Re: [FFmpeg-devel] [PATCH 1/2] libavcodec/qsvenc_av1: add av1_qsv 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On Fri, 2022-10-21 at 02:16 +0000, Xiang, Haihao wrote: > On Thu, 2022-10-13 at 16:25 +0800, wenbin.chen-at-intel.com@ffmpeg.org wrote: > > From: Wenbin Chen > > > > It is available only when libvpl is enabled. MSDK doesn't support av1 > > encoding. > > > > sample command: > > ffmpeg -f rawvideo -pix_fmt nv12 -s 1920x1080 -i input.yuv \ > > -c:v av1_qsv output.ivf > > > > Signed-off-by: Wenbin Chen > > Signed-off-by: Haihao Xiang > > --- > > configure | 2 + > > libavcodec/Makefile | 1 + > > libavcodec/allcodecs.c | 1 + > > libavcodec/qsvenc.c | 196 +++++++++++++++++++++++++++++++++++++++- > > libavcodec/qsvenc.h | 7 +- > > libavcodec/qsvenc_av1.c | 156 ++++++++++++++++++++++++++++++++ > > 6 files changed, 358 insertions(+), 5 deletions(-) > > create mode 100644 libavcodec/qsvenc_av1.c > > > > diff --git a/configure b/configure > > index f3fd91f592..7c4fef6cb0 100755 > > --- a/configure > > +++ b/configure > > @@ -3269,6 +3269,8 @@ vp9_qsv_encoder_select="qsvenc" > > vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m" > > wmv3_crystalhd_decoder_select="crystalhd" > > av1_qsv_decoder_select="qsvdec" > > +av1_qsv_encoder_select="qsvenc" > > +av1_qsv_encoder_deps="libvpl" > > > > # parsers > > aac_parser_select="adts_header mpeg4audio" > > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > > index 37b63cadc2..77deaafe98 100644 > > --- a/libavcodec/Makefile > > +++ b/libavcodec/Makefile > > @@ -244,6 +244,7 @@ OBJS-$(CONFIG_AURA_DECODER) += cyuv.o > > OBJS-$(CONFIG_AURA2_DECODER) += aura.o > > OBJS-$(CONFIG_AV1_DECODER) += av1dec.o > > OBJS-$(CONFIG_AV1_CUVID_DECODER) += cuviddec.o > > +OBJS-$(CONFIG_AV1_QSV_ENCODER) += qsvenc_av1.o > > OBJS-$(CONFIG_AVRN_DECODER) += avrndec.o > > OBJS-$(CONFIG_AVRP_DECODER) += r210dec.o > > OBJS-$(CONFIG_AVRP_ENCODER) += r210enc.o > > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > > index cfeb01ac1c..57e53437dc 100644 > > --- a/libavcodec/allcodecs.c > > +++ b/libavcodec/allcodecs.c > > @@ -827,6 +827,7 @@ extern const FFCodec ff_libaom_av1_decoder; > > extern const FFCodec ff_av1_decoder; > > extern const FFCodec ff_av1_cuvid_decoder; > > extern const FFCodec ff_av1_qsv_decoder; > > +extern const FFCodec ff_av1_qsv_encoder; > > extern const FFCodec ff_libopenh264_encoder; > > extern const FFCodec ff_libopenh264_decoder; > > extern const FFCodec ff_h264_amf_encoder; > > diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c > > index dc5479d0f3..fd3b9d5cbe 100644 > > --- a/libavcodec/qsvenc.c > > +++ b/libavcodec/qsvenc.c > > @@ -82,6 +82,14 @@ static const struct profile_names vp9_profiles[] = { > > { MFX_PROFILE_VP9_3, "vp9 > > 3" }, > > }; > > > > +static const struct profile_names av1_profiles[] = { > > +#if QSV_VERSION_ATLEAST(1, 34) > > + { MFX_PROFILE_AV1_MAIN, "av1 > > main" }, > > + { MFX_PROFILE_AV1_HIGH, "av1 > > high" }, > > + { MFX_PROFILE_AV1_PRO, "av1 > > professional" }, > > +#endif > > +}; > > + > > typedef struct QSVPacket { > > AVPacket pkt; > > mfxSyncPoint *sync; > > @@ -114,6 +122,11 @@ static const char *print_profile(enum AVCodecID > > codec_id, > > mfxU16 profile) > > num_profiles = FF_ARRAY_ELEMS(vp9_profiles); > > break; > > > > + case AV_CODEC_ID_AV1: > > + profiles = av1_profiles; > > + num_profiles = FF_ARRAY_ELEMS(av1_profiles); > > + break; > > + > > default: > > return "unknown"; > > } > > @@ -429,6 +442,88 @@ static void dump_video_mjpeg_param(AVCodecContext > > *avctx, > > QSVEncContext *q) > > info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN); > > } > > > > +#if QSV_HAVE_EXT_AV1_PARAM > > +static void dump_video_av1_param(AVCodecContext *avctx, QSVEncContext *q, > > + mfxExtBuffer **coding_opts) > > +{ > > + mfxInfoMFX *info = &q->param.mfx; > > + mfxExtAV1TileParam *av1_tile_param = (mfxExtAV1TileParam > > *)coding_opts[0]; > > + mfxExtAV1BitstreamParam *av1_bs_param = (mfxExtAV1BitstreamParam > > *)coding_opts[1]; > > + mfxExtCodingOption2 *co2 = (mfxExtCodingOption2*)coding_opts[2]; > > + mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[3]; > > + > > + av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n", > > + print_profile(avctx->codec_id, info->CodecProfile), info- > > > CodecLevel); > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "GopPicSize: %"PRIu16"; GopRefDist: %"PRIu16"; GopOptFlag:%s%s; > > IdrInterval: %"PRIu16"\n", > > + info->GopPicSize, info->GopRefDist, > > + info->GopOptFlag & MFX_GOP_CLOSED ? " closed" : "", > > + info->GopOptFlag & MFX_GOP_STRICT ? " strict" : "", > > + info->IdrInterval); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "TargetUsage: %"PRIu16"; > > RateControlMethod: > > %s\n", > > + info->TargetUsage, print_ratecontrol(info->RateControlMethod)); > > + > > + if (info->RateControlMethod == MFX_RATECONTROL_CBR || > > + info->RateControlMethod == MFX_RATECONTROL_VBR) > > + av_log(avctx, AV_LOG_VERBOSE, > > + "BufferSizeInKB: %"PRIu16"; InitialDelayInKB: %"PRIu16"; > > TargetKbps: %"PRIu16"; MaxKbps: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n", > > + info->BufferSizeInKB, info->InitialDelayInKB, info- > > > TargetKbps, info->MaxKbps, info->BRCParamMultiplier); > > + else if (info->RateControlMethod == MFX_RATECONTROL_CQP) > > + av_log(avctx, AV_LOG_VERBOSE, "QPI: %"PRIu16"; QPP: %"PRIu16"; QPB: > > %"PRIu16"\n", > > + info->QPI, info->QPP, info->QPB); > > + else if (info->RateControlMethod == MFX_RATECONTROL_ICQ) > > + av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"\n", info- > > > ICQQuality); > > + else > > + av_log(avctx, AV_LOG_VERBOSE, "Unsupported ratecontrol method: %d > > \n", info->RateControlMethod); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "NumRefFrame: %"PRIu16"\n", info- > > > NumRefFrame); > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16 > > + "; IntRefQPDelta: %"PRId16"; IntRefCycleDist: %"PRId16"\n", > > + co2->IntRefType, co2->IntRefCycleSize, > > + co2->IntRefQPDelta, co3->IntRefCycleDist); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d;\n", co2- > > >MaxFrameSize); > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n", > > + print_threestate(co2->BitrateLimit), print_threestate(co2- > > >MBBRC), > > + print_threestate(co2->ExtBRC)); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "VDENC: %s\n", print_threestate(info- > > > LowPower)); > > + > > + switch (co2->BRefType) { > > + case MFX_B_REF_OFF: av_log(avctx, AV_LOG_VERBOSE, "BRefType: > > off\n"); break; > > + case MFX_B_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "BRefType: > > pyramid\n"); break; > > + default: av_log(avctx, AV_LOG_VERBOSE, "BRefType: > > auto\n"); break; > > + } > > + > > + switch (co3->PRefType) { > > + case MFX_P_REF_DEFAULT: av_log(avctx, AV_LOG_VERBOSE, "PRefType: > > default\n"); break; > > + case MFX_P_REF_SIMPLE: av_log(avctx, AV_LOG_VERBOSE, "PRefType: > > simple\n"); break; > > + case MFX_P_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "PRefType: > > pyramid\n"); break; > > + default: av_log(avctx, AV_LOG_VERBOSE, "PRefType: > > unknown\n"); break; > > + } > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: > > %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n", > > + co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, > > co2->MaxQPB); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "FrameRateExtD: %"PRIu32"; FrameRateExtN: > > %"PRIu32" \n", > > + info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN); > > + > > + av_log(avctx, AV_LOG_VERBOSE, > > + "NumTileRows: %"PRIu16"; NumTileColumns: %"PRIu16"; > > NumTileGroups: > > %"PRIu16"\n", > > + av1_tile_param->NumTileRows, av1_tile_param->NumTileColumns, > > av1_tile_param->NumTileGroups); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "WriteIVFHeaders: %s \n", > > + print_threestate(av1_bs_param->WriteIVFHeaders)); > > +} > > +#endif > > + > > static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) > > { > > const char *rc_desc; > > @@ -741,10 +836,15 @@ static int init_video_param(AVCodecContext *avctx, > > QSVEncContext *q) > > break; > > case MFX_RATECONTROL_CQP: > > quant = avctx->global_quality / FF_QP2LAMBDA; > > - > > - q->param.mfx.QPI = av_clip(quant * fabs(avctx->i_quant_factor) + > > avctx->i_quant_offset, 0, 51); > > - q->param.mfx.QPP = av_clip(quant, 0, 51); > > - q->param.mfx.QPB = av_clip(quant * fabs(avctx->b_quant_factor) + > > avctx->b_quant_offset, 0, 51); > > + if (avctx->codec_id == AV_CODEC_ID_AV1) { > > + q->param.mfx.QPI = av_clip_uintp2(quant * fabs(avctx- > > > i_quant_factor) + avctx->i_quant_offset, 8); > > + q->param.mfx.QPP = av_clip_uintp2(quant, 8); > > + q->param.mfx.QPB = av_clip_uintp2(quant * fabs(avctx- > > > b_quant_factor) + avctx->b_quant_offset, 8); > > + } else { > > + q->param.mfx.QPI = av_clip(quant * fabs(avctx->i_quant_factor) > > + > > avctx->i_quant_offset, 0, 51); > > + q->param.mfx.QPP = av_clip(quant, 0, 51); > > + q->param.mfx.QPB = av_clip(quant * fabs(avctx->b_quant_factor) > > + > > avctx->b_quant_offset, 0, 51); > > + } > > q->old_global_quality = avctx->global_quality; > > q->old_i_quant_factor = avctx->i_quant_factor; > > q->old_i_quant_offset = avctx->i_quant_offset; > > @@ -895,6 +995,20 @@ static int init_video_param(AVCodecContext *avctx, > > QSVEncContext *q) > > q->extco2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2; > > q->extco2.Header.BufferSz = sizeof(q->extco2); > > > > + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer > > *)&q->extco2; > > + } else if (avctx->codec_id == AV_CODEC_ID_AV1) { > > + if (q->extbrc >= 0) > > + q->extco2.ExtBRC = q->extbrc ? MFX_CODINGOPTION_ON : > > MFX_CODINGOPTION_OFF; > > + if (q->b_strategy >= 0) > > + q->extco2.BRefType = q->b_strategy ? MFX_B_REF_PYRAMID : > > MFX_B_REF_OFF; > > + if (q->adaptive_i >= 0) > > + q->extco2.AdaptiveI = q->adaptive_i ? MFX_CODINGOPTION_ON : > > MFX_CODINGOPTION_OFF; > > + if (q->adaptive_b >= 0) > > + q->extco2.AdaptiveB = q->adaptive_b ? MFX_CODINGOPTION_ON : > > MFX_CODINGOPTION_OFF; > > + > > + q->extco2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2; > > + q->extco2.Header.BufferSz = sizeof(q->extco2); > > + > > q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer > > *)&q->extco2; > > } > > > > @@ -972,6 +1086,27 @@ static int init_video_param(AVCodecContext *avctx, > > QSVEncContext *q) > > q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer > > *)&q- > > > extvp9param; > > } > > > > +#if QSV_HAVE_EXT_AV1_PARAM > > + if (avctx->codec_id == AV_CODEC_ID_AV1) { > > + if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 2, 5)) { > > + q->extav1tileparam.Header.BufferId = > > MFX_EXTBUFF_AV1_TILE_PARAM; > > + q->extav1tileparam.Header.BufferSz = sizeof(q- > > >extav1tileparam); > > + q->extav1tileparam.NumTileColumns = q->tile_cols; > > + q->extav1tileparam.NumTileRows = q->tile_rows; > > + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer > > *)&q->extav1tileparam; > > + > > + q->extav1bsparam.Header.BufferId = > > MFX_EXTBUFF_AV1_BITSTREAM_PARAM; > > + q->extav1bsparam.Header.BufferSz = sizeof(q->extav1bsparam); > > + q->extav1bsparam.WriteIVFHeaders = MFX_CODINGOPTION_OFF; > > + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer > > *)&q->extav1bsparam; > > + } else { > > + av_log(avctx, AV_LOG_ERROR, > > + "This version of runtime doesn't support AV1 > > encoding\n"); > > + return AVERROR_UNKNOWN; > > + } > > + } > > +#endif > > + > > if (avctx->codec_id == AV_CODEC_ID_HEVC) { > > q->exthevctiles.Header.BufferId = MFX_EXTBUFF_HEVC_TILES; > > q->exthevctiles.Header.BufferSz = sizeof(q->exthevctiles); > > @@ -1082,6 +1217,56 @@ static int qsv_retrieve_enc_vp9_params(AVCodecContext > > *avctx, QSVEncContext *q) > > return 0; > > } > > > > +static int qsv_retrieve_enc_av1_params(AVCodecContext *avctx, QSVEncContext > > *q) > > +{ > > +#if QSV_HAVE_EXT_AV1_PARAM > > + int ret = 0; > > + mfxExtAV1TileParam av1_extend_tile_buf = { > > + .Header.BufferId = MFX_EXTBUFF_AV1_TILE_PARAM, > > + .Header.BufferSz = sizeof(av1_extend_tile_buf), > > + }; > > + mfxExtAV1BitstreamParam av1_bs_param = { > > + .Header.BufferId = MFX_EXTBUFF_AV1_BITSTREAM_PARAM, > > + .Header.BufferSz = sizeof(av1_bs_param), > > + }; > > + > > + mfxExtCodingOption2 co2 = { > > + .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2, > > + .Header.BufferSz = sizeof(co2), > > + }; > > + > > + mfxExtCodingOption3 co3 = { > > + .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3, > > + .Header.BufferSz = sizeof(co3), > > + }; > > + > > + mfxExtBuffer *ext_buffers[] = { > > + (mfxExtBuffer*)&av1_extend_tile_buf, > > + (mfxExtBuffer*)&av1_bs_param, > > + (mfxExtBuffer*)&co2, > > + (mfxExtBuffer*)&co3, > > + }; > > + > > + if (!QSV_RUNTIME_VERSION_ATLEAST(q->ver, 2, 5)) { > > + av_log(avctx, AV_LOG_ERROR, > > + "This version of runtime doesn't support AV1 encoding\n"); > > + return AVERROR_UNKNOWN; > > + } > > + > > + q->param.ExtParam = ext_buffers; > > + q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers); > > + > > + ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param); > > + if (ret < 0) > > + return ff_qsv_print_error(avctx, ret, > > + "Error calling GetVideoParam"); > > + > > + q->packet_size = q->param.mfx.BufferSizeInKB * q- > > > param.mfx.BRCParamMultiplier * 1000; > > + dump_video_av1_param(avctx, q, ext_buffers); > > +#endif > > + return 0; > > +} > > + > > static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) > > { > > AVCPBProperties *cpb_props; > > @@ -1420,6 +1605,9 @@ int ff_qsv_enc_init(AVCodecContext *avctx, > > QSVEncContext > > *q) > > case AV_CODEC_ID_VP9: > > ret = qsv_retrieve_enc_vp9_params(avctx, q); > > break; > > + case AV_CODEC_ID_AV1: > > + ret = qsv_retrieve_enc_av1_params(avctx, q); > > + break; > > default: > > ret = qsv_retrieve_enc_params(avctx, q); > > break; > > diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h > > index d77bc0aee1..eb79db9871 100644 > > --- a/libavcodec/qsvenc.h > > +++ b/libavcodec/qsvenc.h > > @@ -39,6 +39,7 @@ > > #include "qsv_internal.h" > > > > #define QSV_HAVE_EXT_VP9_TILES QSV_VERSION_ATLEAST(1, 29) > > +#define QSV_HAVE_EXT_AV1_PARAM QSV_VERSION_ATLEAST(2, 5) > > > > #if defined(_WIN32) || defined(__CYGWIN__) > > #define QSV_HAVE_AVBR 1 > > @@ -154,6 +155,10 @@ typedef struct QSVEncContext { > > #endif > > mfxExtHEVCTiles exthevctiles; > > mfxExtVP9Param extvp9param; > > +#if QSV_HAVE_EXT_AV1_PARAM > > + mfxExtAV1TileParam extav1tileparam; > > + mfxExtAV1BitstreamParam extav1bsparam; > > +#endif > > > > #if QSV_HAVE_OPAQUE > > mfxExtOpaqueSurfaceAlloc opaque_alloc; > > @@ -163,7 +168,7 @@ typedef struct QSVEncContext { > > > > mfxExtVideoSignalInfo extvsi; > > > > - mfxExtBuffer *extparam_internal[5 + (QSV_HAVE_MF * 2)]; > > + mfxExtBuffer *extparam_internal[5 + (QSV_HAVE_MF * 2) + > > QSV_HAVE_EXT_AV1_PARAM * 2]; > > int nb_extparam_internal; > > > > mfxExtBuffer **extparam; > > diff --git a/libavcodec/qsvenc_av1.c b/libavcodec/qsvenc_av1.c > > new file mode 100644 > > index 0000000000..bb9ad16927 > > --- /dev/null > > +++ b/libavcodec/qsvenc_av1.c > > @@ -0,0 +1,156 @@ > > +/* > > + * Intel MediaSDK QSV based AV1 encoder > > + * > > + * This file is part of FFmpeg. > > + * > > + * FFmpeg is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU Lesser General Public > > + * License as published by the Free Software Foundation; either > > + * version 2.1 of the License, or (at your option) any later version. > > + * > > + * FFmpeg is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > + * Lesser General Public License for more details. > > + * > > + * You should have received a copy of the GNU Lesser General Public > > + * License along with FFmpeg; if not, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > > USA > > + */ > > + > > + > > +#include > > +#include > > + > > +#include > > + > > +#include "libavutil/common.h" > > +#include "libavutil/opt.h" > > + > > +#include "avcodec.h" > > +#include "codec_internal.h" > > +#include "bsf.h" > > +#include "qsv.h" > > +#include "qsvenc.h" > > + > > +typedef struct QSVAV1EncContext { > > + AVClass *class; > > + AVBSFContext *extra_data_bsf; > > + QSVEncContext qsv; > > +} QSVAV1EncContext; > > + > > +static av_cold int qsv_enc_init(AVCodecContext *avctx) > > +{ > > + QSVAV1EncContext *q = avctx->priv_data; > > + int ret; > > + > > + if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { > > + const AVBitStreamFilter *filter = > > av_bsf_get_by_name("extract_extradata"); > > + if (!filter) { > > + av_log(avctx, AV_LOG_ERROR, "Cannot get extract_extradata > > bitstream filter\n"); > > + return AVERROR_BUG; > > + } > > + ret = av_bsf_alloc(filter, &q->extra_data_bsf); > > + if (ret < 0) > > + return ret; > > + ret = avcodec_parameters_from_context(q->extra_data_bsf->par_in, > > avctx); > > + if (ret < 0) > > + return ret; > > + ret = av_bsf_init(q->extra_data_bsf); > > + if (ret < 0) > > + return ret; > > + } > > + > > + return ff_qsv_enc_init(avctx, &q->qsv); > > +} > > + > > +static int qsv_enc_frame(AVCodecContext *avctx, AVPacket *pkt, > > + const AVFrame *frame, int *got_packet) > > +{ > > + QSVAV1EncContext *q = avctx->priv_data; > > + int ret; > > + > > + ret = ff_qsv_encode(avctx, &q->qsv, pkt, frame, got_packet); > > + if (ret < 0) > > + return ret; > > + > > + if (*got_packet && avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { > > + ret = av_bsf_send_packet(q->extra_data_bsf, pkt); > > + if (ret < 0) { > > + av_log(avctx, AV_LOG_ERROR, "extract_extradata filter " > > + "failed to send input packet\n"); > > + return ret; > > + } > > + > > + ret = av_bsf_receive_packet(q->extra_data_bsf, pkt); > > + if (ret < 0) { > > + av_log(avctx, AV_LOG_ERROR, "extract_extradata filter " > > + "failed to receive output packet\n"); > > + return ret; > > + } > > + } > > + > > + return ret; > > +} > > + > > +static av_cold int qsv_enc_close(AVCodecContext *avctx) > > +{ > > + QSVAV1EncContext *q = avctx->priv_data; > > + > > + av_bsf_free(&q->extra_data_bsf); > > + > > + return ff_qsv_enc_close(avctx, &q->qsv); > > +} > > + > > +#define OFFSET(x) offsetof(QSVAV1EncContext, x) > > +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM > > +static const AVOption options[] = { > > + QSV_COMMON_OPTS > > + QSV_OPTION_B_STRATEGY > > + QSV_OPTION_ADAPTIVE_I > > + QSV_OPTION_ADAPTIVE_B > > + QSV_OPTION_EXTBRC > > + { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 = > > MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" }, > > + { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > > MFX_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, VE, "profile" }, > > + { "main" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > > MFX_PROFILE_AV1_MAIN }, INT_MIN, INT_MAX, VE, "profile" }, > > + { "tile_cols", "Number of columns for tiled > > encoding", OFFSET(qsv.tile_cols), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, > > UINT16_MAX, VE }, > > + { "tile_rows", "Number of rows for tiled > > encoding", OFFSET(qsv.tile_rows), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, > > UINT16_MAX, VE }, > > + { "look_ahead_depth", "Depth of look ahead in number frames, available > > when extbrc option is enabled", OFFSET(qsv.look_ahead_depth), > > AV_OPT_TYPE_INT, > > { .i64 = 0 }, 0, 100, VE }, > > + { NULL }, > > +}; > > + > > +static const AVClass class = { > > + .class_name = "av1_qsv encoder", > > + .item_name = av_default_item_name, > > + .option = options, > > + .version = LIBAVUTIL_VERSION_INT, > > +}; > > + > > +static const FFCodecDefault qsv_enc_defaults[] = { > > + { "b", "1M" }, > > + { "g", "-1" }, > > + { "bf", "-1" }, > > + { "refs", "0" }, > > + { NULL }, > > +}; > > + > > +FFCodec ff_av1_qsv_encoder = { > > + .p.name = "av1_qsv", > > + .p.long_name = NULL_IF_CONFIG_SMALL("AV1 (Intel Quick Sync Video > > acceleration)"), > > + .priv_data_size = sizeof(QSVAV1EncContext), > > + .p.type = AVMEDIA_TYPE_VIDEO, > > + .p.id = AV_CODEC_ID_AV1, > > + .init = qsv_enc_init, > > + FF_CODEC_ENCODE_CB(qsv_enc_frame), > > + .close = qsv_enc_close, > > + .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID, > > + .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, > > + AV_PIX_FMT_P010, > > + AV_PIX_FMT_QSV, > > + AV_PIX_FMT_NONE }, > > + .p.priv_class = &class, > > + .defaults = qsv_enc_defaults, > > + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, > > + .p.wrapper_name = "qsv", > > + .hw_configs = ff_qsv_enc_hw_configs, > > +}; > > Is there any comment for this patchset ? I'll push this patchset in a few days > if no comment or objection. > Pushed Thanks Haihao _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".