[svn] / branches / dev-api-4 / xvidcore / src / motion / sad.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/motion/sad.c

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

trunk/xvidcore/src/motion/sad.c revision 329, Tue Jul 23 12:59:57 2002 UTC branches/dev-api-4/xvidcore/src/motion/sad.c revision 1142, Wed Sep 10 22:19:00 2003 UTC
# Line 1  Line 1 
1  /**************************************************************************  /*****************************************************************************
2   *   *
3   *      XVID MPEG-4 VIDEO CODEC   *      XVID MPEG-4 VIDEO CODEC
4   *      sum of absolute difference   *  - Sum Of Absolute Difference related code -
5     *
6     *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7   *   *
8   *      This program is free software; you can redistribute it and/or modify   *      This program is free software; you can redistribute it and/or modify
9   *      it under the terms of the GNU General Public License as published by   *      it under the terms of the GNU General Public License as published by
# Line 15  Line 17 
17   *   *
18   *      You should have received a copy of the GNU General Public License   *      You should have received a copy of the GNU General Public License
19   *      along with this program; if not, write to the Free Software   *      along with this program; if not, write to the Free Software
20   *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  *  
  *************************************************************************/  
   
 /**************************************************************************  
  *  
  *      History:  
21   *   *
22   *      14.02.2002      added sad16bi_c()   * $Id: sad.c,v 1.13.2.6 2003-09-10 22:19:00 edgomez Exp $
  *      10.11.2001      initial version; (c)2001 peter ross <pross@cs.rmit.edu.au>  
23   *   *
24   *************************************************************************/   ****************************************************************************/
   
25    
26  #include "../portab.h"  #include "../portab.h"
27    #include "../global.h"
28  #include "sad.h"  #include "sad.h"
29    
30    #include <stdlib.h>
31    
32  sad16FuncPtr sad16;  sad16FuncPtr sad16;
33  sad8FuncPtr sad8;  sad8FuncPtr sad8;
34  sad16biFuncPtr sad16bi;  sad16biFuncPtr sad16bi;
35  sad8biFuncPtr sad8bi;           // not really sad16, but no difference in prototype  sad8biFuncPtr sad8bi;           /* not really sad16, but no difference in prototype */
36  dev16FuncPtr dev16;  dev16FuncPtr dev16;
37    sad16vFuncPtr sad16v;
38    
39  sadInitFuncPtr sadInit;  sadInitFuncPtr sadInit;
40    
 #define ABS(X) (((X)>0)?(X):-(X))  
   
 #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;  
   
 }  
   
