History

Add DecUT Motion Compensation on New Code Base

Dong Zhang committed 12 years ago

Commit 421fe981 parent 2f840d42 files · +335 −0Browse files

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

Unified · Split

test/decoder/DecUT_MotionCompensation.cpp+334−0
@@ -0,0 +1,334 @@
1#include<gtest/gtest.h>
2#include "codec_def.h"
3#include "mc.h"
4#include "mem_align.h"
5#include "cpu_core.h"
6using namespace WelsDec;
7#ifdef X86_ASM
8#define TEST_CASE 0
9//TEST_CASE can be 0,WELS_CPU_SSE2 or WELS_CPU_MMXEXT
10#else
11#define TEST_CASE 0
12#endif
13#define MC_BUFF_SRC_STRIDE 30
14#define MC_BUFF_DST_STRIDE 31
15#define MC_BUFF_HEIGHT 30
16
17/**********************MC Unit Test Anchor Code Begin******************************/
18bool bQpelNeeded[4][4] = {
19 { false, true, false, true },
20 { true, true, true, true },
21 { false, true, false, true },
22 { true, true, true, true }
23};
24int32_t iHpelRef0Array[4][4] = {
25 { 0, 1, 1, 1 },
26 { 0, 1, 1, 1 },
27 { 2, 3, 3, 3 },
28 { 0, 1, 1, 1 }
29};
30int32_t iHpelRef1Array[4][4] = {
31 { 0, 0, 0, 0 },
32 { 2, 2, 3, 2 },
33 { 2, 2, 3, 2 },
34 { 2, 2, 3, 2 }
35};
36#define FILTER6TAP(pPixBuff, x, iStride) ((pPixBuff)[x-2*iStride] + (pPixBuff)[x+3*iStride] - 5*((pPixBuff)[x-iStride] + (pPixBuff)[x+2*iStride]) + 20*((pPixBuff)[x] + (pPixBuff)[x+iStride]))
37static inline uint8_t Clip255 (int32_t x) {
38 return ((x & ~255) ? (-x) >> 31 & 255 : x);
39}
40
41void MCCopyAnchor (uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iWidth,
42 int32_t iHeight) {
43 for (int32_t y = 0; y < iHeight; y++) {
44 memcpy (pDst, pSrc, iWidth * sizeof (uint8_t));
45 pSrc += iSrcStride;
46 pDst += iDstStride;
47 }
48}
49
50void MCHalfPelFilterAnchor (uint8_t* pDstH, uint8_t* pDstV, uint8_t* pDstHV, uint8_t* pSrc,
51 int32_t iStride, int32_t iWidth, int32_t iHeight, int16_t* pBuf) {
52 for (int32_t y = 0; y < iHeight; y++) {
53 for (int32_t x = 0; x < iWidth; x++)
54 pDstH[x] = Clip255 ((FILTER6TAP (pSrc, x, 1) + 16) >> 5);
55 for (int32_t x = -2; x < iWidth + 3; x++) {
56 int32_t v = FILTER6TAP (pSrc, x, iStride);
57 pDstV[x] = Clip255 ((v + 16) >> 5);
58 pBuf[x + 2] = v;
59 }
60 for (int32_t x = 0; x < iWidth; x++)
61 pDstHV[x] = Clip255 ((FILTER6TAP (pBuf + 2, x, 1) + 512) >> 10);
62 pDstH += iStride;
63 pDstV += iStride;
64 pDstHV += iStride;
65 pSrc += iStride;
66 }
67}
68
69void PixelAvgAnchor (uint8_t* pDst, int32_t iDstStride,
70 uint8_t* pSrc1, int32_t iSrc1Stride,
71 uint8_t* pSrc2, int32_t iSrc2Stride, int32_t iWidth, int32_t iHeight) {
72 for (int32_t y = 0; y < iHeight; y++) {
73 for (int32_t x = 0; x < iWidth; x++)
74 pDst[x] = (pSrc1[x] + pSrc2[x] + 1) >> 1;
75 pDst += iDstStride;
76 pSrc1 += iSrc1Stride;
77 pSrc2 += iSrc2Stride;
78 }
79}
80
81void MCLumaAnchor (uint8_t* pDst, int32_t iDstStride, uint8_t* pSrc[4], int32_t iSrcStride,
82 int32_t iMvX, int32_t iMvY, int32_t iWidth, int32_t iHeight) {
83 int32_t iMvXIdx = iMvX & 3;
84 int32_t iMvYIdx = iMvY & 3;
85 int32_t iOffset = (iMvY >> 2) * iSrcStride + (iMvX >> 2);
86 uint8_t* pSrc1 = pSrc[iHpelRef0Array[iMvYIdx][iMvXIdx]] + iOffset + ((iMvYIdx) == 3) * iSrcStride;
87
88 if (bQpelNeeded[iMvYIdx][iMvXIdx]) {
89 uint8_t* pSrc2 = pSrc[iHpelRef1Array[iMvYIdx][iMvXIdx]] + iOffset + ((iMvXIdx) == 3);
90 PixelAvgAnchor (pDst, iDstStride, pSrc1, iSrcStride, pSrc2, iSrcStride, iWidth, iHeight);
91 } else {
92 MCCopyAnchor (pSrc1, iSrcStride, pDst, iDstStride, iWidth, iHeight);
93 }
94}
95
96void MCChromaAnchor (uint8_t* pDstU, uint8_t* pDstV, int32_t iDstStride, uint8_t* pSrc, int32_t iSrcStride,
97 int32_t iMvX, int32_t iMvY, int32_t iWidth, int32_t iHeight) {
98 uint8_t* pSrcTmp;
99 pSrc += (iMvY >> 3) * iSrcStride + (iMvX >> 3) * 2;
100 pSrcTmp = &pSrc[iSrcStride];
101
102 int32_t iMvXIdx = iMvX & 0x07;
103 int32_t iMvYIdx = iMvY & 0x07;
104 int32_t iBiPara0 = (8 - iMvXIdx) * (8 - iMvYIdx);
105 int32_t iBiPara1 = iMvXIdx * (8 - iMvYIdx);
106 int32_t iBiPara2 = (8 - iMvXIdx) * iMvYIdx;
107 int32_t iBiPara3 = iMvXIdx * iMvYIdx;
108 for (int32_t y = 0; y < iHeight; y++) {
109 for (int32_t x = 0; x < iWidth; x++) {
110 pDstU[x] = (iBiPara0 * pSrc[2 * x] + iBiPara1 * pSrc[2 * x + 2] +
111 iBiPara2 * pSrcTmp[2 * x] + iBiPara3 * pSrcTmp[2 * x + 2] + 32) >> 6;
112 pDstV[x] = (iBiPara0 * pSrc[2 * x + 1] + iBiPara1 * pSrc[2 * x + 3] +
113 iBiPara2 * pSrcTmp[2 * x + 1] + iBiPara3 * pSrcTmp[2 * x + 3] + 32) >> 6;
114 }
115 pSrc = pSrcTmp;
116 pSrcTmp += iSrcStride;
117 pDstU += iDstStride;
118 pDstV += iDstStride;
119 }
120}
121
122/**********************MC Unit Test OPENH264 Code Begin******************************/
123#define DEF_MCCOPYTEST(iH,iW) \
124TEST(McCopy_c,iW##x##iH) \
125{ \
126 SMcFunc sMcFunc; \
127 InitMcFunc(&sMcFunc, TEST_CASE); \
128 uint8_t uSrcAnchor[MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE]; \
129 uint8_t uSrcTest[MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE]; \
130 uint8_t uDstAnchor[MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
131 uint8_t uDstTest[MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
132 srand((unsigned int)time(0)); \
133 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
134 { \
135 for(int32_t i=0;i<MC_BUFF_SRC_STRIDE;i++) \
136 { \
137 uSrcAnchor[j][i] = uSrcTest[j][i] = rand()%256; \
138 } \
139 } \
140 memset(uDstAnchor,0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE);\
141 memset(uDstTest,0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE); \
142 MCCopyAnchor(uSrcAnchor[0],MC_BUFF_SRC_STRIDE,uDstAnchor[0],MC_BUFF_DST_STRIDE,iW,iH); \
143 sMcFunc.pMcLumaFunc(uSrcTest[0],MC_BUFF_SRC_STRIDE,uDstTest[0],MC_BUFF_DST_STRIDE,0,0,iW,iH); \
144 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
145 { \
146 for(int32_t i=0;i<MC_BUFF_DST_STRIDE;i++) \
147 { \
148 ASSERT_EQ(uDstAnchor[j][i],uDstTest[j][i]); \
149 } \
150 } \
151}
152
153DEF_MCCOPYTEST (2, 2)
154DEF_MCCOPYTEST (2, 4)
155DEF_MCCOPYTEST (4, 2)
156DEF_MCCOPYTEST (4, 4)
157DEF_MCCOPYTEST (4, 8)
158DEF_MCCOPYTEST (8, 4)
159DEF_MCCOPYTEST (8, 8)
160DEF_MCCOPYTEST (16, 8)
161DEF_MCCOPYTEST (8, 16)
162DEF_MCCOPYTEST (16, 16)
163
164#define DEF_LUMA_MCTEST_SUBCASE(a,b,iW,iH) \
165TEST(McHorVer##a##b##_c,iW##x##iH) \
166{ \
167 SMcFunc sMcFunc; \
168 uint8_t uSrcAnchor[4][MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE]; \
169 uint8_t uSrcTest[MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE]; \
170 uint8_t uDstAnchor[MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
171 uint8_t uDstTest[MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
172 uint8_t* uSrcInputAnchor[4]; \
173 int16_t pBuf[MC_BUFF_DST_STRIDE]; \
174 uSrcInputAnchor[0] = &uSrcAnchor[0][4][4]; \
175 uSrcInputAnchor[1] = &uSrcAnchor[1][4][4]; \
176 uSrcInputAnchor[2] = &uSrcAnchor[2][4][4]; \
177 uSrcInputAnchor[3] = &uSrcAnchor[3][4][4]; \
178 srand((unsigned int)time(0)); \
179 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
180 {\
181 for(int32_t i=0;i<MC_BUFF_SRC_STRIDE;i++) \
182 {\
183 uSrcAnchor[0][j][i] = uSrcTest[j][i] = rand()%256; \
184 }\
185 }\
186 InitMcFunc(&sMcFunc,TEST_CASE);\
187 memset(uDstAnchor,0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE); \
188 memset(uDstTest,0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE); \
189 MCHalfPelFilterAnchor(uSrcInputAnchor[1],uSrcInputAnchor[2],uSrcInputAnchor[3],uSrcInputAnchor[0],MC_BUFF_SRC_STRIDE,iW+1,iH+1,pBuf+4); \
190 MCLumaAnchor(uDstAnchor[0],MC_BUFF_DST_STRIDE,uSrcInputAnchor,MC_BUFF_SRC_STRIDE,a,b,iW,iH); \
191 sMcFunc.pMcLumaFunc(&uSrcTest[4][4],MC_BUFF_SRC_STRIDE,uDstTest[0],MC_BUFF_DST_STRIDE,a,b,iW,iH);\
192 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
193 { \
194 for(int32_t i=0;i<MC_BUFF_DST_STRIDE;i++) \
195 { \
196 ASSERT_EQ(uDstAnchor[j][i],uDstTest[j][i]); \
197 } \
198 } \
199}
200
201#define DEF_LUMA_MCTEST(a,b) \
202DEF_LUMA_MCTEST_SUBCASE(a,b,4,4) \
203DEF_LUMA_MCTEST_SUBCASE(a,b,4,8) \
204DEF_LUMA_MCTEST_SUBCASE(a,b,8,4) \
205DEF_LUMA_MCTEST_SUBCASE(a,b,8,8) \
206DEF_LUMA_MCTEST_SUBCASE(a,b,16,8) \
207DEF_LUMA_MCTEST_SUBCASE(a,b,8,16) \
208DEF_LUMA_MCTEST_SUBCASE(a,b,16,16)
209
210DEF_LUMA_MCTEST (0, 1)
211DEF_LUMA_MCTEST (0, 2)
212DEF_LUMA_MCTEST (0, 3)
213DEF_LUMA_MCTEST (1, 0)
214DEF_LUMA_MCTEST (1, 1)
215DEF_LUMA_MCTEST (1, 2)
216DEF_LUMA_MCTEST (1, 3)
217DEF_LUMA_MCTEST (2, 0)
218DEF_LUMA_MCTEST (2, 1)
219DEF_LUMA_MCTEST (2, 2)
220DEF_LUMA_MCTEST (2, 3)
221DEF_LUMA_MCTEST (3, 0)
222DEF_LUMA_MCTEST (3, 1)
223DEF_LUMA_MCTEST (3, 2)
224DEF_LUMA_MCTEST (3, 3)
225
226#define DEF_CHROMA_MCTEST_SUBCASE(a,b,iW,iH) \
227TEST(McChromaWithFragMv_##a##b##_c,iW##x##iH) \
228{ \
229 SMcFunc sMcFunc; \
230 uint8_t uSrcAnchor[MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE*2]; \
231 uint8_t uSrcTest[MC_BUFF_HEIGHT][MC_BUFF_SRC_STRIDE]; \
232 uint8_t uDstAnchor[2][MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
233 uint8_t uDstTest[MC_BUFF_HEIGHT][MC_BUFF_DST_STRIDE]; \
234 srand((unsigned int)time(0)); \
235 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
236 {\
237 for(int32_t i=0;i<MC_BUFF_SRC_STRIDE;i++) \
238 {\
239 uSrcAnchor[j][i*2] = uSrcTest[j][i] = rand()%256; \
240 }\
241 }\
242 InitMcFunc(&sMcFunc,TEST_CASE);\
243 memset(uDstAnchor[0],0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE); \
244 memset(uDstTest,0,sizeof(uint8_t)*MC_BUFF_HEIGHT*MC_BUFF_DST_STRIDE); \
245 MCChromaAnchor(uDstAnchor[0][0],uDstAnchor[1][0],MC_BUFF_DST_STRIDE,uSrcAnchor[0],MC_BUFF_SRC_STRIDE*2,a,b,iW,iH); \
246 sMcFunc.pMcChromaFunc(uSrcTest[0],MC_BUFF_SRC_STRIDE,uDstTest[0],MC_BUFF_DST_STRIDE,a,b,iW,iH);\
247 for(int32_t j=0;j<MC_BUFF_HEIGHT;j++) \
248 { \
249 for(int32_t i=0;i<MC_BUFF_DST_STRIDE;i++) \
250 { \
251 ASSERT_EQ(uDstAnchor[0][j][i],uDstTest[j][i]); \
252 } \
253 } \
254}
255
256#define DEF_CHROMA_MCTEST(a,b) \
257DEF_CHROMA_MCTEST_SUBCASE(a,b,2,2) \
258DEF_CHROMA_MCTEST_SUBCASE(a,b,2,4) \
259DEF_CHROMA_MCTEST_SUBCASE(a,b,4,2) \
260DEF_CHROMA_MCTEST_SUBCASE(a,b,4,4) \
261DEF_CHROMA_MCTEST_SUBCASE(a,b,4,8) \
262DEF_CHROMA_MCTEST_SUBCASE(a,b,8,4) \
263DEF_CHROMA_MCTEST_SUBCASE(a,b,8,8)
264
265DEF_CHROMA_MCTEST (0, 1)
266DEF_CHROMA_MCTEST (0, 2)
267DEF_CHROMA_MCTEST (0, 3)
268DEF_CHROMA_MCTEST (0, 4)
269DEF_CHROMA_MCTEST (0, 5)
270DEF_CHROMA_MCTEST (0, 6)
271DEF_CHROMA_MCTEST (0, 7)
272
273DEF_CHROMA_MCTEST (1, 0)
274DEF_CHROMA_MCTEST (1, 1)
275DEF_CHROMA_MCTEST (1, 2)
276DEF_CHROMA_MCTEST (1, 3)
277DEF_CHROMA_MCTEST (1, 4)
278DEF_CHROMA_MCTEST (1, 5)
279DEF_CHROMA_MCTEST (1, 6)
280DEF_CHROMA_MCTEST (1, 7)
281
282DEF_CHROMA_MCTEST (2, 0)
283DEF_CHROMA_MCTEST (2, 1)
284DEF_CHROMA_MCTEST (2, 2)
285DEF_CHROMA_MCTEST (2, 3)
286DEF_CHROMA_MCTEST (2, 4)
287DEF_CHROMA_MCTEST (2, 5)
288DEF_CHROMA_MCTEST (2, 6)
289DEF_CHROMA_MCTEST (2, 7)
290
291DEF_CHROMA_MCTEST (3, 0)
292DEF_CHROMA_MCTEST (3, 1)
293DEF_CHROMA_MCTEST (3, 2)
294DEF_CHROMA_MCTEST (3, 3)
295DEF_CHROMA_MCTEST (3, 4)
296DEF_CHROMA_MCTEST (3, 5)
297DEF_CHROMA_MCTEST (3, 6)
298DEF_CHROMA_MCTEST (3, 7)
299
300DEF_CHROMA_MCTEST (4, 0)
301DEF_CHROMA_MCTEST (4, 1)
302DEF_CHROMA_MCTEST (4, 2)
303DEF_CHROMA_MCTEST (4, 3)
304DEF_CHROMA_MCTEST (4, 4)
305DEF_CHROMA_MCTEST (4, 5)
306DEF_CHROMA_MCTEST (4, 6)
307DEF_CHROMA_MCTEST (4, 7)
308
309DEF_CHROMA_MCTEST (5, 0)
310DEF_CHROMA_MCTEST (5, 1)
311DEF_CHROMA_MCTEST (5, 2)
312DEF_CHROMA_MCTEST (5, 3)
313DEF_CHROMA_MCTEST (5, 4)
314DEF_CHROMA_MCTEST (5, 5)
315DEF_CHROMA_MCTEST (5, 6)
316DEF_CHROMA_MCTEST (5, 7)
317
318DEF_CHROMA_MCTEST (6, 0)
319DEF_CHROMA_MCTEST (6, 1)
320DEF_CHROMA_MCTEST (6, 2)
321DEF_CHROMA_MCTEST (6, 3)
322DEF_CHROMA_MCTEST (6, 4)
323DEF_CHROMA_MCTEST (6, 5)
324DEF_CHROMA_MCTEST (6, 6)
325DEF_CHROMA_MCTEST (6, 7)
326
327DEF_CHROMA_MCTEST (7, 0)
328DEF_CHROMA_MCTEST (7, 1)
329DEF_CHROMA_MCTEST (7, 2)
330DEF_CHROMA_MCTEST (7, 3)
331DEF_CHROMA_MCTEST (7, 4)
332DEF_CHROMA_MCTEST (7, 5)
333DEF_CHROMA_MCTEST (7, 6)
334DEF_CHROMA_MCTEST (7, 7)

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