|
|
|
@ -85,13 +85,13 @@ static void set_meta(AVDictionary **metadata, const char *key, char comp, float |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void ssim_4x4x2_core(const uint8_t *main, int main_stride, |
|
|
|
|
const uint8_t *ref, int ref_stride, |
|
|
|
|
int sums[2][4]) |
|
|
|
|
static void ssim_4x4xn(const uint8_t *main, int main_stride, |
|
|
|
|
const uint8_t *ref, int ref_stride, |
|
|
|
|
int (*sums)[4], int width) |
|
|
|
|
{ |
|
|
|
|
int x, y, z; |
|
|
|
|
|
|
|
|
|
for (z = 0; z < 2; z++) { |
|
|
|
|
for (z = 0; z < width; z++) { |
|
|
|
|
uint32_t s1 = 0, s2 = 0, ss = 0, s12 = 0; |
|
|
|
|
|
|
|
|
|
for (y = 0; y < 4; y++) { |
|
|
|
@ -149,8 +149,7 @@ static float ssim_plane(uint8_t *main, int main_stride, |
|
|
|
|
uint8_t *ref, int ref_stride, |
|
|
|
|
int width, int height, void *temp) |
|
|
|
|
{ |
|
|
|
|
int z = 0; |
|
|
|
|
int x, y; |
|
|
|
|
int z = 0, y; |
|
|
|
|
float ssim = 0.0; |
|
|
|
|
int (*sum0)[4] = temp; |
|
|
|
|
int (*sum1)[4] = sum0 + (width >> 2) + 3; |
|
|
|
@ -161,10 +160,9 @@ static float ssim_plane(uint8_t *main, int main_stride, |
|
|
|
|
for (y = 1; y < height; y++) { |
|
|
|
|
for (; z <= y; z++) { |
|
|
|
|
FFSWAP(void*, sum0, sum1); |
|
|
|
|
for (x = 0; x < width; x+=2) |
|
|
|
|
ssim_4x4x2_core(&main[4 * (x + z * main_stride)], main_stride, |
|
|
|
|
&ref[4 * (x + z * ref_stride)], ref_stride, |
|
|
|
|
&sum0[x]); |
|
|
|
|
ssim_4x4xn(&main[4 * z * main_stride], main_stride, |
|
|
|
|
&ref[4 * z * ref_stride], ref_stride, |
|
|
|
|
sum0, width); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ssim += ssim_endn(sum0, sum1, width - 1); |
|
|
|
|