[x265] [PATCH] intra: skip RD analysis when sum of sub CU split cost bigger than non-split cost
Ximing Cheng
chengximing1989 at foxmail.com
Fri Jul 14 19:07:30 CEST 2017
# HG changeset patch
# User Ximing Cheng <ximingcheng at tencent.com>
# Date 1500052036 -28800
# Sat Jul 15 01:07:16 2017 +0800
# Node ID 9c2e9f6c6ee73e75b94c2e52f85a64bca628baf0
# Parent 3f6841d271e36dc324936f09846d1f2cb77c63e5
intra: skip RD analysis when sum of sub CU split cost bigger than non-split cost
This patch will speed up all intra case with almost no BDRATE loss
diff -r 3f6841d271e3 -r 9c2e9f6c6ee7 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Wed Jun 28 10:44:19 2017 +0530
+++ b/source/encoder/analysis.cpp Sat Jul 15 01:07:16 2017 +0800
@@ -485,7 +485,7 @@
md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, parentCTU.m_cuAddr, cuGeom.absPartIdx);
}
-void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)
+uint64_t Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)
{
uint32_t depth = cuGeom.depth;
ModeDepth& md = m_modeDepth[depth];
@@ -561,6 +561,9 @@
Entropy* nextContext = &m_rqt[depth].cur;
int32_t nextQP = qp;
+ uint64_t curCost = 0;
+ int skipSplitCheck = 0;
+
for (uint32_t subPartIdx = 0; subPartIdx < 4; subPartIdx++)
{
const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);
@@ -572,7 +575,12 @@
if (m_slice->m_pps->bUseDQP && nextDepth <= m_slice->m_pps->maxCuDQPDepth)
nextQP = setLambdaFromQP(parentCTU, calculateQpforCuSize(parentCTU, childGeom));
- compressIntraCU(parentCTU, childGeom, nextQP);
+ curCost += compressIntraCU(parentCTU, childGeom, nextQP);
+ if (m_modeDepth[depth].bestMode && curCost > m_modeDepth[depth].bestMode->rdCost)
+ {
+ skipSplitCheck = 1;
+ break;
+ }
// Save best CU and pred data for this sub CU
splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);
@@ -590,14 +598,18 @@
memset(parentCTU.m_cuDepth + childGeom.absPartIdx, 0, childGeom.numPartitions);
}
}
- nextContext->store(splitPred->contexts);
- if (mightNotSplit)
- addSplitFlagCost(*splitPred, cuGeom.depth);
- else
- updateModeCost(*splitPred);
-
- checkDQPForSplitPred(*splitPred, cuGeom);
- checkBestMode(*splitPred, depth);
+
+ if (!skipSplitCheck)
+ {
+ nextContext->store(splitPred->contexts);
+ if (mightNotSplit)
+ addSplitFlagCost(*splitPred, cuGeom.depth);
+ else
+ updateModeCost(*splitPred);
+
+ checkDQPForSplitPred(*splitPred, cuGeom);
+ checkBestMode(*splitPred, depth);
+ }
}
if (m_param->bEnableRdRefine && depth <= m_slice->m_pps->maxCuDQPDepth)
@@ -620,6 +632,8 @@
md.bestMode->cu.copyToPic(depth);
if (md.bestMode != &md.pred[PRED_SPLIT])
md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, parentCTU.m_cuAddr, cuGeom.absPartIdx);
+
+ return md.bestMode->rdCost;
}
void Analysis::PMODE::processTasks(int workerThreadId)
diff -r 3f6841d271e3 -r 9c2e9f6c6ee7 source/encoder/analysis.h
--- a/source/encoder/analysis.h Wed Jun 28 10:44:19 2017 +0530
+++ b/source/encoder/analysis.h Sat Jul 15 01:07:16 2017 +0800
@@ -145,7 +145,7 @@
void qprdRefine(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp, int32_t lqp);
/* full analysis for an I-slice CU */
- void compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);
+ uint64_t compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);
/* full analysis for a P or B slice CU */
uint32_t compressInterCU_dist(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);
More information about the x265-devel
mailing list