[x265] [PATCH] analysis: used CUData helper function to get number of PUs and offset
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Tue Jun 23 17:18:20 CEST 2015
# HG changeset patch
# User Ashok Kumar Mishra<ashok at multicorewareinc.com>
# Date 1435071934 -19800
# Tue Jun 23 20:35:34 2015 +0530
# Node ID cc243b161a2c2868be52e7d2077a77de5d1ef351
# Parent b697c904e641b22aebf936cf97add00892b659e7
analysis: used CUData helper function to get number of PUs and offset
diff -r b697c904e641 -r cc243b161a2c source/common/cudata.cpp
--- a/source/common/cudata.cpp Tue Jun 23 20:35:28 2015 +0530
+++ b/source/common/cudata.cpp Tue Jun 23 20:35:34 2015 +0530
@@ -112,38 +112,6 @@
return MV((int16_t)mvx, (int16_t)mvy);
}
-// Partition table.
-// First index is partitioning mode. Second index is partition index.
-// Third index is 0 for partition sizes, 1 for partition offsets. The
-// sizes and offsets are encoded as two packed 4-bit values (X,Y).
-// X and Y represent 1/4 fractions of the block size.
-const uint32_t partTable[8][4][2] =
-{
- // XY
- { { 0x44, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2Nx2N.
- { { 0x42, 0x00 }, { 0x42, 0x02 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxN.
- { { 0x24, 0x00 }, { 0x24, 0x20 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_Nx2N.
- { { 0x22, 0x00 }, { 0x22, 0x20 }, { 0x22, 0x02 }, { 0x22, 0x22 } }, // SIZE_NxN.
- { { 0x41, 0x00 }, { 0x43, 0x01 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxnU.
- { { 0x43, 0x00 }, { 0x41, 0x03 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxnD.
- { { 0x14, 0x00 }, { 0x34, 0x10 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_nLx2N.
- { { 0x34, 0x00 }, { 0x14, 0x30 }, { 0x00, 0x00 }, { 0x00, 0x00 } } // SIZE_nRx2N.
-};
-
-// Partition Address table.
-// First index is partitioning mode. Second index is partition address.
-const uint32_t partAddrTable[8][4] =
-{
- { 0x00, 0x00, 0x00, 0x00 }, // SIZE_2Nx2N.
- { 0x00, 0x08, 0x08, 0x08 }, // SIZE_2NxN.
- { 0x00, 0x04, 0x04, 0x04 }, // SIZE_Nx2N.
- { 0x00, 0x04, 0x08, 0x0C }, // SIZE_NxN.
- { 0x00, 0x02, 0x02, 0x02 }, // SIZE_2NxnU.
- { 0x00, 0x0A, 0x0A, 0x0A }, // SIZE_2NxnD.
- { 0x00, 0x01, 0x01, 0x01 }, // SIZE_nLx2N.
- { 0x00, 0x05, 0x05, 0x05 } // SIZE_nRx2N.
-};
-
}
cubcast_t CUData::s_partSet[NUM_FULL_DEPTH] = { NULL, NULL, NULL, NULL, NULL };
diff -r b697c904e641 -r cc243b161a2c source/common/cudata.h
--- a/source/common/cudata.h Tue Jun 23 20:35:28 2015 +0530
+++ b/source/common/cudata.h Tue Jun 23 20:35:34 2015 +0530
@@ -121,6 +121,38 @@
// Partition count table, index represents partitioning mode.
const uint32_t nbPartsTable[8] = { 1, 2, 2, 4, 2, 2, 2, 2 };
+// Partition table.
+// First index is partitioning mode. Second index is partition index.
+// Third index is 0 for partition sizes, 1 for partition offsets. The
+// sizes and offsets are encoded as two packed 4-bit values (X,Y).
+// X and Y represent 1/4 fractions of the block size.
+const uint32_t partTable[8][4][2] =
+{
+ // XY
+ { { 0x44, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2Nx2N.
+ { { 0x42, 0x00 }, { 0x42, 0x02 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxN.
+ { { 0x24, 0x00 }, { 0x24, 0x20 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_Nx2N.
+ { { 0x22, 0x00 }, { 0x22, 0x20 }, { 0x22, 0x02 }, { 0x22, 0x22 } }, // SIZE_NxN.
+ { { 0x41, 0x00 }, { 0x43, 0x01 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxnU.
+ { { 0x43, 0x00 }, { 0x41, 0x03 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_2NxnD.
+ { { 0x14, 0x00 }, { 0x34, 0x10 }, { 0x00, 0x00 }, { 0x00, 0x00 } }, // SIZE_nLx2N.
+ { { 0x34, 0x00 }, { 0x14, 0x30 }, { 0x00, 0x00 }, { 0x00, 0x00 } } // SIZE_nRx2N.
+};
+
+// Partition Address table.
+// First index is partitioning mode. Second index is partition address.
+const uint32_t partAddrTable[8][4] =
+{
+ { 0x00, 0x00, 0x00, 0x00 }, // SIZE_2Nx2N.
+ { 0x00, 0x08, 0x08, 0x08 }, // SIZE_2NxN.
+ { 0x00, 0x04, 0x04, 0x04 }, // SIZE_Nx2N.
+ { 0x00, 0x04, 0x08, 0x0C }, // SIZE_NxN.
+ { 0x00, 0x02, 0x02, 0x02 }, // SIZE_2NxnU.
+ { 0x00, 0x0A, 0x0A, 0x0A }, // SIZE_2NxnD.
+ { 0x00, 0x01, 0x01, 0x01 }, // SIZE_nLx2N.
+ { 0x00, 0x05, 0x05, 0x05 } // SIZE_nRx2N.
+};
+
// Holds part data for a CU of a given size, from an 8x8 CU to a CTU
class CUData
{
@@ -222,8 +254,9 @@
void getNeighbourMV(uint32_t puIdx, uint32_t absPartIdx, InterNeighbourMV* neighbours) const;
void getIntraTUQtDepthRange(uint32_t tuDepthRange[2], uint32_t absPartIdx) const;
void getInterTUQtDepthRange(uint32_t tuDepthRange[2], uint32_t absPartIdx) const;
- uint32_t getBestRefIdx(uint32_t subPartIdx) const { return ((m_interDir[subPartIdx] & 1) << m_refIdx[0][subPartIdx]) |
+ uint32_t getBestRefIdx(uint32_t subPartIdx) const { return ((m_interDir[subPartIdx] & 1) << m_refIdx[0][subPartIdx]) |
(((m_interDir[subPartIdx] >> 1) & 1) << (m_refIdx[1][subPartIdx] + 16)); }
+ uint32_t getPUOffset(uint32_t puIdx, uint32_t absPartIdx) const { return (partAddrTable[(int)m_partSize[absPartIdx]][puIdx] << (g_unitSizeDepth - m_cuDepth[absPartIdx]) * 2) >> 4; }
uint32_t getNumPartInter() const { return nbPartsTable[(int)m_partSize[0]]; }
bool isIntra(uint32_t absPartIdx) const { return m_predMode[absPartIdx] == MODE_INTRA; }
diff -r b697c904e641 -r cc243b161a2c source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Tue Jun 23 20:35:28 2015 +0530
+++ b/source/encoder/analysis.cpp Tue Jun 23 20:35:34 2015 +0530
@@ -1081,13 +1081,11 @@
refMask = allSplitRefs;
else
{
- /* use best merge/inter mode, in case of intra use 2Nx2N inter references */
- CUData& cu = md.bestMode->cu.isIntra(0) ? md.pred[PRED_2Nx2N].cu : md.bestMode->cu;
- PartSize partSize = (PartSize)cu.m_partSize[0];
- uint32_t numPU = (partSize == SIZE_2Nx2N) ? 1 : 2;
- uint32_t puOffset = (g_puOffset[uint32_t(partSize)] << (g_unitSizeDepth - cu.m_cuDepth[0]) * 2) >> 4;
- refMask = 0;
- for (uint32_t puIdx = 0, subPartIdx = 0; puIdx < numPU; puIdx++, subPartIdx += puOffset)
+ /* use best merge/inter mode, in case of intra use 2Nx2N inter references */
+ CUData& cu = md.bestMode->cu.isIntra(0) ? md.pred[PRED_2Nx2N].cu : md.bestMode->cu;
+ uint32_t numPU = cu.getNumPartInter();
+ refMask = 0;
+ for (uint32_t puIdx = 0, subPartIdx = 0; puIdx < numPU; puIdx++, subPartIdx += cu.getPUOffset(puIdx, 0))
refMask |= cu.getBestRefIdx(subPartIdx);
}
@@ -1357,11 +1355,9 @@
{
/* use best merge/inter mode, in case of intra use 2Nx2N inter references */
CUData& cu = md.bestMode->cu.isIntra(0) ? md.pred[PRED_2Nx2N].cu : md.bestMode->cu;
- PartSize partSize = (PartSize)cu.m_partSize[0];
- uint32_t numPU = (partSize == SIZE_2Nx2N) ? 1 : 2;
- uint32_t puOffset = (g_puOffset[uint32_t(partSize)] << (g_unitSizeDepth - cu.m_cuDepth[0]) * 2) >> 4;
+ uint32_t numPU = cu.getNumPartInter();
refMask = 0;
- for (uint32_t puIdx = 0, subPartIdx = 0; puIdx < numPU; puIdx++, subPartIdx += puOffset)
+ for (uint32_t puIdx = 0, subPartIdx = 0; puIdx < numPU; puIdx++, subPartIdx += cu.getPUOffset(puIdx, 0))
refMask |= cu.getBestRefIdx(subPartIdx);
}
More information about the x265-devel
mailing list