[x265] [PATCH] cuTree: integrated CuTree into RateControl and Added b-references into RC
Gopu Govindaswamy
gopu at multicorewareinc.com
Mon Dec 2 13:24:18 CET 2013
# HG changeset patch
# User Gopu Govindaswamy <gopu at multicorewareinc.com>
# Date 1385986798 -19800
# Node ID 8617e8ab6fafd5dea42e63f135f6df02761d5dd6
# Parent a0f2c87c5f0a27a2f7e6e96af675efc419988d6e
cuTree: integrated CuTree into RateControl and Added b-references into RC
diff -r a0f2c87c5f0a -r 8617e8ab6faf source/common/common.cpp
--- a/source/common/common.cpp Mon Dec 02 12:53:59 2013 +0530
+++ b/source/common/common.cpp Mon Dec 02 17:49:58 2013 +0530
@@ -398,6 +398,7 @@
{
//currently the default
param->rc.aqMode = X265_AQ_NONE;
+ param->rc.cuTree = 0;
}
else if (!strcmp(tune, "ssim"))
{
diff -r a0f2c87c5f0a -r 8617e8ab6faf source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Mon Dec 02 12:53:59 2013 +0530
+++ b/source/encoder/ratecontrol.cpp Mon Dec 02 17:49:58 2013 +0530
@@ -118,6 +118,7 @@
if (cfg->param.rc.aqMode)
{
pic->m_lowres.qpAqOffset[block_xy] = qp_adj;
+ pic->m_lowres.qpOffset[block_xy] = qp_adj;
pic->m_lowres.invQscaleFactor[block_xy] = x265_exp2fix8(qp_adj);
block_xy++;
}
@@ -141,6 +142,14 @@
this->cfg = _cfg;
ncu = (int)((cfg->param.sourceHeight * cfg->param.sourceWidth) / pow((int)16, 2.0));
+ if (cfg->param.rc.cuTree)
+ {
+ qCompress = 1;
+ cfg->param.rc.pbFactor = 1;
+ }
+ else
+ qCompress = cfg->param.rc.qCompress;
+
// validate for cfg->param.rc, maybe it is need to add a function like x265_parameters_valiate()
cfg->param.rc.rfConstant = Clip3((double)-QP_BD_OFFSET, (double)51, cfg->param.rc.rfConstant);
if (cfg->param.rc.rateControlMode == X265_RC_CRF)
@@ -149,8 +158,8 @@
cfg->param.rc.bitrate = 0;
double baseCplx = ncu * (cfg->param.bframes ? 120 : 80);
- double mbtree_offset = 0; // added later
- rateFactorConstant = pow(baseCplx, 1 - cfg->param.rc.qCompress) /
+ double mbtree_offset = cfg->param.rc.cuTree ? (1.0 - cfg->param.rc.qCompress) * 13.5 : 0;
+ rateFactorConstant = pow(baseCplx, 1 - qCompress) /
qp2qScale(cfg->param.rc.rfConstant + mbtree_offset + QP_BD_OFFSET);
}
@@ -248,7 +257,7 @@
accumPNorm = .01;
accumPQp = (ABR_INIT_QP_MIN)*accumPNorm;
/* estimated ratio that produces a reasonable QP for the first I-frame */
- cplxrSum = .01 * pow(7.0e5, cfg->param.rc.qCompress) * pow(ncu, 0.5);
+ cplxrSum = .01 * pow(7.0e5, qCompress) * pow(ncu, 0.5);
wantedBitsWindow = bitrate * frameDuration;
}
else if (cfg->param.rc.rateControlMode == X265_RC_CRF)
@@ -257,7 +266,7 @@
accumPNorm = .01;
accumPQp = ABR_INIT_QP * accumPNorm;
/* estimated ratio that produces a reasonable QP for the first I-frame */
- cplxrSum = .01 * pow(7.0e5, cfg->param.rc.qCompress) * pow(ncu, 0.5);
+ cplxrSum = .01 * pow(7.0e5, qCompress) * pow(ncu, 0.5);
wantedBitsWindow = bitrate * frameDuration;
}
@@ -351,9 +360,9 @@
double q0 = prevRefSlice->getSliceQp();
double q1 = nextRefSlice->getSliceQp();
- if (prevRefSlice->getSliceType() == B_SLICE && prevRefSlice->isReferenced())
+ if (prevRefSlice->getSliceType() == X265_TYPE_BREF && prevRefSlice->isReferenced())
q0 -= pbOffset / 2;
- if (nextRefSlice->getSliceType() == B_SLICE && nextRefSlice->isReferenced())
+ if (nextRefSlice->getSliceType() == X265_TYPE_BREF && nextRefSlice->isReferenced())
q1 -= pbOffset / 2;
if (i0 && i1)
q = (q0 + q1) / 2 + ipOffset;
@@ -453,7 +462,7 @@
q = Clip3(lqmin, lqmax, q);
}
}
- else if (cfg->param.rc.rateControlMode == X265_RC_CRF && cfg->param.rc.qCompress != 1)
+ else if (cfg->param.rc.rateControlMode == X265_RC_CRF && qCompress != 1)
{
q = qp2qScale(ABR_INIT_QP) / fabs(cfg->param.rc.ipFactor);
}
@@ -565,7 +574,15 @@
{
double q;
- q = pow(rce->blurredComplexity, 1 - cfg->param.rc.qCompress);
+ if (cfg->param.rc.cuTree)
+ {
+ double scale = curSlice->getSPS()->getVuiParameters()->getTimingInfo()->getTimeScale();
+ double units = curSlice->getSPS()->getVuiParameters()->getTimingInfo()->getNumUnitsInTick();
+ double timescale = units / scale;
+ q = pow(BASE_FRAME_DURATION / CLIP_DURATION(2 * timescale), 1 - cfg->param.rc.qCompress);
+ }
+ else
+ q = pow(rce->blurredComplexity, 1 - cfg->param.rc.qCompress);
// avoid NaN's in the rc_eq
if (rce->texBits + rce->mvBits == 0)
diff -r a0f2c87c5f0a -r 8617e8ab6faf source/encoder/ratecontrol.h
--- a/source/encoder/ratecontrol.h Mon Dec 02 12:53:59 2013 +0530
+++ b/source/encoder/ratecontrol.h Mon Dec 02 17:49:58 2013 +0530
@@ -115,6 +115,7 @@
int64_t totalBits; /* totalbits used for already encoded frames */
double lastRceq;
int framesDone; /* framesDone keeps track of # of frames passed through RateCotrol already */
+ double qCompress;
RateControl(TEncCfg * _cfg);
// to be called for each frame to process RateControl and set QP
diff -r a0f2c87c5f0a -r 8617e8ab6faf source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Mon Dec 02 12:53:59 2013 +0530
+++ b/source/encoder/slicetype.cpp Mon Dec 02 17:49:58 2013 +0530
@@ -1366,7 +1366,7 @@
}
cuTreeFinish(Frames[lastnonb], averageDuration, lastnonb);
- if (cfg->param.bBPyramid && bframes > 1 /* && !h->param.rc.i_vbv_buffer_size */)
+ if (cfg->param.bBPyramid && bframes > 1 && !cfg->param.rc.vbvBufferSize)
cuTreeFinish(Frames[lastnonb + (bframes + 1) / 2], averageDuration, 0);
}
@@ -1464,7 +1464,7 @@
}
}
- if(/*h->param.rc.i_vbv_buffer_size &&*/ cfg->param.logLevel && referenced)
+ if(cfg->param.rc.vbvBufferSize && cfg->param.logLevel && referenced)
cuTreeFinish(Frames[b], averageDuration, b == p1 ? b - p0 : 0);
}
@@ -1481,7 +1481,8 @@
* concepts are very similar. */
int cuCount = widthInCU * heightInCU;
- double strength = 5.0f * (1.0f - cfg->param.rc.qCompress);
+ double strength = 5.0 * (1.0 - cfg->param.rc.qCompress);
+
for (int cuIndex = 0; cuIndex < cuCount; cuIndex++)
{
int intracost = (Frame->intraCost[cuIndex] * Frame->invQscaleFactor[cuIndex] + 128) >> 8;
More information about the x265-devel
mailing list