History

Add partly UT code for deblocking filter

Haibo Zhu committed 12 years ago

Commit 3593f2e1 parent 007fb471 file · +396 −0Browse files

Showing the changes to test/decoder/DecUT_DeblockCommon.cpp (1 of 1 file). Show all

Unified · Split

test/decoder/DecUT_DeblockCommon.cpp+396−0
@@ -0,0 +1,396 @@
1#include <gtest/gtest.h>
2
3#include "../../codec/decoder/core/inc/deblocking.h"
4#include "../../codec/common/inc/deblocking_common.h"
5
6#define CLIP3(VALUE, MIN, MAX) ((VALUE) < (MIN) ? (MIN) : ((VALUE) > (MAX) ? (MAX) : (VALUE)))
7
8using namespace WelsDec;
9
10/* extern pure C functions */
11extern void DeblockLumaLt4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta,
12 int8_t* pTc);
13extern void DeblockLumaEq4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta);
14extern void DeblockChromaLt4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha,
15 int32_t iBeta, int8_t* pTc);
16extern void DeblockChromaEq4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha,
17 int32_t iBeta);
18
19/* Macros body */
20#define GENERATE_DATA_DEBLOCKING(pBase, pRef, iWidth) \
21if (iNum==0) { \
22 iAlpha = 255; \
23 iBeta = 18; \
24 iTc[0] = iTc[1] = iTc[2] = iTc[3] = 25; \
25 pBase[0] = pRef[0] = 128; \
26 for (int i = 1; i < iWidth*iWidth; i++) { \
27 pBase[i] = pRef[i] = CLIP3(0, 255, pBase[i-1] -16 + rand()%32); \
28 } \
29} else if (iNum==1) { \
30 iAlpha = 4; \
31 iBeta = 2; \
32 iTc[0] = iTc[1] = iTc[2] = iTc[3] = 9; \
33 pBase[0] = pRef[0] = 128; \
34 for (int i = 1; i < iWidth*iWidth; i++) { \
35 pBase[i] = pRef[i] = CLIP3(0, 255, pBase[i-1] -4 + rand()%8); \
36 } \
37} else { \
38 iAlpha = rand() % 256; \
39 iBeta = rand() % 19; \
40 for (int i=0; i<4; i++) { \
41 iTc[i] = rand() % 26; \
42 } \
43 for (int i = 0; i < iWidth*iWidth; i++) { \
44 pBase[i] = pRef[i] = rand() % 256; \
45 } \
46}
47
48/* Anchor functions body, some directly from the current code */
49void anchor_DeblockingLumaNormal (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta,
50 int8_t* pTc) {
51 // void DeblockLumaLt4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, int8_t* pTc)
52 // bS<4, Section 8.7.2.3
53
54 int32_t p[3];
55 int32_t q[3];
56 int32_t iTc;
57 int32_t iDelta;
58 int32_t iIndexTc;
59 for (int iLine = 0; iLine < 16; iLine++) {
60 iIndexTc = iLine >> 2;
61
62 iTc = pTc[iIndexTc];
63 for (int m = 0; m < 3; m++) {
64 p[m] = pPix[iStrideX * -1 * (m + 1)];
65 q[m] = pPix[iStrideX * m];
66 }// for
67
68 // filterSampleFlag, 8-460
69 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
70 // 8-470
71 if (abs (p[2] - p[0]) < iBeta) {
72 pPix[iStrideX * -2] = p[1] + CLIP3 (((p[2] + ((p[0] + q[0] + 1) >> 1) - (p[1] << 1)) >> 1), -1 * pTc[iIndexTc],
73 pTc[iIndexTc]);
74 iTc++;
75 }
76 // 8-472
77 if (abs (q[2] - q[0]) < iBeta) {
78 pPix[iStrideX * 1] = q[1] + CLIP3 (((q[2] + ((p[0] + q[0] + 1) >> 1) - (q[1] << 1)) >> 1), -1 * pTc[iIndexTc],
79 pTc[iIndexTc]);
80 iTc++;
81 }
82 // 8-467,468,469
83 iDelta = CLIP3 (((((q[0] - p[0]) << 2) + (p[1] - q[1]) + 4) >> 3), -1 * iTc, iTc);
84 pPix[iStrideX * -1] = CLIP3 ((p[0] + iDelta), 0, 255);
85 pPix[0] = CLIP3 ((q[0] - iDelta), 0, 255);
86 }
87
88 // Next line
89 pPix += iStrideY;
90 }
91}
92
93void anchor_DeblockingLumaIntra (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta) {
94 // void DeblockLumaEq4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta)
95 // bS==4, Section 8.7.2.4
96
97 int32_t p[4], q[4];
98 for (int iLine = 0; iLine < 16; iLine++) {
99
100 for (int m = 0; m < 4; m++) {
101 p[m] = pPix[iStrideX * -1 * (m + 1)];
102 q[m] = pPix[iStrideX * m];
103 }
104
105 // filterSampleFlag, 8-460
106 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
107
108 // 8-476
109 if (abs (p[2] - p[0]) < iBeta && abs (p[0] - q[0]) < ((iAlpha >> 2) + 2)) {
110 // 8-477,478, 479
111 pPix[iStrideX * -1] = (p[2] + 2 * p[1] + 2 * p[0] + 2 * q[0] + q[1] + 4) >> 3;
112 pPix[iStrideX * -2] = (p[2] + p[1] + p[0] + q[0] + 2) >> 2;
113 pPix[iStrideX * -3] = (2 * p[3] + 3 * p[2] + p[1] + p[0] + q[0] + 4) >> 3;
114 } else {
115 // 8-480
116 pPix[iStrideX * -1] = (2 * p[1] + p[0] + q[1] + 2) >> 2;
117 }
118
119 // 8-483
120 if (abs (q[2] - q[0]) < iBeta && abs (p[0] - q[0]) < ((iAlpha >> 2) + 2)) {
121 // 8-484,485,486
122 pPix[ 0 ] = (p[1] + 2 * p[0] + 2 * q[0] + 2 * q[1] + q[2] + 4) >> 3;
123 pPix[1 * iStrideX ] = (p[0] + q[0] + q[1] + q[2] + 2) >> 2;
124 pPix[2 * iStrideX ] = (2 * q[3] + 3 * q[2] + q[1] + q[0] + p[0] + 4) >> 3;
125 } else {
126 // 8-487
127 pPix[0 * iStrideX ] = (2 * q[1] + q[0] + p[1] + 2) >> 2;
128 }
129 }
130 // Next line
131 pPix += iStrideY;
132 }
133}
134
135void anchor_DeblockingChromaNormal (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY,
136 int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
137 // void DeblockChromaLt4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, int8_t* pTc)
138 // Section 8.7.2.3
139 int32_t p[2], q[2];
140 int32_t iIndexTc;
141 int32_t iDelta;
142 int32_t iTc;
143 for (int iLine = 0; iLine < 8; iLine++) {
144 iIndexTc = iLine >> 1;
145 iTc = pTc[iIndexTc];
146 /* for Cb */
147 for (int m = 0; m < 2; m++) {
148 p[m] = pPixCb[iStrideX * -1 * (m + 1)];
149 q[m] = pPixCb[iStrideX * m];
150 }
151
152 // filterSampleFlag, 8-460
153 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
154 // 8-467, 468, 469
155 iDelta = CLIP3 (((((q[0] - p[0]) << 2) + (p[1] - q[1]) + 4) >> 3), -1 * iTc, iTc);
156 pPixCb[iStrideX * -1] = CLIP3 ((p[0] + iDelta), 0, 255);
157 pPixCb[iStrideX * 0 ] = CLIP3 ((q[0] - iDelta), 0, 255);
158 }
159 pPixCb += iStrideY;
160
161 /* for Cr */
162 for (int m = 0; m < 2; m++) {
163 p[m] = pPixCr[iStrideX * -1 * (m + 1)];
164 q[m] = pPixCr[iStrideX * m];
165 }
166
167 // filterSampleFlag, 8-460
168 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
169 // 8-467, 468, 469
170 iDelta = CLIP3 (((((q[0] - p[0]) << 2) + (p[1] - q[1]) + 4) >> 3), -1 * iTc, iTc);
171 pPixCr[iStrideX * -1] = CLIP3 ((p[0] + iDelta), 0, 255);
172 pPixCr[iStrideX * 0 ] = CLIP3 ((q[0] - iDelta), 0, 255);
173 }
174 pPixCr += iStrideY;
175 }
176}
177
178void anchor_DeblockingChromaIntra (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha,
179 int32_t iBeta) {
180 //void DeblockChromaEq4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta)
181 // Section 8.7.2.4
182 int32_t p[2], q[2];
183
184 for (int iLine = 0; iLine < 8; iLine++) {
185 /* for Cb */
186 for (int m = 0; m < 2; m++) {
187 p[m] = pPixCb[iStrideX * -1 * (m + 1)];
188 q[m] = pPixCb[iStrideX * m];
189 }
190
191 // filterSampleFlag, 8-460
192 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
193 // 8-480, 487
194 pPixCb[iStrideX * -1] = CLIP3 ((2 * p[1] + p[0] + q[1] + 2) >> 2, 0, 255);
195 pPixCb[iStrideX * 0 ] = CLIP3 ((2 * q[1] + q[0] + p[1] + 2) >> 2, 0, 255);
196 }
197 pPixCb += iStrideY;
198
199 /* for Cr */
200 for (int m = 0; m < 2; m++) {
201 p[m] = pPixCr[iStrideX * -1 * (m + 1)];
202 q[m] = pPixCr[iStrideX * m];
203 }
204
205 // filterSampleFlag, 8-460
206 if (abs (p[0] - q[0]) < iAlpha && abs (p[1] - p[0]) < iBeta && abs (q[1] - q[0]) < iBeta) {
207 // 8-480, 487
208 pPixCr[iStrideX * -1] = CLIP3 ((2 * p[1] + p[0] + q[1] + 2) >> 2, 0, 255);
209 pPixCr[iStrideX * 0 ] = CLIP3 ((2 * q[1] + q[0] + p[1] + 2) >> 2, 0, 255);
210 }
211 pPixCr += iStrideY;
212 }
213}
214
215/* Unit test functions body */
216TEST (DeblockingCommon, DeblockLumaLt4_c) {
217 // void DeblockLumaLt4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, int8_t* pTc)
218
219#define TEST_CYCLE 1000
220 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixBase, 16 * 16, 16);
221 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixRef, 16 * 16, 16);
222
223 int32_t iAlpha, iBeta;
224
225 ENFORCE_STACK_ALIGN_1D (int8_t, iTc, 4, 16);
226
227 bool bEqual = true;
228
229 for (int iNum = 0; bEqual && iNum < TEST_CYCLE; iNum++) {
230 /* Horizontal */
231 GENERATE_DATA_DEBLOCKING (iPixBase, iPixRef, 16)
232
233 anchor_DeblockingLumaNormal (&iPixBase[8 * 1], 1, 16, iAlpha, iBeta, iTc);
234 DeblockLumaLt4_c (&iPixRef[8 * 1], 1, 16, iAlpha, iBeta, iTc);
235
236 for (int i = 0; i < 16 * 16; i++) {
237 if (iPixBase[i] != iPixRef[i]) {
238 bEqual = false;
239 break;
240 }
241 }
242
243 /* Vertical */
244 GENERATE_DATA_DEBLOCKING (iPixBase, iPixRef, 16)
245
246 anchor_DeblockingLumaNormal (&iPixBase[8 * 16], 16, 1, iAlpha, iBeta, iTc);
247 DeblockLumaLt4_c (&iPixRef[8 * 16], 16, 1, iAlpha, iBeta, iTc);
248
249 for (int i = 0; i < 16 * 16; i++) {
250 if (iPixBase[i] != iPixRef[i]) {
251 bEqual = false;
252 break;
253 }
254 }
255 }
256
257 EXPECT_TRUE (bEqual);
258}
259TEST (DeblockingCommon, DeblockLumaEq4_c) {
260 //void DeblockLumaEq4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta)
261#define TEST_CYCLE 1000
262 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixBase, 16 * 16, 16);
263 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixRef, 16 * 16, 16);
264
265 int32_t iAlpha, iBeta;
266
267 /* NOT used here */
268 ENFORCE_STACK_ALIGN_1D (int8_t, iTc, 4, 16);
269
270 bool bEqual = true;
271
272 for (int iNum = 0; bEqual && iNum < TEST_CYCLE; iNum++) {
273 /* Horizontal */
274 GENERATE_DATA_DEBLOCKING (iPixBase, iPixRef, 16)
275
276 anchor_DeblockingLumaIntra (&iPixBase[8 * 1], 1, 16, iAlpha, iBeta);
277 DeblockLumaEq4_c (&iPixRef[8 * 1], 1, 16, iAlpha, iBeta);
278
279 for (int i = 0; i < 16 * 16; i++) {
280 if (iPixBase[i] != iPixRef[i]) {
281 bEqual = false;
282 break;
283 }
284 }
285
286 /* Vertical */
287 GENERATE_DATA_DEBLOCKING (iPixBase, iPixRef, 16)
288
289 anchor_DeblockingLumaIntra (&iPixBase[8 * 16], 16, 1, iAlpha, iBeta);
290 DeblockLumaEq4_c (&iPixRef[8 * 16], 16, 1, iAlpha, iBeta);
291
292 for (int i = 0; i < 16 * 16; i++) {
293 if (iPixBase[i] != iPixRef[i]) {
294 bEqual = false;
295 break;
296 }
297 }
298 }
299
300 EXPECT_TRUE (bEqual);
301}
302
303TEST (DeblockingCommon, DeblockChromaLt4_c) {
304 // void DeblockChromaLt4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, int8_t* pTc)
305#define TEST_CYCLE 1000
306 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCbBase, 8 * 8, 16);
307 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCrBase, 8 * 8, 16);
308 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCbRef, 8 * 8, 16);
309 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCrRef, 8 * 8, 16);
310
311 int32_t iAlpha, iBeta;
312
313 ENFORCE_STACK_ALIGN_1D (int8_t, iTc, 4, 16);
314
315 bool bEqual = true;
316
317 for (int iNum = 0; bEqual && iNum < TEST_CYCLE; iNum++) {
318 /* Horizontal */
319 GENERATE_DATA_DEBLOCKING (iPixCbBase, iPixCbRef, 8)
320 GENERATE_DATA_DEBLOCKING (iPixCrBase, iPixCrRef, 8)
321
322 anchor_DeblockingChromaNormal (&iPixCbBase[4 * 1], &iPixCrBase[4 * 1], 1, 8, iAlpha, iBeta, iTc);
323 DeblockChromaLt4_c (&iPixCbRef[4 * 1], &iPixCrRef[4 * 1], 1, 8, iAlpha, iBeta, iTc);
324
325 for (int i = 0; i < 8 * 8; i++) {
326 if (iPixCbBase[i] != iPixCbRef[i] || iPixCrBase[i] != iPixCrRef[i]) {
327 bEqual = false;
328 break;
329 }
330 }
331
332 /* Vertical */
333 GENERATE_DATA_DEBLOCKING (iPixCbBase, iPixCbRef, 8)
334 GENERATE_DATA_DEBLOCKING (iPixCrBase, iPixCrRef, 8)
335
336 anchor_DeblockingChromaNormal (&iPixCbBase[4 * 8], &iPixCrBase[4 * 8], 8, 1, iAlpha, iBeta, iTc);
337 DeblockChromaLt4_c (&iPixCbRef[4 * 8], &iPixCrRef[4 * 8], 8, 1, iAlpha, iBeta, iTc);
338
339 for (int i = 0; i < 8 * 8; i++) {
340 if (iPixCbBase[i] != iPixCbRef[i] || iPixCrBase[i] != iPixCrRef[i]) {
341 bEqual = false;
342 break;
343 }
344 }
345 }
346
347 EXPECT_TRUE (bEqual);
348}
349
350TEST (DeblockingCommon, DeblockChromaEq4_c) {
351 // void DeblockChromaEq4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta)
352#define TEST_CYCLE 1000
353 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCbBase, 8 * 8, 16);
354 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCrBase, 8 * 8, 16);
355 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCbRef, 8 * 8, 16);
356 ENFORCE_STACK_ALIGN_1D (uint8_t, iPixCrRef, 8 * 8, 16);
357
358 int32_t iAlpha, iBeta;
359
360 /* NOT used here*/
361 ENFORCE_STACK_ALIGN_1D (int8_t, iTc, 4, 16);
362
363 bool bEqual = true;
364
365 for (int iNum = 0; bEqual && iNum < TEST_CYCLE; iNum++) {
366 /* Horizontal */
367 GENERATE_DATA_DEBLOCKING (iPixCbBase, iPixCbRef, 8)
368 GENERATE_DATA_DEBLOCKING (iPixCrBase, iPixCrRef, 8)
369
370 anchor_DeblockingChromaIntra (&iPixCbBase[4 * 1], &iPixCrBase[4 * 1], 1, 8, iAlpha, iBeta);
371 DeblockChromaEq4_c (&iPixCbRef[4 * 1], &iPixCrRef[4 * 1], 1, 8, iAlpha, iBeta);
372
373 for (int i = 0; i < 8 * 8; i++) {
374 if (iPixCbBase[i] != iPixCbRef[i] || iPixCrBase[i] != iPixCrRef[i]) {
375 bEqual = false;
376 break;
377 }
378 }
379
380 /* Vertical */
381 GENERATE_DATA_DEBLOCKING (iPixCbBase, iPixCbRef, 8)
382 GENERATE_DATA_DEBLOCKING (iPixCrBase, iPixCrRef, 8)
383
384 anchor_DeblockingChromaIntra (&iPixCbBase[4 * 8], &iPixCrBase[4 * 8], 8, 1, iAlpha, iBeta);
385 DeblockChromaEq4_c (&iPixCbRef[4 * 8], &iPixCrRef[4 * 8], 8, 1, iAlpha, iBeta);
386
387 for (int i = 0; i < 8 * 8; i++) {
388 if (iPixCbBase[i] != iPixCbRef[i] || iPixCrBase[i] != iPixCrRef[i]) {
389 bEqual = false;
390 break;
391 }
392 }
393 }
394
395 EXPECT_TRUE (bEqual);
396}

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