[svn] / trunk / xvidcore / src / plugins / plugin_ssim.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/plugins/plugin_ssim.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1757, Wed Nov 8 06:55:27 2006 UTC revision 1758, Wed Nov 8 07:17:22 2006 UTC
# Line 43  Line 43 
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;
# Line 241  Line 251 
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;
# Line 284  Line 309 
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;
# Line 433  Line 492 
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;

Legend:
Removed from v.1757  
changed lines
  Added in v.1758

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4