// We are using a 8x8 moving window with starting location of each 8x8 window // on the 4x4 pixel grid. Such arrangement allows the windows to overlap // block boundaries to penalize blocking artifacts. double vp8_ssim2 ( unsigned char *img1, unsigned char *img2, int stride_img1, int stride_img2, int width, int height ) { int i,j; int samples =0; double ssim_total=0; // sample point start with each 4x4 location for(i=0; i < height-8; i+=4, img1 += stride_img1*4, img2 += stride_img2*4) { for(j=0; j < width-8; j+=4 ) { double v = ssim_8x8(img1+j, stride_img1, img2+j, stride_img2); ssim_total += v; samples++; } } ssim_total /= samples; return ssim_total; }
// We are using a 8x8 moving window with starting location of each 8x8 window // on the 4x4 pixel grid. Such arrangement allows the windows to overlap // block boundaries to penalize blocking artifacts. static double aom_ssim2(const uint8_t *img1, const uint8_t *img2, int stride_img1, int stride_img2, int width, int height) { int i, j; int samples = 0; double ssim_total = 0; // sample point start with each 4x4 location for (i = 0; i <= height - 8; i += 4, img1 += stride_img1 * 4, img2 += stride_img2 * 4) { for (j = 0; j <= width - 8; j += 4) { double v = ssim_8x8(img1 + j, stride_img1, img2 + j, stride_img2); ssim_total += v; samples++; } } ssim_total /= samples; return ssim_total; }