[x265] [PATCH] analysis: add CU specific details to encodeCU()
santhoshini at multicorewareinc.com
santhoshini at multicorewareinc.com
Tue Sep 16 06:15:22 CEST 2014
# HG changeset patch
# User Santhoshini Sekar <santhoshini at multicorewareinc.com>
# Date 1410840429 -19800
# Tue Sep 16 09:37:09 2014 +0530
# Node ID 50505472d3e33b775c70f2f373e1c15d17e47e66
# Parent 7e29b10982d2eb7fd79f581d99996f04184522ba
analysis: add CU specific details to encodeCU()
diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Thu Sep 11 19:24:28 2014 +0530
+++ b/source/encoder/analysis.cpp Tue Sep 16 09:37:09 2014 +0530
@@ -301,7 +301,6 @@
{
if (cu->m_slice->m_pps->bUseDQP)
m_bEncodeDQP = true;
- loadCTUData(cu);
// initialize CU data
m_bestCU[0]->initCU(cu->m_pic, cu->getAddr());
diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/entropy.cpp
--- a/source/encoder/entropy.cpp Thu Sep 11 19:24:28 2014 +0530
+++ b/source/encoder/entropy.cpp Tue Sep 16 09:37:09 2014 +0530
@@ -481,14 +481,14 @@
}
}
-void Entropy::encodeCTU(TComDataCU* cu)
+void Entropy::encodeCTU(TComDataCU* cu, CU* cuData)
{
bool bEncodeDQP = cu->m_slice->m_pps->bUseDQP;
- encodeCU(cu, 0, 0, false, bEncodeDQP);
+ encodeCU(cu, 0, 0, bEncodeDQP, cuData);
}
/* encode a CU block recursively */
-void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bInsidePicture, bool& bEncodeDQP)
+void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool& bEncodeDQP, CU* cuData)
{
Frame* pic = cu->m_pic;
Slice* slice = cu->m_slice;
@@ -496,30 +496,24 @@
if (depth <= slice->m_pps->maxCuDQPDepth && slice->m_pps->bUseDQP)
bEncodeDQP = true;
- if (!bInsidePicture)
+ int cuSplitFlag = !(cuData->flags & CU::LEAF);
+ int cuUnsplitFlag = !(cuData->flags & CU::SPLIT_MANDATORY);
+
+ if (!cuUnsplitFlag)
{
- uint32_t xmax = slice->m_sps->picWidthInLumaSamples - cu->getCUPelX();
- uint32_t ymax = slice->m_sps->picHeightInLumaSamples - cu->getCUPelY();
- uint32_t cuSize = g_maxCUSize >> depth;
-
- bInsidePicture = (g_zscanToPelX[absPartIdx] + cuSize <= xmax &&
- g_zscanToPelY[absPartIdx] + cuSize <= ymax);
-
- if (!bInsidePicture)
+ uint32_t qNumParts = (pic->getNumPartInCU() >> (depth << 1)) >> 2;
+ for (uint32_t partUnitIdx = 0; partUnitIdx < 4; partUnitIdx++, absPartIdx += qNumParts)
{
- uint32_t qNumParts = (pic->getNumPartInCU() >> (depth << 1)) >> 2;
- for (uint32_t partUnitIdx = 0; partUnitIdx < 4; partUnitIdx++, absPartIdx += qNumParts)
- {
- if (g_zscanToPelX[absPartIdx] < xmax && g_zscanToPelY[absPartIdx] < ymax)
- encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP);
- }
-
- return;
+ CU *childCU = cu->m_CULocalData + cuData->childIdx + partUnitIdx;
+ int cuPresentFlagChild = !(childCU->flags & CU::PRESENT);
+ if (!cuPresentFlagChild)
+ encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU);
}
+ return;
}
// We need to split, so don't try these modes.
- if (bInsidePicture && depth < g_maxCUDepth)
+ if (cuSplitFlag)
codeSplitFlag(cu, absPartIdx, depth);
if (depth < cu->getDepth(absPartIdx) && depth < g_maxCUDepth)
@@ -527,7 +521,10 @@
uint32_t qNumParts = (pic->getNumPartInCU() >> (depth << 1)) >> 2;
for (uint32_t partUnitIdx = 0; partUnitIdx < 4; partUnitIdx++, absPartIdx += qNumParts)
- encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP);
+ {
+ CU *childCU = cu->m_CULocalData + cuData->childIdx + partUnitIdx;
+ encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU);
+ }
return;
}
diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/entropy.h
--- a/source/encoder/entropy.h Thu Sep 11 19:24:28 2014 +0530
+++ b/source/encoder/entropy.h Tue Sep 16 09:37:09 2014 +0530
@@ -148,7 +148,7 @@
void codeShortTermRefPicSet(RPS* rps);
void finishSlice() { encodeBinTrm(1); finish(); dynamic_cast<Bitstream*>(m_bitIf)->writeByteAlignment(); }
- void encodeCTU(TComDataCU* cu);
+ void encodeCTU(TComDataCU* cu, CU *cuData);
void codeSaoOffset(SaoLcuParam* saoLcuParam, uint32_t compIdx);
void codeSaoUnitInterleaving(int compIdx, bool saoFlag, int rx, int ry, SaoLcuParam* saoLcuParam, int cuAddrInSlice, int cuAddrUpInSlice, int allowMergeLeft, int allowMergeUp);
void codeSaoMerge(uint32_t code) { encodeBin(code, m_contextState[OFF_SAO_MERGE_FLAG_CTX]); }
@@ -193,7 +193,7 @@
void encodeBinsEP(uint32_t binValues, int numBins);
void encodeBinTrm(uint32_t binValue);
- void encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bInsidePicture, bool& bEncodeDQP);
+ void encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool& bEncodeDQP, CU *cuData);
void finishCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth);
void writeOut();
diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Thu Sep 11 19:24:28 2014 +0530
+++ b/source/encoder/frameencoder.cpp Tue Sep 16 09:37:09 2014 +0530
@@ -470,8 +470,9 @@
}
}
+ m_tld.cuCoder.loadCTUData(cu);
// final coding (bitstream generation) for this CU
- m_entropyCoder.encodeCTU(cu);
+ m_entropyCoder.encodeCTU(cu, cu->m_CULocalData);
if (m_param->bEnableWavefront)
{
@@ -689,12 +690,13 @@
// load current best state from go-on entropy coder
curRow.rdEntropyCoders[0][CI_CURR_BEST].load(rowCoder);
+ tld.cuCoder.loadCTUData(cu);
tld.cuCoder.m_quant.setQPforQuant(cu);
tld.cuCoder.compressCU(cu); // Does all the CU analysis
/* advance top-level row coder to include the context of this CTU.
* if SAO is disabled, rowCoder writes the final CTU bitstream */
- rowCoder.encodeCTU(cu);
+ rowCoder.encodeCTU(cu, cu->m_CULocalData);
if (m_param->bEnableWavefront && col == 1)
// Save CABAC state for next row
More information about the x265-devel
mailing list