[x265] [PATCH] Fix internally overflowed VBV variables
Richard
ccc7922 at foxmail.com
Thu Dec 18 19:59:50 UTC 2025
From a3887c477a7d2ce02d3432a4e9b0b5c907a7918f Mon Sep 17 00:00:00 2001
From: Mr-Z-2697 <74594146+Mr-Z-2697 at users.noreply.github.com>
Date: Fri, 19 Dec 2025 02:53:34 +0800
Subject: [PATCH] Fix internally overflowed VBV variables
New levels' VBV can overflow the int type after being multiplied by 1000.
---
source/encoder/ratecontrol.cpp | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp
index 6b8b384e4..a62fd77cd 100644
--- a/source/encoder/ratecontrol.cpp
+++ b/source/encoder/ratecontrol.cpp
@@ -71,7 +71,7 @@ namespace {
}\
}
-inline int calcScale(uint32_t x)
+inline int calcScale(uint64_t x)
{
static uint8_t lut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
int y, z = (((x & 0xffff) - 1) >> 27) & 16;
@@ -407,8 +407,8 @@ void RateControl::initVBV(const SPS& sps)
x265_log(m_param, X265_LOG_WARNING, "VBV buffer size cannot be smaller than one frame, using %d kbit\n",
m_param->rc.vbvBufferSize);
}
- int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
- int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
+ uint64_t vbvBufferSize = m_param->rc.vbvBufferSize * 1000ULL;
+ uint64_t vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000ULL;
if (m_param->bEmitHRDSEI && !m_param->decoderVbvMaxRate)
{
@@ -843,8 +843,8 @@ void RateControl::reconfigureRC()
x265_log(m_param, X265_LOG_WARNING, "VBV buffer size cannot be smaller than one frame, using %d kbit\n",
m_param->rc.vbvBufferSize);
}
- int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
- int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
+ uint64_t vbvBufferSize = m_param->rc.vbvBufferSize * 1000ULL;
+ uint64_t vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000ULL;
m_bufferRate = vbvMaxBitrate / m_fps;
m_vbvMaxRate = vbvMaxBitrate;
m_bufferSize = vbvBufferSize;
@@ -889,8 +889,8 @@ void RateControl::reconfigureRC()
void RateControl::initHRD(SPS& sps)
{
- int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
- int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
+ uint64_t vbvBufferSize = m_param->rc.vbvBufferSize * 1000ULL;
+ uint64_t vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000ULL;
// Init HRD
HRDInfo* hrd = &sps.vuiParameters.hrdParameters;
@@ -906,8 +906,8 @@ void RateControl::initHRD(SPS& sps)
hrd->cpbSizeScale = x265_clip3(0, 15, calcScale(vbvBufferSize) - CPB_SHIFT);
hrd->cpbSizeValue = (vbvBufferSize >> (hrd->cpbSizeScale + CPB_SHIFT));
- int bitRateUnscale = hrd->bitRateValue << (hrd->bitRateScale + BR_SHIFT);
- int cpbSizeUnscale = hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
+ uint64_t bitRateUnscale = (uint64_t)hrd->bitRateValue << (hrd->bitRateScale + BR_SHIFT);
+ uint64_t cpbSizeUnscale = (uint64_t)hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
// arbitrary
#define MAX_DURATION 0.5
--
2.52.0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20251219/c9386ba0/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fix-internally-overflowed-VBV-variables.patch
Type: application/octet-stream
Size: 3057 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20251219/c9386ba0/attachment-0001.obj>
More information about the x265-devel
mailing list