Showing the changes to test/encoder/EncUT_MotionEstimate.cpp (1 of 5 files). Show all
Unified · Split
| @@ -125,6 +125,124 @@ TEST_F (MotionEstimateTest, TestDiamondSearch) { · 124 unmodified lines | |||
| 125 | } | 125 | } |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | class MotionEstimateRangeTest : public ::testing::Test { | ||
| 129 | public: | ||
| 130 | virtual void SetUp() { | ||
| 131 | |||
| 132 | m_iWidth = 320; | ||
| 133 | m_iHeight = 240; | ||
| 134 | m_iWidthExt = m_iWidth + 2 * PADDING_LENGTH; | ||
| 135 | m_iHeightExt = m_iHeight + 2 * PADDING_LENGTH; | ||
| 136 | m_iMbWidth = m_iWidth >> 4; | ||
| 137 | m_iMbHeight = m_iHeight >> 4; | ||
| 138 | |||
| 139 | m_iUsageType = 0; | ||
| 140 | m_iNumDependencyLayers = 1; | ||
| 141 | m_iMvRange = m_iUsageType ? EXPANDED_MV_RANGE : CAMERA_STARTMV_RANGE; | ||
| 142 | m_iMvdRange = (m_iUsageType ? EXPANDED_MVD_RANGE : ((m_iNumDependencyLayers == 1) ? CAMERA_MVD_RANGE : | ||
| 143 | CAMERA_HIGHLAYER_MVD_RANGE)); | ||
| 144 | m_uiMvdInterTableSize = (m_iMvdRange << 2); //intepel*4=qpel | ||
| 145 | m_uiMvdInterTableStride = 1 + (m_uiMvdInterTableSize << 1);//qpel_mv_range*2=(+/-); | ||
| 146 | m_uiMvdCacheAlignedSize = m_uiMvdInterTableStride * sizeof (uint16_t); | ||
| 147 | |||
| 148 | m_pMa = new CMemoryAlign (16); | ||
| 149 | ASSERT_TRUE (NULL != m_pMa); | ||
| 150 | m_pMvdCostTable = (uint16_t*)m_pMa->WelsMallocz (52 * m_uiMvdCacheAlignedSize, "pMvdCostTable"); | ||
| 151 | ASSERT_TRUE (NULL != m_pMvdCostTable); | ||
| 152 | m_pRefStart = (uint8_t*)m_pMa->WelsMallocz (m_iWidthExt * m_iHeightExt, "reference frame "); | ||
| 153 | ASSERT_TRUE (NULL != m_pRefStart); | ||
| 154 | m_pSrc = (uint8_t*)m_pMa->WelsMallocz (m_iWidth * m_iHeight, "source frame"); | ||
| 155 | ASSERT_TRUE (NULL != m_pSrc); | ||
| 156 | |||
| 157 | } | ||
| 158 | virtual void TearDown() { | ||
| 159 | if (!m_pMa) | ||
| 160 | return; | ||
| 161 | if (m_pRefStart) { | ||
| 162 | m_pMa->WelsFree (m_pRefStart, "reference frame "); | ||
| 163 | m_pRefStart = NULL; | ||
| 164 | } | ||
| 165 | if (m_pSrc) { | ||
| 166 | m_pMa->WelsFree (m_pSrc, "source frame "); | ||
| 167 | m_pSrc = NULL; | ||
| 168 | } | ||
| 169 | if (m_pMvdCostTable) { | ||
| 170 | m_pMa->WelsFree (m_pMvdCostTable, "pMvdCostTable"); | ||
| 171 | m_pMvdCostTable = NULL; | ||
| 172 | } | ||
| 173 | if (m_pMa) { | ||
| 174 | delete m_pMa; | ||
| 175 | m_pMa = NULL; | ||
| 176 | } | ||
| 177 | |||
| 178 | } | ||
| 179 | public: | ||
| 180 | uint8_t* m_pRefStart; | ||
| 181 | uint8_t* m_pSrc; | ||
| 182 | uint16_t* m_pMvdCostTable; | ||
| 183 | |||
| 184 | int32_t m_iWidth; | ||
| 185 | int32_t m_iHeight; | ||
| 186 | int32_t m_iWidthExt; | ||
| 187 | int32_t m_iHeightExt; | ||
| 188 | int32_t m_iMbWidth; | ||
| 189 | int32_t m_iMbHeight; | ||
| 190 | CMemoryAlign* m_pMa; | ||
| 191 | |||
| 192 | int32_t m_iMvRange; | ||
| 193 | int32_t m_iMvdRange; | ||
| 194 | uint32_t m_uiMvdInterTableSize; | ||
| 195 | uint32_t m_uiMvdInterTableStride; | ||
| 196 | uint32_t m_uiMvdCacheAlignedSize; | ||
| 197 | int32_t m_iUsageType; | ||
| 198 | int32_t m_iNumDependencyLayers; | ||
| 199 | }; | ||
| 200 | |||
| 201 | TEST_F (MotionEstimateRangeTest, TestDiamondSearch) { | ||
| 202 | |||
| 203 | const int32_t kiMaxBlock16Sad = 72000;//a rough number | ||
| 204 | uint8_t* pRef = m_pRefStart + PADDING_LENGTH * m_iWidthExt + PADDING_LENGTH; | ||
| 205 | SWelsFuncPtrList sFuncList; | ||
| 206 | SWelsME sMe; | ||
| 207 | SSlice sSlice; | ||
| 208 | const uint8_t kuiQp = rand() % 52; | ||
| 209 | InitMe (kuiQp, m_uiMvdInterTableStride, m_uiMvdInterTableStride, m_pMvdCostTable, &sMe); | ||
| 210 | |||
| 211 | WelsInitSampleSadFunc (&sFuncList, 0); //test c functions | ||
| 212 | |||
| 213 | memset (m_pSrc, 128, m_iWidth * m_iHeight); | ||
| 214 | memset (m_pRefStart, 0, m_iWidthExt * m_iHeightExt); | ||
| 215 | |||
| 216 | sMe.uiBlockSize = BLOCK_16x16; // | ||
| 217 | |||
| 218 | sMe.sMvp.iMvX = rand() % m_iMvRange; | ||
| 219 | sMe.sMvp.iMvY = rand() % m_iMvRange; | ||
| 220 | |||
| 221 | for (int h = 0; h < m_iHeight; h++) | ||
| 222 | memset (pRef + h * m_iWidthExt, h, m_iWidthExt); | ||
| 223 | |||
| 224 | sMe.pEncMb = m_pSrc; | ||
| 225 | |||
| 226 | sMe.sMv.iMvX = sMe.sMvp.iMvX; | ||
| 227 | sMe.sMv.iMvY = sMe.sMvp.iMvY; | ||
| 228 | |||
| 229 | sMe.uiSadCost = sMe.uiSatdCost = kiMaxBlock16Sad; | ||
| 230 | SetMvWithinIntegerMvRange (m_iMbWidth, m_iMbHeight, 0, 0, m_iMvRange, | ||
| 231 | & (sSlice.sMvStartMin), & (sSlice.sMvStartMax)); | ||
| 232 | |||
| 233 | |||
| 234 | sMe.pRefMb = pRef + sMe.sMvp.iMvY * m_iWidthExt; | ||
| 235 | WelsDiamondSearch (&sFuncList, &sMe, &sSlice, m_iWidth, m_iWidthExt); | ||
| 236 | |||
| 237 | if ((WELS_ABS (sMe.sMv.iMvX) > m_iMvRange)) | ||
| 238 | printf ("mvx = %d\n", sMe.sMv.iMvX); | ||
| 239 | ASSERT_TRUE (! (WELS_ABS (sMe.sMv.iMvX) > m_iMvRange)); | ||
| 240 | if ((WELS_ABS (sMe.sMv.iMvY) > m_iMvRange)) | ||
| 241 | printf ("mvy = %d\n", sMe.sMv.iMvY); | ||
| 242 | ASSERT_TRUE (! (WELS_ABS (sMe.sMv.iMvY) > m_iMvRange)); | ||
| 243 | |||
| 244 | |||
| 245 | } | ||
| 128 | 246 | ||
| 129 | void MotionEstimateTest::DoLineTest (PLineFullSearchFunc func, bool vertical) { | 247 | void MotionEstimateTest::DoLineTest (PLineFullSearchFunc func, bool vertical) { |
| 130 | const int32_t kiMaxBlock16Sad = 72000;//a rough number | 248 | const int32_t kiMaxBlock16Sad = 72000;//a rough number |