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"
6+using 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******************************/
18+bool bQpelNeeded[4][4] = {
19+ { false, true, false, true },
20+ { true, true, true, true },
21+ { false, true, false, true },
22+ { true, true, true, true }
23+};
24+int32_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+};
30+int32_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]))
37+static inline uint8_t Clip255 (int32_t x) {
38+ return ((x & ~255) ? (-x) >> 31 & 255 : x);
39+}
40+
41+void 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+
50+void 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+
69+void 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+
81+void 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+
96+void 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) \
124+TEST(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+
153+DEF_MCCOPYTEST (2, 2)
154+DEF_MCCOPYTEST (2, 4)
155+DEF_MCCOPYTEST (4, 2)
156+DEF_MCCOPYTEST (4, 4)
157+DEF_MCCOPYTEST (4, 8)
158+DEF_MCCOPYTEST (8, 4)
159+DEF_MCCOPYTEST (8, 8)
160+DEF_MCCOPYTEST (16, 8)
161+DEF_MCCOPYTEST (8, 16)
162+DEF_MCCOPYTEST (16, 16)
163+
164+#define DEF_LUMA_MCTEST_SUBCASE(a,b,iW,iH) \
165+TEST(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) \
202+DEF_LUMA_MCTEST_SUBCASE(a,b,4,4) \
203+DEF_LUMA_MCTEST_SUBCASE(a,b,4,8) \
204+DEF_LUMA_MCTEST_SUBCASE(a,b,8,4) \
205+DEF_LUMA_MCTEST_SUBCASE(a,b,8,8) \
206+DEF_LUMA_MCTEST_SUBCASE(a,b,16,8) \
207+DEF_LUMA_MCTEST_SUBCASE(a,b,8,16) \
208+DEF_LUMA_MCTEST_SUBCASE(a,b,16,16)
209+
210+DEF_LUMA_MCTEST (0, 1)
211+DEF_LUMA_MCTEST (0, 2)
212+DEF_LUMA_MCTEST (0, 3)
213+DEF_LUMA_MCTEST (1, 0)
214+DEF_LUMA_MCTEST (1, 1)
215+DEF_LUMA_MCTEST (1, 2)
216+DEF_LUMA_MCTEST (1, 3)
217+DEF_LUMA_MCTEST (2, 0)
218+DEF_LUMA_MCTEST (2, 1)
219+DEF_LUMA_MCTEST (2, 2)
220+DEF_LUMA_MCTEST (2, 3)
221+DEF_LUMA_MCTEST (3, 0)
222+DEF_LUMA_MCTEST (3, 1)
223+DEF_LUMA_MCTEST (3, 2)
224+DEF_LUMA_MCTEST (3, 3)
225+
226+#define DEF_CHROMA_MCTEST_SUBCASE(a,b,iW,iH) \
227+TEST(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) \
257+DEF_CHROMA_MCTEST_SUBCASE(a,b,2,2) \
258+DEF_CHROMA_MCTEST_SUBCASE(a,b,2,4) \
259+DEF_CHROMA_MCTEST_SUBCASE(a,b,4,2) \
260+DEF_CHROMA_MCTEST_SUBCASE(a,b,4,4) \
261+DEF_CHROMA_MCTEST_SUBCASE(a,b,4,8) \
262+DEF_CHROMA_MCTEST_SUBCASE(a,b,8,4) \
263+DEF_CHROMA_MCTEST_SUBCASE(a,b,8,8)
264+
265+DEF_CHROMA_MCTEST (0, 1)
266+DEF_CHROMA_MCTEST (0, 2)
267+DEF_CHROMA_MCTEST (0, 3)
268+DEF_CHROMA_MCTEST (0, 4)
269+DEF_CHROMA_MCTEST (0, 5)
270+DEF_CHROMA_MCTEST (0, 6)
271+DEF_CHROMA_MCTEST (0, 7)
272+
273+DEF_CHROMA_MCTEST (1, 0)
274+DEF_CHROMA_MCTEST (1, 1)
275+DEF_CHROMA_MCTEST (1, 2)
276+DEF_CHROMA_MCTEST (1, 3)
277+DEF_CHROMA_MCTEST (1, 4)
278+DEF_CHROMA_MCTEST (1, 5)
279+DEF_CHROMA_MCTEST (1, 6)
280+DEF_CHROMA_MCTEST (1, 7)
281+
282+DEF_CHROMA_MCTEST (2, 0)
283+DEF_CHROMA_MCTEST (2, 1)
284+DEF_CHROMA_MCTEST (2, 2)
285+DEF_CHROMA_MCTEST (2, 3)
286+DEF_CHROMA_MCTEST (2, 4)
287+DEF_CHROMA_MCTEST (2, 5)
288+DEF_CHROMA_MCTEST (2, 6)
289+DEF_CHROMA_MCTEST (2, 7)
290+
291+DEF_CHROMA_MCTEST (3, 0)
292+DEF_CHROMA_MCTEST (3, 1)
293+DEF_CHROMA_MCTEST (3, 2)
294+DEF_CHROMA_MCTEST (3, 3)
295+DEF_CHROMA_MCTEST (3, 4)
296+DEF_CHROMA_MCTEST (3, 5)
297+DEF_CHROMA_MCTEST (3, 6)
298+DEF_CHROMA_MCTEST (3, 7)
299+
300+DEF_CHROMA_MCTEST (4, 0)
301+DEF_CHROMA_MCTEST (4, 1)
302+DEF_CHROMA_MCTEST (4, 2)
303+DEF_CHROMA_MCTEST (4, 3)
304+DEF_CHROMA_MCTEST (4, 4)
305+DEF_CHROMA_MCTEST (4, 5)
306+DEF_CHROMA_MCTEST (4, 6)
307+DEF_CHROMA_MCTEST (4, 7)
308+
309+DEF_CHROMA_MCTEST (5, 0)
310+DEF_CHROMA_MCTEST (5, 1)
311+DEF_CHROMA_MCTEST (5, 2)
312+DEF_CHROMA_MCTEST (5, 3)
313+DEF_CHROMA_MCTEST (5, 4)
314+DEF_CHROMA_MCTEST (5, 5)
315+DEF_CHROMA_MCTEST (5, 6)
316+DEF_CHROMA_MCTEST (5, 7)
317+
318+DEF_CHROMA_MCTEST (6, 0)
319+DEF_CHROMA_MCTEST (6, 1)
320+DEF_CHROMA_MCTEST (6, 2)
321+DEF_CHROMA_MCTEST (6, 3)
322+DEF_CHROMA_MCTEST (6, 4)
323+DEF_CHROMA_MCTEST (6, 5)
324+DEF_CHROMA_MCTEST (6, 6)
325+DEF_CHROMA_MCTEST (6, 7)
326+
327+DEF_CHROMA_MCTEST (7, 0)
328+DEF_CHROMA_MCTEST (7, 1)
329+DEF_CHROMA_MCTEST (7, 2)
330+DEF_CHROMA_MCTEST (7, 3)
331+DEF_CHROMA_MCTEST (7, 4)
332+DEF_CHROMA_MCTEST (7, 5)
333+DEF_CHROMA_MCTEST (7, 6)
334+DEF_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