43 |
2.8165226, 1.0361408, 0.1402264, 0.0069815 |
2.8165226, 1.0361408, 0.1402264, 0.0069815 |
44 |
}; |
}; |
45 |
|
|
46 |
|
/* integer version. Norm: coeffs sums up to 4096. |
47 |
|
Define USE_INT_GAUSSIAN to use it as replacement to float version */ |
48 |
|
|
49 |
|
/* #define USE_INT_GAUSSIAN */ |
50 |
|
static const uint16_t imask8[8] = { |
51 |
|
4, 72, 530, 1442, 1442, 530, 72, 4 |
52 |
|
}; |
53 |
|
#define GACCUM(X) ( ((X)+(1<<11)) >> 12 ) |
54 |
|
|
55 |
|
|
56 |
struct framestat_t{ |
struct framestat_t{ |
57 |
int type; |
int type; |
58 |
int quant; |
int quant; |
251 |
return (int) mean + 0.5; |
return (int) mean + 0.5; |
252 |
} |
} |
253 |
|
|
254 |
|
int lum_8x8_gaussian_int(uint8_t* ptr, int stride){ |
255 |
|
uint32_t mean; |
256 |
|
int i,j; |
257 |
|
mean = 0; |
258 |
|
for(i=0;i<8;i++){ |
259 |
|
uint32_t sum = 0; |
260 |
|
for(j=0;j<8;j++) |
261 |
|
sum += ptr[i*stride + j]*imask8[j]; |
262 |
|
|
263 |
|
sum = GACCUM(sum) * imask8[i]; |
264 |
|
mean += sum; |
265 |
|
} |
266 |
|
return (int)GACCUM(mean); |
267 |
|
} |
268 |
|
|
269 |
/*calculate the difference between two blocks next to each other on a row*/ |
/*calculate the difference between two blocks next to each other on a row*/ |
270 |
int lum_2x8_c(uint8_t* ptr, int stride){ |
int lum_2x8_c(uint8_t* ptr, int stride){ |
271 |
int mean=0,i; |
int mean=0,i; |
309 |
*pcorr = (int) (corr - ((lumo*lumc + 32) >> 6)) + 0.5; |
*pcorr = (int) (corr - ((lumo*lumc + 32) >> 6)) + 0.5; |
310 |
}; |
}; |
311 |
|
|
312 |
|
void consim_gaussian_int(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr) |
313 |
|
{ |
314 |
|
unsigned int valo, valc,i,j,str; |
315 |
|
uint32_t devo=0, devc=0, corr=0; |
316 |
|
str = stride - 8; |
317 |
|
for(i=0;i< 8;i++){ |
318 |
|
uint32_t sumo = 0; |
319 |
|
uint32_t sumc = 0; |
320 |
|
uint32_t sumcorr = 0; |
321 |
|
for(j=0;j< 8;j++){ |
322 |
|
valo = *ptro; |
323 |
|
valc = *ptrc; |
324 |
|
sumo += valo*valo*imask8[j]; |
325 |
|
sumc += valc*valc*imask8[j]; |
326 |
|
sumcorr += valo*valc*imask8[j]; |
327 |
|
ptro++; |
328 |
|
ptrc++; |
329 |
|
} |
330 |
|
|
331 |
|
devo += GACCUM(sumo)*imask8[i]; |
332 |
|
devc += GACCUM(sumc)*imask8[i]; |
333 |
|
corr += GACCUM(sumcorr)*imask8[i]; |
334 |
|
ptro += str; |
335 |
|
ptrc += str; |
336 |
|
} |
337 |
|
|
338 |
|
devo = GACCUM(devo); |
339 |
|
devc = GACCUM(devc); |
340 |
|
corr = GACCUM(corr); |
341 |
|
*pdevo = (int) (devo - ((lumo*lumo + 32) >> 6)) + 0.5; |
342 |
|
*pdevc = (int) (devc - ((lumc*lumc + 32) >> 6)) + 0.5; |
343 |
|
*pcorr = (int) (corr - ((lumo*lumc + 32) >> 6)) + 0.5; |
344 |
|
}; |
345 |
|
|
346 |
/*calculate contrast and correlation of the two blocks*/ |
/*calculate contrast and correlation of the two blocks*/ |
347 |
void consim_c(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr){ |
void consim_c(uint8_t* ptro, uint8_t* ptrc, int stride, int lumo, int lumc, int* pdevo, int* pdevc, int* pcorr){ |
348 |
unsigned int valo, valc, devo=0, devc=0, corr=0,i,j,str; |
unsigned int valo, valc, devo=0, devc=0, corr=0,i,j,str; |
492 |
#endif |
#endif |
493 |
|
|
494 |
/*gaussian weigthing not implemented*/ |
/*gaussian weigthing not implemented*/ |
495 |
|
#if !defined(USE_INT_GAUSSIAN) |
496 |
if(ssim->grid == 0){ |
if(ssim->grid == 0){ |
497 |
ssim->grid = 1; |
ssim->grid = 1; |
498 |
ssim->func8x8 = lum_8x8_gaussian; |
ssim->func8x8 = lum_8x8_gaussian; |
499 |
ssim->func2x8 = NULL; |
ssim->func2x8 = NULL; |
500 |
ssim->consim = consim_gaussian; |
ssim->consim = consim_gaussian; |
501 |
} |
} |
502 |
|
#else |
503 |
|
if(ssim->grid == 0){ |
504 |
|
ssim->grid = 1; |
505 |
|
ssim->func8x8 = lum_8x8_gaussian_int; |
506 |
|
ssim->func2x8 = NULL; |
507 |
|
ssim->consim = consim_gaussian_int; |
508 |
|
} |
509 |
|
#endif |
510 |
if(ssim->grid > 4) ssim->grid = 4; |
if(ssim->grid > 4) ssim->grid = 4; |
511 |
|
|
512 |
ssim->ssim_sum = 0.0; |
ssim->ssim_sum = 0.0; |