[x265] [PATCH] analysis: re-order RD 0/4 analysis to do splits before ME or intra
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Mon Apr 13 15:31:16 CEST 2015
# HG changeset patch
# User Ashok Kumar Mishra<ashok at multicorewareinc.com>
# Date 1428776857 -19800
# Sat Apr 11 23:57:37 2015 +0530
# Node ID 79f68b7eda3fb6ab2c25982c362159f9a07cb472
# Parent 4cccf22b00ee188a72c8dc3896d7dc1613d855ad
analysis: re-order RD 0/4 analysis to do splits before ME or intra
diff -r 4cccf22b00ee -r 79f68b7eda3f source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Fri Apr 10 18:15:38 2015 -0500
+++ b/source/encoder/analysis.cpp Sat Apr 11 23:57:37 2015 +0530
@@ -751,20 +751,71 @@
bool mightSplit = !(cuGeom.flags & CUGeom::LEAF);
bool mightNotSplit = !(cuGeom.flags & CUGeom::SPLIT_MANDATORY);
uint32_t minDepth = topSkipMinDepth(parentCTU, cuGeom);
-
+ bool earlyskip = false;
if (mightNotSplit && depth >= minDepth)
{
- bool bTryIntra = m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames;
-
/* Compute Merge Cost */
md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom);
md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom);
checkMerge2Nx2N_rd0_4(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
-
- bool earlyskip = false;
if (m_param->rdLevel)
earlyskip = m_param->bEnableEarlySkip && md.bestMode && md.bestMode->cu.isSkipped(0); // TODO: sa8d threshold per depth
+ }
+ bool bNoSplit = false;
+ if (md.bestMode)
+ {
+ bNoSplit = md.bestMode->cu.isSkipped(0);
+ if (mightSplit && depth && depth >= minDepth && !bNoSplit)
+ bNoSplit = recursionDepthCheck(parentCTU, cuGeom, *md.bestMode);
+ }
+ if (mightSplit && !bNoSplit)
+ {
+ Mode* splitPred = &md.pred[PRED_SPLIT];
+ splitPred->initCosts();
+ CUData* splitCU = &splitPred->cu;
+ splitCU->initSubCU(parentCTU, cuGeom);
+
+ uint32_t nextDepth = depth + 1;
+ ModeDepth& nd = m_modeDepth[nextDepth];
+ invalidateContexts(nextDepth);
+ Entropy* nextContext = &m_rqt[depth].cur;
+
+ for (uint32_t subPartIdx = 0; subPartIdx < 4; subPartIdx++)
+ {
+ const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);
+ if (childGeom.flags & CUGeom::PRESENT)
+ {
+ m_modeDepth[0].fencYuv.copyPartToYuv(nd.fencYuv, childGeom.absPartIdx);
+ m_rqt[nextDepth].cur.load(*nextContext);
+ compressInterCU_rd0_4(parentCTU, childGeom);
+
+ // Save best CU and pred data for this sub CU
+ splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);
+ splitPred->addSubCosts(*nd.bestMode);
+
+ if (m_param->rdLevel)
+ nd.bestMode->reconYuv.copyToPartYuv(splitPred->reconYuv, childGeom.numPartitions * subPartIdx);
+ else
+ nd.bestMode->predYuv.copyToPartYuv(splitPred->predYuv, childGeom.numPartitions * subPartIdx);
+ if (m_param->rdLevel > 1)
+ nextContext = &nd.bestMode->contexts;
+ }
+ else
+ splitCU->setEmptyPart(childGeom, subPartIdx);
+ }
+ nextContext->store(splitPred->contexts);
+
+ if (mightNotSplit)
+ addSplitFlagCost(*splitPred, cuGeom.depth);
+ else if (m_param->rdLevel > 1)
+ updateModeCost(*splitPred);
+ else
+ splitPred->sa8dCost = m_rdCost.calcRdSADCost(splitPred->distortion, splitPred->sa8dBits);
+ }
+
+ if (mightNotSplit && depth >= minDepth)
+ {
if (!earlyskip)
{
md.pred[PRED_2Nx2N].cu.initSubCU(parentCTU, cuGeom);
@@ -829,7 +880,7 @@
bestInter = &md.pred[PRED_nRx2N];
}
}
-
+ bool bTryIntra = m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames;
if (m_param->rdLevel >= 3)
{
/* Calculate RD cost of best inter option */
@@ -946,69 +997,7 @@
if (mightSplit)
addSplitFlagCost(*md.bestMode, cuGeom.depth);
}
-
- bool bNoSplit = false;
- if (md.bestMode)
- {
- bNoSplit = md.bestMode->cu.isSkipped(0);
- if (mightSplit && depth && depth >= minDepth && !bNoSplit)
- bNoSplit = recursionDepthCheck(parentCTU, cuGeom, *md.bestMode);
- }
-
- if (mightSplit && !bNoSplit)
- {
- Mode* splitPred = &md.pred[PRED_SPLIT];
- splitPred->initCosts();
- CUData* splitCU = &splitPred->cu;
- splitCU->initSubCU(parentCTU, cuGeom);
-
- uint32_t nextDepth = depth + 1;
- ModeDepth& nd = m_modeDepth[nextDepth];
- invalidateContexts(nextDepth);
- Entropy* nextContext = &m_rqt[depth].cur;
-
- for (uint32_t subPartIdx = 0; subPartIdx < 4; subPartIdx++)
- {
- const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);
- if (childGeom.flags & CUGeom::PRESENT)
- {
- m_modeDepth[0].fencYuv.copyPartToYuv(nd.fencYuv, childGeom.absPartIdx);
- m_rqt[nextDepth].cur.load(*nextContext);
- compressInterCU_rd0_4(parentCTU, childGeom);
-
- // Save best CU and pred data for this sub CU
- splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);
- splitPred->addSubCosts(*nd.bestMode);
-
- if (m_param->rdLevel)
- nd.bestMode->reconYuv.copyToPartYuv(splitPred->reconYuv, childGeom.numPartitions * subPartIdx);
- else
- nd.bestMode->predYuv.copyToPartYuv(splitPred->predYuv, childGeom.numPartitions * subPartIdx);
- if (m_param->rdLevel > 1)
- nextContext = &nd.bestMode->contexts;
- }
- else
- splitCU->setEmptyPart(childGeom, subPartIdx);
- }
- nextContext->store(splitPred->contexts);
-
- if (mightNotSplit)
- addSplitFlagCost(*splitPred, cuGeom.depth);
- else if (m_param->rdLevel > 1)
- updateModeCost(*splitPred);
- else
- splitPred->sa8dCost = m_rdCost.calcRdSADCost(splitPred->distortion, splitPred->sa8dBits);
-
- if (!md.bestMode)
- md.bestMode = splitPred;
- else if (m_param->rdLevel > 1)
- checkBestMode(*splitPred, cuGeom.depth);
- else if (splitPred->sa8dCost < md.bestMode->sa8dCost)
- md.bestMode = splitPred;
-
- checkDQPForSplitPred(md.bestMode->cu, cuGeom);
- }
- if (mightNotSplit)
+ if (mightNotSplit && md.bestMode)
{
/* early-out statistics */
FrameData& curEncData = *m_frame->m_encData;
@@ -1017,14 +1006,23 @@
cuStat.count[depth] += 1;
cuStat.avgCost[depth] = (temp + md.bestMode->rdCost) / cuStat.count[depth];
}
+ if (mightSplit && !bNoSplit)
+ {
+ Mode* splitPred = &md.pred[PRED_SPLIT];
+ if (!md.bestMode)
+ md.bestMode = splitPred;
+ else if (m_param->rdLevel > 1)
+ checkBestMode(*splitPred, cuGeom.depth);
+ else if (splitPred->sa8dCost < md.bestMode->sa8dCost)
+ md.bestMode = splitPred;
+ checkDQPForSplitPred(md.bestMode->cu, cuGeom);
+ }
/* Copy best data to encData CTU and recon */
X265_CHECK(md.bestMode->ok(), "best mode is not ok");
md.bestMode->cu.copyToPic(depth);
- if (md.bestMode != &md.pred[PRED_SPLIT] && m_param->rdLevel)
- md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, cuAddr, cuGeom.absPartIdx);
+ md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, cuAddr, cuGeom.absPartIdx);
}
-
void Analysis::compressInterCU_rd5_6(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t &zOrder)
{
uint32_t depth = cuGeom.depth;
More information about the x265-devel
mailing list