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 AE20648C44 for ; Thu, 22 Feb 2024 10:10:26 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD89468D20C; Thu, 22 Feb 2024 12:10:22 +0200 (EET) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.10]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 27ACE68CA86 for ; Thu, 22 Feb 2024 12:10:15 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708596621; x=1740132621; h=from:to:subject:date:message-id:references:in-reply-to: content-transfer-encoding:mime-version; bh=xlpWw/YISjAiw1jW2r7y5RuTwXLXiutJedqo59S4Yp8=; b=CYKig3LCQqlv4T41AKwN6Qy9aPn/VGgviXQ3XrIAf/lwNlmX4qLbGAP4 8Xw2O+D/ABVXkjeEZ9CadNyYWdzUXohXTikV3cxbIFkLLwTz5mvJ+m/+z dkc1WMj5BXPhhxKTP4d18XWA4QRbyr8rfIRI4u2KtgsrPrB6TXFyz0/B9 fXGxiaT5rL96Cd/xsAErlkCPmHr+A1h45Nb3B9fZgc0Inl0fOvvBUhn6Z s7W3XPs2JcSMJhsSXK1w9oLF84CZmQ7dJyIHnKI6ogbxsl2rKbwAKwkCq zt80ZjZQfGo6phuzp2dxSoJPFvx14Td3BrjaItnufyIef3hmtXIWggAu0 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10991"; a="14227657" X-IronPort-AV: E=Sophos;i="6.06,177,1705392000"; d="scan'208";a="14227657" Received: from fmviesa006.fm.intel.com ([10.60.135.146]) by fmvoesa104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2024 02:10:12 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.06,177,1705392000"; d="scan'208";a="5651482" Received: from fmsmsx602.amr.corp.intel.com ([10.18.126.82]) by fmviesa006.fm.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 22 Feb 2024 02:10:13 -0800 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Thu, 22 Feb 2024 02:10:12 -0800 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35 via Frontend Transport; Thu, 22 Feb 2024 02:10:12 -0800 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.168) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Thu, 22 Feb 2024 02:10:12 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=S7DMiU8ojqcR05hlCAXJGpdqjx+H1W2MkKd17m7OPR2KeO610p/TAAedPSxn+ay9cXbk54R5fe2KoHWQGuraiqWk1OZ+xZwOxLGZn8DdIluOrQlfYSZLz3YZmsUE7yaH8zdBY09SMfWtaECtR+VDkZJsAK4cfYr1385sObXAMKPm4gaqs8mHks8OB4l6vd1U+6IHRWIfv9AxQcFryo+Jv+OjcaCBJ4Q1KAT1DMyFx0a6JHkKnh7j42IMqamCF77NG0+Qo4f7JHh5Iy+PF1RtzMHMXe5ssDhpzAMQnOlo70i6nlkVFRdAvRCpWU4wW+j1EgOWKLTOP1gVVSvlbnfh4Q== 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=V6nH5aFr3pJH4Ls3o/PMq7gwIvChoqRtdhnkKFAODK4=; b=O/6S0wi8GH+2Dk1IO14dI5snPnBVgWnPh/UIlClcYXwUugwVcCNp13lpN+H99Q5ky1/EoM+VWVI+L7H5ZzR/1K4Ddn4TNqpL7xqAuvETJwATQNcEk9pE0L1jaKHm5CmpV+Igr2kEEg9QH+HLgVGWj/qz5psvb/cCu1aE9XXkF2d/6xIFpzJqg699NUfoT8nmO+hpdEI8HldQmorumk4vjLBzd560q7CQr5J+2UJX+1ed8f4jkuoCRzTuEskb8xN52TB/bjiOJeLDB/BZMTnNFvNCZKfjD3b+rNpIVGmdP9iz1Ky1wWt2Sk21kUvZHkkP2wyKJIdrQpOTA3+y+LCshA== 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 CH3PR11MB8659.namprd11.prod.outlook.com (2603:10b6:610:1cf::5) by DS0PR11MB7215.namprd11.prod.outlook.com (2603:10b6:8:13a::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.22; Thu, 22 Feb 2024 10:10:09 +0000 Received: from CH3PR11MB8659.namprd11.prod.outlook.com ([fe80::22d3:5f9d:8fc0:1a2d]) by CH3PR11MB8659.namprd11.prod.outlook.com ([fe80::22d3:5f9d:8fc0:1a2d%2]) with mapi id 15.20.7316.018; Thu, 22 Feb 2024 10:10:09 +0000 From: "Wu, Tong1" To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] [PATCH v5 4/9] avcodec/vaapi_encode: extract rc parameter configuration to base layer Thread-Index: AQHaYqPJSMu6gw0/yEKYMHytjFcGUbEWJOcg Date: Thu, 22 Feb 2024 10:10:09 +0000 Message-ID: References: <20240218084529.554-1-tong1.wu@intel.com> <20240218084529.554-4-tong1.wu@intel.com> In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: 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: CH3PR11MB8659:EE_|DS0PR11MB7215:EE_ x-ms-office365-filtering-correlation-id: 55a7141d-1e08-49a6-dade-08dc338e7368 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 6xMok35f9kA+BQlSP1z2ObcpHn+2yZOsZ8rpItA3+Gia8ymGWthytQOqBA56sHzTLiPOrsURBsO93zgUvR+JJzWxDnKhkKT2wxUCGxRwd2ztYdBWvthBjAJLdsOd5xRgWeSDFLHFafGfW2i6Ks4Nk+TLgVbh8o1LCBiGSsVTFgPZ7bssz0FOFZwvfi5V4MHtqQFpg/6MXHmYserTwFFiRPmoHAvBmqE2dqeVoDQVBjFbTY4yd69qKhpuHzKvhNXpSZDk3lgUM1/8dYzk4o7KfkcZoZ0lQ9szHkQl4KBSHebIrvvaxGidtz8Zbg4yeAFzpo1Dsm9rmO8yj8isukyNtP+9cx+lLHu5W4uM7eSLJsH3JyTmByFQJpGso/NAHrSG3/SRZw23X9XU+puOns6acrdabJciLV0q9fTuMt8iM6Pxa9x1wEujZ8Jjkykcz5wG1V0A30oDdq7UPRxZUv8ChmBIx0WgbO1QDkg9qrQeuWnxz5qhXnqeshkRQyukQZDccU48GLWhPhC8CycU0jlQ9ZkSOVEFXqarKVXSk9eXUPRJgJ/VO3OWykU89bHB4Bw5QqB4etNStkJgYABExTlBaQJweLvZvvFeeQo7qq0T5ew= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CH3PR11MB8659.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(230273577357003)(38070700009); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?6lzMD6oPu0+6C6vRVKu4akS12GN8ayww93uXlxxHDBJXxq4USsPdP0oRLnE/?= =?us-ascii?Q?YnVLmbti6kSigyJVaQz6xSM3uPdHSUVQM4Jo1ErOLcYDdnQjQDEv8Gd/ofMP?= =?us-ascii?Q?99+qpSktRhKVtYIAPeZSmAiGvjw+PJPmZKzgJtCTSUuZ4Ht46V50hX2EEyTT?= =?us-ascii?Q?l34WfLUejhuze7pXzqk3AWp4ldItX3SdcCnb8fww/DuMEKJY+SoQLEWED+Iw?= =?us-ascii?Q?eqcbFR0XDfpQoYQfloosGj8Y0nPlNvQSDLcLrx1pK1EQodJig7f+8PcOInGt?= =?us-ascii?Q?sMvbSKTh3NvM6IUjThhkdBykzfFASaG7YZSBKiZA/Wq8I+7Kyy60VI3zzoEF?= =?us-ascii?Q?0xxQzsQzVerQcgziug1I6zKt7Wh1vi5n35chOuln2E3kUq9B2HnpLfjflDpk?= =?us-ascii?Q?6uWMhIrhtfnk/i0d1438CgOZs70r80lBpZ1jIQMd6MdWHw5T+zpkaINRByl7?= =?us-ascii?Q?sdiH3rddXFO/lkSw4P/rLO3xKY6kZT/CJ1dd2doW4gMUEbHKxCHEsKmRZyGY?= =?us-ascii?Q?wUF0UNmiDZNHeyy5JX0euQB1a1ewnAQ0MOfU5am39n33pV1RnmDBj+PCfFlL?= =?us-ascii?Q?wuRgblgfPisX4x92EcMcvdwQ5CRWeCqDfDPC5JRUMs9n1UI6dLMkLQrdkP7I?= =?us-ascii?Q?CgS+CnCq9dfEF6+glYP/cjz1DUpPKdXiDWIJ+zxahwk7lk4UUfXTEKU81MYu?= =?us-ascii?Q?YWGh05YDZwHPdpp/pHM6+gzAVuGqWH9ivvw+FUGmR+7casj6J5FmmXTq+fem?= =?us-ascii?Q?IpwyuwNR58ibfTJ3/ZcN/6oIlvFnZku5fxi3GnXE7Vm/iA85jQ0Oq7yw5mDE?= =?us-ascii?Q?7GV9N3FMVHmaoXrLdvlwXppB84KKasvaGlEjyKPzvSKm1gzVQbDiiSr58S3k?= =?us-ascii?Q?v1e28S2PgOyrE4SitS5P+XXyd61H9KsLrBxP9KU1W7YW6rwjCkQ4Kf4WOY7N?= =?us-ascii?Q?U9k+KMpyKUi9qIzI2I0v8eTF+JMiEvaaBB/Yy3qwmbtUXqSXh9OqF+vgVbE3?= =?us-ascii?Q?n10tNtZkdcUmxFLBgKxEPCohh7oy2zpLhJPTyylEio7a1ofz9hY0ZKvr1Ozf?= =?us-ascii?Q?Gl5XDIVjIrJYisCevtC5fNPxbAgIYLkJMe58H+VDumUlFS1PnWqCNnZ5KaUW?= =?us-ascii?Q?Ji+n0oAsWyN/bYrLkThTdf9B+miaDsqedj8YM7NxghOrmIfGnPMa7Py0yX3b?= =?us-ascii?Q?ZjeafN/ReoNuB5MUVy8G+4i9J+Gnch4wBjfnZWQfBzz7aobbDHiMUe1pzet+?= =?us-ascii?Q?f9zLRkaKwxicICM9vKgA2Ohxh7iwGVOUIEIHbZyfnIEciOO/GvpgLLof80d6?= =?us-ascii?Q?E7kyXgZ5H8nC0QCztoIQuke6Nf20ZkJ6XAkMsYTnxohSUq2HnoCPF2fqEqKl?= =?us-ascii?Q?TdJfod7jr2ZdYTDpgOovywhSxATdPFovZTgG5UdEW+Ak2ZiLwxxqSpz2HLjr?= =?us-ascii?Q?+VOwFS6WY7/9hmX2dEJloS/hnD3pJqmGPp8neEvQreeb65a5r1+2ZINcpjJW?= =?us-ascii?Q?zSC9XniR5sOfVDfWvlzQEyC/pGT1G9V0LCA5JaEffX2cz/SQTeMzq6hWa3yJ?= =?us-ascii?Q?wAkF4ygVRJQh/1ZWOCZq99Pqv6bo9/U+wYtqnRoh?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CH3PR11MB8659.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 55a7141d-1e08-49a6-dade-08dc338e7368 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Feb 2024 10:10:09.4370 (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: LlpzVGJIv82X9VADYfFl3eiPfPi3xb1QDmcQRjGSU63UIwPSSwTeMJC7GSi2TlmRECjLplMgzFIUP6ZBd7d2WA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR11MB7215 X-OriginatorOrg: intel.com Subject: Re: [FFmpeg-devel] [PATCH v5 4/9] avcodec/vaapi_encode: extract rc parameter configuration to base layer 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 18/02/2024 08:45, tong1.wu-at-intel.com@ffmpeg.org wrote: >> From: Tong Wu >> >> VAAPI and D3D12VA can share rate control configuration codes. Hence, it >> can be moved to base layer for simplification. >> >> Signed-off-by: Tong Wu >> --- >> libavcodec/hw_base_encode.c | 151 ++++++++++++++++++++++++ >> libavcodec/hw_base_encode.h | 34 ++++++ >> libavcodec/vaapi_encode.c | 210 ++++++--------------------------- >> libavcodec/vaapi_encode.h | 14 +-- >> libavcodec/vaapi_encode_av1.c | 2 +- >> libavcodec/vaapi_encode_h264.c | 2 +- >> libavcodec/vaapi_encode_vp9.c | 2 +- >> 7 files changed, 227 insertions(+), 188 deletions(-) >> >> diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c >> index f0e4ef9655..c20c47bf55 100644 >> --- a/libavcodec/hw_base_encode.c >> +++ b/libavcodec/hw_base_encode.c >> @@ -631,6 +631,157 @@ end: >> return 0; >> } >> >> +int ff_hw_base_rc_mode_configure(AVCodecContext *avctx, const >HWBaseEncodeRCMode *rc_mode, >> + int default_quality, HWBaseEncodeRCConfigure *rc_conf) >> +{ >> + HWBaseEncodeContext *ctx = avctx->priv_data; >> + >> + if (!rc_mode || !rc_conf) >> + return -1; >> + >> + if (rc_mode->bitrate) { >> + if (avctx->bit_rate <= 0) { >> + av_log(avctx, AV_LOG_ERROR, "Bitrate must be set for %s " >> + "RC mode.\n", rc_mode->name); >> + return AVERROR(EINVAL); >> + } >> + >> + if (rc_mode->mode == RC_MODE_AVBR) { >> + // For maximum confusion AVBR is hacked into the existing API >> + // by overloading some of the fields with completely different >> + // meanings. > >You definitely don't want this absurd wart from libva to leak into the common >API parts. Make new fields which have the desired meaning in the common >parts and let the VAAPI code deal with this stupidity. Agreed. > >> + >> + // Target percentage does not apply in AVBR mode. >> + rc_conf->rc_bits_per_second = avctx->bit_rate; >> + >> + // Accuracy tolerance range for meeting the specified target >> + // bitrate. It's very unclear how this is actually intended >> + // to work - since we do want to get the specified bitrate, >> + // set the accuracy to 100% for now. >> + rc_conf->rc_target_percentage = 100; >> + >> + // Convergence period in frames. The GOP size reflects the >> + // user's intended block size for cutting, so reusing that >> + // as the convergence period seems a reasonable default. >> + rc_conf->rc_window_size = avctx->gop_size > 0 ? avctx->gop_size : >60; >> + >> + } else if (rc_mode->maxrate) { >> + if (avctx->rc_max_rate > 0) { >> + if (avctx->rc_max_rate < avctx->bit_rate) { >> + av_log(avctx, AV_LOG_ERROR, "Invalid bitrate settings: " >> + "bitrate (%"PRId64") must not be greater than " >> + "maxrate (%"PRId64").\n", avctx->bit_rate, >> + avctx->rc_max_rate); >> + return AVERROR(EINVAL); >> + } >> + rc_conf->rc_bits_per_second = avctx->rc_max_rate; >> + rc_conf->rc_target_percentage = (avctx->bit_rate * 100) / >> + avctx->rc_max_rate; >> + } else { >> + // We only have a target bitrate, but this mode requires >> + // that a maximum rate be supplied as well. Since the >> + // user does not want this to be a constraint, arbitrarily >> + // pick a maximum rate of double the target rate. >> + rc_conf->rc_bits_per_second = 2 * avctx->bit_rate; >> + rc_conf->rc_target_percentage = 50; >> + } >> + } else { >> + if (avctx->rc_max_rate > avctx->bit_rate) { >> + av_log(avctx, AV_LOG_WARNING, "Max bitrate is ignored " >> + "in %s RC mode.\n", rc_mode->name); >> + } >> + rc_conf->rc_bits_per_second = avctx->bit_rate; >> + rc_conf->rc_target_percentage = 100; >> + } >> + } else { >> + rc_conf->rc_bits_per_second = 0; >> + rc_conf->rc_target_percentage = 100; >> + } >> + >> + if (rc_mode->quality) { >> + if (ctx->explicit_qp) { >> + rc_conf->rc_quality = ctx->explicit_qp; >> + } else if (avctx->global_quality > 0) { >> + rc_conf->rc_quality = avctx->global_quality; >> + } else { >> + rc_conf->rc_quality = default_quality; >> + av_log(avctx, AV_LOG_WARNING, "No quality level set; " >> + "using default (%d).\n", rc_conf->rc_quality); >> + } >> + } else { >> + rc_conf->rc_quality = 0; >> + } >> + >> + if (rc_mode->hrd) { >> + if (avctx->rc_buffer_size) >> + rc_conf->hrd_buffer_size = avctx->rc_buffer_size; >> + else if (avctx->rc_max_rate > 0) >> + rc_conf->hrd_buffer_size = avctx->rc_max_rate; >> + else >> + rc_conf->hrd_buffer_size = avctx->bit_rate; >> + if (avctx->rc_initial_buffer_occupancy) { >> + if (avctx->rc_initial_buffer_occupancy > rc_conf->hrd_buffer_size) { >> + av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: " >> + "must have initial buffer size (%d) <= " >> + "buffer size (%"PRId64").\n", >> + avctx->rc_initial_buffer_occupancy, rc_conf->hrd_buffer_size); >> + return AVERROR(EINVAL); >> + } >> + rc_conf->hrd_initial_buffer_fullness = avctx- >>rc_initial_buffer_occupancy; >> + } else { >> + rc_conf->hrd_initial_buffer_fullness = rc_conf->hrd_buffer_size * 3 / >4; >> + } >> + >> + rc_conf->rc_window_size = (rc_conf->hrd_buffer_size * 1000) / rc_conf- >>rc_bits_per_second; >> + } else { >> + if (avctx->rc_buffer_size || avctx->rc_initial_buffer_occupancy) { >> + av_log(avctx, AV_LOG_WARNING, "Buffering settings are ignored " >> + "in %s RC mode.\n", rc_mode->name); >> + } >> + >> + rc_conf->hrd_buffer_size = 0; >> + rc_conf->hrd_initial_buffer_fullness = 0; >> + >> + if (rc_mode->mode != RC_MODE_AVBR) { >> + // Already set (with completely different meaning) for AVBR. >> + rc_conf->rc_window_size = 1000; >> + } >> + } >> + >> + if (rc_conf->rc_bits_per_second > UINT32_MAX || >> + rc_conf->hrd_buffer_size > UINT32_MAX || >> + rc_conf->hrd_initial_buffer_fullness > UINT32_MAX) { >> + av_log(avctx, AV_LOG_ERROR, "RC parameters of 2^32 or " >> + "greater are not supported by hardware.\n"); >> + return AVERROR(EINVAL); >> + } >> + >> + av_log(avctx, AV_LOG_VERBOSE, "RC mode: %s.\n", rc_mode->name); >> + >> + if (rc_mode->quality) >> + av_log(avctx, AV_LOG_VERBOSE, "RC quality: %d.\n", rc_conf- >>rc_quality); >> + >> + if (rc_mode->hrd) { >> + av_log(avctx, AV_LOG_VERBOSE, "RC buffer: %"PRId64" bits, " >> + "initial fullness %"PRId64" bits.\n", >> + rc_conf->hrd_buffer_size, rc_conf->hrd_initial_buffer_fullness); >> + } >> + >> + if (avctx->framerate.num > 0 && avctx->framerate.den > 0) >> + av_reduce(&rc_conf->fr_num, &rc_conf->fr_den, >> + avctx->framerate.num, avctx->framerate.den, 65535); >> + else >> + av_reduce(&rc_conf->fr_num, &rc_conf->fr_den, >> + avctx->time_base.den, avctx->time_base.num, 65535); >> + >> + av_log(avctx, AV_LOG_VERBOSE, "RC framerate: %d/%d (%.2f fps).\n", >> + rc_conf->fr_num, rc_conf->fr_den, (double)rc_conf->fr_num / >rc_conf->fr_den); >> + >> + ctx->rc_quality = rc_conf->rc_quality; >> + >> + return 0; >> +} >> + >> int ff_hw_base_encode_init(AVCodecContext *avctx) >> { >> HWBaseEncodeContext *ctx = avctx->priv_data; >> diff --git a/libavcodec/hw_base_encode.h b/libavcodec/hw_base_encode.h >> index b836b22e6b..4072b514d3 100644 >> --- a/libavcodec/hw_base_encode.h >> +++ b/libavcodec/hw_base_encode.h >> @@ -72,6 +72,37 @@ enum { >> RC_MODE_MAX = RC_MODE_AVBR, >> }; >> >> +typedef struct HWBaseEncodeRCMode { >> + // Mode from above enum (RC_MODE_*). >> + int mode; >> + // Name. >> + const char *name; >> + // Uses bitrate parameters. >> + int bitrate; >> + // Supports maxrate distinct from bitrate. >> + int maxrate; >> + // Uses quality value. >> + int quality; >> + // Supports HRD/VBV parameters. >> + int hrd; >> +} HWBaseEncodeRCMode; >> + >> +typedef struct HWBaseEncodeRCConfigure >> +{ >> + int64_t rc_bits_per_second; >> + int rc_target_percentage; >> + int rc_window_size; >> + >> + int rc_quality; >> + >> + int64_t hrd_buffer_size; >> + int64_t hrd_initial_buffer_fullness; >> + >> + int fr_num; >> + int fr_den; >> +} HWBaseEncodeRCConfigure; > >The set of fields here needs more thought to match up the common parts of >the APIs. > >Just have target rate and maxrate and let VAAPI deal with the percentage stuff >maybe? Not sure what to do with window_size which isn't present at all in >D3D12. The convergence/accuracy stuff for VAAPI AVBR is also unclear. > Could you please explain more about your thoughts on why the percentage stuff should not be in the common part? I think D3D12 can share the same code in terms of percentage stuff and hrd stuff. I can let VAAPI do the AVBR stuff and remove window_size from common part and keep everything else as-is. >(Do you know why QVBR is missing the VBV parameters in D3D12? On the face >of it that doesn't make any sense, but maybe I'm missing something.) > It is presented in QVBR1 structure(defined in DirectX-header but not yet in Windows SDK). I can add this support afterwards maybe along with AV1 implementation. >> + >> + >> typedef struct HWBaseEncodePicture { >> struct HWBaseEncodePicture *next; >> >> @@ -242,6 +273,9 @@ int >ff_hw_base_encode_set_output_property(AVCodecContext *avctx, >HWBaseEncodePic >> >> int ff_hw_base_encode_receive_packet(AVCodecContext *avctx, AVPacket >*pkt); >> >> +int ff_hw_base_rc_mode_configure(AVCodecContext *avctx, const >HWBaseEncodeRCMode *rc_mode, >> + int default_quality, HWBaseEncodeRCConfigure *rc_conf); >> + >> int ff_hw_base_encode_init(AVCodecContext *avctx); >> >> int ff_hw_base_encode_close(AVCodecContext *avctx); >> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c >> ... > >Thanks, > >- Mark Thanks for your review and I'll reply to your comments regarding D3D12 HEVC encoder patch later since there're indeed a lot of stuff you pointed out that I need to take care of again. BRs, Tong >_______________________________________________ >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". _______________________________________________ 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".