[cvs] / xvidcore / src / motion / sad.c Repository:
ViewVC logotype

Diff of /xvidcore/src/motion/sad.c

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

revision 1.7.2.1, Mon Sep 23 20:36:02 2002 UTC revision 1.9, Sat Oct 19 11:41:11 2002 UTC
# Line 1  Line 1 
1  /**************************************************************************  /*****************************************************************************
2   *   *
3   *      XVID MPEG-4 VIDEO CODEC   *      XVID MPEG-4 VIDEO CODEC
4   *      sum of absolute difference   *  - SAD calculation module (C part) -
5     *
6     *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7     *  Copyright(C) 2002 Pete Ross
8   *   *
9   *      This program is an implementation of a part of one or more MPEG-4   *      This program is an implementation of a part of one or more MPEG-4
10   *      Video tools as specified in ISO/IEC 14496-2 standard.  Those intending   *      Video tools as specified in ISO/IEC 14496-2 standard.  Those intending
# Line 24  Line 27 
27   *   *
28   *      You should have received a copy of the GNU General Public License   *      You should have received a copy of the GNU General Public License
29   *      along with this program; if not, write to the Free Software   *      along with this program; if not, write to the Free Software
30   *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  *  
  *************************************************************************/  
   
 /**************************************************************************  
  *  
  *      History:  
31   *   *
32   *      14.02.2002      added sad16bi_c()   ****************************************************************************/
  *      10.11.2001      initial version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
  *  
  *************************************************************************/  
   
33    
34  #include "../portab.h"  #include "../portab.h"
35  #include "sad.h"  #include "sad.h"
# Line 46  Line 39 
39  sad16biFuncPtr sad16bi;  sad16biFuncPtr sad16bi;
40  sad8biFuncPtr sad8bi;           // not really sad16, but no difference in prototype  sad8biFuncPtr sad8bi;           // not really sad16, but no difference in prototype
41  dev16FuncPtr dev16;  dev16FuncPtr dev16;
 sad16vFuncPtr sad16v;  
