From patchwork Tue Apr 25 06:09:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Wu X-Patchwork-Id: 41317 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dca6:b0:f3:34fa:f187 with SMTP id ky38csp1973141pzb; Mon, 24 Apr 2023 23:10:32 -0700 (PDT) X-Google-Smtp-Source: AKy350Y8omoHU8PBWxaJSyb9iECSaAcBPb+wg8jw+0VpVs1z1xNHzqRl7gPSWDdlOSlxRVF2v1u0 X-Received: by 2002:a17:906:d201:b0:957:802:497d with SMTP id w1-20020a170906d20100b009570802497dmr12344502ejz.9.1682403031835; Mon, 24 Apr 2023 23:10:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682403031; cv=none; d=google.com; s=arc-20160816; b=b5+p9AS7lq9TsQ5pDfKNRnyKaX7zauDigknX5E7aDPX+8+j6Iaxtw8dngi/14iO7Yd z6KRXI3ojgMYcG3B+MCN5rldVgNogH3CQOp0hEeyaaB0Yxk2vg9sXeeBroKzqpq3m/C4 leh3eaeGVnU9yw4+ApTvZefpEY2MR7fTMrMTQnn70/Ybd43w2iyF3D4o9Z6yELkUICTX zS2Hx2qMRPji9FnRxV+DchC1dgBM43haOfEZTIVqadAxvhN9ubI3S9b3VWTFMqqJy8u8 /lb0ueyUfL8v28UlnC9sF4tvJ6x2JMuThvDi283d4zY881eJOVpPY3XRh2qlwa/vodmm 17Jw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=ZHzS0uVvI7cxsqBcwCfKRwiQ005F29NmrWlSW1qVX64=; b=rUVDiOnjVERJIF52oN3PFtAhrY8UYoZr3v9iYFp3Z1ssBGCrGZkwhvgHOybS53HCd3 +NnbpVFHknsvwr9f4PxupxrOI9WO/4pF/YOzKVqfrGn3lg4s0hNgSASg8zISMA4TuK1E Fs1iNcW2GE20vb37nU5FAoME7iVsYtCUkhcpBYTvZ05LjqQcOhOlojhuGklYRz3IdH3Z Z+7IriEhLfA4u2P7Pw0+frckIXy/292mDArViYklUo26njkezofWGu16k1wuxrVUp4Gn qUVCT15jziOXmVyCp5fcHY4Mtx7LJVAGSMauwHOWMqrAwBdbWaycXnoxY9fOXTbSWcm0 RIlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@chromium.org header.s=google header.b=REmZA9Xm; 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 a11-20020a170906368b00b0094f36230cb7si8868851ejc.785.2023.04.24.23.10.31; Mon, 24 Apr 2023 23:10: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; dkim=neutral (body hash did not verify) header.i=@chromium.org header.s=google header.b=REmZA9Xm; 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 8F96368BECF; Tue, 25 Apr 2023 09:10:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org 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-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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bU50yzOtQtx3 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"},