[x265] [PATCH] EARLY EXIT NO RDO OPTIMIZATION - replaced SATD predictions with RDO predictions
aarthi at multicorewareinc.com
aarthi at multicorewareinc.com
Wed Jul 31 14:23:41 CEST 2013
# HG changeset patch
# User sumalatha
# Date 1375273324 -19800
# Node ID 1510dd1fda4dada5d940cd1552f4b5b31585ff98
# Parent 66eab44e4c56d7f7841a417aa05b9b49a6192a5a
EARLY EXIT NO RDO OPTIMIZATION - replaced SATD predictions with RDO predictions
diff -r 66eab44e4c56 -r 1510dd1fda4d source/Lib/TLibCommon/CommonDef.h
--- a/source/Lib/TLibCommon/CommonDef.h Wed Jul 31 01:18:43 2013 -0500
+++ b/source/Lib/TLibCommon/CommonDef.h Wed Jul 31 17:52:04 2013 +0530
@@ -126,7 +126,7 @@
#define REG_DCT 65535
#define CABAC_INIT_PRESENT_FLAG 1
-#define LAMBDA_PARTITION_SELECT 0.6
+#define LAMBDA_PARTITION_SELECT 0.9
#define _SUMMARY_OUT_ 0 ///< print-out PSNR results of all slices to summary.txt
#define _SUMMARY_PIC_ 0 ///< print-out PSNR results for each slice type to summary.txt
diff -r 66eab44e4c56 -r 1510dd1fda4d source/encoder/compress.cpp
--- a/source/encoder/compress.cpp Wed Jul 31 01:18:43 2013 -0500
+++ b/source/encoder/compress.cpp Wed Jul 31 17:52:04 2013 +0530
@@ -286,15 +286,12 @@
Bool bTrySplitDQP = true;
Bool bBoundary = false;
UInt64 nxnCost = 0;
-#if EARLY_EXIT_NO_RDO
- UInt64 inter2Nx2NCost = 0;
-#endif
UInt lpelx = outTempCU->getCUPelX();
UInt rpelx = lpelx + outTempCU->getWidth(0) - 1;
UInt tpely = outTempCU->getCUPelY();
UInt bpely = tpely + outTempCU->getHeight(0) - 1;
TComDataCU* subTempPartCU, * subBestPartCU;
- Int qp = outTempCU->getQP(0);
+ Int qp = m_cfg->getUseRateCtrl() ? m_rateControl->getRCQP() : outTempCU->getQP(0);
// If slice start or slice end is within this cu...
TComSlice * slice = outTempCU->getPic()->getSlice();
@@ -332,6 +329,7 @@
/* Compute Merge Cost */
Bool earlyDetectionSkip = false;
+
xCheckRDCostMerge2Nx2N(m_bestMergeCU[depth], m_mergeCU[depth], &earlyDetectionSkip, m_modePredYuv[3][depth], m_bestMergeRecoYuv[depth]);
if (!earlyDetectionSkip)
@@ -354,9 +352,7 @@
m_bestPredYuvNxN[PartitionIndex][depth] = m_bestPredYuv[depth];
m_bestPredYuv[depth] = tempYuv;
}*/
-#if EARLY_EXIT_NO_RDO
- inter2Nx2NCost = outBestCU->m_totalCost;
-#endif
+
bTrySplitDQP = bTrySplit;
if ((Int)depth <= m_addSADDepth)
@@ -365,37 +361,9 @@
m_addSADDepth = depth;
}
-#if EARLY_EXIT_NO_RDO
- if (depth < g_maxCUDepth - g_addCUDepth)
- {
- outTempCU->initEstData(depth, qp);
- UChar nextDepth = (UChar)(depth + 1);
- /*Best CU initialised to NULL; */
- subBestPartCU = NULL;
- /*The temp structure is used for boundary analysis, and to copy Best SubCU mode data on return*/
- subTempPartCU;
- nxnCost = 0;
- for (UInt partUnitIdx = 0; partUnitIdx < 4; partUnitIdx++)
- {
- subTempPartCU = m_interCU_NxN[partUnitIdx][nextDepth];
- subTempPartCU->initSubCU(outTempCU, partUnitIdx, nextDepth, qp); // clear sub partition datas or init.
- TComPic* subPic = subTempPartCU->getPic();
- m_origYuv[nextDepth]->copyFromPicYuv(subPic->getPicYuvOrg(), subTempPartCU->getAddr(), subTempPartCU->getZorderIdxInCU());
- Bool bInSlice = subTempPartCU->getSCUAddr() < slice->getSliceCurEndCUAddr() ;
- if (bInSlice && (subTempPartCU->getCUPelX() < slice->getSPS()->getPicWidthInLumaSamples()) &&
- (subTempPartCU->getCUPelY() < slice->getSPS()->getPicHeightInLumaSamples()))
- {
- xComputeCostInter(subTempPartCU, m_bestPredYuvNxN[partUnitIdx][nextDepth], SIZE_2Nx2N, 0);
- nxnCost += subTempPartCU->m_totalCost;
- }
-
- }
- }
-#endif // if EARLY_EXIT_NO_RDO
- if (outBestCU->m_totalCost > nxnCost)
- {
+
/*Compute Rect costs*/
if (m_cfg->getUseRectInter())
{
@@ -419,7 +387,7 @@
m_modePredYuv[2][depth] = m_bestPredYuv[depth];
m_bestPredYuv[depth] = tempYuv;
}
- }
+
m_search->encodeResAndCalcRdInterCU(outBestCU, m_origYuv[depth], m_bestPredYuv[depth], m_tmpResiYuv[depth],
m_bestResiYuv[depth], m_bestRecoYuv[depth], false);
@@ -444,7 +412,7 @@
outBestCU->getCbf(0, TEXT_CHROMA_U) != 0 ||
outBestCU->getCbf(0, TEXT_CHROMA_V) != 0)
{
- xComputeCostIntraInInter(m_intraInInterCU[depth], SIZE_2Nx2N);
+ xComputeCostIntraInInter(m_intraInInterCU[depth], SIZE_2Nx2N);
xEncodeIntraInInter(m_intraInInterCU[depth], m_origYuv[depth], m_modePredYuv[5][depth], m_tmpResiYuv[depth], m_tmpRecoYuv[depth]);
if (m_intraInInterCU[depth]->m_totalCost < outBestCU->m_totalCost)
@@ -457,26 +425,12 @@
TComYuv* tmpPic = m_bestRecoYuv[depth];
m_bestRecoYuv[depth] = m_tmpRecoYuv[depth];
m_tmpRecoYuv[depth] = tmpPic;
+
}
}
// further split
-#if EARLY_EXIT_NO_RDO
- if (inter2Nx2NCost < nxnCost && depth < g_maxCUDepth - g_addCUDepth)
- {
- m_entropyCoder->resetBits();
- m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth, true);
- outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
- outBestCU->m_totalBins += ((TEncBinCABAC*)((TEncSbac*)m_entropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
- outBestCU->m_totalCost = m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
- /* Copy Best data to Picture for next partition prediction. */
- outBestCU->copyToPic((UChar)depth);
- /* Copy Yuv data to picture Yuv */
- xCopyYuv2Pic(outBestCU->getPic(), outBestCU->getAddr(), outBestCU->getZorderIdxInCU(), depth, depth, outBestCU, lpelx, tpely);
- return;
- }
-#endif // if EARLY_EXIT_NO_RDO
}
else
{
@@ -525,7 +479,70 @@
// further split
if (bSubBranch && bTrySplitDQP && depth < g_maxCUDepth - g_addCUDepth)
- {
+ {
+#if EARLY_EXIT_NO_RDO
+ if(outBestCU!=0 && depth >0)
+ {
+
+ outTempCU->initEstData(depth, qp);
+ UChar nextDepth = (UChar)(depth + 1);
+ /*Best CU initialised to NULL; */
+ subBestPartCU = NULL;
+ /*The temp structure is used for boundary analysis, and to copy Best SubCU mode data on return*/
+ subTempPartCU;
+ nxnCost = 0;
+ for (UInt partUnitIdx = 0; partUnitIdx < 4; partUnitIdx++)
+ {
+ subTempPartCU = m_interCU_NxN[partUnitIdx][nextDepth];
+ subTempPartCU->initSubCU(outTempCU, partUnitIdx, nextDepth, qp); // clear sub partition datas or init.
+ TComPic* subPic = subTempPartCU->getPic();
+ m_origYuv[nextDepth]->copyFromPicYuv(subPic->getPicYuvOrg(), subTempPartCU->getAddr(), subTempPartCU->getZorderIdxInCU());
+ TComSlice * pcSubSlice = subTempPartCU->getPic()->getSlice();
+ Bool subSliceEnd = subTempPartCU->getSCUAddr() < slice->getSliceCurEndCUAddr()
+ && pcSubSlice->getSliceCurEndCUAddr() < subTempPartCU->getSCUAddr() + subTempPartCU->getTotalNumPart();
+ if (!subSliceEnd && (subTempPartCU->getCUPelX() < slice->getSPS()->getPicWidthInLumaSamples()) &&
+ (subTempPartCU->getCUPelY() < slice->getSPS()->getPicHeightInLumaSamples()))
+ {
+ if(outBestCU->getPredictionMode(0)==0)
+ {
+
+ xComputeCostInter(subTempPartCU, m_bestPredYuvNxN[partUnitIdx][nextDepth],outBestCU->getPartitionSize(0), 0);
+ m_search->encodeResAndCalcRdInterCU(subTempPartCU, m_origYuv[nextDepth], m_bestPredYuvNxN[partUnitIdx][nextDepth], m_tmpResiYuv[nextDepth],
+ m_bestResiYuv[nextDepth], m_tmpRecoYuv[nextDepth], false);
+ nxnCost += subTempPartCU->m_totalCost;
+
+ }
+ else if(outBestCU->getPredictionMode(0)==1)
+ {
+
+ xComputeCostIntraInInter(subTempPartCU, SIZE_2Nx2N);
+ xEncodeIntraInInter(subTempPartCU, m_origYuv[nextDepth], m_modePredYuv[5][nextDepth], m_tmpResiYuv[nextDepth], m_tmpRecoYuv[nextDepth]);
+ nxnCost += subTempPartCU->m_totalCost;
+
+
+ }
+
+ }
+ }
+
+
+ if ( outBestCU->m_totalCost < LAMBDA_PARTITION_SELECT* nxnCost)
+ {
+ m_entropyCoder->resetBits();
+ m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth, true);
+ outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
+ outBestCU->m_totalBins += ((TEncBinCABAC*)((TEncSbac*)m_entropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
+ outBestCU->m_totalCost = m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
+ /* Copy Best data to Picture for next partition prediction. */
+ outBestCU->copyToPic((UChar)depth);
+
+ /* Copy Yuv data to picture Yuv */
+ xCopyYuv2Pic(outBestCU->getPic(), outBestCU->getAddr(), outBestCU->getZorderIdxInCU(), depth, depth, outBestCU, lpelx, tpely);
+ return;
+ }
+
+ }
+ #endif // if EARLY_EXIT_NO_RDO
outTempCU->initEstData(depth, qp);
UChar nextDepth = (UChar)(depth + 1);
subTempPartCU = m_tempCU[nextDepth];
More information about the x265-devel
mailing list