From patchwork Sun Aug 28 20:27:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Beckmann X-Patchwork-Id: 37521 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp1567530pzh; Sun, 28 Aug 2022 13:27:31 -0700 (PDT) X-Google-Smtp-Source: AA6agR5MKetrIoEuwtg2kVuASeBZKWvEjBCNCSXTn3n8wqrMU2O5rcyc2EzHu1BcLhNi4fJEEiJ+ X-Received: by 2002:a17:906:9b92:b0:730:a237:40fe with SMTP id dd18-20020a1709069b9200b00730a23740femr11497657ejc.464.1661718451365; Sun, 28 Aug 2022 13:27:31 -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 t15-20020a1709060c4f00b00738340201b8si4225609ejf.121.2022.08.28.13.27.29; Sun, 28 Aug 2022 13:27:31 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8EF6368B9A3; Sun, 28 Aug 2022 23:27:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from BRA01-ROA-obe.outbound.protection.outlook.com (mail-roabra01olkn2025.outbound.protection.outlook.com [40.92.96.25]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1C5DF68B8C3 for ; Sun, 28 Aug 2022 23:27:19 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GfPkd7O7DLACvb/67o6ZyVBrvY0RJ4Qb0ir2lRsX0ebImFu+Eafc2v+GtTg/deqx+Lpgg0RiHyQ7QZWqH8+7GD+QdxOHdNR0Mbai/bgjhCyxcfVEx1NE5wan6v6zfBhfPiYcrrEaitHdNRKW6Y1ojhsTiB2dcsE2FpzCqT9QK+uyUIJUXr51W81BdewmCJknEwNsiPAdHRTwpEE/TJ7GS8LVuy+8MpB+3kvyYz20Wo7U+Kyr8UVA2eq559aagm3y+qZs7+HKPQ4tmuuGRPXUrg1JOfEt6IiK5rKEOB6tGTMiExvnocQGeFZkDXI0wFpI3mmQQJCuqf26C+D5ekRzVw== 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=/GNITzw3DU3WWQ+ewvPf71Wc4juf84LZFbbzER5RRoc=; b=ec1N6HMcjTg0jC/0XbRHjK54K9KVoi+DUZCD/1jcJ4U+YmBlsqvt/YzdZmUP1DtVUYIw9ky12NraZCGv0zC+Ja1cunzexpRMZhqx3GLJB7Ji/tsza0mWKHCQHy07c56SbuRyOdVWGZh9nwII719N8QIGPEJxotvuoXtDaCcteqoKSKtyiIbveHclOfI3FvKCQBCihvrm8e38/r2aKwwF/pi7VsUom3f8KcRNQsrb8bRJcHL8TDpESEdahai4zzBpSqcJCWuT6WiE+vaSKHwxucbTwiV4x/apRBUvTentzaBd+H5qx79FYzdb340m6UZYR0I0CZixvw8VyWUF7SMvdw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Received: from ROAP284MB0911.BRAP284.PROD.OUTLOOK.COM (2603:10d6:10:4f::10) by ROAP284MB0269.BRAP284.PROD.OUTLOOK.COM (2603:10d6:10:33::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Sun, 28 Aug 2022 20:27:15 +0000 Received: from ROAP284MB0911.BRAP284.PROD.OUTLOOK.COM ([fe80::65ad:ada2:b121:7d36]) by ROAP284MB0911.BRAP284.PROD.OUTLOOK.COM ([fe80::65ad:ada2:b121:7d36%2]) with mapi id 15.20.5566.021; Sun, 28 Aug 2022 20:27:14 +0000 From: Sebastian Beckmann To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH v3] avcodec/videotoolboxenc: Add CBR option to H264 and HEVC encoder Thread-Index: AQHYuxyP/V3ndD6pJUmfCNbRLMNqGg== Date: Sun, 28 Aug 2022 20:27:14 +0000 Message-ID: References: In-Reply-To: Accept-Language: de-DE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [uHKnVd/83zcDv5wXC4zO9g2CS5TPOBv/] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 4ede54d1-ce93-4e69-7f2a-08da8933b1f0 x-ms-traffictypediagnostic: ROAP284MB0269:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: ISP0D43OXqmBjLPNA+B74oMEXdw0N9BdRV8yeELHBUpvqI5wSOTsfSUCZcxK8+eZbqDqRa+5zQzip/2mSw6vS2f7+RQJ1ihU+BwNFT3vkW1KcnVZ3qQH1NqoqSP1PXH1dL7gjgqZfvZ1RpumuYi8HeFI9fUaS2e01fkXRXCi+g+xY5OxiGcVUzm6Xe6Goo6zugf4IQyVEcMP10hVfvG9z3tE83xKa46r8Ehka4Pe/zo4+WUZ7ntJInM8kEheOzYfwsB2Bqw8CkBBC3/2IxwKZei4WGF5tQGcQ3u89t1HZBVXlTZWBsF5IatfWzzzpAuVbV87dMmA4etoZKQ+rJYEbZ+HS/5oxR8OOvPTdtQMRzRh9ms3HKV5jv3ps6bcQDC/lG9zFR/tz6USt/eyGOEXnSA1M6P4Zvg9eHqAQZV1eMDW6atbe5FMZgYBPa78KjmGkjojA/dzTzyiKYjmzlWcQ1Lo+KypeV+bn3yu8QiTI2Xl83xR3JHEz+c7ueXOlWFqbBYkytpoobD9CBDp8FEXEQA5US/4vIqDfFGvWh8oCqrHjcQA7gBJ8J9E4YdK1ZRybyYWCsvxTaDXRQ7BHxnvRwOtCGuvCgLiXafLniGe5IuaFGxhB2M/v1fCK3rhNkSkh4YtcjKN2hK4+R/JpZuIdQ== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: eBTdrgDfBS+8zQfiXvDfqoCtz7fP2P4U5pedhsGFe3Qsa0qxLgEXMexqxKalxgBMHsj/zwpJWZBkGmOBx+6zV+CPIrvHWYNiU8MKt+xNTAE6FhyNucis7DjXmM1H35IwwMl8SjPtbdHHGkMuetRaqGiTdS7QeqC/wALGRbopTeST5lLHGmetHe2HQnpsymhw/iFg8ycFUYiOVzIF3eF7gcbV7vhKFL815Z6HJGzW0QIDPpe0kOjxu3rwsvYVtLIb4l8IOl74X/Mm3viR1mscG6mqPbLE4whZRJo8jcK6Jgl3gJctmdkoJIx9zR9ZCDAMARwiipjHjTwnsucRL31RsVyvJaiixs8OwtttX0gRkJAmQdVj/5iETlhspT40EfiFpo7JwMcDuv56GqGrvGXzKPegE0oj7PaL8ZbAPwDIfdp2jcqL34dfxyPJZrVyqIezBKKGHC783+WuUNNaBE8WWpgBHswvnz7x+exrPWh88JOY9O436w9m/AxrnYWFjfRvRh8yxTlUW80uEr8Std85WM+6jxMQYXg0UD277BumnFF+XNVoo0jp9J8rXQwvYGByauLvMP7Hh3QhoBgLUIHxsIMvomAghnh/Hq2wfx3g/koCZfjmUdvIRayIDoLufzccHcMwFTl1M8Y7sAiPj28wPz6sUe4nZViBrfkNUUpVJAFK3/yLvlBYI21WwrxVtlUTm2hXG/IMU71dutUygrZxRBqziWtNQU6sG9ZCNjd2FALHau7p4irSrYYTUryAiSDtIlPitgHngt0bcsF95d8KNq3WJtFAFx+9xO0LqVcVN/K3u6Xo2qP35+xh3FCORdWcO4I6DnYMW0SpkyHSl0MWxGmONFgTVUgHc2Ek/4rLgl4Cma9IMZxOpESRFYfVX6zxv1iqD1OSz/Jpoqj7miJE3NWPLNY65g/f1V0vEM44hKFxjemIQEUYGjDG3n8TgE/wnIfya2Vc3XF7RlOkopllUEEMyMp/uIFp80MiP6jMawKbzh0HkkNFuocsFeH8ulNKU6i+lOMNGJtERFKQWDiti1wywRlwdnAlHTJZ/eBd5uwAyc5nIw2Go6VgnjLQv+K2NHYtFSD/RG1m3B7JSBJcUwLHBbceHxPIweV8TOnRPNMs24XcQAmg7VEDOmeBh7m7+7ZPijgHb1tv+SzikK6FGCzqP91PCH0lRNik7zTJebpSDNzzasZtYCfZMV4p20J+1eYD2Kq4js9w3htTlhHIXXAxDaqKu53oyOw+6GKkJNHvNS1zv/EPCuYQCDnsGa+tGWbTr4yop+NOYgZ7KhRZYqBNWOnpPY5WFV2G57hI2IY= Content-ID: <06169D4D1A23144BB60F2D845C3B2082@BRAP284.PROD.OUTLOOK.COM> MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-7dc52.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: ROAP284MB0911.BRAP284.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 4ede54d1-ce93-4e69-7f2a-08da8933b1f0 X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Aug 2022 20:27:14.7387 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: ROAP284MB0269 Subject: [FFmpeg-devel] [PATCH v3] avcodec/videotoolboxenc: Add CBR option to H264 and HEVC 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: H/MbJfqSQTMV Adds an option to use constant bitrate instead of average bitrate to the videotoolbox encoders. This is enabled via -constant_bit_rate true. macOS 13 is required for this option to work. Signed-off-by: Sebastian Beckmann --- Removed the hard-coded check for Apple Silicon CPUs. libavcodec/videotoolboxenc.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 823e5ad94e..9de86cc4d9 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -101,6 +101,7 @@ static struct{ CFStringRef kVTCompressionPropertyKey_RealTime; CFStringRef kVTCompressionPropertyKey_TargetQualityForAlpha; CFStringRef kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality; + CFStringRef kVTCompressionPropertyKey_ConstantBitRate; CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder; CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder; @@ -164,6 +165,7 @@ static void loadVTEncSymbols(){ "TargetQualityForAlpha"); GET_SYM(kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality, "PrioritizeEncodingSpeedOverQuality"); + GET_SYM(kVTCompressionPropertyKey_ConstantBitRate, "ConstantBitRate"); GET_SYM(kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, "EnableHardwareAcceleratedVideoEncoder"); @@ -236,6 +238,7 @@ typedef struct VTEncContext { int realtime; int frames_before; int frames_after; + bool constant_bit_rate; int allow_sw; int require_sw; @@ -1079,6 +1082,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, CFNumberRef gamma_level, CFDictionaryRef enc_info, CFDictionaryRef pixel_buffer_info, + bool constant_bit_rate, VTCompressionSessionRef *session) { VTEncContext *vtctx = avctx->priv_data; @@ -1139,9 +1143,20 @@ static int vtenc_create_encoder(AVCodecContext *avctx, &bit_rate); if (!bit_rate_num) return AVERROR(ENOMEM); - status = VTSessionSetProperty(vtctx->session, - kVTCompressionPropertyKey_AverageBitRate, - bit_rate_num); + if (constant_bit_rate) { + status = VTSessionSetProperty(vtctx->session, + compat_keys.kVTCompressionPropertyKey_ConstantBitRate, + bit_rate_num); + if (status == kVTPropertyNotSupportedErr) { + av_log(avctx, AV_LOG_ERROR, "Error: -constant_bit_rate true is not supported by the encoder.\n"); + return AVERROR_EXTERNAL; + } + } else { + status = VTSessionSetProperty(vtctx->session, + kVTCompressionPropertyKey_AverageBitRate, + bit_rate_num); + } + CFRelease(bit_rate_num); } @@ -1530,6 +1545,7 @@ static int vtenc_configure_encoder(AVCodecContext *avctx) gamma_level, enc_info, pixel_buffer_info, + vtctx->constant_bit_rate, &vtctx->session); init_cleanup: @@ -2532,6 +2548,7 @@ static int vtenc_populate_extradata(AVCodecContext *avctx, gamma_level, enc_info, pixel_buffer_info, + vtctx->constant_bit_rate, &vtctx->session); if (status) goto pe_cleanup; @@ -2727,6 +2744,8 @@ static const AVOption h264_options[] = { { "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, VE }, + { "constant_bit_rate", "Require constant bit rate (macOS 13 or newer)", OFFSET(constant_bit_rate), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + COMMON_OPTIONS { NULL }, }; @@ -2760,6 +2779,8 @@ static const AVOption hevc_options[] = { { "alpha_quality", "Compression quality for the alpha channel", OFFSET(alpha_quality), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0.0, 1.0, VE }, + { "constant_bit_rate", "Require constant bit rate (macOS 13 or newer)", OFFSET(constant_bit_rate), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + COMMON_OPTIONS { NULL }, };