41    
42  uint32_t  uint32_t
43  sad16_c(const uint8_t * const cur,  sad16_c(const uint8_t * const cur,
# Line 93  Line 47 
47  {  {
48    
49          uint32_t sad = 0;          uint32_t sad = 0;
50          uint32_t i, j;          uint32_t j;
51          uint8_t const *ptr_cur = cur;          uint8_t const *ptr_cur = cur;
52          uint8_t const *ptr_ref = ref;          uint8_t const *ptr_ref = ref;
53    
54          for (j = 0; j < 16; j++) {          for (j = 0; j < 16; j++) {
55                            sad += abs(ptr_cur[0] - ptr_ref[0]);
56                            sad += abs(ptr_cur[1] - ptr_ref[1]);
57                            sad += abs(ptr_cur[2] - ptr_ref[2]);
58                            sad += abs(ptr_cur[3] - ptr_ref[3]);
59                            sad += abs(ptr_cur[4] - ptr_ref[4]);
60                            sad += abs(ptr_cur[5] - ptr_ref[5]);
61                            sad += abs(ptr_cur[6] - ptr_ref[6]);
62                            sad += abs(ptr_cur[7] - ptr_ref[7]);
63                            sad += abs(ptr_cur[8] - ptr_ref[8]);
64                            sad += abs(ptr_cur[9] - ptr_ref[9]);
65                            sad += abs(ptr_cur[10] - ptr_ref[10]);
66                            sad += abs(ptr_cur[11] - ptr_ref[11]);
67                            sad += abs(ptr_cur[12] - ptr_ref[12]);
68                            sad += abs(ptr_cur[13] - ptr_ref[13]);
69                            sad += abs(ptr_cur[14] - ptr_ref[14]);
70                            sad += abs(ptr_cur[15] - ptr_ref[15]);
71    
72                  for (i = 0; i < 16; i++) {                          if (sad >= best_sad)
   
                         sad += ABS(*(ptr_cur + i) - *(ptr_ref + i));  
   
                         if (sad >= best_sad) {  
73                                  return sad;                                  return sad;
                         }  
   
   
                 }  
74    
75                  ptr_cur += stride;                  ptr_cur += stride;
76                  ptr_ref += stride;                  ptr_ref += stride;
# Line 119  Line 81 
81    
82  }  }
83    
   
   
84  uint32_t  uint32_t
85  sad16bi_c(const uint8_t * const cur,  sad16bi_c(const uint8_t * const cur,
86                    const uint8_t * const ref1,                    const uint8_t * const ref1,
# Line 138  Line 98 
98    
99                  for (i = 0; i < 16; i++) {                  for (i = 0; i < 16; i++) {
100                          int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;                          int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;
101                            sad += abs(ptr_cur[i] - pixel);
                         if (pixel < 0) {  
                                 pixel = 0;  
                         } else if (pixel > 255) {  
                                 pixel = 255;  
                         }  
   
                         sad += ABS(ptr_cur[i] - pixel);  
102                  }                  }
103    
104                  ptr_cur += stride;                  ptr_cur += stride;
# Line 175  Line 128 
128    
129                  for (i = 0; i < 8; i++) {                  for (i = 0; i < 8; i++) {
130                          int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;                          int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;
131                            sad += abs(ptr_cur[i] - pixel);
                         if (pixel < 0) {  
                                 pixel = 0;  
                         } else if (pixel > 255) {  
                                 pixel = 255;  
                         }  
   
                         sad += ABS(ptr_cur[i] - pixel);  
132                  }                  }
133    
134                  ptr_cur += stride;                  ptr_cur += stride;
# Line 203  Line 149 
149             const uint32_t stride)             const uint32_t stride)
150  {  {
151          uint32_t sad = 0;          uint32_t sad = 0;
152          uint32_t i, j;          uint32_t j;
153          uint8_t const *ptr_cur = cur;          uint8_t const *ptr_cur = cur;
154          uint8_t const *ptr_ref = ref;          uint8_t const *ptr_ref = ref;
155    
156          for (j = 0; j < 8; j++) {          for (j = 0; j < 8; j++) {
157    
158                  for (i = 0; i < 8; i++) {                  sad += abs(ptr_cur[0] - ptr_ref[0]);
159                          sad += ABS(*(ptr_cur + i) - *(ptr_ref + i));                  sad += abs(ptr_cur[1] - ptr_ref[1]);
160                  }                  sad += abs(ptr_cur[2] - ptr_ref[2]);
161                    sad += abs(ptr_cur[3] - ptr_ref[3]);
162                    sad += abs(ptr_cur[4] - ptr_ref[4]);
163                    sad += abs(ptr_cur[5] - ptr_ref[5]);
164                    sad += abs(ptr_cur[6] - ptr_ref[6]);
165                    sad += abs(ptr_cur[7] - ptr_ref[7]);
166    
167                  ptr_cur += stride;                  ptr_cur += stride;
168                  ptr_ref += stride;                  ptr_ref += stride;
# Line 222  Line 173 
173  }  }
174    
175    
   
   
176  /* average deviation from mean */  /* average deviation from mean */
177    
178  uint32_t  uint32_t
# Line 251  Line 200 
200          for (j = 0; j < 16; j++) {          for (j = 0; j < 16; j++) {
201    
202                  for (i = 0; i < 16; i++)                  for (i = 0; i < 16; i++)
203                          dev += ABS(*(ptr_cur + i) - (int32_t) mean);                          dev += abs(*(ptr_cur + i) - (int32_t) mean);
204    
205                  ptr_cur += stride;                  ptr_cur += stride;
206    
# Line 259  Line 208 
208    
209          return dev;          return dev;
210  }  }
211    
212    uint32_t sad16v_c(const uint8_t * const cur,
213                               const uint8_t * const ref,
214                               const uint32_t stride,
215                               int32_t *sad)
216    {
217            sad[0] = sad8(cur, ref, stride);
218            sad[1] = sad8(cur + 8, ref + 8, stride);
219            sad[2] = sad8(cur + 8*stride, ref + 8*stride, stride);
220            sad[3] = sad8(cur + 8*stride + 8, ref + 8*stride + 8, stride);
221    
222            return sad[0]+sad[1]+sad[2]+sad[3];
223    }
224    
225    uint32_t sad32v_c(const uint8_t * const cur,
226                               const uint8_t * const ref,
227                               const uint32_t stride,
228                               int32_t *sad)
229    {
230            sad[0] = sad16(cur, ref, stride, 256*4096);
231            sad[1] = sad16(cur + 16, ref + 16, stride, 256*4096);
232            sad[2] = sad16(cur + 16*stride, ref + 16*stride, stride, 256*4096);
233            sad[3] = sad16(cur + 16*stride + 16, ref + 16*stride + 16, stride, 256*4096);
234    
235            return sad[0]+sad[1]+sad[2]+sad[3];
236    }
237    
238    
239    
240    #define MRSAD16_CORRFACTOR 8
241    uint32_t
242    mrsad16_c(const uint8_t * const cur,
243                      const uint8_t * const ref,
244                      const uint32_t stride,
245                      const uint32_t best_sad)
246    {
247    
248            uint32_t sad = 0;
249            int32_t mean = 0;
250            uint32_t i, j;
251            uint8_t const *ptr_cur = cur;
252            uint8_t const *ptr_ref = ref;
253    
254            for (j = 0; j < 16; j++) {
255                    for (i = 0; i < 16; i++) {
256                            mean += ((int) *(ptr_cur + i) - (int) *(ptr_ref + i));
257                    }
258                    ptr_cur += stride;
259                    ptr_ref += stride;
260    
261            }
262            mean /= 256;
263    
264            for (j = 0; j < 16; j++) {
265    
266                    ptr_cur -= stride;
267                    ptr_ref -= stride;
268    
269                    for (i = 0; i < 16; i++) {
270    
271                            sad += abs(*(ptr_cur + i) - *(ptr_ref + i) - mean);
272                            if (sad >= best_sad) {
273                                    return MRSAD16_CORRFACTOR * sad;
274                            }
275                    }
276            }
277    
278            return MRSAD16_CORRFACTOR * sad;
279    }

Legend:
Removed from v.329  
changed lines
  Added in v.1142

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