# HG changeset patch # User Sumalatha Polureddy # Date 1385639857 -19800 # Node ID bebef81f10563d404ddb03ce0d7f53dae2013664 # Parent 2ba6c26c9febdc8c57d3014c0cf98d4897d3992d no-rdo: made TOPSKIP Macro as CLI option
--topskip will enable topskip --no-topskip will disable topskip diff -r 2ba6c26c9feb -r bebef81f1056 source/common/common.cpp --- a/source/common/common.cpp Thu Nov 28 15:04:04 2013 +0530 +++ b/source/common/common.cpp Thu Nov 28 17:27:37 2013 +0530 @@ -647,6 +647,7 @@ TOOLOPT(param->bEnableCbfFastMode, "cfm"); TOOLOPT(param->bEnableConstrainedIntra, "cip"); TOOLOPT(param->bEnableEarlySkip, "esd"); + TOOLOPT(param->bEnableTopSkip, "topskip"); fprintf(stderr, "rd=%d ", param->rdLevel); TOOLOPT(param->bEnableLoopFilter, "lft"); @@ -722,6 +723,7 @@ OPT("amp") p->bEnableAMP = bvalue; OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value); OPT("early-skip") p->bEnableEarlySkip = bvalue; + OPT("topskip") p->bEnableTopSkip = bvalue; OPT("fast-cbf") p->bEnableCbfFastMode = bvalue; OPT("rdpenalty") p->rdPenalty = atoi(value); OPT("tskip") p->bEnableTransformSkip = bvalue; @@ -800,6 +802,7 @@ BOOL(p->bEnableAMP, "amp"); s += sprintf(s, " max-merge=%d", p->maxNumMergeCand); BOOL(p->bEnableEarlySkip, "early-skip"); + BOOL(p->bEnableTopSkip, "topskip"); BOOL(p->bEnableCbfFastMode, "fast-cbf"); s += sprintf(s, " rdpenalty=%d", p->rdPenalty); BOOL(p->bEnableTransformSkip, "tskip"); diff -r 2ba6c26c9feb -r bebef81f1056 source/encoder/compress.cpp --- a/source/encoder/compress.cpp Thu Nov 28 15:04:04 2013 +0530 +++ b/source/encoder/compress.cpp Thu Nov 28 17:27:37 2013 +0530 @@ -27,7 +27,6 @@ /* Lambda Partition Select adjusts the threshold value for Early Exit in No-RDO flow */ #define LAMBDA_PARTITION_SELECT 0.9 #define EARLY_EXIT 1 -#define TOPSKIP 1 using namespace x265; @@ -345,51 +344,50 @@ // We need to split, so don't try these modes. TComYuv* tempYuv = NULL; -#if TOPSKIP - TComDataCU* colocated0 = outTempCU->getCUColocated(REF_PIC_LIST_0); - TComDataCU* colocated1 = outTempCU->getCUColocated(REF_PIC_LIST_1); - char currentQP = outTempCU->getQP(0); - char previousQP = colocated0->getQP(0); - UChar delta = 0, minDepth0 = 4, minDepth1 = 4; - if (depth == 0) + if (m_cfg->param.bEnableTopSkip) { - double sum0 = 0; - double sum1 = 0; - double avgDepth0 = 0; - double avgDepth1 = 0; - double avgDepth = 0; - for (uint32_t i = 0; i < outTempCU->getTotalNumPart(); i = i + 4) + TComDataCU* colocated0 = outTempCU->getCUColocated(REF_PIC_LIST_0); + TComDataCU* colocated1 = outTempCU->getCUColocated(REF_PIC_LIST_1); + char currentQP = outTempCU->getQP(0); + char previousQP = colocated0->getQP(0); + UChar delta = 0, minDepth0 = 4, minDepth1 = 4; + if (depth == 0) { - if (colocated0 && colocated0->getDepth(i) < minDepth0) - minDepth0 = colocated0->getDepth(i); - if (colocated1 && colocated1->getDepth(i) < minDepth1) - minDepth1 = colocated1->getDepth(i); - if (colocated0) - sum0 += (colocated0->getDepth(i) * 4); - if (colocated1) - sum1 += (colocated1->getDepth(i) * 4); + double sum0 = 0; + double sum1 = 0; + double avgDepth0 = 0; + double avgDepth1 = 0; + double avgDepth = 0; + for (uint32_t i = 0; i < outTempCU->getTotalNumPart(); i = i + 4) + { + if (colocated0 && colocated0->getDepth(i) < minDepth0) + minDepth0 = colocated0->getDepth(i); + if (colocated1 && colocated1->getDepth(i) < minDepth1) + minDepth1 = colocated1->getDepth(i); + if (colocated0) + sum0 += (colocated0->getDepth(i) * 4); + if (colocated1) + sum1 += (colocated1->getDepth(i) * 4); + } + + avgDepth0 = sum0 / outTempCU->getTotalNumPart(); + avgDepth1 = sum1 / outTempCU->getTotalNumPart(); + avgDepth = (avgDepth0 + avgDepth1) / 2; + + if (minDepth1 < minDepth0) + minDepth = minDepth1; + else + minDepth = minDepth0; + + if (((currentQP - previousQP) < 0) || (((currentQP - previousQP) >= 0) && ((avgDepth - minDepth) > 0.5))) + delta = 0; + else + delta = 1; + if (minDepth > 0) + minDepth = minDepth - delta; } - - avgDepth0 = sum0 / outTempCU->getTotalNumPart(); - avgDepth1 = sum1 / outTempCU->getTotalNumPart(); - avgDepth = (avgDepth0 + avgDepth1) / 2; - - if (minDepth1 < minDepth0) - minDepth = minDepth1; - else - minDepth = minDepth0; - - if (((currentQP - previousQP) < 0) || (((currentQP - previousQP) >= 0) && ((avgDepth - minDepth) > 0.5))) - delta = 0; - else - delta = 1; - if (minDepth > 0) - minDepth = minDepth - delta; - } -#endif // if TOPSKIP -#if TOPSKIP - if (!(depth < minDepth)) //topskip -#endif + } // if TOPSKIP + if (!m_cfg->param.bEnableTopSkip || (m_cfg->param.bEnableTopSkip && (!(depth < minDepth)))) { m_log->cntTotalCu[depth]++; if (!bSliceEnd && bInsidePicture) @@ -544,6 +542,7 @@ m_addSADDepth++; } } + #if CU_STAT_LOGFILE if (outBestCU) { @@ -559,63 +558,62 @@ #if EARLY_EXIT // turn ON this to enable early exit // early exit when the RD cost of best mode at depth n is less than the sum of avgerage of RD cost of the neighbour // CU's(above, aboveleft, aboveright, left, colocated) and avg cost of that CU at depth "n" with weightage for each quantity -#if TOPSKIP - if (outBestCU != 0 && !(depth < minDepth)) //topskip -#else - if (outBestCU != 0) -#endif + if (!m_cfg->param.bEnableTopSkip || (m_cfg->param.bEnableTopSkip &&(!(depth < minDepth)) )) { - uint64_t totalCostNeigh = 0, totalCostCU = 0, totalCountCU = 0; - double avgCost = 0; - uint64_t totalCountNeigh = 0; - TComDataCU* above = outTempCU->getCUAbove(); - TComDataCU* aboveLeft = outTempCU->getCUAboveLeft(); - TComDataCU* aboveRight = outTempCU->getCUAboveRight(); - TComDataCU* left = outTempCU->getCULeft(); - TComDataCU* rootCU = outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr()); + if (outBestCU != 0) + { + uint64_t totalCostNeigh = 0, totalCostCU = 0, totalCountCU = 0; + double avgCost = 0; + uint64_t totalCountNeigh = 0; + TComDataCU* above = outTempCU->getCUAbove(); + TComDataCU* aboveLeft = outTempCU->getCUAboveLeft(); + TComDataCU* aboveRight = outTempCU->getCUAboveRight(); + TComDataCU* left = outTempCU->getCULeft(); + TComDataCU* rootCU = outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr()); - totalCostCU += rootCU->m_avgCost[depth] * rootCU->m_count[depth]; - totalCountCU += rootCU->m_count[depth]; - if (above) - { - totalCostNeigh += above->m_avgCost[depth] * above->m_count[depth]; - totalCountNeigh += above->m_count[depth]; - } - if (aboveLeft) - { - totalCostNeigh += aboveLeft->m_avgCost[depth] * aboveLeft->m_count[depth]; - totalCountNeigh += aboveLeft->m_count[depth]; - } - if (aboveRight) - { - totalCostNeigh += aboveRight->m_avgCost[depth] * aboveRight->m_count[depth]; - totalCountNeigh += aboveRight->m_count[depth]; - } - if (left) - { - totalCostNeigh += left->m_avgCost[depth] * left->m_count[depth]; - totalCountNeigh += left->m_count[depth]; - } + totalCostCU += rootCU->m_avgCost[depth] * rootCU->m_count[depth]; + totalCountCU += rootCU->m_count[depth]; + if (above) + { + totalCostNeigh += above->m_avgCost[depth] * above->m_count[depth]; + totalCountNeigh += above->m_count[depth]; + } + if (aboveLeft) + { + totalCostNeigh += aboveLeft->m_avgCost[depth] * aboveLeft->m_count[depth]; + totalCountNeigh += aboveLeft->m_count[depth]; + } + if (aboveRight) + { + totalCostNeigh += aboveRight->m_avgCost[depth] * aboveRight->m_count[depth]; + totalCountNeigh += aboveRight->m_count[depth]; + } + if (left) + { + totalCostNeigh += left->m_avgCost[depth] * left->m_count[depth]; + totalCountNeigh += left->m_count[depth]; + } - //giving 60% weight to all CU's and 40% weight to neighbour CU's - if (totalCountNeigh + totalCountCU) - avgCost = ((0.6 * totalCostCU) + (0.4 * totalCostNeigh)) / ((0.6 * totalCountCU) + (0.4 * totalCountNeigh)); + //giving 60% weight to all CU's and 40% weight to neighbour CU's + if (totalCountNeigh + totalCountCU) + avgCost = ((0.6 * totalCostCU) + (0.4 * totalCostNeigh)) / ((0.6 * totalCountCU) + (0.4 * totalCountNeigh)); - float lambda = 1.0f; + float lambda = 1.0f; - if (outBestCU->m_totalCost < lambda * avgCost && avgCost != 0 && depth != 0) - { - m_entropyCoder->resetBits(); - m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth, true); - outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits - 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); + if (outBestCU->m_totalCost < lambda * avgCost && avgCost != 0 && depth != 0) + { + m_entropyCoder->resetBits(); + m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth, true); + outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits + 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); - m_log->cntTotalCu[depth]--; - return; + /* Copy Yuv data to picture Yuv */ + xCopyYuv2Pic(outBestCU->getPic(), outBestCU->getAddr(), outBestCU->getZorderIdxInCU(), depth, depth, outBestCU, lpelx, tpely); + m_log->cntTotalCu[depth]--; + return; + } } } #endif // if EARLY_EXIT diff -r 2ba6c26c9feb -r bebef81f1056 source/x265.cpp --- a/source/x265.cpp Thu Nov 28 15:04:04 2013 +0530 +++ b/source/x265.cpp Thu Nov 28 17:27:37 2013 +0530 @@ -102,6 +102,8 @@ { "amp", no_argument, NULL, 0 }, { "no-early-skip", no_argument, NULL, 0 }, { "early-skip", no_argument, NULL, 0 }, + { "no-topskip", no_argument, NULL, 0 }, + { "topskip", no_argument, NULL, 0 }, { "no-fast-cbf", no_argument, NULL, 0 }, { "fast-cbf", no_argument, NULL, 0 }, { "no-tskip", no_argument, NULL, 0 }, @@ -291,6 +293,7 @@ H0(" --[no-]amp Enable asymmetric motion partitions, requires --rect. Default %s\n", OPT(param->bEnableAMP)); H0(" --max-merge Maximum number of merge candidates. Default %d\n", param->maxNumMergeCand); H0(" --[no-]early-skip Enable early SKIP detection. Default %s\n", OPT(param->bEnableEarlySkip)); + H0(" --[no-]topskip Enable TOP SKIP detection. Default %s\n", OPT(param->bEnableTopSkip)); H0(" --[no-]fast-cbf Enable Cbf fast mode. Default %s\n", OPT(param->bEnableCbfFastMode)); H0("\nSpatial / intra options:\n"); H0(" --rdpenalty penalty for 32x32 intra TU in non-I slices. 0:disabled 1:RD-penalty 2:maximum. Default %d\n", param->rdPenalty); diff -r 2ba6c26c9feb -r bebef81f1056 source/x265.h --- a/source/x265.h Thu Nov 28 15:04:04 2013 +0530 +++ b/source/x265.h Thu Nov 28 17:27:37 2013 +0530 @@ -496,6 +496,12 @@ * skip blocks. Default is disabled */ int bEnableEarlySkip; + /* Enable top skip decisions (set the starting depth from which the + * partitioning should happen for particular CU. The starting depth for + * particular CU in present frame is selected form the previous frame's + * colocated CU minimum depth*/ + int bEnableTopSkip; + /* Apply an optional penalty to the estimated cost of 32x32 intra blocks in * non-intra slices. 0 is disabled, 1 enables a small penalty, and 2 enables * a full penalty. This favors inter-coding and its low bitrate over _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel