[x265] [PATCH] fix analysis save/load bug in limitTU
bhavna at multicorewareinc.com
bhavna at multicorewareinc.com
Fri Dec 9 14:17:51 CET 2016
# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1481260512 -19800
# Fri Dec 09 10:45:12 2016 +0530
# Node ID b7a07ba5be2551b9f130e805b51eca4f2403264a
# Parent c97c64ab8b8eaea8b1de611adc9022815d88b09b
fix analysis save/load bug in limitTU
diff -r c97c64ab8b8e -r b7a07ba5be25 doc/reST/cli.rst
--- a/doc/reST/cli.rst Thu May 26 17:49:25 2016 +0530
+++ b/doc/reST/cli.rst Fri Dec 09 10:45:12 2016 +0530
@@ -874,10 +874,13 @@
Enables early exit from TU depth recursion, for inter coded blocks.
Level 1 - decides to recurse to next higher depth based on cost
comparison of full size TU and split TU.
+
Level 2 - based on first split subTU's depth, limits recursion of
other split subTUs.
+
Level 3 - based on the average depth of the co-located and the neighbor
CUs' TU depth, limits recursion of the current CU.
+
Level 4 - uses the depth of the neighbouring/ co-located CUs TU depth
to limit the 1st subTU depth. The 1st subTU depth is taken as the
limiting depth for the other subTUs.
diff -r c97c64ab8b8e -r b7a07ba5be25 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Thu May 26 17:49:25 2016 +0530
+++ b/source/encoder/analysis.cpp Fri Dec 09 10:45:12 2016 +0530
@@ -377,15 +377,6 @@
checkBestMode(md.pred[PRED_INTRA_NxN], depth);
}
- if ((m_limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
- {
- CUData* ctu = md.bestMode->cu.m_encData->getPicCTU(parentCTU.m_cuAddr);
- int8_t maxTUDepth = -1;
- for (uint32_t i = 0; i < cuGeom.numPartitions; i++)
- maxTUDepth = X265_MAX(maxTUDepth, md.bestMode->cu.m_tuDepth[i]);
- ctu->m_refTuDepth[cuGeom.geomRecurId] = maxTUDepth;
- }
-
if (m_bTryLossless)
tryLossless(cuGeom);
@@ -454,6 +445,16 @@
cacheCost[cuIdx] = md.bestMode->rdCost;
}
+ /* Save Intra CUs TU depth only when analysis mode is OFF */
+ if ((m_limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4 && !m_param->analysisMode)
+ {
+ CUData* ctu = md.bestMode->cu.m_encData->getPicCTU(parentCTU.m_cuAddr);
+ int8_t maxTUDepth = -1;
+ for (uint32_t i = 0; i < cuGeom.numPartitions; i++)
+ maxTUDepth = X265_MAX(maxTUDepth, md.pred[PRED_INTRA].cu.m_tuDepth[i]);
+ ctu->m_refTuDepth[cuGeom.geomRecurId] = maxTUDepth;
+ }
+
/* Copy best data to encData CTU and recon */
md.bestMode->cu.copyToPic(depth);
if (md.bestMode != &md.pred[PRED_SPLIT])
diff -r c97c64ab8b8e -r b7a07ba5be25 source/encoder/search.cpp
--- a/source/encoder/search.cpp Thu May 26 17:49:25 2016 +0530
+++ b/source/encoder/search.cpp Fri Dec 09 10:45:12 2016 +0530
@@ -2645,12 +2645,6 @@
uint32_t tuDepthRange[2];
cu.getInterTUQtDepthRange(tuDepthRange, 0);
- if (m_limitTU & X265_TU_LIMIT_NEIGH)
- {
- int32_t maxLog2CUSize = g_log2Size[m_param->maxCUSize];
- m_maxTUDepth = x265_clip3(maxLog2CUSize - (int32_t)tuDepthRange[1], maxLog2CUSize - (int32_t)tuDepthRange[0], m_maxTUDepth);
- }
-
m_entropyCoder.load(m_rqt[depth].cur);
if ((m_limitTU & X265_TU_LIMIT_DFS) && !(m_limitTU & X265_TU_LIMIT_NEIGH))
@@ -2659,9 +2653,18 @@
memset(&m_cacheTU, 0, sizeof(TUInfoCache));
Cost costs;
- if ((m_limitTU & X265_TU_LIMIT_DFS) && (m_limitTU & X265_TU_LIMIT_NEIGH))
+ if (m_limitTU & X265_TU_LIMIT_NEIGH)
{
+ /* Save and reload maxTUDepth to avoid changing of maxTUDepth between modes */
int32_t tempDepth = m_maxTUDepth;
+ if (m_maxTUDepth != -1)
+ {
+ uint32_t splitFlag = interMode.cu.m_partSize[0] != SIZE_2Nx2N;
+ uint32_t minSize = tuDepthRange[0];
+ uint32_t maxSize = tuDepthRange[1];
+ maxSize = X265_MIN(maxSize, cuGeom.log2CUSize - splitFlag);
+ m_maxTUDepth = x265_clip3(cuGeom.log2CUSize - maxSize, cuGeom.log2CUSize - minSize, (uint32_t)m_maxTUDepth);
+ }
estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs, tuDepthRange);
m_maxTUDepth = tempDepth;
}
diff -r c97c64ab8b8e -r b7a07ba5be25 source/test/smoke-tests.txt
--- a/source/test/smoke-tests.txt Thu May 26 17:49:25 2016 +0530
+++ b/source/test/smoke-tests.txt Fri Dec 09 10:45:12 2016 +0530
@@ -15,7 +15,7 @@
RaceHorses_416x240_30_10bit.yuv,--preset=veryfast --max-tu-size 8
RaceHorses_416x240_30_10bit.yuv,--preset=slower --bitrate 500 -F4 --rdoq-level 1
CrowdRun_1920x1080_50_10bit_444.yuv,--preset=ultrafast --constrained-intra --min-keyint 5 --keyint 10
-CrowdRun_1920x1080_50_10bit_444.yuv,--preset=medium --max-tu-size 16
+CrowdRun_1920x1080_50_10bit_444.yuv,--preset=medium --max-tu-size 16 --tu-inter-depth 2 --limit-tu 3
DucksAndLegs_1920x1080_60_10bit_422.yuv,--preset=veryfast --min-cu 16
DucksAndLegs_1920x1080_60_10bit_422.yuv,--preset=fast --weightb --interlace bff
DucksAndLegs_1920x1080_60_10bit_422.yuv,--preset=veryslow --limit-ref 1 --limit-mode --tskip --limit-tu 1
diff -r c97c64ab8b8e -r b7a07ba5be25 source/x265cli.h
--- a/source/x265cli.h Thu May 26 17:49:25 2016 +0530
+++ b/source/x265cli.h Fri Dec 09 10:45:12 2016 +0530
@@ -327,7 +327,7 @@
H0(" --max-tu-size <32|16|8|4> Maximum TU size (WxH). Default %d\n", param->maxTUSize);
H0(" --tu-intra-depth <integer> Max TU recursive depth for intra CUs. Default %d\n", param->tuQTMaxIntraDepth);
H0(" --tu-inter-depth <integer> Max TU recursive depth for inter CUs. Default %d\n", param->tuQTMaxInterDepth);
- H0(" --limit-tu <integer> Enable early exit from TU recursion for inter coded blocks. Default %d\n", param->limitTU);
+ H0(" --limit-tu <0..4> Enable early exit from TU recursion for inter coded blocks. Default %d\n", param->limitTU);
H0("\nAnalysis:\n");
H0(" --rd <1..6> Level of RDO in mode decision 1:least....6:full RDO. Default %d\n", param->rdLevel);
H0(" --[no-]psy-rd <0..5.0> Strength of psycho-visual rate distortion optimization, 0 to disable. Default %.1f\n", param->psyRd);
More information about the x265-devel
mailing list