History

reorganize tests

Licai Guo committed 12 years ago

Commit f26bb571 parent 667bfe223 files · +68 −43Browse files

Showing the changes to test/decoder/DecUT_IntraPrediction.cpp (1 of 23 files). Show all

Unified · Split

test/decoder/DecUT_IntraPrediction.cpp+611−0
@@ -0,0 +1,611 @@
1+#include<gtest/gtest.h>
2+#include <time.h>
3+#include "../codec/decoder/core/inc/get_intra_predictor.h"
4+#include "typedefs.h"
5+#include "ls_defines.h"
6+using namespace WelsDec;
7+#define GENERATE_4x4_UT(pred, ref) \
8+ TEST(DecoderIntraPredictionTest, pred) { \
9+ const int32_t kiStride = 32; \
10+ int32_t iRunTimes = 1000; \
11+ uint8_t pPredBuffer[9 * kiStride]; \
12+ uint8_t pRefBuffer[9 * kiStride]; \
13+ srand((unsigned int)time(NULL)); \
14+ while(iRunTimes--) {\
15+ for (int i = 0; i < 9; i++) {\
16+ pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \
17+ pRefBuffer[i * kiStride] = pPredBuffer[i * kiStride] = rand() & 255; \
18+ } \
19+ pred (&pPredBuffer[kiStride + 1], kiStride); \
20+ ref (&pRefBuffer[kiStride + 1], kiStride); \
21+ bool ok = true; \
22+ for (int i = 0; i < 4; i++) \
23+ for (int j = 0; j < 4; j++) \
24+ if (pPredBuffer[(i+1) * kiStride + j + 1] != pRefBuffer[(i+1) * kiStride + j + 1]) { \
25+ ok = false; \
26+ break; \
27+ } \
28+ EXPECT_EQ(ok, true);\
29+ } \
30+ }
31+
32+#define PREDV(size) \
33+void LumaI##size##x##size##PredV(uint8_t *pPred, const int32_t kiStride) {\
34+ int i; \
35+ for (i = 0; i < size; i++) {\
36+ memcpy(pPred + i * kiStride, pPred - kiStride, size * sizeof(uint8_t)); \
37+ } \
38+}
39+
40+#define PREDH(size) \
41+void LumaI##size##x##size##PredH(uint8_t *pPred, const int32_t kiStride) {\
42+ for (int i = 0; i < size; i++) { \
43+ memset(pPred + i * kiStride, pPred[i * kiStride - 1], size * sizeof(uint8_t));\
44+ }\
45+}
46+
47+#define PREDDC(size, log) \
48+void LumaI##size##x##size##PredDC(uint8_t *pPred, const int32_t kiStride) {\
49+ int iSum = size; \
50+ for (int i = 0; i < size; i ++) \
51+ iSum += pPred[-1 + i * kiStride] + pPred[i - kiStride]; \
52+ uint8_t uiMean = iSum >>(log+1);\
53+ for (int i = 0; i < size; i ++) \
54+ memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \
55+}
56+
57+#define PREDDCLeft(size, log) \
58+void LumaI##size##x##size##PredDCLeft(uint8_t *pPred, const int32_t kiStride) {\
59+ int iSum = size/2; \
60+ for (int i = 0; i < size; i ++) \
61+ iSum += pPred[-1 + i * kiStride]; \
62+ uint8_t uiMean = iSum >>(log);\
63+ for (int i = 0; i < size; i ++) \
64+ memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \
65+}
66+
67+#define PREDDCTop(size, log) \
68+void LumaI##size##x##size##PredDCTop(uint8_t *pPred, const int32_t kiStride) {\
69+ int iSum = size/2; \
70+ for (int i = 0; i < size; i ++) \
71+ iSum += pPred[i - kiStride]; \
72+ uint8_t uiMean = iSum >>(log);\
73+ for (int i = 0; i < size; i ++) \
74+ memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \
75+}
76+
77+#define PREDDCNone(size, log) \
78+void LumaI##size##x##size##PredDCNone(uint8_t *pPred, const int32_t kiStride) {\
79+ uint8_t uiMean = 128;\
80+ for (int i = 0; i < size; i ++) \
81+ memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \
82+}
83+
84+
85+/*down pLeft*/
86+void WelsI4x4LumaPredDDL_ref (uint8_t* pPred, const int32_t kiStride) {
87+ const int32_t kiStride2 = kiStride << 1;
88+ const int32_t kiStride3 = kiStride + kiStride2;
89+ /*get pTop*/
90+ uint8_t* ptop = &pPred[-kiStride];
91+ const uint8_t kuiT0 = *ptop;
92+ const uint8_t kuiT1 = * (ptop + 1);
93+ const uint8_t kuiT2 = * (ptop + 2);
94+ const uint8_t kuiT3 = * (ptop + 3);
95+ const uint8_t kuiT4 = * (ptop + 4);
96+ const uint8_t kuiT5 = * (ptop + 5);
97+ const uint8_t kuiT6 = * (ptop + 6);
98+ const uint8_t kuiT7 = * (ptop + 7);
99+ const uint8_t kuiDDL0 = (2 + kuiT0 + kuiT2 + (kuiT1 << 1)) >> 2; // kDDL0
100+ const uint8_t kuiDDL1 = (2 + kuiT1 + kuiT3 + (kuiT2 << 1)) >> 2; // kDDL1
101+ const uint8_t kuiDDL2 = (2 + kuiT2 + kuiT4 + (kuiT3 << 1)) >> 2; // kDDL2
102+ const uint8_t kuiDDL3 = (2 + kuiT3 + kuiT5 + (kuiT4 << 1)) >> 2; // kDDL3
103+ const uint8_t kuiDDL4 = (2 + kuiT4 + kuiT6 + (kuiT5 << 1)) >> 2; // kDDL4
104+ const uint8_t kuiDDL5 = (2 + kuiT5 + kuiT7 + (kuiT6 << 1)) >> 2; // kDDL5
105+ const uint8_t kuiDDL6 = (2 + kuiT6 + kuiT7 + (kuiT7 << 1)) >> 2; // kDDL6
106+ const uint8_t kuiList[8] = { kuiDDL0, kuiDDL1, kuiDDL2, kuiDDL3, kuiDDL4, kuiDDL5, kuiDDL6, 0 };
107+
108+ ST32 (pPred , LD32 (kuiList));
109+ ST32 (pPred + kiStride , LD32 (kuiList + 1));
110+ ST32 (pPred + kiStride2, LD32 (kuiList + 2));
111+ ST32 (pPred + kiStride3, LD32 (kuiList + 3));
112+}
113+
114+/*down pLeft*/
115+void WelsI4x4LumaPredDDLTop_ref (uint8_t* pPred, const int32_t kiStride) {
116+ const int32_t kiStride2 = kiStride << 1;
117+ const int32_t kiStride3 = kiStride + kiStride2;
118+ /*get pTop*/
119+ uint8_t* ptop = &pPred[-kiStride];
120+ const uint8_t kuiT0 = *ptop;
121+ const uint8_t kuiT1 = * (ptop + 1);
122+ const uint8_t kuiT2 = * (ptop + 2);
123+ const uint8_t kuiT3 = * (ptop + 3);
124+ const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
125+ const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
126+ const uint16_t kuiT23 = 1 + kuiT2 + kuiT3;
127+ const uint16_t kuiT33 = 1 + (kuiT3 << 1);
128+ const uint8_t kuiDLT0 = (kuiT01 + kuiT12) >> 2; // kDLT0
129+ const uint8_t kuiDLT1 = (kuiT12 + kuiT23) >> 2; // kDLT1
130+ const uint8_t kuiDLT2 = (kuiT23 + kuiT33) >> 2; // kDLT2
131+ const uint8_t kuiDLT3 = kuiT33 >> 1; // kDLT3
132+ const uint8_t kuiList[8] = { kuiDLT0, kuiDLT1, kuiDLT2, kuiDLT3, kuiDLT3, kuiDLT3, kuiDLT3 , kuiDLT3 };
133+
134+ ST32 (pPred, LD32 (kuiList));
135+ ST32 (pPred + kiStride, LD32 (kuiList + 1));
136+ ST32 (pPred + kiStride2, LD32 (kuiList + 2));
137+ ST32 (pPred + kiStride3, LD32 (kuiList + 3));
138+}
139+
140+
141+/*down right*/
142+void WelsI4x4LumaPredDDR_ref (uint8_t* pPred, const int32_t kiStride) {
143+ const int32_t kiStride2 = kiStride << 1;
144+ const int32_t kiStride3 = kiStride + kiStride2;
145+ uint8_t* ptopleft = &pPred[- (kiStride + 1)];
146+ uint8_t* pleft = &pPred[-1];
147+ const uint8_t kuiLT = *ptopleft;
148+ /*get pLeft and pTop*/
149+ const uint8_t kuiL0 = *pleft;
150+ const uint8_t kuiL1 = * (pleft + kiStride);
151+ const uint8_t kuiL2 = * (pleft + kiStride2);
152+ const uint8_t kuiL3 = * (pleft + kiStride3);
153+ const uint8_t kuiT0 = * (ptopleft + 1);
154+ const uint8_t kuiT1 = * (ptopleft + 2);
155+ const uint8_t kuiT2 = * (ptopleft + 3);
156+ const uint8_t kuiT3 = * (ptopleft + 4);
157+ const uint16_t kuiTL0 = 1 + kuiLT + kuiL0;
158+ const uint16_t kuiLT0 = 1 + kuiLT + kuiT0;
159+ const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
160+ const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
161+ const uint16_t kuiT23 = 1 + kuiT2 + kuiT3;
162+ const uint16_t kuiL01 = 1 + kuiL0 + kuiL1;
163+ const uint16_t kuiL12 = 1 + kuiL1 + kuiL2;
164+ const uint16_t kuiL23 = 1 + kuiL2 + kuiL3;
165+ const uint8_t kuiDDR0 = (kuiTL0 + kuiLT0) >> 2; // kuiDDR0
166+ const uint8_t kuiDDR1 = (kuiLT0 + kuiT01) >> 2; // kuiDDR1
167+ const uint8_t kuiDDR2 = (kuiT01 + kuiT12) >> 2; // kuiDDR2
168+ const uint8_t kuiDDR3 = (kuiT12 + kuiT23) >> 2; // kuiDDR3
169+ const uint8_t kuiDDR4 = (kuiTL0 + kuiL01) >> 2; // kuiDDR4
170+ const uint8_t kuiDDR5 = (kuiL01 + kuiL12) >> 2; // kuiDDR5
171+ const uint8_t kuiDDR6 = (kuiL12 + kuiL23) >> 2; // kuiDDR6
172+ const uint8_t kuiList[8] = { kuiDDR6, kuiDDR5, kuiDDR4, kuiDDR0, kuiDDR1, kuiDDR2, kuiDDR3, 0 };
173+
174+ ST32 (pPred , LD32 (kuiList + 3));
175+ ST32 (pPred + kiStride , LD32 (kuiList + 2));
176+ ST32 (pPred + kiStride2, LD32 (kuiList + 1));
177+ ST32 (pPred + kiStride3, LD32 (kuiList));
178+}
179+
180+
181+/*vertical pLeft*/
182+void WelsI4x4LumaPredVL_ref (uint8_t* pPred, const int32_t kiStride) {
183+ const int32_t kiStride2 = kiStride << 1;
184+ const int32_t kiStride3 = kiStride + kiStride2;
185+ uint8_t* ptopleft = &pPred[- (kiStride + 1)];
186+ /*get pTop*/
187+ const uint8_t kuiT0 = * (ptopleft + 1);
188+ const uint8_t kuiT1 = * (ptopleft + 2);
189+ const uint8_t kuiT2 = * (ptopleft + 3);
190+ const uint8_t kuiT3 = * (ptopleft + 4);
191+ const uint8_t kuiT4 = * (ptopleft + 5);
192+ const uint8_t kuiT5 = * (ptopleft + 6);
193+ const uint8_t kuiT6 = * (ptopleft + 7);
194+ const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
195+ const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
196+ const uint16_t kuiT23 = 1 + kuiT2 + kuiT3;
197+ const uint16_t kuiT34 = 1 + kuiT3 + kuiT4;
198+ const uint16_t kuiT45 = 1 + kuiT4 + kuiT5;
199+ const uint16_t kuiT56 = 1 + kuiT5 + kuiT6;
200+ const uint8_t kuiVL0 = kuiT01 >> 1; // kuiVL0
201+ const uint8_t kuiVL1 = kuiT12 >> 1; // kuiVL1
202+ const uint8_t kuiVL2 = kuiT23 >> 1; // kuiVL2
203+ const uint8_t kuiVL3 = kuiT34 >> 1; // kuiVL3
204+ const uint8_t kuiVL4 = kuiT45 >> 1; // kuiVL4
205+ const uint8_t kuiVL5 = (kuiT01 + kuiT12) >> 2; // kuiVL5
206+ const uint8_t kuiVL6 = (kuiT12 + kuiT23) >> 2; // kuiVL6
207+ const uint8_t kuiVL7 = (kuiT23 + kuiT34) >> 2; // kuiVL7
208+ const uint8_t kuiVL8 = (kuiT34 + kuiT45) >> 2; // kuiVL8
209+ const uint8_t kuiVL9 = (kuiT45 + kuiT56) >> 2; // kuiVL9
210+ const uint8_t kuiList[10] = { kuiVL0, kuiVL1, kuiVL2, kuiVL3, kuiVL4, kuiVL5, kuiVL6, kuiVL7, kuiVL8, kuiVL9 };
211+
212+ ST32 (pPred, LD32 (kuiList));
213+ ST32 (pPred + kiStride, LD32 (kuiList + 5));
214+ ST32 (pPred + kiStride2, LD32 (kuiList + 1));
215+ ST32 (pPred + kiStride3, LD32 (kuiList + 6));
216+}
217+
218+/*vertical pLeft*/
219+void WelsI4x4LumaPredVLTop_ref (uint8_t* pPred, const int32_t kiStride) {
220+ const int32_t kiStride2 = kiStride << 1;
221+ const int32_t kiStride3 = kiStride + kiStride2;
222+ uint8_t* ptopleft = &pPred[- (kiStride + 1)];
223+ /*get pTop*/
224+ const uint8_t kuiT0 = * (ptopleft + 1);
225+ const uint8_t kuiT1 = * (ptopleft + 2);
226+ const uint8_t kuiT2 = * (ptopleft + 3);
227+ const uint8_t kuiT3 = * (ptopleft + 4);
228+ const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
229+ const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
230+ const uint16_t kuiT23 = 1 + kuiT2 + kuiT3;
231+ const uint16_t kuiT33 = 1 + (kuiT3 << 1);
232+ const uint8_t kuiVL0 = kuiT01 >> 1;
233+ const uint8_t kuiVL1 = kuiT12 >> 1;
234+ const uint8_t kuiVL2 = kuiT23 >> 1;
235+ const uint8_t kuiVL3 = kuiT33 >> 1;
236+ const uint8_t kuiVL4 = (kuiT01 + kuiT12) >> 2;
237+ const uint8_t kuiVL5 = (kuiT12 + kuiT23) >> 2;
238+ const uint8_t kuiVL6 = (kuiT23 + kuiT33) >> 2;
239+ const uint8_t kuiVL7 = kuiVL3;
240+ const uint8_t kuiList[10] = { kuiVL0, kuiVL1, kuiVL2, kuiVL3, kuiVL3, kuiVL4, kuiVL5, kuiVL6, kuiVL7, kuiVL7 };
241+
242+ ST32 (pPred , LD32 (kuiList));
243+ ST32 (pPred + kiStride , LD32 (kuiList + 5));
244+ ST32 (pPred + kiStride2, LD32 (kuiList + 1));
245+ ST32 (pPred + kiStride3, LD32 (kuiList + 6));
246+}
247+
248+
249+/*vertical right*/
250+void WelsI4x4LumaPredVR_ref (uint8_t* pPred, const int32_t kiStride) {
251+ const int32_t kiStride2 = kiStride << 1;
252+ const int32_t kiStride3 = kiStride + kiStride2;
253+ const uint8_t kuiLT = pPred[-kiStride - 1];
254+ /*get pLeft and pTop*/
255+ const uint8_t kuiL0 = pPred[ -1];
256+ const uint8_t kuiL1 = pPred[kiStride - 1];
257+ const uint8_t kuiL2 = pPred[kiStride2 - 1];
258+ const uint8_t kuiT0 = pPred[ -kiStride];
259+ const uint8_t kuiT1 = pPred[1 - kiStride];
260+ const uint8_t kuiT2 = pPred[2 - kiStride];
261+ const uint8_t kuiT3 = pPred[3 - kiStride];
262+ const uint8_t kuiVR0 = (1 + kuiLT + kuiT0) >> 1; // kuiVR0
263+ const uint8_t kuiVR1 = (1 + kuiT0 + kuiT1) >> 1; // kuiVR1
264+ const uint8_t kuiVR2 = (1 + kuiT1 + kuiT2) >> 1; // kuiVR2
265+ const uint8_t kuiVR3 = (1 + kuiT2 + kuiT3) >> 1; // kuiVR3
266+ const uint8_t kuiVR4 = (2 + kuiL0 + (kuiLT << 1) + kuiT0) >> 2; // kuiVR4
267+ const uint8_t kuiVR5 = (2 + kuiLT + (kuiT0 << 1) + kuiT1) >> 2; // kuiVR5
268+ const uint8_t kuiVR6 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2; // kuiVR6
269+ const uint8_t kuiVR7 = (2 + kuiT1 + (kuiT2 << 1) + kuiT3) >> 2; // kuiVR7
270+ const uint8_t kuiVR8 = (2 + kuiLT + (kuiL0 << 1) + kuiL1) >> 2; // kuiVR8
271+ const uint8_t kuiVR9 = (2 + kuiL0 + (kuiL1 << 1) + kuiL2) >> 2; // kuiVR9
272+ const uint8_t kuiList[10] = { kuiVR8, kuiVR0, kuiVR1, kuiVR2, kuiVR3, kuiVR9, kuiVR4, kuiVR5, kuiVR6, kuiVR7 };
273+
274+ ST32 (pPred , LD32 (kuiList + 1));
275+ ST32 (pPred + kiStride , LD32 (kuiList + 6));
276+ ST32 (pPred + kiStride2, LD32 (kuiList));
277+ ST32 (pPred + kiStride3, LD32 (kuiList + 5));
278+}
279+
280+/*horizontal up*/
281+void WelsI4x4LumaPredHU_ref (uint8_t* pPred, const int32_t kiStride) {
282+ const int32_t kiStride2 = kiStride << 1;
283+ const int32_t kiStride3 = kiStride + kiStride2;
284+ /*get pLeft*/
285+ const uint8_t kuiL0 = pPred[ -1];
286+ const uint8_t kuiL1 = pPred[kiStride - 1];
287+ const uint8_t kuiL2 = pPred[kiStride2 - 1];
288+ const uint8_t kuiL3 = pPred[kiStride3 - 1];
289+ const uint16_t kuiL01 = 1 + kuiL0 + kuiL1;
290+ const uint16_t kuiL12 = 1 + kuiL1 + kuiL2;
291+ const uint16_t kuiL23 = 1 + kuiL2 + kuiL3;
292+ const uint8_t kuiHU0 = kuiL01 >> 1;
293+ const uint8_t kuiHU1 = (kuiL01 + kuiL12) >> 2;
294+ const uint8_t kuiHU2 = kuiL12 >> 1;
295+ const uint8_t kuiHU3 = (kuiL12 + kuiL23) >> 2;
296+ const uint8_t kuiHU4 = kuiL23 >> 1;
297+ const uint8_t kuiHU5 = (1 + kuiL23 + (kuiL3 << 1)) >> 2;
298+ const uint8_t kuiList[10] = { kuiHU0, kuiHU1, kuiHU2, kuiHU3, kuiHU4, kuiHU5, kuiL3, kuiL3, kuiL3, kuiL3 };
299+
300+ ST32 (pPred , LD32 (kuiList));
301+ ST32 (pPred + kiStride , LD32 (kuiList + 2));
302+ ST32 (pPred + kiStride2, LD32 (kuiList + 4));
303+ ST32 (pPred + kiStride3, LD32 (kuiList + 6));
304+}
305+
306+/*horizontal down*/
307+void WelsI4x4LumaPredHD_ref (uint8_t* pPred, const int32_t kiStride) {
308+ const int32_t kiStride2 = kiStride << 1;
309+ const int32_t kiStride3 = kiStride + kiStride2;
310+ const uint8_t kuiLT = pPred[- (kiStride + 1)];
311+ /*get pLeft and pTop*/
312+ const uint8_t kuiL0 = pPred[-1 ];
313+ const uint8_t kuiL1 = pPred[-1 + kiStride ];
314+ const uint8_t kuiL2 = pPred[-1 + kiStride2];
315+ const uint8_t kuiL3 = pPred[-1 + kiStride3];
316+ const uint8_t kuiT0 = pPred[-kiStride ];
317+ const uint8_t kuiT1 = pPred[-kiStride + 1 ];
318+ const uint8_t kuiT2 = pPred[-kiStride + 2 ];
319+ const uint16_t kuiTL0 = 1 + kuiLT + kuiL0;
320+ const uint16_t kuiLT0 = 1 + kuiLT + kuiT0;
321+ const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
322+ const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
323+ const uint16_t kuiL01 = 1 + kuiL0 + kuiL1;
324+ const uint16_t kuiL12 = 1 + kuiL1 + kuiL2;
325+ const uint16_t kuiL23 = 1 + kuiL2 + kuiL3;
326+ const uint8_t kuiHD0 = kuiTL0 >> 1;
327+ const uint8_t kuiHD1 = (kuiTL0 + kuiLT0) >> 2;
328+ const uint8_t kuiHD2 = (kuiLT0 + kuiT01) >> 2;
329+ const uint8_t kuiHD3 = (kuiT01 + kuiT12) >> 2;
330+ const uint8_t kuiHD4 = kuiL01 >> 1;
331+ const uint8_t kuiHD5 = (kuiTL0 + kuiL01) >> 2;
332+ const uint8_t kuiHD6 = kuiL12 >> 1;
333+ const uint8_t kuiHD7 = (kuiL01 + kuiL12) >> 2;
334+ const uint8_t kuiHD8 = kuiL23 >> 1;
335+ const uint8_t kuiHD9 = (kuiL12 + kuiL23) >> 2;
336+ const uint8_t kuiList[10] = { kuiHD8, kuiHD9, kuiHD6, kuiHD7, kuiHD4, kuiHD5, kuiHD0, kuiHD1, kuiHD2, kuiHD3 };
337+
338+ ST32 (pPred , LD32 (kuiList + 6));
339+ ST32 (pPred + kiStride , LD32 (kuiList + 4));
340+ ST32 (pPred + kiStride2, LD32 (kuiList + 2));
341+ ST32 (pPred + kiStride3, LD32 (kuiList));
342+}
343+// Unit test for Luma 4x4 cases
344+PREDV (4)
345+GENERATE_4x4_UT (WelsI4x4LumaPredV_c, LumaI4x4PredV)
346+
347+PREDH (4)
348+GENERATE_4x4_UT (WelsI4x4LumaPredH_c, LumaI4x4PredH)
349+
350+PREDDC (4, 2)
351+GENERATE_4x4_UT (WelsI4x4LumaPredDc_c, LumaI4x4PredDC)
352+
353+PREDDCLeft (4, 2)
354+GENERATE_4x4_UT (WelsI4x4LumaPredDcLeft_c, LumaI4x4PredDCLeft)
355+
356+PREDDCTop (4, 2)
357+GENERATE_4x4_UT (WelsI4x4LumaPredDcTop_c, LumaI4x4PredDCTop)
358+
359+PREDDCNone (4, 2)
360+GENERATE_4x4_UT (WelsI4x4LumaPredDcNA_c, LumaI4x4PredDCNone)
361+GENERATE_4x4_UT (WelsI4x4LumaPredDDL_c, WelsI4x4LumaPredDDL_ref)
362+GENERATE_4x4_UT (WelsI4x4LumaPredDDLTop_c, WelsI4x4LumaPredDDLTop_ref)
363+GENERATE_4x4_UT (WelsI4x4LumaPredDDR_c, WelsI4x4LumaPredDDR_ref)
364+GENERATE_4x4_UT (WelsI4x4LumaPredVR_c, WelsI4x4LumaPredVR_ref)
365+GENERATE_4x4_UT (WelsI4x4LumaPredVL_c, WelsI4x4LumaPredVL_ref)
366+GENERATE_4x4_UT (WelsI4x4LumaPredVLTop_c, WelsI4x4LumaPredVLTop_ref)
367+GENERATE_4x4_UT (WelsI4x4LumaPredHU_c, WelsI4x4LumaPredHU_ref)
368+GENERATE_4x4_UT (WelsI4x4LumaPredHD_c, WelsI4x4LumaPredHD_ref)
369+
370+#define GENERATE_8x8_UT(pred, ref) \
371+TEST(DecoderIntraPredictionTest, pred) {\
372+const int32_t kiStride = 32; \
373+int iRunTimes = 1000; \
374+uint8_t _pRefBuffer[18 * kiStride + 64]; \
375+uint8_t _pPredBuffer[18 * kiStride + 64]; \
376+uint8_t *pRefBuffer, *pPredBuffer; \
377+pRefBuffer = (uint8_t*)((((intptr_t)(&_pRefBuffer[31])) >> 4) << 4); \
378+pPredBuffer = (uint8_t*)((((intptr_t)(&_pPredBuffer[31])) >> 4) << 4); \
379+srand((unsigned int)time(NULL)); \
380+while(iRunTimes--) {\
381+for (int i = 0; i < 17; i ++) {\
382+ pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \
383+ pRefBuffer[i * kiStride - 1] = pPredBuffer[i * kiStride - 1] = rand() & 255; \
384+}\
385+pred(&pPredBuffer[kiStride], kiStride); \
386+ref(&pRefBuffer[kiStride], kiStride); \
387+bool ok = true; \
388+for (int i = 0; i < 8; i ++)\
389+ for(int j = 0; j < 8; j ++)\
390+ if (pPredBuffer[(i+1) * kiStride + j] != pRefBuffer[(i+1) * kiStride + j]) {\
391+ ok = false; \
392+ break; \
393+ } \
394+ EXPECT_EQ(ok, true); \
395+} \
396+}
397+
398+void WelsIChromaPredPlane_ref (uint8_t* pPred, const int32_t kiStride) {
399+ int32_t a = 0, b = 0, c = 0, H = 0, V = 0;
400+ int32_t i, j;
401+ uint8_t* pTop = &pPred[-kiStride];
402+ uint8_t* pLeft = &pPred[-1];
403+
404+ for (i = 0 ; i < 4 ; i ++) {
405+ H += (i + 1) * (pTop[4 + i] - pTop[2 - i]);
406+ V += (i + 1) * (pLeft[ (4 + i) * kiStride] - pLeft[ (2 - i) * kiStride]);
407+ }
408+
409+ a = (pLeft[7 * kiStride] + pTop[7]) << 4;
410+ b = (17 * H + 16) >> 5;
411+ c = (17 * V + 16) >> 5;
412+
413+ for (i = 0 ; i < 8 ; i ++) {
414+ for (j = 0 ; j < 8 ; j ++) {
415+ int32_t iTmp = (a + b * (j - 3) + c * (i - 3) + 16) >> 5;
416+ pPred[j] = (iTmp < 0) ? 0 : ((iTmp > 255) ? 255 : iTmp);
417+ }
418+ pPred += kiStride;
419+ }
420+}
421+
422+
423+void WelsIChromaPredDc_ref (uint8_t* pPred, const int32_t kiStride) {
424+ const int32_t kiL1 = kiStride - 1;
425+ const int32_t kiL2 = kiL1 + kiStride;
426+ const int32_t kiL3 = kiL2 + kiStride;
427+ const int32_t kiL4 = kiL3 + kiStride;
428+ const int32_t kiL5 = kiL4 + kiStride;
429+ const int32_t kiL6 = kiL5 + kiStride;
430+ const int32_t kiL7 = kiL6 + kiStride;
431+ /*caculate the kMean value*/
432+ const uint8_t kuiM1 = (pPred[-kiStride] + pPred[1 - kiStride] + pPred[2 - kiStride] + pPred[3 - kiStride] +
433+ pPred[-1] + pPred[kiL1] + pPred[kiL2] + pPred[kiL3] + 4) >> 3 ;
434+ const uint32_t kuiSum2 = pPred[4 - kiStride] + pPred[5 - kiStride] + pPred[6 - kiStride] + pPred[7 - kiStride];
435+ const uint32_t kuiSum3 = pPred[kiL4] + pPred[kiL5] + pPred[kiL6] + pPred[kiL7];
436+ const uint8_t kuiM2 = (kuiSum2 + 2) >> 2;
437+ const uint8_t kuiM3 = (kuiSum3 + 2) >> 2;
438+ const uint8_t kuiM4 = (kuiSum2 + kuiSum3 + 4) >> 3;
439+ const uint8_t kuiMUP[8] = {kuiM1, kuiM1, kuiM1, kuiM1, kuiM2, kuiM2, kuiM2, kuiM2};
440+ const uint8_t kuiMDown[8] = {kuiM3, kuiM3, kuiM3, kuiM3, kuiM4, kuiM4, kuiM4, kuiM4};
441+ const uint64_t kuiUP64 = LD64 (kuiMUP);
442+ const uint64_t kuiDN64 = LD64 (kuiMDown);
443+
444+ ST64 (pPred , kuiUP64);
445+ ST64 (pPred + kiL1 + 1, kuiUP64);
446+ ST64 (pPred + kiL2 + 1, kuiUP64);
447+ ST64 (pPred + kiL3 + 1, kuiUP64);
448+ ST64 (pPred + kiL4 + 1, kuiDN64);
449+ ST64 (pPred + kiL5 + 1, kuiDN64);
450+ ST64 (pPred + kiL6 + 1, kuiDN64);
451+ ST64 (pPred + kiL7 + 1, kuiDN64);
452+}
453+
454+void WelsIChromaPredDcLeft_ref (uint8_t* pPred, const int32_t kiStride) {
455+ const int32_t kiL1 = -1 + kiStride;
456+ const int32_t kiL2 = kiL1 + kiStride;
457+ const int32_t kiL3 = kiL2 + kiStride;
458+ const int32_t kiL4 = kiL3 + kiStride;
459+ const int32_t kiL5 = kiL4 + kiStride;
460+ const int32_t kiL6 = kiL5 + kiStride;
461+ const int32_t kiL7 = kiL6 + kiStride;
462+ /*caculate the kMean value*/
463+ const uint8_t kuiMUP = (pPred[-1] + pPred[kiL1] + pPred[kiL2] + pPred[kiL3] + 2) >> 2 ;
464+ const uint8_t kuiMDown = (pPred[kiL4] + pPred[kiL5] + pPred[kiL6] + pPred[kiL7] + 2) >> 2;
465+ const uint64_t kuiUP64 = 0x0101010101010101ULL * kuiMUP;
466+ const uint64_t kuiDN64 = 0x0101010101010101ULL * kuiMDown;
467+
468+ ST64 (pPred , kuiUP64);
469+ ST64 (pPred + kiL1 + 1, kuiUP64);
470+ ST64 (pPred + kiL2 + 1, kuiUP64);
471+ ST64 (pPred + kiL3 + 1, kuiUP64);
472+ ST64 (pPred + kiL4 + 1, kuiDN64);
473+ ST64 (pPred + kiL5 + 1, kuiDN64);
474+ ST64 (pPred + kiL6 + 1, kuiDN64);
475+ ST64 (pPred + kiL7 + 1, kuiDN64);
476+}
477+
478+void WelsIChromaPredDcTop_ref (uint8_t* pPred, const int32_t kiStride) {
479+ int32_t iTmp = (kiStride << 3) - kiStride;
480+ /*caculate the kMean value*/
481+ const uint8_t kuiM1 = (pPred[-kiStride] + pPred[1 - kiStride] + pPred[2 - kiStride] + pPred[3 - kiStride] + 2) >> 2;
482+ const uint8_t kuiM2 = (pPred[4 - kiStride] + pPred[5 - kiStride] + pPred[6 - kiStride] + pPred[7 - kiStride] + 2) >>
483+ 2;
484+ const uint8_t kuiM[8] = {kuiM1, kuiM1, kuiM1, kuiM1, kuiM2, kuiM2, kuiM2, kuiM2};
485+
486+ uint8_t i = 7;
487+
488+ do {
489+ ST64 (pPred + iTmp, LD64 (kuiM));
490+
491+ iTmp -= kiStride;
492+ } while (i-- > 0);
493+}
494+PREDV (8)
495+PREDH (8)
496+PREDDCNone (8, 3)
497+GENERATE_8x8_UT (WelsIChromaPredDcNA_c, LumaI8x8PredDCNone)
498+GENERATE_8x8_UT (WelsIChromaPredPlane_c, WelsIChromaPredPlane_ref)
499+GENERATE_8x8_UT (WelsIChromaPredDc_c, WelsIChromaPredDc_ref)
500+GENERATE_8x8_UT (WelsIChromaPredDcTop_c, WelsIChromaPredDcTop_ref)
501+GENERATE_8x8_UT (WelsIChromaPredDcLeft_c, WelsIChromaPredDcLeft_ref)
502+GENERATE_8x8_UT (WelsIChromaPredH_c, LumaI8x8PredH)
503+GENERATE_8x8_UT (WelsIChromaPredV_c, LumaI8x8PredV)
504+#define GENERATE_16x16_UT(pred, ref) \
505+TEST(DecoderIntraPredictionTest, pred) {\
506+const int32_t kiStride = 32; \
507+int32_t iRunTimes = 1000; \
508+uint8_t _pRefBuffer[18 * kiStride + 64]; \
509+uint8_t _pPredBuffer[18 * kiStride + 64]; \
510+uint8_t *pRefBuffer, *pPredBuffer; \
511+pRefBuffer = (uint8_t*)((((intptr_t)(&_pRefBuffer[31])) >> 4) << 4); \
512+pPredBuffer = (uint8_t*)((((intptr_t)(&_pPredBuffer[31])) >> 4) << 4); \
513+srand((unsigned int)time(NULL)); \
514+while(iRunTimes--) {\
515+for (int i = 0; i < 17; i ++) {\
516+ pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \
517+ pRefBuffer[i * kiStride - 1] = pPredBuffer[i * kiStride - 1] = rand() & 255; \
518+}\
519+pred(&pPredBuffer[kiStride], kiStride); \
520+ref(&pRefBuffer[kiStride], kiStride); \
521+bool ok = true; \
522+for (int i = 0; i < 16; i ++)\
523+ for(int j = 0; j < 16; j ++)\
524+ if (pPredBuffer[(i+1) * kiStride + j] != pRefBuffer[(i+1) * kiStride + j]) {\
525+ ok = false; \
526+ break; \
527+ } \
528+ EXPECT_EQ(ok, true); \
529+} \
530+}
531+void WelsI16x16LumaPredPlane_ref (uint8_t* pPred, const int32_t kiStride) {
532+ int32_t a = 0, b = 0, c = 0, H = 0, V = 0;
533+ int32_t i, j;
534+ uint8_t* pTop = &pPred[-kiStride];
535+ uint8_t* pLeft = &pPred[-1];
536+
537+ for (i = 0 ; i < 8 ; i ++) {
538+ H += (i + 1) * (pTop[8 + i] - pTop[6 - i]);
539+ V += (i + 1) * (pLeft[ (8 + i) * kiStride] - pLeft[ (6 - i) * kiStride]);
540+ }
541+
542+ a = (pLeft[15 * kiStride] + pTop[15]) << 4;
543+ b = (5 * H + 32) >> 6;
544+ c = (5 * V + 32) >> 6;
545+
546+ for (i = 0 ; i < 16 ; i ++) {
547+ for (j = 0 ; j < 16 ; j ++) {
548+ int32_t iTmp = (a + b * (j - 7) + c * (i - 7) + 16) >> 5;
549+ pPred[j] = (iTmp < 0) ? 0 : ((iTmp > 255) ? 255 : iTmp);
550+ }
551+ pPred += kiStride;
552+ }
553+}
554+
555+PREDV (16)
556+PREDH (16)
557+PREDDC (16, 4)
558+PREDDCTop (16, 4)
559+PREDDCLeft (16, 4)
560+PREDDCNone (16, 4)
561+
562+GENERATE_16x16_UT (WelsI16x16LumaPredDcNA_c, LumaI16x16PredDCNone)
563+GENERATE_16x16_UT (WelsI16x16LumaPredPlane_c, WelsI16x16LumaPredPlane_ref)
564+GENERATE_16x16_UT (WelsI16x16LumaPredDcLeft_c, LumaI16x16PredDCLeft)
565+GENERATE_16x16_UT (WelsI16x16LumaPredDcTop_c, LumaI16x16PredDCTop)
566+GENERATE_16x16_UT (WelsI16x16LumaPredDc_c, LumaI16x16PredDC)
567+GENERATE_16x16_UT (WelsI16x16LumaPredH_c, LumaI16x16PredH)
568+GENERATE_16x16_UT (WelsI16x16LumaPredV_c, LumaI16x16PredV)
569+#if defined(X86_ASM)
570+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredH_sse2, LumaI4x4PredH)
571+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDR_mmx, WelsI4x4LumaPredDDR_ref)
572+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHD_mmx, WelsI4x4LumaPredHD_ref)
573+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHU_mmx, WelsI4x4LumaPredHU_ref)
574+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVR_mmx, WelsI4x4LumaPredVR_ref)
575+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDL_mmx, WelsI4x4LumaPredDDL_ref)
576+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVL_mmx, WelsI4x4LumaPredVL_ref)
577+GENERATE_8x8_UT (WelsDecoderIChromaPredDcTop_sse2, WelsIChromaPredDcTop_ref)
578+GENERATE_8x8_UT (WelsDecoderIChromaPredDc_sse2, WelsIChromaPredDc_ref)
579+GENERATE_8x8_UT (WelsDecoderIChromaPredPlane_sse2, WelsIChromaPredPlane_ref)
580+GENERATE_8x8_UT (WelsDecoderIChromaPredH_mmx, LumaI8x8PredH)
581+GENERATE_8x8_UT (WelsDecoderIChromaPredV_mmx, LumaI8x8PredV)
582+GENERATE_8x8_UT (WelsDecoderIChromaPredDcLeft_mmx, WelsIChromaPredDcLeft_ref)
583+GENERATE_8x8_UT (WelsDecoderIChromaPredDcNA_mmx, LumaI8x8PredDCNone)
584+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredPlane_sse2, WelsI16x16LumaPredPlane_ref)
585+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredH_sse2, LumaI16x16PredH)
586+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredV_sse2, LumaI16x16PredV)
587+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDc_sse2, LumaI16x16PredDC)
588+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDcTop_sse2, LumaI16x16PredDCTop)
589+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDcNA_sse2, LumaI16x16PredDCNone)
590+#endif
591+
592+#if defined(HAVE_NEON)
593+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredV_neon, LumaI16x16PredV)
594+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredH_neon, LumaI16x16PredH)
595+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDc_neon, LumaI16x16PredDC)
596+GENERATE_16x16_UT (WelsDecoderI16x16LumaPredPlane_neon, WelsI16x16LumaPredPlane_ref)
597+
598+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredV_neon, LumaI4x4PredV)
599+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredH_neon, LumaI4x4PredH)
600+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDL_neon, WelsI4x4LumaPredDDL_ref)
601+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDR_neon, WelsI4x4LumaPredDDR_ref)
602+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVL_neon, WelsI4x4LumaPredVL_ref)
603+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVR_neon, WelsI4x4LumaPredVR_ref)
604+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHU_neon, WelsI4x4LumaPredHU_ref)
605+GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHD_neon, WelsI4x4LumaPredHD_ref)
606+
607+GENERATE_8x8_UT (WelsDecoderIChromaPredV_neon, LumaI8x8PredV)
608+GENERATE_8x8_UT (WelsDecoderIChromaPredH_neon, LumaI8x8PredH)
609+GENERATE_8x8_UT (WelsDecoderIChromaPredDc_neon, WelsIChromaPredDc_ref)
610+GENERATE_8x8_UT (WelsDecoderIChromaPredPlane_neon, WelsIChromaPredPlane_ref)
611+#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t