From a3887c477a7d2ce02d3432a4e9b0b5c907a7918f Mon Sep 17 00:00:00 2001
From: Mr-Z-2697 <[email protected]&gt;
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.
---
&nbsp;source/encoder/ratecontrol.cpp | 18 +++++++++---------
&nbsp;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 {
&nbsp; &nbsp; &nbsp;}\
&nbsp;}
&nbsp;
-inline int calcScale(uint32_t x)
+inline int calcScale(uint64_t x)
&nbsp;{
&nbsp; &nbsp; &nbsp;static uint8_t lut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 
0, 2, 0, 1, 0};
&nbsp; &nbsp; &nbsp;int y, z = (((x &amp; 0xffff) - 1) &gt;&gt; 27) &amp; 16;
@@ -407,8 +407,8 @@ void RateControl::initVBV(const SPS&amp; sps)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x265_log(m_param, X265_LOG_WARNING, "VBV 
buffer size cannot be smaller than one frame, using %d kbit\n",
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_param-&gt;rc.vbvBufferSize);
&nbsp; &nbsp; &nbsp;}
- &nbsp; &nbsp;int vbvBufferSize = m_param-&gt;rc.vbvBufferSize * 1000;
- &nbsp; &nbsp;int vbvMaxBitrate = m_param-&gt;rc.vbvMaxBitrate * 1000;
+ &nbsp; &nbsp;uint64_t vbvBufferSize = m_param-&gt;rc.vbvBufferSize * 1000ULL;
+ &nbsp; &nbsp;uint64_t vbvMaxBitrate = m_param-&gt;rc.vbvMaxBitrate * 1000ULL;
&nbsp;
&nbsp; &nbsp; &nbsp;if (m_param-&gt;bEmitHRDSEI &amp;&amp; 
!m_param-&gt;decoderVbvMaxRate)
&nbsp; &nbsp; &nbsp;{
@@ -843,8 +843,8 @@ void RateControl::reconfigureRC()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x265_log(m_param, 
X265_LOG_WARNING, "VBV buffer size cannot be smaller than one frame, using %d 
kbit\n",
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp;m_param-&gt;rc.vbvBufferSize);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
- &nbsp; &nbsp; &nbsp; &nbsp;int vbvBufferSize = m_param-&gt;rc.vbvBufferSize * 
1000;
- &nbsp; &nbsp; &nbsp; &nbsp;int vbvMaxBitrate = m_param-&gt;rc.vbvMaxBitrate * 
1000;
+ &nbsp; &nbsp; &nbsp; &nbsp;uint64_t vbvBufferSize = 
m_param-&gt;rc.vbvBufferSize * 1000ULL;
+ &nbsp; &nbsp; &nbsp; &nbsp;uint64_t vbvMaxBitrate = 
m_param-&gt;rc.vbvMaxBitrate * 1000ULL;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_bufferRate = vbvMaxBitrate / m_fps;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_vbvMaxRate = vbvMaxBitrate;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_bufferSize = vbvBufferSize;
@@ -889,8 +889,8 @@ void RateControl::reconfigureRC()
&nbsp;
&nbsp;void RateControl::initHRD(SPS&amp; sps)
&nbsp;{
- &nbsp; &nbsp;int vbvBufferSize = m_param-&gt;rc.vbvBufferSize * 1000;
- &nbsp; &nbsp;int vbvMaxBitrate = m_param-&gt;rc.vbvMaxBitrate * 1000;
+ &nbsp; &nbsp;uint64_t vbvBufferSize = m_param-&gt;rc.vbvBufferSize * 1000ULL;
+ &nbsp; &nbsp;uint64_t vbvMaxBitrate = m_param-&gt;rc.vbvMaxBitrate * 1000ULL;
&nbsp;
&nbsp; &nbsp; &nbsp;// Init HRD
&nbsp; &nbsp; &nbsp;HRDInfo* hrd = &amp;sps.vuiParameters.hrdParameters;
@@ -906,8 +906,8 @@ void RateControl::initHRD(SPS&amp; sps)
&nbsp;
&nbsp; &nbsp; &nbsp;hrd-&gt;cpbSizeScale = x265_clip3(0, 15, 
calcScale(vbvBufferSize) - CPB_SHIFT);
&nbsp; &nbsp; &nbsp;hrd-&gt;cpbSizeValue = (vbvBufferSize &gt;&gt; 
(hrd-&gt;cpbSizeScale + CPB_SHIFT));
- &nbsp; &nbsp;int bitRateUnscale = hrd-&gt;bitRateValue << 
(hrd-&gt;bitRateScale + BR_SHIFT);
- &nbsp; &nbsp;int cpbSizeUnscale = hrd-&gt;cpbSizeValue << 
(hrd-&gt;cpbSizeScale + CPB_SHIFT);
+ &nbsp; &nbsp;uint64_t bitRateUnscale = (uint64_t)hrd-&gt;bitRateValue << 
(hrd-&gt;bitRateScale + BR_SHIFT);
+ &nbsp; &nbsp;uint64_t cpbSizeUnscale = (uint64_t)hrd-&gt;cpbSizeValue << 
(hrd-&gt;cpbSizeScale + CPB_SHIFT);
&nbsp;
&nbsp; &nbsp; &nbsp;// arbitrary
&nbsp; &nbsp; &nbsp;#define MAX_DURATION 0.5
--
2.52.0

Attachment: 0001-Fix-internally-overflowed-VBV-variables.patch
Description: Binary data

_______________________________________________
x265-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to