Commit | Line | Data |
---|---|---|
80f575fc DM |
1 | |
2 | void testImageStripeYUV(int size, VSFrameInfo* fi, VSFrame* img){ | |
3 | int i,j; | |
4 | vsFrameInfoInit(fi, size, 4, PF_YUV420P); | |
5 | vsFrameAllocate(img,fi); | |
6 | memset(img->data[0],100,sizeof(uint8_t)*fi->width*fi->height); | |
7 | for(j=0; j<fi->height; j++){ | |
8 | for(i=0; i<size; i++){ | |
9 | img->data[0][i+j*img->linesize[0]]= sin(((double)i)/size/(double)j)*128+128; | |
10 | } | |
11 | } | |
12 | memset(img->data[1],100,sizeof(uint8_t)*(fi->width >> 1) *(fi->height>>1)); | |
13 | memset(img->data[2],100,sizeof(uint8_t)*(fi->width >> 1) *(fi->height>>1)); | |
14 | for(j=0; j<fi->height/2; j++){ | |
15 | for(i=0; i<size/2; i++){ | |
16 | img->data[1][i+j*img->linesize[1]]= sin(((double)i)/size/j*2.0)*128+128; | |
17 | img->data[2][i+j*img->linesize[2]]= cos(((double)i)/size/j*4.0)*128+128; | |
18 | } | |
19 | } | |
20 | } | |
21 | ||
22 | ||
23 | void test_transform_implementation(const TestData* testdata){ | |
24 | ||
25 | VSFrameInfo fi; | |
26 | VSFrame src; | |
27 | testImageStripeYUV(128,&fi,&src); | |
28 | VSFrame dest; | |
29 | vsFrameAllocate(&dest,&fi); | |
30 | VSFrame cfinal; | |
31 | vsFrameAllocate(&cfinal,&fi); | |
32 | VSTransformData td; | |
33 | VSTransformConfig conf = vsTransformGetDefaultConfig("test_transform_implementation"); | |
34 | ||
35 | fprintf(stderr,"--- Validate Interpolations ----\n"); | |
36 | ||
37 | int it; | |
38 | int i; | |
39 | int sum; | |
40 | VSTransform t; | |
41 | t.x = 10; | |
42 | t.alpha = 2*M_PI/(180.0); | |
43 | ||
44 | for(it=VS_Zero; it<=VS_BiCubic; it++){ | |
45 | vsFrameCopy(&dest, &src, &fi); | |
46 | conf.interpolType=it; | |
47 | test_bool(vsTransformDataInit(&td, &conf, &fi, &fi) == VS_OK); | |
48 | ||
49 | fprintf(stderr,"Transform: %s\n", getInterpolationTypeName(it)); | |
50 | test_bool(vsTransformPrepare(&td,&dest,&dest)== VS_OK); | |
51 | test_bool(transformPlanar_float(&td, t)== VS_OK); | |
52 | ||
53 | vsFrameCopy(&cfinal,&td.dest,&fi); | |
54 | vsTransformDataCleanup(&td); | |
55 | ||
56 | vsFrameCopy(&dest, &src, &fi); | |
57 | test_bool(vsTransformDataInit(&td, &conf, &fi, &fi) == VS_OK); | |
58 | test_bool(vsTransformPrepare(&td,&dest,&dest)== VS_OK); | |
59 | test_bool(transformPlanar(&td, t)== VS_OK); | |
60 | ||
61 | // validate | |
62 | sum=0; | |
63 | for(i=0; i<fi.width*fi.height; i++){ | |
64 | int diff = cfinal.data[0][i] - td.dest.data[0][i]; | |
65 | if(abs(diff)>2){ | |
66 | sum+=abs(diff); | |
67 | printf("%i,%i: %i\n", i/fi.width, i%fi.width, diff); | |
68 | } | |
69 | } | |
70 | vsTransformDataCleanup(&td); | |
71 | printf("***Difference: %i\n", sum); | |
72 | test_bool(sum==0); | |
73 | } | |
74 | vsFrameFree(&dest); | |
75 | vsFrameFree(&cfinal); | |
76 | vsFrameFree(&src); | |
77 | } | |
78 | ||
79 | void test_transform_performance(const TestData* testdata){ | |
80 | ||
81 | ||
82 | VSTransformConfig conf = vsTransformGetDefaultConfig("test_transform_performance"); | |
83 | fprintf(stderr,"--- Performance of Transforms ----\n"); | |
84 | VSFrame dest; | |
85 | VSFrame cfinal; | |
86 | int it; | |
87 | int start, numruns; | |
88 | int timeC, timeCFP; //, timeOrc; | |
89 | vsFrameAllocate(&dest, &testdata->fi); | |
90 | vsFrameAllocate(&cfinal, &testdata->fi); | |
91 | numruns = 5; | |
92 | for(it=VS_Zero; it<=VS_BiCubic; it++){ | |
93 | VSTransformData td; | |
94 | int i; | |
95 | //// Float implementation | |
96 | conf.interpolType=it; | |
97 | test_bool(vsTransformDataInit(&td, &conf, &testdata->fi, &testdata->fi) == VS_OK); | |
98 | ||
99 | fprintf(stderr,"Transform: %s", getInterpolationTypeName(it)); | |
100 | start = timeOfDayinMS(); | |
101 | for(i=0; i<numruns; i++){ | |
102 | VSTransform t = null_transform(); | |
103 | t.x = i*10+10; | |
104 | t.alpha = (i+1)*2*M_PI/(180.0); | |
105 | t.zoom = 0; | |
106 | vsFrameCopy(&dest, &testdata->frames[0], &testdata->fi); | |
107 | test_bool(vsTransformPrepare(&td,&dest,&dest)== VS_OK); | |
108 | test_bool(transformPlanar_float(&td, t)== VS_OK); | |
109 | } | |
110 | timeC = timeOfDayinMS() - start; | |
111 | fprintf(stderr,"\n***C elapsed time for %i runs: %i ms ****\n", | |
112 | numruns, timeC ); | |
113 | ||
114 | if(it==VS_BiLinear){ | |
115 | storePGMImage("transformed.pgm", td.dest.data[0], testdata->fi); | |
116 | storePGMImage("transformed_u.pgm", td.dest.data[1], testdata->fi_color); | |
117 | fprintf(stderr,"stored transformed.pgm\n"); | |
118 | } | |
119 | vsFrameCopy(&cfinal,&td.dest,&testdata->fi); | |
120 | vsTransformDataCleanup(&td); | |
121 | ||
122 | //// fixed point implementation | |
123 | test_bool(vsTransformDataInit(&td, &conf, &testdata->fi, &testdata->fi) == VS_OK); | |
124 | start = timeOfDayinMS(); | |
125 | for(i=0; i<numruns; i++){ | |
126 | VSTransform t = null_transform(); | |
127 | t.x = i*10+10; | |
128 | t.alpha = (i+1)*2*M_PI/(180.0); | |
129 | t.zoom = 0; | |
130 | vsFrameCopy(&dest, &testdata->frames[0], &testdata->fi); | |
131 | test_bool(vsTransformPrepare(&td,&dest,&dest)== VS_OK); | |
132 | test_bool(transformPlanar(&td, t)== VS_OK); | |
133 | } | |
134 | timeCFP = timeOfDayinMS() - start; | |
135 | fprintf(stderr,"***FP elapsed time for %i runs: %i ms ****\n", | |
136 | numruns, timeCFP ); | |
137 | if(it==VS_BiLinear){ | |
138 | storePGMImage("transformed_FP.pgm", td.dest.data[0], testdata->fi); | |
139 | storePGMImage("transformed_u_FP.pgm", td.dest.data[1], testdata->fi_color); | |
140 | fprintf(stderr,"stored transformed_FP.pgm\n"); | |
141 | } | |
142 | fprintf(stderr,"***Speedup %3.2f\n", (double)timeC/timeCFP); | |
143 | // validate | |
144 | int sum=0; | |
145 | for(i=0; i<testdata->fi.width*testdata->fi.height; i++){ | |
146 | int diff = cfinal.data[0][i] - td.dest.data[0][i]; | |
147 | if(abs(diff)>2){ | |
148 | sum+=abs(diff); | |
149 | //printf("%i,%i: %i\n", i/fi.width, i%fi.width, diff); | |
150 | } | |
151 | } | |
152 | printf("***Difference: %i\n", sum); | |
153 | vsTransformDataCleanup(&td); | |
154 | test_bool(sum==0); | |
155 | } | |
156 | ||
157 | vsFrameFree(&dest); | |
158 | vsFrameFree(&cfinal); | |
159 | } |