| 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 | } |