From patchwork Fri Aug 26 12:34:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Beckmann X-Patchwork-Id: 37506 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp304150pzh; Fri, 26 Aug 2022 05:34:47 -0700 (PDT) X-Google-Smtp-Source: AA6agR6Li0P7joRaYyA+ui5q/Lf2CLcJlzn27L+K+DRqHuWV3CtYLo6TvACGQw3uOjSU3Q8JAvRm X-Received: by 2002:aa7:d814:0:b0:447:b848:9e53 with SMTP id v20-20020aa7d814000000b00447b8489e53mr5645178edq.64.1661517287450; Fri, 26 Aug 2022 05:34:47 -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 hp13-20020a1709073e0d00b0073dad2f550csi1395906ejc.680.2022.08.26.05.34.40; Fri, 26 Aug 2022 05:34:47 -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 3C13768B99A; Fri, 26 Aug 2022 15:34:37 +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-roabra01olkn2028.outbound.protection.outlook.com [40.92.96.28]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 98B4A68B24D for ; Fri, 26 Aug 2022 15:34:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Wgw64DOjThw8p2EIGoV9AsGKHmC1B8laaA/dYnmwv/IdNzxFKkxCD1EwkNIqTXO3poZRBJuIICac963Nbo/Xl3uk2iZCq0lGDwbKZQZeCE1o4FY26rdRROALzw4ZcxFOt7pWEI/brpcegvtaiU2RVMgJrtGqMOtQOf2iyKtPIt4eg5vtrsZ2reKy4SZKlzGvqSn0PMwmwUkPzZQ4IiFKFjsrEIf0qOzR1IVY8eUZQol8M7OkvTUU/A9eaPfd0AIVy4s/77ynIycCvypdYc8to0p/9BukQ4fNMZZ6GiEvn1/vOmnhPKuCXjJuiqHmILOeIqwXurI92AO0jpK2lqlEsQ== 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=WddaULIdVyT01Us4kXSl5vR9WwRgl7C4PecFF4A41As=; b=H9u5jQXl4KPESFRePoZ4QD6f9MGZnjUVweu5DLneqz3jgkRyimDxRBJyeglTKc/jqrlk06pqe/cDohE+G5LNi8HQyaJxRrAO0M8WvX5pKdYWZ9rjCgj1EpGUZcvi38BxofSbsDgqSHGRtl0m50HVjNWCUcr61qyNy4Vb04lAWvSJvSANc++QKyOi+VrGn/PphGGfIpyj1nbpcKEIFvyyn+aTUz7T9/aMXnJDnI52Bs17YX02qk+7serY1f44Ub5oyAwiYhXM3wwnpxTpW6PETyPHc/ww8IoVWpbRG755jGKzZCi65wJpe3TnGkD43E1JcXylHOfGF4oopuU0x1cqXg== 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 RIZP284MB1177.BRAP284.PROD.OUTLOOK.COM (2603:10d6:10:46::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.14; Fri, 26 Aug 2022 12:34:26 +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.016; Fri, 26 Aug 2022 12:34:26 +0000 From: Sebastian Beckmann To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH v2] avcodec/videotoolboxenc: Add CBR option to H264 and HEVC encoder Thread-Index: AQHYuUgt5f4PngLQUkKIBf3ivDV+Gg== Date: Fri, 26 Aug 2022 12:34:26 +0000 Message-ID: <442A31FA-F222-4FAF-AC80-0352F49F975F@outlook.de> 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: [eylCnTIbTogPn6W0qb1r3YTTyM2WqHid] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d6002861-6045-425f-6d61-08da875f502e x-ms-traffictypediagnostic: RIZP284MB1177:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: dK8RaiQn69wQBVNwyUtsXKSX3nwK5ydRx4DWkJe9z4fEINHi9boY0uLWyLzJMolJuZTd+VU9V8d8rblg5qR0YIJ4dT49EuVzlFlPcUuCKlFdwkqk6gKY7k+68x/EMSCUEinSAP+R9Jz2Hp8/lWuCV1BxUdnEmzepvvDEFimsNfhCBr6GkY24XwkMkiINJrk8X21UJLmm4w5eHRzy7vqZi04GRaxOQWZM+/uUSQDb4EHnwJGYqryS86LDFWwtB5a/k6Gk1uCKA05J5xj6Zrmm5ZRpXHh1SE8Ybk4OtnP/+mW282bmFpawBp6erJKw1JYXXKeuJciJ+iEi/wPA0vVR7GcDvgef63zJV8F3Mji5Ak1fgWZROVEh/mf2G2LwyiZF6l2E+f3C02xHf4QMVeyz1/X8vPNvAwXHxz60Bz04roOnI5mizSDia8bNfF9itt0YXJfnSD+HzbUaNXwDpqgB5dvdL2ZEcTdg87gcK1htsLk20EHPZcP4HAS77a7I/671NcC8KZt9o1z8XMKEex6uFHQCSJiW+EAlQn6duCbhqzzLJ51geail/8DXNQ+rPV7jxvjTzUSDBiI1Wht+szrkTw/LK7/jL7jKnbSiVzdK8FeOcTqjip3XX7xnrFN0UPW/jpSafpya1G0df+2rQdJtlw== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: AAhYBqS50PlPuq8BJutLA7ZscK1UPq7jFMsWlmnDfRHBqHoIuAx44U6OadIQza1cpyvHMEBWfPdtui59U0Qsor8XPx4dA2vswfpkG5I7VnWlrbLjAKcQbciXRhlNV59o4Q6JDH0RjACFGs/4ojE3iJO8J7ARXShEe2WT0Wty/BGCjOxifMF0PYEwMw+VKrJfqE6FFxVH9vm1zltL7nKYd68tbPuEH0E+VNM/vRql6T44XYNifkq+Ey9syVAYhtEZ9u6RDavrZd1UiAhyuDwGGtoIPvaY71tK8rJmf8RrsooySDWOVk2+FOg9C5ak2GnD9rvGM4RCymcSoeTe2LNitmcsZL9KtDLHD35izoMPVNQZ4O4ZvZ5Y2R1aaTzM5tZF3eL6S5CwLK8Mq7RqmKa7HOWCP5keAOnmulO4E63b8gmIkQHnisPHqm/JS0UHN9ZuMzyF15l0QV+ODVCrl0n0ZcsMjxUS10QVbXxQ36tcxeRAH7j4KC7xpbjiOQ/iU3XVQtOVp47V91jSoqZLh23VV4Hz5cXutSXVFWYrlxMedCusk6/lxe/gFmv7eBSEw8WusYUPlH2G1ThiOtKBHFo/1ErP3hDdv4bPYn1tpLMJcFP76mBfvsnPqP7k2EJKocj7Jlytm+9MSSQ38WwM3jhj6za3EziN2A61C9uxUNxn14A1ybO0JWeU5/EPcI8UHCb9jM3ErNDSJ9kSoabwwJogpLkOX1+wmSFbObShwDR0xRza/haKK5l3iFQDjVBtlBifnrVx7N2ZPrfH21CMSdh4BLL59B9xqL2WPM2zvqjx/sZ5G1swoD2icFMZeT93LHIsDiFbzYCV2kZJeRlHgQC/nqesyOC4VeQH06D+pR/pQ/sAKxVUEflcPChrAOHig0qs19dY2wjzhq6JZRVeloWrbiN9rKaBnUlMTdAsT7oUgfhJmFkG5w4H1hQfoRU76VdZCRLkrsd1gi3aPqSLoh4ediyTKEwKWQ+A9z9jAJ8Zo8rYzAoxvXcsCtBNfDjpoSonLpBZ7W8pdI+VHhWG0HudpdHAyaTIQV4WmElnK95mgMvnbKwiVOI+C3LHBw0OhYibn0zoc/mVNdxiNP4lCgGlhEwc6B2pKQXfNPn4jWgzj2i154nHhrBoJdemXKChbXeDooEmF5Tt+msLbTzFNWx+7nmOJ/OjQ6IUjtbr7qRjb11AWBUMfBJIPs+/wkdh6y9adEPaKEW/apVzSqNcLprClEHjaKLYLenP6CQsz/uZufZrhb0wiLfuXqbz0tiKYvSSouBae7XrH6+wC98RLl4LLfAKLscXiEH/mIHP6W1q0bH34AeDX2a1d2jx/629ONy7 Content-ID: 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: d6002861-6045-425f-6d61-08da875f502e X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Aug 2022 12:34:26.2734 (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: RIZP284MB1177 Subject: [FFmpeg-devel] [PATCH v2] 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: kgbD/PlLHGnp 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 --- Changes the name of vtenc_constant_bit_rate_enabled to vtenc_constant_bit_rate_available to clarify that this checks for availablity of the feature. libavcodec/videotoolboxenc.c | 37 +++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 823e5ad94e..18d68360ef 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; @@ -1073,12 +1076,22 @@ static bool vtenc_qscale_enabled(void) return !TARGET_OS_IPHONE && TARGET_CPU_ARM64; } +// constant bit rate only on Macs with Apple Silicon running macOS 13 (Ventura) or newer +static bool vtenc_constant_bit_rate_available(void) +{ + if (__builtin_available(macOS 13, *)) + return !TARGET_OS_IPHONE && TARGET_CPU_ARM64; + else + return false; +} + static int vtenc_create_encoder(AVCodecContext *avctx, CMVideoCodecType codec_type, CFStringRef profile_level, CFNumberRef gamma_level, CFDictionaryRef enc_info, CFDictionaryRef pixel_buffer_info, + bool constant_bit_rate, VTCompressionSessionRef *session) { VTEncContext *vtctx = avctx->priv_data; @@ -1122,6 +1135,11 @@ static int vtenc_create_encoder(AVCodecContext *avctx, return AVERROR_EXTERNAL; } + if (constant_bit_rate && !vtenc_constant_bit_rate_available()) { + av_log(avctx, AV_LOG_ERROR, "Error: -constant_bit_rate true not available for encoder.\n"); + return AVERROR_EXTERNAL; + } + if (avctx->flags & AV_CODEC_FLAG_QSCALE) { quality = quality >= 100 ? 1.0 : quality / 100; quality_num = CFNumberCreate(kCFAllocatorDefault, @@ -1139,9 +1157,16 @@ 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); + } else { + status = VTSessionSetProperty(vtctx->session, + kVTCompressionPropertyKey_AverageBitRate, + bit_rate_num); + } + CFRelease(bit_rate_num); } @@ -1530,6 +1555,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 +2558,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 +2754,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 +2789,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 }, };