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 7930044108 for ; Fri, 26 Aug 2022 11:42:46 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 65E9268B991; Fri, 26 Aug 2022 14:42:44 +0300 (EEST) Received: from BRA01-ROA-obe.outbound.protection.outlook.com (mail-roabra01olkn2062.outbound.protection.outlook.com [40.92.96.62]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5B07368B680 for ; Fri, 26 Aug 2022 14:42:38 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Q6iwfS34g83ay/jFj3ezypUjWPMgU2S1gRsoHizqyX4fWtkh1GiMz+nypSiCDtSmWPYw0weOk+fDBNcM8qMiNcjigdlkhUoiTYbPoVndh67Xxsbf8yN6lp3jSpaCnsUsCynyE8LCh3WmvJ7whHjPt5Mklmun38mV0UTJEVHXX9sElYnIwl8RUaeBqkCmE7aakYoS0+YHZc9PadohmOjgpQ3bO8fkdzi9oPp1ef9ElbdlDPJLnazYXfmsaMIg3K/n5dK4gyoJ8aCDd+a1EeGSOYUBT8UDbo4vF1KY6Ug1SYvTJAQS1yO4ZvabId1IdOcyFPRlyXXeY1oJT15g5J905w== 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=6LZpZx4vEXbMY/Jsj2z0AUL1zvXvML+GDcL/KRSQks4=; b=XaW6f9OYFrEXc8SmzwZzRDSAd0LShtiSoSZAol0u+nGw8fcbcHoWsn2HIE7X6r2LxbQ9JFsoHALKD5QFlsUa3071VaRSmB/K27cVkEWi5tSHRlcQ8E0ZmFNaYncJzzc/SjL2T6TtwfzYgSwxkayZt4jy80L0zVDX4+iXrjVZozyRYmLkwJXm1LTcnd2tvChArPzlA8kuCi5fIJ16eIp3SWrRZpyW/beQyroWiRR0pTh/s1N8NBIqPOM5jZNpfpjC5C8IJB/kJ2VIMbVkBj9CyYeXdC0XAcLB6uTmluzTCXgvKCuDx9dd2/+h0KtbABCuTvsVpGpIfzTS6n6Wmh59tg== 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 CPYP284MB1160.BRAP284.PROD.OUTLOOK.COM (2603:10d6:103:9e::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Fri, 26 Aug 2022 11:42:34 +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 11:42:33 +0000 From: Sebastian Beckmann To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH] avcodec/videotoolboxenc: Add CBR option to H264 and HEVC encoder Thread-Index: AQHYuUDuIi6+FE1wqUassSa+1qj3FA== Date: Fri, 26 Aug 2022 11:42:33 +0000 Message-ID: <333BB5A1-3A9E-4DCA-9782-4DA302C124F6@outlook.de> 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: [nXONCJwfNKxRnH6szh4QEppx0PEbbDIn] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d591d1b2-3c7b-426c-eb0d-08da875810e1 x-ms-traffictypediagnostic: CPYP284MB1160:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: NkCkbT4rhjzWX9bD2TlV+1YLqVe6Ketkx1xZKMzp59SoeqhKvei7caOmQ7BZKMn6FbmuclR0jIfHolWegoMBm/6ViFL4QrBb8YPnEGKNpY6nuhF25LdF9/aZdso5b1verc3Iunm+2wdMJcCR0jc9O6zoU7rQSF1HcVis9jeYI0UUFEG+CHYns7wb++C0V9Dq5xsiWuhjYbSiWs3RY6Hg6MJyavKEixNR6RtkCgfLObAI8zv9IYPeGU5E7DqVFanGcPU4goBfNJi96i5THq9B6aNHo8Y6N3aP4l23JWA3ea6piiPGPuMbqLFs2hXdjhOYQwZIIHuap/AdkG35wyPFnQe3QXC0nT6MQvQmyb1BTYaKb++kLeCcvmfZ3YHM20CeUM2hl8GHnnFkvO5jmxdsZpxpyOZzFIVupo4WyTaQ3neSqb8hbb/UN2oD+QKIvmUZHp0zQeDJyk6HRLKJTBd+hQGlxPi9cTUkC+FUFjXdKEfkxHfKHOC3A17OHkuK5iFjvz0n6Q23sAEj9Z+LhhxoVtJgb4XLcw4+fRKjjZHZolkO9YB/u/fY3Gmo3QPKmxl5YM4mZJgo2wA2ZXbyCMTN/uvrAYD96iK0XXxlqgln83NJ4HzUsW/5/CSvjbb2mSocf2aE4hgiJXWb6+BobYykEg== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?OjXSd+DpDngaIMrsFBit3WT0LvymRvcE1DF7OJ74bS2upQEDOemBWkTDz6mK?= =?us-ascii?Q?pL11Ta+tzzQXqOzoqVdfLe9Of9gIhLYmgFvLWrGCC0Q/N7oJKCNu7mkc+PUU?= =?us-ascii?Q?dU4VUKT8mCdwck7/DS6xr4Z766J3cTeXW63pFDH6Vu7OUwwu0D44lftX1ate?= =?us-ascii?Q?SRXBSolbmGK1YKIyg6WTwznjoly6LBckHvBz42igfpnN2w/h1Wd8wgcyV7t+?= =?us-ascii?Q?3hKyBBXOZddRr6BJz6apbO/eNs8SbrMchdFSGfFaBWjqBbl6xS1byRQtPjhr?= =?us-ascii?Q?otQpp+uMxpAC6CMOrj/hIL2lu5gi8Jlad4+MhioDPXtpJW+wzHAqjpdF3Tz8?= =?us-ascii?Q?8vKzGLyaId/lX8GpHZs+XFdU3+bqcdBfZ2x3GR0V7xAdj9Q/uS0smaU4usj1?= =?us-ascii?Q?w3mLHUCBMnPWIh9BTRLw/7L6vTwWdjHU+NNSy75FD9WRndjHZ9aKPLYiU7c1?= =?us-ascii?Q?lSbd7W4EsNoPpXJ09AlV6IX5SpbO6Kp0jD5INlZKbNq+t9ntP+CEZ44/DdD/?= =?us-ascii?Q?ZgLM1R9JEvF3n+7f7mjLs2POd5ZKa2fuvALtbPbbRSrONYwWT+vRkpJtFlVx?= =?us-ascii?Q?9gjCvv3cizpXIT/Tenew915aDbiU12ctgA9x6oRqWHFgoKnsVykyXC48Ycww?= =?us-ascii?Q?aEbbHGMYWMLc4TeeasnCOwwyj7Mmpf2YtL7H/FuT8QcbOYR3zqMcOOdDRFzj?= =?us-ascii?Q?CtbJVPz947GegAhZu6x3umo8hk90+R0nR6WYaJzJcJqdFhewNXmF5jUQV2Ft?= =?us-ascii?Q?imxGTrO7Y5L8+lK9NCckRbK85/XV8vssSbiPF+4m1TCMNbMQwUH09McSBY2+?= =?us-ascii?Q?agiA4ZqIaVgRDV7FPeP5Ty7iFIc7XNamLjLBvs+/gvlel9TrKebxKK22pDls?= =?us-ascii?Q?DlegCClFfMCpl2uuwJufOU8OrY3RydMxdz3nE6elfTuZRC1PbvTIgUuTa+GN?= =?us-ascii?Q?oF8Sum3nMhNRwX5foSnRq9BSoWYr+ZZTxritk0eAbtUhzlbSt9cw+B31l39Z?= =?us-ascii?Q?nWJ+MNAIVdbR65gnUnNEf3zdpuQ23c6hnT56euB/v521MVWWanLLsqLu6wZs?= =?us-ascii?Q?6ajsAqBoYkv69EgwZxmRVy8dH9VVdG11bhroVfb9Yb3nL8qMJDP8GYDQtHei?= =?us-ascii?Q?BsKbqTXFMWuNatfxcF7EK4l2kjueBp1rACUqTxxzSZoOhqoOdfJtpk/G9Q2Y?= =?us-ascii?Q?MHIcmAsG2ouyX72QaY56pLY/oael/qCEyp453pf7bVcXOTDz+9EdfHT6YrLN?= =?us-ascii?Q?MCYeemjQQNoNBupOl1ddkqcj/gvDomFxP+iuGeFrkX8AJdtd0E004JkVctKe?= =?us-ascii?Q?yhkuj3mnk8sWwQt5VaOdiH21?= Content-ID: <6B85A0B67D7F664BBC3D3881377C7C92@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: d591d1b2-3c7b-426c-eb0d-08da875810e1 X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Aug 2022 11:42:33.6303 (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: CPYP284MB1160 Subject: [FFmpeg-devel] [PATCH] 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 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: 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 --- libavcodec/videotoolboxenc.c | 37 +++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index 823e5ad94e..9eb6fe09a2 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_enabled(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_enabled()) { + 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 }, }; -- 2.37.0 (Apple Git-136) _______________________________________________ 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".