• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <gtest/gtest.h>
2 #include <math.h>
3 #include <stdlib.h>
4 #include <time.h>
5 
6 #include "cpu_core.h"
7 #include "cpu.h"
8 #include "macros.h"
9 #include "encode_mb_aux.h"
10 #include "decode_mb_aux.h"
11 #include "wels_func_ptr_def.h"
12 
13 using namespace WelsEnc;
14 #define RECONTEST_NUM 1000
FillWithRandomData(uint8_t * p,int32_t Len)15 static void FillWithRandomData (uint8_t* p, int32_t Len) {
16   for (int32_t i = 0; i < Len; i++) {
17     p[i] = rand() % 256;
18   }
19 }
20 
TEST(ReconstructionFunTest,WelsIDctRecI16x16Dc)21 TEST (ReconstructionFunTest, WelsIDctRecI16x16Dc) {
22   ENFORCE_STACK_ALIGN_2D (uint8_t, pRec, 2, 16 * 16, 16)
23   ENFORCE_STACK_ALIGN_1D (uint8_t, pPred, 32 * 16, 16)
24   ENFORCE_STACK_ALIGN_1D (int16_t, pDct, 16, 16)
25   int32_t iCpuCores = 0;
26   SWelsFuncPtrList sFuncPtrList;
27   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
28   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
29 
30   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
31     FillWithRandomData (pPred, 32 * 16);
32     FillWithRandomData ((uint8_t*)pDct, 16 * 2);
33     for (int32_t i = 0 ; i < 16; i++) {
34       pDct[i] = WELS_CLIP3 (pDct[i], -4080, 4080);
35     }
36     WelsIDctRecI16x16Dc_c (pRec[0], 16, pPred, 32, pDct);
37     sFuncPtrList.pfIDctI16x16Dc (pRec[1], 16, pPred, 32, pDct);
38 
39     for (int32_t j = 0 ; j < 16; j++) {
40       for (int32_t i = 0 ; i < 16; i++) {
41         ASSERT_EQ (pRec[0][i + j * 16], pRec[1][i + j * 16]);
42       }
43     }
44   }
45 
46 }
47 
TEST(ReconstructionFunTest,WelsGetNoneZeroCount)48 TEST (ReconstructionFunTest, WelsGetNoneZeroCount) {
49   ENFORCE_STACK_ALIGN_1D (int16_t, pInput, 64, 16)
50   int32_t iZeroCount[2];
51   int32_t iCpuCores = 0;
52   SWelsFuncPtrList sFuncPtrList;
53   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
54   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
55 
56   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
57     FillWithRandomData ((uint8_t*)pInput, 128);
58     iZeroCount[0] = WelsGetNoneZeroCount_c (pInput);
59     iZeroCount[1] = sFuncPtrList.pfGetNoneZeroCount (pInput);
60     ASSERT_EQ (iZeroCount[0], iZeroCount[1]);
61   }
62 
63 }
64 
TEST(ReconstructionFunTest,WelsHadamardT4Dc)65 TEST (ReconstructionFunTest, WelsHadamardT4Dc) {
66   ENFORCE_STACK_ALIGN_1D (int16_t, pDct, 16 * 16, 16)
67   ENFORCE_STACK_ALIGN_2D (int16_t, pLumaDc, 2, 16, 16)
68   int32_t iCpuCores = 0;
69   SWelsFuncPtrList sFuncPtrList;
70   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
71   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
72 
73   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
74     FillWithRandomData ((uint8_t*)pDct, 16 * 16 * 2);
75     for (int32_t j = 0 ; j < 16; j++) {
76       for (int32_t i = 0 ; i < 16; i++) {
77         pDct[i + j * 16] = WELS_CLIP3 (pDct[i + j * 16], -4080, 4080);
78       }
79     }
80     WelsHadamardT4Dc_c (pLumaDc[0], pDct);
81     sFuncPtrList.pfTransformHadamard4x4Dc (pLumaDc[1], pDct);
82     for (int32_t i = 0 ; i < 16; i++) {
83       ASSERT_EQ (pLumaDc[0][i], pLumaDc[1][i]);
84     }
85   }
86 
87 
88 }
89 
TEST(ReconstructionFunTest,WelsDctT4)90 TEST (ReconstructionFunTest, WelsDctT4) {
91   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput1, 16 * 4, 16)
92   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput2, 32 * 4, 16)
93   ENFORCE_STACK_ALIGN_2D (int16_t, pOut, 2, 16, 16)
94 
95   int32_t iCpuCores = 0;
96   SWelsFuncPtrList sFuncPtrList;
97   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
98   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
99 
100   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
101     FillWithRandomData (pInput1, 16 * 4);
102     FillWithRandomData (pInput2, 32 * 4);
103     WelsDctT4_c (pOut[0], pInput1, 16, pInput2, 32);
104     sFuncPtrList.pfDctT4 (pOut[1], pInput1, 16, pInput2, 32);
105     for (int32_t i = 0 ; i < 16; i++) {
106       ASSERT_EQ (pOut[0][i], pOut[1][i]);
107     }
108   }
109 
110 
111   memset (pInput1, 255, 16 * 4);
112   memset (pInput2, 0, 32 * 4);
113   WelsDctT4_c (pOut[0], pInput1, 16, pInput2, 32);
114   sFuncPtrList.pfDctT4 (pOut[1], pInput1, 16, pInput2, 32);
115   for (int32_t i = 0 ; i < 16; i++) {
116     ASSERT_EQ (pOut[0][i], pOut[1][i]);
117   }
118 
119   memset (pInput1, 0, 16 * 4);
120   memset (pInput2, 255, 32 * 4);
121   WelsDctT4_c (pOut[0], pInput1, 16, pInput2, 32);
122   sFuncPtrList.pfDctT4 (pOut[1], pInput1, 16, pInput2, 32);
123   for (int32_t i = 0 ; i < 16; i++) {
124     ASSERT_EQ (pOut[0][i], pOut[1][i]);
125   }
126 }
127 
TEST(ReconstructionFunTest,WelsDctFourT4)128 TEST (ReconstructionFunTest, WelsDctFourT4) {
129   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput1, 16 * 8, 16)
130   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput2, 32 * 8, 16)
131   ENFORCE_STACK_ALIGN_2D (int16_t, pOut, 2, 64, 16)
132   int32_t iCpuCores = 0;
133   SWelsFuncPtrList sFuncPtrList;
134   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
135   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
136 
137   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
138     FillWithRandomData (pInput1, 16 * 8);
139     FillWithRandomData (pInput2, 32 * 8);
140     WelsDctFourT4_c (pOut[0], pInput1, 16, pInput2, 32);
141     sFuncPtrList.pfDctFourT4 (pOut[1], pInput1, 16, pInput2, 32);
142     for (int32_t i = 0 ; i < 64; i++) {
143       ASSERT_EQ (pOut[0][i], pOut[1][i]);
144     }
145   }
146 
147 }
148 
TEST(ReconstructionFunTest,WelsIDctT4Rec)149 TEST (ReconstructionFunTest, WelsIDctT4Rec) {
150   ENFORCE_STACK_ALIGN_2D (int16_t, pDct, 2, 16, 16)
151   ENFORCE_STACK_ALIGN_1D (uint8_t, pPred, 32 * 4, 16)
152   ENFORCE_STACK_ALIGN_2D (uint8_t, pRec, 2, 16 * 4, 16)
153   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput1, 16 * 4, 16)
154   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput2, 32 * 4, 16)
155   int32_t iCpuCores = 0;
156   SWelsFuncPtrList sFuncPtrList;
157   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
158   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
159   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
160 
161   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
162     FillWithRandomData (pPred, 32 * 4);
163     FillWithRandomData (pInput1, 16 * 4);
164     FillWithRandomData (pInput2, 32 * 4);
165     WelsDctT4_c (pDct[0], pInput1, 16, pInput2, 32);
166     sFuncPtrList.pfDctT4 (pDct[1], pInput1, 16, pInput2, 32);
167     WelsIDctT4Rec_c (pRec[0], 16, pPred, 32, pDct[0]);
168     sFuncPtrList.pfIDctT4 (pRec[1], 16, pPred, 32, pDct[1]);
169 
170     for (int32_t j = 0 ; j < 4; j++) {
171       for (int32_t i = 0 ; i < 4; i++) {
172         ASSERT_EQ (pRec[0][i + j * 16], pRec[1][i + j * 16]);
173       }
174     }
175   }
176 
177 
178   memset (pPred, 255, 32 * 4);
179   memset (pInput1, 255, 16 * 4);
180   memset (pInput2, 0, 32 * 4);
181   WelsDctT4_c (pDct[0], pInput1, 16, pInput2, 32);
182   sFuncPtrList.pfDctT4 (pDct[1], pInput1, 16, pInput2, 32);
183   WelsIDctT4Rec_c (pRec[0], 16, pPred, 32, pDct[0]);
184   sFuncPtrList.pfIDctT4 (pRec[1], 16, pPred, 32, pDct[1]);
185 
186   for (int32_t j = 0 ; j < 4; j++) {
187     for (int32_t i = 0 ; i < 4; i++) {
188       ASSERT_EQ (pRec[0][i + j * 16], pRec[1][i + j * 16]);
189     }
190   }
191 
192   memset (pPred, 255, 32 * 4);
193   memset (pInput1, 0, 16 * 4);
194   memset (pInput2, 255, 32 * 4);
195   WelsDctT4_c (pDct[0], pInput1, 16, pInput2, 32);
196   sFuncPtrList.pfDctT4 (pDct[1], pInput1, 16, pInput2, 32);
197   WelsIDctT4Rec_c (pRec[0], 16, pPred, 32, pDct[0]);
198   sFuncPtrList.pfIDctT4 (pRec[1], 16, pPred, 32, pDct[1]);
199 
200   for (int32_t j = 0 ; j < 4; j++) {
201     for (int32_t i = 0 ; i < 4; i++) {
202       ASSERT_EQ (pRec[0][i + j * 16], pRec[1][i + j * 16]);
203     }
204   }
205 
206 }
207 
208 
TEST(ReconstructionFunTest,WelsIDctFourT4Rec)209 TEST (ReconstructionFunTest, WelsIDctFourT4Rec) {
210   ENFORCE_STACK_ALIGN_2D (int16_t, pDct, 2, 64, 16)
211   ENFORCE_STACK_ALIGN_1D (uint8_t, pPred, 32 * 8, 16)
212   ENFORCE_STACK_ALIGN_2D (uint8_t, pRec, 2, 16 * 8, 16)
213   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput1, 16 * 8, 16)
214   ENFORCE_STACK_ALIGN_1D (uint8_t, pInput2, 32 * 8, 16)
215   int32_t iCpuCores = 0;
216   SWelsFuncPtrList sFuncPtrList;
217   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
218   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
219   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
220 
221   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
222     FillWithRandomData (pInput1, 16 * 8);
223     FillWithRandomData (pInput2, 32 * 8);
224     FillWithRandomData (pPred, 32 * 8);
225     WelsDctFourT4_c (pDct[0], pInput1, 16, pInput2, 32);
226     sFuncPtrList.pfDctFourT4 (pDct[1], pInput1, 16, pInput2, 32);
227     WelsIDctFourT4Rec_c (pRec[0], 16, pPred, 32, pDct[0]);
228     sFuncPtrList.pfIDctFourT4 (pRec[1], 16, pPred, 32, pDct[1]);
229     for (int32_t j = 0 ; j < 8; j++) {
230       for (int32_t i = 0 ; i < 8; i++) {
231         ASSERT_EQ (pRec[0][i + j * 16], pRec[1][i + j * 16]);
232       }
233     }
234   }
235 
236 }
237 
238 
TEST(ReconstructionFunTest,WelsDequant4x4)239 TEST (ReconstructionFunTest, WelsDequant4x4) {
240   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 16, 16)
241   int32_t iCpuCores = 0;
242   SWelsFuncPtrList sFuncPtrList;
243   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
244   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
245   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
246 
247   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
248     uint8_t uiQp = rand() % 52;
249     FillWithRandomData ((uint8_t*)pInput[0], 32);
250     for (int32_t i = 0 ; i < 16; i++) {
251       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
252     }
253     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 32);
254 
255     const int16_t* pMF = g_kiQuantMF[uiQp];
256     const int16_t* pFF = g_iQuantIntraFF[uiQp];
257     WelsQuant4x4_c (pInput[0], pFF, pMF);
258     sFuncPtrList.pfQuantization4x4 (pInput[1], pFF, pMF);
259 
260     WelsDequant4x4_c (pInput[0], g_kuiDequantCoeff[uiQp]);
261     sFuncPtrList.pfDequantization4x4 (pInput[1], g_kuiDequantCoeff[uiQp]);
262     for (int32_t i = 0 ; i < 16; i++) {
263       ASSERT_EQ (pInput[0][i], pInput[1][i]);
264     }
265   }
266 
267 }
268 
TEST(ReconstructionFunTest,WelsDequantIHadamard4x4)269 TEST (ReconstructionFunTest, WelsDequantIHadamard4x4) {
270   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 16, 16)
271   int32_t iCpuCores = 0;
272   SWelsFuncPtrList sFuncPtrList;
273   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
274   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
275   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
276 
277   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
278     uint8_t uiQp = rand() % 52;
279     FillWithRandomData ((uint8_t*)pInput[0], 32);
280     for (int32_t i = 0 ; i < 16; i++) {
281       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
282     }
283     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 32);
284 
285     const int16_t* pMF = g_kiQuantMF[uiQp];
286     const int16_t* pFF = g_iQuantIntraFF[uiQp];
287     WelsQuant4x4_c (pInput[0], pFF, pMF);
288     sFuncPtrList.pfQuantization4x4 (pInput[1], pFF, pMF);
289 
290     WelsDequantIHadamard4x4_c (pInput[0], g_kuiDequantCoeff[uiQp][0]);
291     sFuncPtrList.pfDequantizationIHadamard4x4 (pInput[1], g_kuiDequantCoeff[uiQp][0]);
292     for (int32_t i = 0 ; i < 16; i++) {
293       ASSERT_EQ (pInput[0][i], pInput[1][i]);
294     }
295   }
296 
297 }
298 
TEST(ReconstructionFunTest,WelsQuant4x4)299 TEST (ReconstructionFunTest, WelsQuant4x4) {
300   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 16, 16)
301   int32_t iCpuCores = 0;
302   SWelsFuncPtrList sFuncPtrList;
303   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
304   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
305 
306   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
307     uint8_t uiQp = rand() % 52;
308     FillWithRandomData ((uint8_t*)pInput[0], 32);
309     for (int32_t i = 0 ; i < 16; i++) {
310       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
311     }
312     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 32);
313 
314     const int16_t* pMF = g_kiQuantMF[uiQp];
315     const int16_t* pFF = g_iQuantIntraFF[uiQp];
316     WelsQuant4x4_c (pInput[0], pFF, pMF);
317     sFuncPtrList.pfQuantization4x4 (pInput[1], pFF, pMF);
318     for (int32_t i = 0 ; i < 16; i++) {
319       ASSERT_EQ (pInput[0][i], pInput[1][i]);
320     }
321   }
322 
323 }
324 
325 
TEST(ReconstructionFunTest,WelsQuant4x4Dc)326 TEST (ReconstructionFunTest, WelsQuant4x4Dc) {
327   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 16, 16)
328   int32_t iCpuCores = 0;
329   SWelsFuncPtrList sFuncPtrList;
330   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
331   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
332 
333   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
334     uint8_t uiQp = rand() % 52;
335     FillWithRandomData ((uint8_t*)pInput[0], 32);
336     for (int32_t i = 0 ; i < 16; i++) {
337       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
338     }
339     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 32);
340 
341     const int16_t* pMF = g_kiQuantMF[uiQp];
342     const int16_t* pFF = g_iQuantIntraFF[uiQp];
343     WelsQuant4x4Dc_c (pInput[0], pFF[0], pMF[0]);
344     sFuncPtrList.pfQuantizationDc4x4 (pInput[1], pFF[0], pMF[0]);
345     for (int32_t i = 0 ; i < 16; i++) {
346       ASSERT_EQ (pInput[0][i], pInput[1][i]);
347     }
348   }
349 
350 }
351 
TEST(ReconstructionFunTest,WelsQuantFour4x4)352 TEST (ReconstructionFunTest, WelsQuantFour4x4) {
353   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 64, 16)
354   int32_t iCpuCores = 0;
355   SWelsFuncPtrList sFuncPtrList;
356   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
357   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
358 
359   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
360     uint8_t uiQp = rand() % 52;
361     FillWithRandomData ((uint8_t*)pInput[0], 128);
362     for (int32_t i = 0 ; i < 64; i++) {
363       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
364     }
365     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 128);
366 
367     const int16_t* pMF = g_kiQuantMF[uiQp];
368     const int16_t* pFF = g_iQuantIntraFF[uiQp];
369     WelsQuantFour4x4_c (pInput[0], pFF, pMF);
370     sFuncPtrList.pfQuantizationFour4x4 (pInput[1], pFF, pMF);
371     for (int32_t i = 0 ; i < 64; i++) {
372       ASSERT_EQ (pInput[0][i], pInput[1][i]);
373     }
374   }
375 
376 }
377 
TEST(ReconstructionFunTest,WelsQuantFour4x4Max)378 TEST (ReconstructionFunTest, WelsQuantFour4x4Max) {
379   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 64, 16)
380   int32_t iCpuCores = 0;
381   SWelsFuncPtrList sFuncPtrList;
382   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
383   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
384 
385   int16_t pMax[2][4];
386   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
387     uint8_t uiQp = rand() % 52;
388     FillWithRandomData ((uint8_t*)pInput[0], 128);
389     for (int32_t i = 0 ; i < 64; i++) {
390       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
391     }
392     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 128);
393 
394     const int16_t* pMF = g_kiQuantMF[uiQp];
395     const int16_t* pFF = g_iQuantIntraFF[uiQp];
396     WelsQuantFour4x4Max_c (pInput[0], pFF, pMF, pMax[0]);
397     sFuncPtrList.pfQuantizationFour4x4Max (pInput[1], pFF, pMF, pMax[1]);
398     for (int32_t i = 0 ; i < 64; i++) {
399       ASSERT_EQ (pInput[0][i], pInput[1][i]);
400       ASSERT_EQ (pMax[0][i >> 4], pMax[1][i >> 4]);
401     }
402   }
403 }
404 
TEST(ReconstructionFunTest,WelsDeQuantFour4x4)405 TEST (ReconstructionFunTest, WelsDeQuantFour4x4) {
406   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 64, 16)
407   int32_t iCpuCores = 0;
408   SWelsFuncPtrList sFuncPtrList;
409   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
410   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
411   WelsInitReconstructionFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
412 
413   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
414     uint8_t uiQp = rand() % 52;
415     FillWithRandomData ((uint8_t*)pInput[0], 128);
416     for (int32_t i = 0 ; i < 64; i++) {
417       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -32000, 32000);
418     }
419     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 128);
420 
421     const int16_t* pMF = g_kiQuantMF[uiQp];
422     const int16_t* pFF = g_iQuantIntraFF[uiQp];
423     WelsQuantFour4x4_c (pInput[0], pFF, pMF);
424     sFuncPtrList.pfQuantizationFour4x4 (pInput[1], pFF, pMF);
425 
426     WelsDequantFour4x4_c (pInput[0], g_kuiDequantCoeff[uiQp]);
427     sFuncPtrList.pfDequantizationFour4x4 (pInput[1], g_kuiDequantCoeff[uiQp]);
428     for (int32_t i = 0 ; i < 64; i++) {
429       ASSERT_EQ (pInput[0][i], pInput[1][i]);
430     }
431   }
432 }
433 
TEST(ReconstructionFunTest,WelsHadamardQuant2x2Skip)434 TEST (ReconstructionFunTest, WelsHadamardQuant2x2Skip) {
435   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 64, 16)
436   int32_t iCpuCores = 0;
437   SWelsFuncPtrList sFuncPtrList;
438   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
439   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
440 
441   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
442     uint8_t uiQp = rand() % 52;
443     FillWithRandomData ((uint8_t*)pInput[0], 128);
444     for (int32_t i = 0 ; i < 64; i++) {
445       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -4080, 4080);
446     }
447     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 128);
448 
449     const int16_t* pMF = g_kiQuantMF[uiQp];
450     const int16_t* pFF = g_iQuantIntraFF[uiQp];
451     int32_t iSkip_c = WelsHadamardQuant2x2Skip_c (pInput[0], pFF[0], pMF[0]);
452     int32_t iSkip_test = sFuncPtrList.pfQuantizationHadamard2x2Skip (pInput[1], pFF[0], pMF[0]);
453 
454     ASSERT_EQ ((iSkip_test != 0), (iSkip_c != 0));
455   }
456 
457 }
458 
TEST(ReconstructionFunTest,WelsHadamardQuant2x2)459 TEST (ReconstructionFunTest, WelsHadamardQuant2x2) {
460   ENFORCE_STACK_ALIGN_2D (int16_t, pInput, 2, 64, 16)
461   ENFORCE_STACK_ALIGN_2D (int16_t, pDct, 2, 4, 16)
462   ENFORCE_STACK_ALIGN_2D (int16_t, pBlock, 2, 4, 16)
463   int32_t iCpuCores = 0;
464   SWelsFuncPtrList sFuncPtrList;
465   uint32_t m_uiCpuFeatureFlag = WelsCPUFeatureDetect (&iCpuCores);
466   WelsInitEncodingFuncs (&sFuncPtrList, m_uiCpuFeatureFlag);
467 
468   for (int32_t k = 0; k < RECONTEST_NUM; k++) {
469     uint8_t uiQp = rand() % 52;
470     FillWithRandomData ((uint8_t*)pInput[0], 128);
471     for (int32_t i = 0 ; i < 64; i++) {
472       pInput[0][i] = WELS_CLIP3 (pInput[0][i], -4080, 4080);
473     }
474     memcpy ((uint8_t*)pInput[1], (uint8_t*)pInput[0], 128);
475 
476     const int16_t* pMF = g_kiQuantMF[uiQp];
477     const int16_t* pFF = g_iQuantIntraFF[uiQp];
478     int32_t iSkip_c = WelsHadamardQuant2x2_c (pInput[0], pFF[0], pMF[0], pDct[0], pBlock[0]);
479     int32_t iSkip_test = sFuncPtrList.pfQuantizationHadamard2x2 (pInput[1], pFF[0], pMF[0], pDct[1], pBlock[1]);
480 
481     ASSERT_EQ ((iSkip_test != 0), (iSkip_c != 0));
482     for (int32_t i = 0 ; i < 64; i++) {
483       ASSERT_EQ (pInput[0][i], pInput[1][i]);
484     }
485     for (int32_t i = 0 ; i < 4; i++) {
486       ASSERT_EQ (pDct[0][i], pDct[1][i]);
487       ASSERT_EQ (pBlock[0][i], pBlock[1][i]);
488     }
489   }
490 
491 }
492 
493