[x265] [PATCH] fine tuning getInterMergeCandidates() function
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Wed Feb 25 14:32:53 CET 2015
# HG changeset patch
# User Ashok Kumar Mishra<ashok at multicorewareinc.com>
# Date 1424862539 -19800
# Wed Feb 25 16:38:59 2015 +0530
# Node ID f513ae68dd7eb8c72f44dd74ea151041fea82492
# Parent 87173d41df87043297698770c8e99ac8c419d19e
fine tuning getInterMergeCandidates() function
diff -r 87173d41df87 -r f513ae68dd7e source/common/cudata.cpp
--- a/source/common/cudata.cpp Tue Feb 24 13:27:15 2015 -0600
+++ b/source/common/cudata.cpp Wed Feb 25 16:38:59 2015 +0530
@@ -1426,9 +1426,7 @@
if (isInterB)
cuLeft->getMvField(cuLeft, leftPartIdx, 1, candMvField[count][1]);
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
@@ -1450,9 +1448,7 @@
if (isInterB)
cuAbove->getMvField(cuAbove, abovePartIdx, 1, candMvField[count][1]);
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
@@ -1471,9 +1467,7 @@
if (isInterB)
cuAboveRight->getMvField(cuAboveRight, aboveRightPartIdx, 1, candMvField[count][1]);
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
@@ -1492,9 +1486,7 @@
if (isInterB)
cuLeftBottom->getMvField(cuLeftBottom, leftBottomPartIdx, 1, candMvField[count][1]);
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
@@ -1516,9 +1508,7 @@
if (isInterB)
cuAboveLeft->getMvField(cuAboveLeft, aboveLeftPartIdx, 1, candMvField[count][1]);
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
}
@@ -1553,31 +1543,21 @@
absPartAddr = 0;
}
- int refIdx = 0;
- uint32_t partIdxCenter = deriveCenterIdx(puIdx);
- uint32_t curCTUIdx = m_cuAddr;
- int dir = 0;
- bool bExistMV = ctuIdx >= 0 && getColMVP(colmv, refIdx, 0, ctuIdx, absPartAddr);
- if (!bExistMV)
- bExistMV = getColMVP(colmv, refIdx, 0, curCTUIdx, partIdxCenter);
- if (bExistMV)
+ int maxList = isInterB ? 2 : 1;
+ int dir = 0, refIdx = 0;
+ for (int list = 0; list < maxList; list++)
{
- dir |= 1;
- candMvField[count][0].mv = colmv;
- candMvField[count][0].refIdx = refIdx;
- }
-
- if (isInterB)
- {
- bExistMV = ctuIdx >= 0 && getColMVP(colmv, refIdx, 1, ctuIdx, absPartAddr);
+ bool bExistMV = ctuIdx >= 0 && getColMVP(colmv, refIdx, list, ctuIdx, absPartAddr);
if (!bExistMV)
- bExistMV = getColMVP(colmv, refIdx, 1, curCTUIdx, partIdxCenter);
-
+ {
+ uint32_t partIdxCenter = deriveCenterIdx(puIdx);
+ bExistMV = getColMVP(colmv, refIdx, list, m_cuAddr, partIdxCenter);
+ }
if (bExistMV)
{
- dir |= 2;
- candMvField[count][1].mv = colmv;
- candMvField[count][1].refIdx = refIdx;
+ dir |= (1 << list);
+ candMvField[count][list].mv = colmv;
+ candMvField[count][list].refIdx = refIdx;
}
}
@@ -1585,9 +1565,7 @@
{
candDir[count] = (uint8_t)dir;
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
}
@@ -1598,12 +1576,10 @@
uint32_t priorityList0 = 0xEDC984; // { 0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3 }
uint32_t priorityList1 = 0xB73621; // { 1, 0, 2, 0, 2, 1, 3, 0, 3, 1, 3, 2 }
- for (uint32_t idx = 0; idx < cutoff; idx++)
+ for (uint32_t idx = 0; idx < cutoff; idx++, priorityList0 >>= 2, priorityList1 >>= 2)
{
int i = priorityList0 & 3;
int j = priorityList1 & 3;
- priorityList0 >>= 2;
- priorityList1 >>= 2;
if ((candDir[i] & 0x1) && (candDir[j] & 0x2))
{
@@ -1620,9 +1596,7 @@
candMvField[count][1].refIdx = refIdxL1;
candDir[count] = 3;
- count++;
-
- if (count == maxNumMergeCand)
+ if (++count == maxNumMergeCand)
return maxNumMergeCand;
}
}
@@ -1659,16 +1633,16 @@
}
/* Check whether the current PU and a spatial neighboring PU are in a same ME region */
-bool CUData::isDiffMER(int xN, int yN, int xP, int yP) const
-{
- uint32_t plevel = 2;
-
- if ((xN >> plevel) != (xP >> plevel))
- return true;
- if ((yN >> plevel) != (yP >> plevel))
- return true;
- return false;
-}
+//bool CUData::isDiffMER(int xN, int yN, int xP, int yP) const
+//{
+// uint32_t plevel = 2;
+//
+// if ((xN >> plevel) != (xP >> plevel))
+// return true;
+// if ((yN >> plevel) != (yP >> plevel))
+// return true;
+// return false;
+//}
/* Constructs a list of candidates for AMVP, and a larger list of motion candidates */
int CUData::fillMvpCand(uint32_t puIdx, uint32_t absPartIdx, int picList, int refIdx, MV* amvpCand, MV* mvc) const
diff -r 87173d41df87 -r f513ae68dd7e source/common/cudata.h
--- a/source/common/cudata.h Tue Feb 24 13:27:15 2015 -0600
+++ b/source/common/cudata.h Wed Feb 25 16:38:59 2015 +0530
@@ -241,7 +241,8 @@
bool hasEqualMotion(uint32_t absPartIdx, const CUData& candCU, uint32_t candAbsPartIdx) const;
- bool isDiffMER(int xN, int yN, int xP, int yP) const;
+ /* Check whether the current PU and a spatial neighboring PU are in same ME region */
+ bool isDiffMER(int xN, int yN, int xP, int yP) const { return ((xN >> 2) != (xP >> 2)) || ((yN >> 2) != (yP >> 2)); };
// add possible motion vector predictor candidates
bool addMVPCand(MV& mvp, int picList, int refIdx, uint32_t absPartIdx, MVP_DIR dir) const;
More information about the x265-devel
mailing list