[x265] [PATCH 4 of 5] Force modes or qp based on the CTUInfo recieved through API
vignesh at multicorewareinc.com
vignesh at multicorewareinc.com
Tue May 9 10:44:15 CEST 2017
# HG changeset patch
# User Vignesh Vijayakumar
# Date 1491894877 -19800
# Tue Apr 11 12:44:37 2017 +0530
# Node ID 1b538bbc0021244c55565f5095bf8a4289638e79
# Parent 7fd517f9bbe78a0eba180a42d97bef1970af294a
Force modes or qp based on the CTUInfo recieved through API
diff -r 7fd517f9bbe7 -r 1b538bbc0021 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Tue Apr 11 12:40:20 2017 +0530
+++ b/source/encoder/analysis.cpp Tue Apr 11 12:44:37 2017 +0530
@@ -1091,13 +1091,38 @@
else if (mightNotSplit && bDecidedDepth)
{
if (m_additionalCtuInfo[cuGeom.absPartIdx])
+ {
bCtuInfoCheck = skipRecursion = true;
+ md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
+ md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
+ checkMerge2Nx2N_rd0_4(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
+ if (!sameContentRef)
+ {
+ if ((m_param->bCTUInfo & 2) && (m_slice->m_pps->bUseDQP && depth <= m_slice->m_pps->maxCuDQPDepth))
+ {
+ qp -= int32_t(0.04 * qp);
+ setLambdaFromQP(parentCTU, qp);
+ }
+ if (m_param->bCTUInfo & 4)
+ skipModes = false;
+ }
+ if (sameContentRef || (!sameContentRef && !(m_param->bCTUInfo & 4)))
+ {
+ if (m_param->rdLevel)
+ skipModes = m_param->bEnableEarlySkip && md.bestMode && md.bestMode->cu.isSkipped(0);
+ if ((m_param->bCTUInfo & 4) && sameContentRef)
+ skipModes = md.bestMode && true;
+ }
+ }
+ else
+ {
+ md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
+ md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
+ checkMerge2Nx2N_rd0_4(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
+ if (m_param->rdLevel)
+ skipModes = m_param->bEnableEarlySkip && md.bestMode && md.bestMode->cu.isSkipped(0);
+ }
mightSplit &= !bDecidedDepth;
- md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
- md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
- checkMerge2Nx2N_rd0_4(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
- if (m_param->rdLevel)
- skipModes = m_param->bEnableEarlySkip && md.bestMode && md.bestMode->cu.isSkipped(0);
}
}
if (m_param->analysisMode == X265_ANALYSIS_LOAD && m_param->analysisRefineLevel > 1)
@@ -1167,6 +1192,8 @@
/* Step 2. Evaluate each of the 4 split sub-blocks in series */
if (mightSplit && !skipRecursion)
{
+ if (bCtuInfoCheck && m_param->bCTUInfo & 2)
+ qp = int((1 / 0.96) * qp + 0.5);
Mode* splitPred = &md.pred[PRED_SPLIT];
splitPred->initCosts();
CUData* splitCU = &splitPred->cu;
@@ -1222,7 +1249,7 @@
* 2 3 */
uint32_t allSplitRefs = splitData[0].splitRefs | splitData[1].splitRefs | splitData[2].splitRefs | splitData[3].splitRefs;
/* Step 3. Evaluate ME (2Nx2N, rect, amp) and intra modes at current depth */
- if (mightNotSplit && depth >= minDepth)
+ if (mightNotSplit && (depth >= minDepth || (m_param->bCTUInfo && !md.bestMode)))
{
if (m_slice->m_pps->bUseDQP && depth <= m_slice->m_pps->maxCuDQPDepth && m_slice->m_pps->maxCuDQPDepth != 0)
setLambdaFromQP(parentCTU, qp);
@@ -1406,7 +1433,7 @@
}
}
}
- bool bTryIntra = (m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && cuGeom.log2CUSize != MAX_LOG2_CU_SIZE;
+ bool bTryIntra = (m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && cuGeom.log2CUSize != MAX_LOG2_CU_SIZE && !((m_param->bCTUInfo & 4) && bCtuInfoCheck);
if (m_param->rdLevel >= 3)
{
/* Calculate RD cost of best inter option */
@@ -1683,16 +1710,42 @@
else if (mightNotSplit && bDecidedDepth)
{
if (m_additionalCtuInfo[cuGeom.absPartIdx])
+ {
bCtuInfoCheck = skipRecursion = true;
+ refMasks[0] = allSplitRefs;
+ md.pred[PRED_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);
+ checkInter_rd5_6(md.pred[PRED_2Nx2N], cuGeom, SIZE_2Nx2N, refMasks);
+ checkBestMode(md.pred[PRED_2Nx2N], cuGeom.depth);
+ if (!sameContentRef)
+ {
+ if ((m_param->bCTUInfo & 2) && (m_slice->m_pps->bUseDQP && depth <= m_slice->m_pps->maxCuDQPDepth))
+ {
+ qp -= int32_t(0.04 * qp);
+ setLambdaFromQP(parentCTU, qp);
+ }
+ if (m_param->bCTUInfo & 4)
+ skipModes = false;
+ }
+ if (sameContentRef || (!sameContentRef && !(m_param->bCTUInfo & 4)))
+ {
+ if (m_param->rdLevel)
+ skipModes = m_param->bEnableEarlySkip && md.bestMode && md.bestMode->cu.isSkipped(0);
+ if ((m_param->bCTUInfo & 4) && sameContentRef)
+ skipModes = md.bestMode && true;
+ }
+ }
+ else
+ {
+ md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
+ md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
+ checkMerge2Nx2N_rd5_6(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
+ skipModes = !!m_param->bEnableEarlySkip && md.bestMode;
+ refMasks[0] = allSplitRefs;
+ md.pred[PRED_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);
+ checkInter_rd5_6(md.pred[PRED_2Nx2N], cuGeom, SIZE_2Nx2N, refMasks);
+ checkBestMode(md.pred[PRED_2Nx2N], cuGeom.depth);
+ }
mightSplit &= !bDecidedDepth;
- md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
- md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
- checkMerge2Nx2N_rd5_6(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
- skipModes = !!m_param->bEnableEarlySkip && md.bestMode;
- refMasks[0] = allSplitRefs;
- md.pred[PRED_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);
- checkInter_rd5_6(md.pred[PRED_2Nx2N], cuGeom, SIZE_2Nx2N, refMasks);
- checkBestMode(md.pred[PRED_2Nx2N], cuGeom.depth);
}
}
if (m_param->analysisMode == X265_ANALYSIS_LOAD && m_param->analysisRefineLevel > 1)
@@ -1760,6 +1813,8 @@
/* Step 2. Evaluate each of the 4 split sub-blocks in series */
if (mightSplit && !skipRecursion)
{
+ if (bCtuInfoCheck && m_param->bCTUInfo & 2)
+ qp = int((1 / 0.96) * qp + 0.5);
Mode* splitPred = &md.pred[PRED_SPLIT];
splitPred->initCosts();
CUData* splitCU = &splitPred->cu;
@@ -1996,7 +2051,7 @@
}
}
- if ((m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && cuGeom.log2CUSize != MAX_LOG2_CU_SIZE)
+ if ((m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && (cuGeom.log2CUSize != MAX_LOG2_CU_SIZE) && !((m_param->bCTUInfo & 4) && bCtuInfoCheck))
{
if (!m_param->limitReferences || splitIntra)
{
More information about the x265-devel
mailing list