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 4F7DC40665 for ; Tue, 25 Apr 2023 06:10:30 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4CE0C68BEC4; Tue, 25 Apr 2023 09:10:27 +0300 (EEST) Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D829E68BE34 for ; Tue, 25 Apr 2023 09:10:19 +0300 (EEST) Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-63b7b54642cso3965740b3a.0 for ; Mon, 24 Apr 2023 23:10:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682403017; x=1684995017; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=nBOGX0gurj/lAHidc1dQKCAjSJL2hv5Py2qim/+yTm0=; b=REmZA9Xma5X9ATcIa8m3knCKBT9RDy2LLP7sLsGMHKRZ94Zr6c6LLXOU2UfzgazDP0 g+JxpV6sHvKTyoOXVnjoGcB60Dv803xYLk6nBehccCyiQPk/zU0z7CVHIOhRRjn9cCG2 SBD19L8Gwo2qII7K+tpG9oauj1An2xwndwQ8M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682403017; x=1684995017; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=nBOGX0gurj/lAHidc1dQKCAjSJL2hv5Py2qim/+yTm0=; b=HW6oUHb1MBt878L86+1nFDckMym4c/JGiYaLei2yEYFFhfJ3gYltONplIZihKkIcST aEJmjAvPnltLooxsA/qX15BeVFbhRWt/EKJ6oKoZHvNp+5mVrw2K/9cn1zE22I4+Wgaa 9Mst3ipOLKhOpefB8rkifn493jMyf7DI9V71cbVX7CYtJj07uwAeltDGWuxBI1S1yjDN BLoyJtNajI0PwPe3SotnGOyJ5sVqnv4kilCbJg+tjegbGrm3NVQf+eSWKl0lwYDtFSAu a4dgV1m2+0R1MjBhVgNywowcc7c8x0g5S14FjSYKpo986w7Y/e3M/re7xq7iXM33diQL vaGw== X-Gm-Message-State: AAQBX9da6f+1iHVuKILLpKFMDFhzmf1ACQP71J95Pj4l57d4XDjMOoFZ hAxIbF+k7vioA+6x90ibBWl5vUqkoJS0ohr5fzE= X-Google-Smtp-Source: AKy350Y34x2VQiLakNY3AAHHt1MNbA7eReZjat8Pw9WgQQOn7r/on7Pd8ilKNdZQvAkrBGBN8YcFUQ== X-Received: by 2002:a05:6a20:840c:b0:ef:a31b:af90 with SMTP id c12-20020a056a20840c00b000efa31baf90mr21743712pzd.28.1682403017442; Mon, 24 Apr 2023 23:10:17 -0700 (PDT) Received: from jrwu.c.googlers.com.com (21.160.199.104.bc.googleusercontent.com. [104.199.160.21]) by smtp.gmail.com with ESMTPSA id x4-20020aa784c4000000b0063d238b1e4bsm8376794pfn.160.2023.04.24.23.10.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Apr 2023 23:10:16 -0700 (PDT) From: Jeremy Wu To: ffmpeg-devel@ffmpeg.org Date: Tue, 25 Apr 2023 06:09:52 +0000 Message-ID: <20230425060952.2341011-1-jrwu@chromium.org> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avcodec/aacenc: add strict bit rate control option 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 Cc: Jeremy Wu , Jeremy Wu 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: From: Jeremy Wu 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 to be fragmented (but UNRECOMMENDED), in practice most headsets do not recognize nor reassemble such packets. In this patch, we allow setting `bit_rate_tolerance` to 0 to indicate that the specified bit rate should be treated as an upper bound up to frame level. Signed-off-by: Jeremy Wu --- libavcodec/aacenc.c | 12 ++++++++++++ libavcodec/options_table.h | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index ed036209e9..f48f057022 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -1106,6 +1106,18 @@ 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); + /* When strict bit-rate control is demanded */ + if (avctx->bit_rate_tolerance == 0) { + if (rate_bits < frame_bits) { + float ratio = ((float)rate_bits) / frame_bits; + s->lambda *= FFMIN(0.9f, ratio); + 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/options_table.h b/libavcodec/options_table.h index f331ce2861..716787aa59 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -50,7 +50,7 @@ static const AVOption avcodec_options[] = { {"bt", "Set video bitrate tolerance (in bits/s). In 1-pass mode, bitrate tolerance specifies how far " "ratecontrol is willing to deviate from the target average bitrate value. This is not related " "to minimum/maximum bitrate. Lowering tolerance too much has an adverse effect on quality.", - OFFSET(bit_rate_tolerance), AV_OPT_TYPE_INT, {.i64 = AV_CODEC_DEFAULT_BITRATE*20 }, 1, INT_MAX, V|E}, + OFFSET(bit_rate_tolerance), AV_OPT_TYPE_INT, {.i64 = AV_CODEC_DEFAULT_BITRATE*20 }, 0, INT_MAX, A|V|E}, {"flags", NULL, OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT }, 0, UINT_MAX, V|A|S|E|D, "flags"}, {"unaligned", "allow decoders to produce unaligned output", 0, AV_OPT_TYPE_CONST, { .i64 = AV_CODEC_FLAG_UNALIGNED }, INT_MIN, INT_MAX, V | D, "flags" }, {"mv4", "use four motion vectors per macroblock (MPEG-4)", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, "flags"}, -- 2.40.0.634.g4ca3ef3211-goog _______________________________________________ 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".