Imported Debian version 1.0~trusty
[deb_vid.stab.git] / tests / test_transform.c
CommitLineData
80f575fc
DM
1
2void 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
23void 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
79void 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}