ref: 9a74427a613999bf5efac9c6b498081beb2d1eb3
parent: f897029034b2e4e67620dba487f1c73369902ba9
parent: 92e5489dd3da00771c7be151ca3e33c7d088ced0
author: volvet <qizh@cisco.com>
date: Tue May 6 11:00:01 EDT 2014
Merge pull request #788 from mstorsjo/factorize-duplicated-test Avoid duplicating code in the MotionEstimate test Approved by Sijia.
--- a/test/encoder/EncUT_MotionEstimate.cpp
+++ b/test/encoder/EncUT_MotionEstimate.cpp
@@ -63,6 +63,7 @@
m_pMvdCostTable=new uint16_t[52*m_uiMvdTableSize];
ASSERT_TRUE( NULL != m_pMvdCostTable );
}
+ void DoLineTest(PLineFullSearchFunc func, bool horizontal);
virtual void TearDown() {
delete [] m_pMvdCostTable;
pMa->WelsFree( m_pRefData, "RefPic");
@@ -135,7 +136,7 @@
}
-TEST_F(MotionEstimateTest, TestVerticalSearch) {
+void MotionEstimateTest::DoLineTest(PLineFullSearchFunc func, bool vertical) {
const int32_t kiMaxBlock16Sad = 72000;//a rough number
SWelsFuncPtrList sFuncList;
SWelsME sMe;
@@ -146,6 +147,7 @@
SMVUnitXY sTargetMv;
WelsInitSampleSadFunc( &sFuncList, 0 );//test c functions
+ WelsInitMeFunc(&sFuncList, WelsCPUFeatureDetect(NULL), 1);
uint8_t *pRefPicCenter = m_pRefData+(m_iHeight/2)*m_iWidth+(m_iWidth/2);
sMe.iCurMeBlockPixX = (m_iWidth/2);
@@ -155,8 +157,13 @@
bool bFoundMatch = false;
int32_t iTryTimes=100;
- sTargetMv.iMvX = 0;
- sTargetMv.iMvY = -sMe.iCurMeBlockPixY + INTPEL_NEEDED_MARGIN + rand()%(m_iHeight - 16 - 2*INTPEL_NEEDED_MARGIN);
+ if (vertical) {
+ sTargetMv.iMvX = 0;
+ sTargetMv.iMvY = -sMe.iCurMeBlockPixY + INTPEL_NEEDED_MARGIN + rand()%(m_iHeight - 16 - 2*INTPEL_NEEDED_MARGIN);
+ } else {
+ sTargetMv.iMvX = -sMe.iCurMeBlockPixX + INTPEL_NEEDED_MARGIN + rand()%(m_iWidth - 16 - 2*INTPEL_NEEDED_MARGIN);
+ sTargetMv.iMvY = 0;
+ }
bDataGeneratorSucceed = false;
bFoundMatch = false;
while (!bFoundMatch && (iTryTimes--)>0) {
@@ -179,16 +186,24 @@
const int32_t iCurMeBlockQpelPixY = ((iCurMeBlockPixY)<<2);
uint16_t* pMvdCostX = sMe.pMvdCost - iCurMeBlockQpelPixX - sMe.sMvp.iMvX; //do the offset here
uint16_t* pMvdCostY = sMe.pMvdCost - iCurMeBlockQpelPixY - sMe.sMvp.iMvY;
- LineFullSearch_c ( &sFuncList, &sMe,
- pMvdCostY, pMvdCostX[ iCurMeBlockQpelPixX ],
- m_iMaxSearchBlock, m_iWidth,
- INTPEL_NEEDED_MARGIN,
- m_iHeight-INTPEL_NEEDED_MARGIN-16, true );
+ uint16_t* pMvdCost = vertical ? pMvdCostY : pMvdCostX;
+ int iSize = vertical ? m_iHeight : m_iWidth;
+ int iFixedMvd = vertical ? pMvdCostX[ iCurMeBlockQpelPixX ] : pMvdCostY[ iCurMeBlockQpelPixY ];
+ func ( &sFuncList, &sMe,
+ pMvdCost, iFixedMvd,
+ m_iMaxSearchBlock, m_iWidth,
+ INTPEL_NEEDED_MARGIN,
+ iSize-INTPEL_NEEDED_MARGIN-16, vertical );
//the last selection may be affected by MVDcost, that is when smaller MvY will be better
- bFoundMatch = (sMe.sMv.iMvX==0
- &&(sMe.sMv.iMvY==sTargetMv.iMvY||abs(sMe.sMv.iMvY)<abs(sTargetMv.iMvY)));
- //printf("TestVerticalSearch Target: %d,%d\n", sTargetMv.iMvX, sTargetMv.iMvY);
+ if (vertical) {
+ bFoundMatch = (sMe.sMv.iMvX==0
+ &&(sMe.sMv.iMvY==sTargetMv.iMvY||abs(sMe.sMv.iMvY)<abs(sTargetMv.iMvY)));
+ } else {
+ bFoundMatch = (sMe.sMv.iMvY==0
+ &&(sMe.sMv.iMvX==sTargetMv.iMvX||abs(sMe.sMv.iMvX)<abs(sTargetMv.iMvX)));
+ }
+ //printf("DoLineTest Target: %d,%d\n", sTargetMv.iMvX, sTargetMv.iMvY);
}
if (bDataGeneratorSucceed) {
//if DataGenerator never succeed, there is no meaning to check iTryTimes
@@ -196,199 +211,31 @@
//it is possible that ref at differnt position is identical, but that should be under a low probability
}
}
-TEST_F(MotionEstimateTest, TestHorizontalSearch) {
- const int32_t kiMaxBlock16Sad = 72000;//a rough number
- SWelsFuncPtrList sFuncList;
- SWelsME sMe;
- srand((uint32_t)time(NULL));
- const uint8_t kuiQp = rand()%52;
- InitMe(kuiQp, 648, m_uiMvdTableSize, m_pMvdCostTable, &sMe);
-
- SMVUnitXY sTargetMv;
- WelsInitSampleSadFunc( &sFuncList, 0 );//test c functions
-
- uint8_t *pRefPicCenter = m_pRefData+(m_iHeight/2)*m_iWidth+(m_iWidth/2);
- sMe.iCurMeBlockPixX = (m_iWidth/2);
- sMe.iCurMeBlockPixY = (m_iHeight/2);
-
- bool bDataGeneratorSucceed = false;
- bool bFoundMatch = false;
- int32_t iTryTimes=100;
-
- sTargetMv.iMvX = -sMe.iCurMeBlockPixX + INTPEL_NEEDED_MARGIN + rand()%(m_iWidth - 16 - 2*INTPEL_NEEDED_MARGIN);
- sTargetMv.iMvY = 0;
- bDataGeneratorSucceed = false;
- bFoundMatch = false;
- while (!bFoundMatch && (iTryTimes--)>0) {
- if (!YUVPixelDataGenerator( m_pRefData, m_iWidth, m_iHeight, m_iWidth ))
- continue;
-
- bDataGeneratorSucceed = true;
- CopyTargetBlock( m_pSrcBlock, 16, sTargetMv, m_iWidth, pRefPicCenter);
-
- //clean the sMe status
- sMe.uiBlockSize = rand()%5;
- sMe.pEncMb = m_pSrcBlock;
- sMe.pRefMb = pRefPicCenter;
- sMe.pColoRefMb = pRefPicCenter;
- sMe.sMv.iMvX = sMe.sMv.iMvY = 0;
- sMe.uiSadCost = sMe.uiSatdCost = kiMaxBlock16Sad;
- const int32_t iCurMeBlockPixX = sMe.iCurMeBlockPixX;
- const int32_t iCurMeBlockQpelPixX = ((iCurMeBlockPixX)<<2);
- const int32_t iCurMeBlockPixY = sMe.iCurMeBlockPixY;
- const int32_t iCurMeBlockQpelPixY = ((iCurMeBlockPixY)<<2);
- uint16_t* pMvdCostX = sMe.pMvdCost - iCurMeBlockQpelPixX - sMe.sMvp.iMvX; //do the offset here
- uint16_t* pMvdCostY = sMe.pMvdCost - iCurMeBlockQpelPixY - sMe.sMvp.iMvY;
- LineFullSearch_c ( &sFuncList, &sMe,
- pMvdCostX, pMvdCostY[ iCurMeBlockQpelPixY ],
- m_iMaxSearchBlock, m_iWidth,
- INTPEL_NEEDED_MARGIN,
- m_iWidth-INTPEL_NEEDED_MARGIN-16, false );
-
- //the last selection may be affected by MVDcost, that is when smaller MvY will be better
- bFoundMatch = (sMe.sMv.iMvY==0
- &&(sMe.sMv.iMvX==sTargetMv.iMvX||abs(sMe.sMv.iMvX)<abs(sTargetMv.iMvX)));
- //printf("TestHorizontalSearch Target: %d,%d\n", sTargetMv.iMvX, sTargetMv.iMvY);
- }
- if (bDataGeneratorSucceed) {
- //if DataGenerator never succeed, there is no meaning to check iTryTimes
- ASSERT_TRUE(iTryTimes > 0);
- //it is possible that ref at differnt position is identical, but that should be under a low probability
- }
+TEST_F(MotionEstimateTest, TestVerticalSearch) {
+ DoLineTest(LineFullSearch_c, true);
}
+TEST_F(MotionEstimateTest, TestHorizontalSearch) {
+ DoLineTest(LineFullSearch_c, false);
+}
#ifdef X86_ASM
TEST_F(MotionEstimateTest, TestVerticalSearch_SSE41)
{
- const int32_t kiMaxBlock16Sad = 72000;//a rough number
- SWelsFuncPtrList sFuncList;
- SWelsME sMe;
-
- srand((uint32_t)time(NULL));
- const uint8_t kuiQp = rand()%52;
- InitMe(kuiQp, 648, m_uiMvdTableSize, m_pMvdCostTable, &sMe);
int32_t iTmp = 1;
uint32_t uiCPUFlags = WelsCPUFeatureDetect( &iTmp);
if ((uiCPUFlags & WELS_CPU_SSE41) == 0) return ;
- SMVUnitXY sTargetMv;
- WelsInitSampleSadFunc( &sFuncList, 0 );//test c functions
- WelsInitMeFunc(&sFuncList, WELS_CPU_SSE41, 1);
-
- uint8_t *pRefPicCenter = m_pRefData+(m_iHeight/2)*m_iWidth+(m_iWidth/2);
- sMe.iCurMeBlockPixX = (m_iWidth/2);
- sMe.iCurMeBlockPixY = (m_iHeight/2);
-
- bool bDataGeneratorSucceed = false;
- bool bFoundMatch = false;
- int32_t iTryTimes=100;
-
- sTargetMv.iMvX = 0;
- sTargetMv.iMvY = -sMe.iCurMeBlockPixY + INTPEL_NEEDED_MARGIN + rand()%(m_iHeight - 16 - 2*INTPEL_NEEDED_MARGIN);
- bDataGeneratorSucceed = false;
- bFoundMatch = false;
- while (!bFoundMatch && (iTryTimes--)>0) {
- if (!YUVPixelDataGenerator( m_pRefData, m_iWidth, m_iHeight, m_iWidth ))
- continue;
-
- bDataGeneratorSucceed = true;
- CopyTargetBlock( m_pSrcBlock, 16, sTargetMv, m_iWidth, pRefPicCenter);
-
- //clean the sMe status
- sMe.uiBlockSize = rand()%5;
- sMe.pEncMb = m_pSrcBlock;
- sMe.pRefMb = pRefPicCenter;
- sMe.pColoRefMb = pRefPicCenter;
- sMe.sMv.iMvX = sMe.sMv.iMvY = 0;
- sMe.uiSadCost = sMe.uiSatdCost = kiMaxBlock16Sad;
- const int32_t iCurMeBlockPixX = sMe.iCurMeBlockPixX;
- const int32_t iCurMeBlockQpelPixX = ((iCurMeBlockPixX)<<2);
- const int32_t iCurMeBlockPixY = sMe.iCurMeBlockPixY;
- const int32_t iCurMeBlockQpelPixY = ((iCurMeBlockPixY)<<2);
- uint16_t* pMvdCostX = sMe.pMvdCost - iCurMeBlockQpelPixX - sMe.sMvp.iMvX; //do the offset here
- uint16_t* pMvdCostY = sMe.pMvdCost - iCurMeBlockQpelPixY - sMe.sMvp.iMvY;
- VerticalFullSearchUsingSSE41 ( &sFuncList, &sMe,
- pMvdCostY, pMvdCostX[ iCurMeBlockQpelPixX ],
- m_iMaxSearchBlock, m_iWidth,
- INTPEL_NEEDED_MARGIN,
- m_iHeight-INTPEL_NEEDED_MARGIN-16, true );
-
- //the last selection may be affected by MVDcost, that is when smaller MvY will be better
- bFoundMatch = (sMe.sMv.iMvX==0
- &&(sMe.sMv.iMvY==sTargetMv.iMvY||abs(sMe.sMv.iMvY)<abs(sTargetMv.iMvY)));
- //printf("TestVerticalSearch Target: %d,%d\n", sTargetMv.iMvX, sTargetMv.iMvY);
- }
- if (bDataGeneratorSucceed) {
- //if DataGenerator never succeed, there is no meaning to check iTryTimes
- ASSERT_TRUE(iTryTimes > 0);
- //it is possible that ref at differnt position is identical, but that should be under a low probability
- }
+ DoLineTest(VerticalFullSearchUsingSSE41, true);
}
TEST_F(MotionEstimateTest, TestHorizontalSearch_SSE41)
{
- const int32_t kiMaxBlock16Sad = 72000;//a rough number
- SWelsFuncPtrList sFuncList;
- SWelsME sMe;
-
- srand((uint32_t)time(NULL));
- const uint8_t kuiQp = rand()%52;
- InitMe(kuiQp, 648, m_uiMvdTableSize, m_pMvdCostTable, &sMe);
int32_t iTmp = 1;
uint32_t uiCPUFlags = WelsCPUFeatureDetect( &iTmp);
if ((uiCPUFlags & WELS_CPU_SSE41) == 0) return ;
- SMVUnitXY sTargetMv;
- WelsInitSampleSadFunc( &sFuncList, 0 );//test c functions
- WelsInitMeFunc(&sFuncList, WELS_CPU_SSE41, 1);
- uint8_t *pRefPicCenter = m_pRefData+(m_iHeight/2)*m_iWidth+(m_iWidth/2);
- sMe.iCurMeBlockPixX = (m_iWidth/2);
- sMe.iCurMeBlockPixY = (m_iHeight/2);
-
- bool bDataGeneratorSucceed = false;
- bool bFoundMatch = false;
- int32_t iTryTimes=100;
-
- sTargetMv.iMvX = -sMe.iCurMeBlockPixX + INTPEL_NEEDED_MARGIN + rand()%(m_iWidth - 16 - 2*INTPEL_NEEDED_MARGIN);
- sTargetMv.iMvY = 0;
- bDataGeneratorSucceed = false;
- bFoundMatch = false;
- while (!bFoundMatch && (iTryTimes--)>0) {
- if (!YUVPixelDataGenerator( m_pRefData, m_iWidth, m_iHeight, m_iWidth ))
- continue;
- bDataGeneratorSucceed = true;
- CopyTargetBlock( m_pSrcBlock, m_iMaxSearchBlock, sTargetMv, m_iWidth, pRefPicCenter );
-
- //clean sMe status
- sMe.uiBlockSize = rand()%5;
- sMe.pEncMb = m_pSrcBlock;
- sMe.pRefMb = pRefPicCenter;
- sMe.pColoRefMb = pRefPicCenter;
- sMe.sMv.iMvX = sMe.sMv.iMvY = 0;
- sMe.uiSadCost = sMe.uiSatdCost = kiMaxBlock16Sad;
- const int32_t iCurMeBlockPixX = sMe.iCurMeBlockPixX;
- const int32_t iCurMeBlockQpelPixX = ((iCurMeBlockPixX)<<2);
- const int32_t iCurMeBlockPixY = sMe.iCurMeBlockPixY;
- const int32_t iCurMeBlockQpelPixY = ((iCurMeBlockPixY)<<2);
- uint16_t* pMvdCostX = sMe.pMvdCost - iCurMeBlockQpelPixX - sMe.sMvp.iMvX; //do the offset here
- uint16_t* pMvdCostY = sMe.pMvdCost - iCurMeBlockQpelPixY - sMe.sMvp.iMvY;
- HorizontalFullSearchUsingSSE41 ( &sFuncList, &sMe,
- pMvdCostX, pMvdCostY[ iCurMeBlockQpelPixY ],
- m_iMaxSearchBlock, m_iWidth,
- INTPEL_NEEDED_MARGIN,
- m_iWidth-INTPEL_NEEDED_MARGIN-16, false );
-
- //the last selection may be affected by MVDcost, that is when smaller MvY will be better
- bFoundMatch = (sMe.sMv.iMvY==0
- &&(sMe.sMv.iMvX==sTargetMv.iMvX||abs(sMe.sMv.iMvX)<abs(sTargetMv.iMvX)));
- //printf("TestHorizontalSearch Target: %d,%d\n", sTargetMv.iMvX, sTargetMv.iMvY);
- }
- if (bDataGeneratorSucceed) {
- //if DataGenerator never succeed, there is no meaning to check iTryTimes
- ASSERT_TRUE(iTryTimes > 0);
- //it is possible that ref at differnt position is identical, but that should be under a low probability
- }
+ DoLineTest(HorizontalFullSearchUsingSSE41, false);
}
#endif