#include #include "ipp.h" static void print_16u(Ipp16u* pSrc, int srcStep, IppiSize roiSize) { int i, j; for (j = 0; j>1)*j+i]); } printf("\n"); } } int bench(int sw, int sh, int dw, int dh) { IppStatus status; IppiResizeSpec_32f* pSpec = 0; IppiInterpolationType interpolation = ippCubic; Ipp8u *pInitBuf, *pBuffer; IppiSize srcSize = { sw, sh}; IppiSize dstSize = { dw, dh}; int specSize, initSize, bufSize, srcStep, dstStep, i, j; IppiPoint dstOffset = { 0, 0 }; Ipp16u valueB = 0.15; Ipp16u valueC = 0.5; Ipp16u *pSrc, *pDst; Ipp16u borderVal[3] = { 0,0,0 }; __int64 cycles[2]; double cpe = 0, cpe1 = 0; //int n, nloops = 10000; int n, nloops = 5; //Resize with ippBorderRepl pSrc = ippiMalloc_16u_C1(srcSize.width, srcSize.height, &srcStep); pDst = ippiMalloc_16u_C1(dstSize.width, dstSize.height, &dstStep); for (i = 0; i < srcSize.height; i++) { for (j = 0; j < srcSize.width; j++) { pSrc[(srcStep>>1)*i+j] = i+j; } } status = ippiResizeGetSize_16u(srcSize, dstSize, interpolation, 0, &specSize, &initSize); pInitBuf = ippsMalloc_8u(initSize); pSpec = (IppiResizeSpec_32f*)ippsMalloc_8u(specSize); status = ippiResizeCubicInit_16u(srcSize, dstSize, valueB, valueC, pSpec, pInitBuf); status = ippiResizeGetBufferSize_16u(pSpec, dstSize, 1, &bufSize); pBuffer= ippsMalloc_8u(bufSize); status = ippiResizeCubic_16u_C1R(pSrc, srcStep, pDst, dstStep, dstOffset, dstSize, ippBorderRepl, borderVal, pSpec, pBuffer); cycles[0] = __rdtsc(); for (n = 0; n < nloops; n++) { status = ippiResizeCubic_16u_C1R(pSrc, srcStep, pDst, dstStep, dstOffset, dstSize, ippBorderRepl, borderVal, pSpec, pBuffer); } cycles[1] = __rdtsc(); cpe = ((double)cycles[1] - (double)cycles[0]) / (double)nloops; //printf("cpe=%.4f\n", cpe); //printf("source\n"); print_16u(pSrc, srcStep, srcSize); //printf("dest\n"); print_16u(pDst, dstStep, dstSize); //Resize with additional buffer Ipp16u *pSrc1; int srcStep1; IppiSize srcSize1; IppiBorderSize borderSize; status = ippiResizeGetBorderSize_16u(pSpec, &borderSize); srcSize1.width = borderSize.borderLeft + srcSize.width + borderSize.borderRight; srcSize1.height = borderSize.borderTop + srcSize.height + borderSize.borderBottom; pSrc1 = ippiMalloc_16u_C1(srcSize1.width, srcSize1.height, &srcStep1); ippiCopyReplicateBorder_16u_C1R(pSrc, srcStep, srcSize, pSrc1, srcStep1, srcSize1, borderSize.borderTop, borderSize.borderLeft); status = ippiResizeCubic_16u_C1R(pSrc1+(srcStep1>>1)*borderSize.borderTop + borderSize.borderLeft, srcStep1, pDst, dstStep, dstOffset, dstSize, ippBorderInMem, borderVal, pSpec, pBuffer); cycles[0] = __rdtsc(); for (n = 0; n < nloops; n++) { status = ippiResizeCubic_16u_C1R(pSrc1 + (srcStep1 >> 1)*borderSize.borderTop + borderSize.borderLeft, srcStep1, pDst, dstStep, dstOffset, dstSize, ippBorderInMem, borderVal, pSpec, pBuffer); } cycles[1] = __rdtsc(); cpe1 = ((double)cycles[1] - (double)cycles[0]) / (double)nloops; //printf("cpe=%.4f\n", cpe); printf("(%3d, %3d) -> (%3d, %3d), %12.2f, %12.2f\n", sw, sh, dw, dh, cpe, cpe1); //printf("source with border\n"); print_16u(pSrc1, srcStep1, srcSize1); //printf("dest\n"); print_16u(pDst, dstStep, dstSize); } int main() { const IppLibraryVersion* version; version = ippiGetLibVersion(); printf("%s, %s\n", version->Name, version->Version); bench(30, 27, 30 * 2, 27 * 2); bench(30, 27, 30 * 4, 27 * 4); bench(90, 81, 30 * 2, 27 * 2); bench(90, 81, 30 *4, 27 * 4); return 0; }