From patchwork Mon Apr 24 09:14:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Wu X-Patchwork-Id: 41310 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dca6:b0:f3:34fa:f187 with SMTP id ky38csp1292425pzb; Mon, 24 Apr 2023 02:14:42 -0700 (PDT) X-Google-Smtp-Source: AKy350Z54jSdrsFcJUdec4TC0B00Jp4fide1Ai2U+K/MhW+/hmWNndFCf10wvMMma94LoS0g5UeE X-Received: by 2002:a17:907:b01d:b0:94f:6c6c:e17c with SMTP id fu29-20020a170907b01d00b0094f6c6ce17cmr8140329ejc.60.1682327682281; Mon, 24 Apr 2023 02:14:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682327682; cv=none; d=google.com; s=arc-20160816; b=dUW0wXG+Le4pL1Z2n7SeRjjm5TK5bn3GRI/G9DyDcmt85Ea6p+stYRRF7lEPp76/Pr ty6aAgw5A1hOF+kxW1HGNGRX4ND9csot1fb0oYtPhgHrRzVq/TEppbeuFiVuFZCFStvZ WySPqurZon37G+R9Mw2Z16oaUMZCQKBER735rEJ3X+3z9hJyqdlr0a5AeyEhqAsekCH8 ZJUieTPb8Tr8z2Vy9h7p2H6pduu/uNere+fisXInFoATIrBp2sqOI+xqMwPTVjKNZYLU ++3rGTP0g025SSmpaDnilBBgGKkY7pMDC1QrBvrgf4qEUdgiFqO05uCYK/ArezsdG8tE vUGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:to:from:user-agent:mime-version :date:message-id:dkim-signature:delivered-to; bh=NNH3nMPjGi62J/yCteL9KexlbO1vsDk1DKuqRGmcTxE=; b=w4i0H/C8XOpdheV6Ff3RjOtHAYYNux/S7eVTFaLk8KuSnY/k3/ez5tc6vTqSJp1V96 SmmxMnTvubpdkgE632GluFiH35fufFAhygZiowzqrSz5zCGw3cmA16YwIV5VFQVemVHK 6nAMcphID5fxXuBa3GssuHzycNAPSATHdszoiQq1qGmV743dsNXqmqmyBjzkFVR0YFaX gYKO6SMa4DL5fIZ147y+PfJfrSWTxJFYxbGklGP157VBFhYNdvCW2fayUW8n509Zk6I5 NX9bZ9XrjXUwsoe8pOEy8+JP9aIEpik958CEiKuT/eC7vOYdZ20CnjFEe/VAvRrYaSUe eZdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@chromium.org header.s=google header.b=i0o2+ThS; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id vm4-20020a170907b68400b0094eee717c9esi7406338ejc.7.2023.04.24.02.14.41; Mon, 24 Apr 2023 02:14:42 -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; dkim=neutral (body hash did not verify) header.i=@chromium.org header.s=google header.b=i0o2+ThS; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1027B68BF61; Mon, 24 Apr 2023 12:14:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8A92D689D6F for ; Mon, 24 Apr 2023 12:14:32 +0300 (EEST) Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-63b5c4c76aaso3074390b3a.2 for ; Mon, 24 Apr 2023 02:14:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682327670; x=1684919670; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=36ekMF4v4ZPO1l//8HDyWYV3Mv+86Q9qWojPSwDkpVw=; b=i0o2+ThSmNDDqSErGFo8e4BUe2FSrf9dDx9H8Q/Mno0qOsBJpJEImqp0tff+di9t+/ g6qcjlaCxANcNblW4T0VS6jIY3Lmgwl3WE8ihDmxB2vAFJI5cJirEaJrf8QpJes2vTDh Y/xGS4KDUib8fF5Y//tpCdhrvdDC2xz+3z+mU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682327670; x=1684919670; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=36ekMF4v4ZPO1l//8HDyWYV3Mv+86Q9qWojPSwDkpVw=; b=IfUI+EOHNhqN/Zn2weRFFDQRCsy3oiRT5qJ84Su3xJO6f2TNtd7p85VaFExfCjwKgk Yf4b8lldvouBY2o/LR0+WHmCZHGigmWQ49J+LMmZIrKrdNuDucAGdgw/0KBDJ8XEhw1P x9HE0IrqfqVzxF6hZu0QFhAN+P0ovnBoIghNpYlcy9fjMC4Efhrt3RSAme1hmevyE5Lp UIml+NtTr4gtI95X03lA+cMqY01q3tRL3hvektKVq6b9pXbn1lKeUjyCDfF3FvxnNHIY 3ZxTPjJPBKuEteA/ITedRiIfvoc0DAfWJyoVtu7HGNtsjFu2QARrfIaGgW9HNTE8HIGF eoRw== X-Gm-Message-State: AAQBX9eWFnmheTidzP+DWFC66nJGMvfq2cM2fO/f97KvaaZkI6J1F5hH ai17pkwhouwzl6q7DUvd589jFhx4SUELCs+UAWjIWw== X-Received: by 2002:a05:6a00:134a:b0:637:253a:531c with SMTP id k10-20020a056a00134a00b00637253a531cmr18976116pfu.27.1682327670407; Mon, 24 Apr 2023 02:14:30 -0700 (PDT) Received: from ?IPV6:2401:fa00:1:17:78d1:9784:d4b0:2aec? ([2401:fa00:1:17:78d1:9784:d4b0:2aec]) by smtp.gmail.com with ESMTPSA id y9-20020a62ce09000000b0063b6ad9f535sm6964428pfg.8.2023.04.24.02.14.29 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 24 Apr 2023 02:14:29 -0700 (PDT) Message-ID: <087eca86-4810-3055-840e-633f665c6ac2@chromium.org> Date: Mon, 24 Apr 2023 17:14:28 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 From: Jeremy Wu To: ffmpeg-devel@ffmpeg.org Content-Language: en-US Subject: [FFmpeg-devel] [PATCH] avcodec/aacenc: add strict bit rate control mode 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: bx8saAWiAUxA In certain use cases, controlling the maximum frame size is critical. An example is when transmitting AAC packets over Bluetooth A2DP. While the spec allows the packets be fragmented (though UNRECOMMENDED), in practice most headsets do not recognize nor reassemble such packets. In this patch, we add a new mode to specify that the configured bit rate should be followed strictly up to frame level. Signed-off-by: Jeremy Wu --- doc/APIchanges | 3 +++ libavcodec/aacenc.c | 11 +++++++++++ libavcodec/avcodec.h | 4 ++++ libavcodec/version.h | 2 +- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 0b609e3d3b..e730a7e126 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09 API changes, most recent first: +2023-0x-xx - xxxxxxxxxx - lavc 60.11.100 - avcodec.h + Add AV_CODEC_FLAG_STRICT_BITRATE. + 2023-04-10 - xxxxxxxxxx - lavu 58.6.100 - frame.h av_frame_get_plane_buffer() now accepts const AVFrame*. diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index ed036209e9..daf5538056 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -1106,6 +1106,17 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, too_many_bits = FFMIN(too_many_bits, 6144 * s->channels - 3); too_few_bits = FFMIN(FFMAX(rate_bits - rate_bits/4, target_bits), too_many_bits); + if (avctx->flags & AV_CODEC_FLAG_STRICT_BITRATE) { + if (rate_bits < frame_bits) { + /* temporarily degrade quality and repeat until frame fits */ + s->lambda *= 0.75f; + continue; + } + /* reset lambda when solution is found */ + s->lambda = avctx->global_quality > 0 ? avctx->global_quality : 120; + break; + } + /* When using ABR, be strict (but only for increasing) */ too_few_bits = too_few_bits - too_few_bits/8; too_many_bits = too_many_bits + too_many_bits/2; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 1e91b9cb53..bc9ecdff23 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -333,6 +333,10 @@ typedef struct RcOverride{ * H.263 advanced intra coding / MPEG-4 AC prediction */ #define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * Treat specified bit rate as upper bound up to frame level. + */ +#define AV_CODEC_FLAG_STRICT_BITRATE (1 << 25) /** * interlaced motion estimation */ diff --git a/libavcodec/version.h b/libavcodec/version.h index 80e2ae630d..8b53586be1 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 10 +#define LIBAVCODEC_VERSION_MINOR 11 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ -- 2.40.0.634.g4ca3ef3211-goog