42    
43  sadInitFuncPtr sadInit;  sadInitFuncPtr sadInit;
44    
45  #define ABS(X) (((X)>0)?(X):-(X))  #define ABS(X) (((X)>0)?(X):-(X))
46    
47    #define MRSAD16_CORRFACTOR 8
48    uint32_t
49    mrsad16_c(const uint8_t * const cur,
50                      const uint8_t * const ref,
51                      const uint32_t stride,
52                      const uint32_t best_sad)
53    {
54    
55            uint32_t sad = 0;
56            int32_t mean = 0;
57            uint32_t i, j;
58            uint8_t const *ptr_cur = cur;
59            uint8_t const *ptr_ref = ref;
60    
61            for (j = 0; j < 16; j++) {
62                    for (i = 0; i < 16; i++) {
63                            mean += ((int) *(ptr_cur + i) - (int) *(ptr_ref + i));
64                    }
65                    ptr_cur += stride;
66                    ptr_ref += stride;
67    
68            }
69            mean /= 256;
70    
71            for (j = 0; j < 16; j++) {
72    
73                    ptr_cur -= stride;
74                    ptr_ref -= stride;
75    
76                    for (i = 0; i < 16; i++) {
77    
78                            sad += ABS(*(ptr_cur + i) - *(ptr_ref + i) - mean);
79                            if (sad >= best_sad) {
80                                    return MRSAD16_CORRFACTOR * sad;
81                            }
82                    }
83            }
84    
85            return MRSAD16_CORRFACTOR * sad;
86    
87    }
88    
89    
90  uint32_t  uint32_t
91  sad16_c(const uint8_t * const cur,  sad16_c(const uint8_t * const cur,
92                  const uint8_t * const ref,                  const uint8_t * const ref,
# Line 60  Line 95 
95  {  {
96    
97          uint32_t sad = 0;          uint32_t sad = 0;
98          uint32_t j;          uint32_t i, j;
99          uint8_t const *ptr_cur = cur;          uint8_t const *ptr_cur = cur;
100          uint8_t const *ptr_ref = ref;          uint8_t const *ptr_ref = ref;
101    
102          for (j = 0; j < 16; j++) {          for (j = 0; j < 16; j++) {
                         sad += ABS(ptr_cur[0] - ptr_ref[0]);  
                         sad += ABS(ptr_cur[1] - ptr_ref[1]);  
                         sad += ABS(ptr_cur[2] - ptr_ref[2]);  
                         sad += ABS(ptr_cur[3] - ptr_ref[3]);  
                         sad += ABS(ptr_cur[4] - ptr_ref[4]);  
                         sad += ABS(ptr_cur[5] - ptr_ref[5]);  
                         sad += ABS(ptr_cur[6] - ptr_ref[6]);  
                         sad += ABS(ptr_cur[7] - ptr_ref[7]);  
                         sad += ABS(ptr_cur[8] - ptr_ref[8]);  
                         sad += ABS(ptr_cur[9] - ptr_ref[9]);  
                         sad += ABS(ptr_cur[10] - ptr_ref[10]);  
                         sad += ABS(ptr_cur[11] - ptr_ref[11]);  
                         sad += ABS(ptr_cur[12] - ptr_ref[12]);  
                         sad += ABS(ptr_cur[13] - ptr_ref[13]);  
                         sad += ABS(ptr_cur[14] - ptr_ref[14]);  
                         sad += ABS(ptr_cur[15] - ptr_ref[15]);  
103    
104                          if (sad >= best_sad)                  for (i = 0; i < 16; i++) {
105    
106                            sad += ABS(*(ptr_cur + i) - *(ptr_ref + i));
107    
108                            if (sad >= best_sad) {
109                                  return sad;                                  return sad;
110                            }
111    
112    
113                    }
114    
115                          ptr_cur += stride;                          ptr_cur += stride;
116                          ptr_ref += stride;                          ptr_ref += stride;
# Line 94  Line 121 
121    
122  }  }
123    
124    
125    
126  uint32_t  uint32_t
127  sad16bi_c(const uint8_t * const cur,  sad16bi_c(const uint8_t * const cur,
128                    const uint8_t * const ref1,                    const uint8_t * const ref1,
# Line 176  Line 205 
205             const uint32_t stride)             const uint32_t stride)
206  {  {
207          uint32_t sad = 0;          uint32_t sad = 0;
208          uint32_t j;          uint32_t i, j;
209          uint8_t const *ptr_cur = cur;          uint8_t const *ptr_cur = cur;
210          uint8_t const *ptr_ref = ref;          uint8_t const *ptr_ref = ref;
211    
212          for (j = 0; j < 8; j++) {          for (j = 0; j < 8; j++) {
213    
214                  sad += ABS(ptr_cur[0] - ptr_ref[0]);                  for (i = 0; i < 8; i++) {
215                  sad += ABS(ptr_cur[1] - ptr_ref[1]);                          sad += ABS(*(ptr_cur + i) - *(ptr_ref + i));
216                  sad += ABS(ptr_cur[2] - ptr_ref[2]);                  }
                 sad += ABS(ptr_cur[3] - ptr_ref[3]);  
                 sad += ABS(ptr_cur[4] - ptr_ref[4]);  
                 sad += ABS(ptr_cur[5] - ptr_ref[5]);  
                 sad += ABS(ptr_cur[6] - ptr_ref[6]);  
                 sad += ABS(ptr_cur[7] - ptr_ref[7]);  
217    
218                  ptr_cur += stride;                  ptr_cur += stride;
219                  ptr_ref += stride;                  ptr_ref += stride;
# Line 200  Line 224 
224  }  }
225    
226    
227    
228    
229  /* average deviation from mean */  /* average deviation from mean */
230    
231  uint32_t  uint32_t
# Line 235  Line 261 
261    
262          return dev;          return dev;
263  }  }
   
 uint32_t sad16v_c(const uint8_t * const cur,  
                            const uint8_t * const ref,  
                            const uint32_t stride,  
                            int32_t *sad)  
 {  
         sad[0] = sad8(cur, ref, stride);  
         sad[1] = sad8(cur + 8, ref + 8, stride);  
         sad[2] = sad8(cur + 8*stride, ref + 8*stride, stride);  
         sad[3] = sad8(cur + 8*stride + 8, ref + 8*stride + 8, stride);  
   
         return sad[0]+sad[1]+sad[2]+sad[3];  
 }  
   
   
 #define MRSAD16_CORRFACTOR 8  
 uint32_t  
 mrsad16_c(const uint8_t * const cur,  
                   const uint8_t * const ref,  
                   const uint32_t stride,  
                   const uint32_t best_sad)  
 {  
   
         uint32_t sad = 0;  
         int32_t mean = 0;  
         uint32_t i, j;  
         uint8_t const *ptr_cur = cur;  
         uint8_t const *ptr_ref = ref;  
   
         for (j = 0; j < 16; j++) {  
                 for (i = 0; i < 16; i++) {  
                         mean += ((int) *(ptr_cur + i) - (int) *(ptr_ref + i));  
                 }  
                 ptr_cur += stride;  
                 ptr_ref += stride;  
   
         }  
         mean /= 256;  
   
         for (j = 0; j < 16; j++) {  
   
                 ptr_cur -= stride;  
                 ptr_ref -= stride;  
   
                 for (i = 0; i < 16; i++) {  
   
                         sad += ABS(*(ptr_cur + i) - *(ptr_ref + i) - mean);  
                         if (sad >= best_sad) {  
                                 return MRSAD16_CORRFACTOR * sad;  
                         }  
                 }  
         }  
   
         return MRSAD16_CORRFACTOR * sad;  
   
 }  
   
   

Legend:
Removed from v.1.7.2.1  
changed lines
  Added in v.1.9

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