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

Annotation of /trunk/xvidcore/src/motion/sad.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1424 - (view) (download)

1 : edgomez 1382 /*****************************************************************************
2 : edgomez 195 *
3 : edgomez 1382 * XVID MPEG-4 VIDEO CODEC
4 :     * - Sum Of Absolute Difference related code -
5 : edgomez 195 *
6 : edgomez 1382 * Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7 : edgomez 195 *
8 : edgomez 1382 * 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
10 :     * the Free Software Foundation ; either version 2 of the License, or
11 :     * (at your option) any later version.
12 : edgomez 195 *
13 : edgomez 1382 * This program is distributed in the hope that it will be useful,
14 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
15 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     * GNU General Public License for more details.
17 : edgomez 195 *
18 : edgomez 1382 * You should have received a copy of the GNU General Public License
19 :     * along with this program ; if not, write to the Free Software
20 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 : edgomez 195 *
22 : edgomez 1424 * $Id: sad.c,v 1.16 2004-04-12 15:49:56 edgomez Exp $
23 : edgomez 195 *
24 : edgomez 1382 ****************************************************************************/
25 : edgomez 195
26 :     #include "../portab.h"
27 : edgomez 851 #include "../global.h"
28 : edgomez 195 #include "sad.h"
29 :    
30 : edgomez 1382 #include <stdlib.h>
31 :    
32 : edgomez 195 sad16FuncPtr sad16;
33 :     sad8FuncPtr sad8;
34 :     sad16biFuncPtr sad16bi;
35 : edgomez 1382 sad8biFuncPtr sad8bi; /* not really sad16, but no difference in prototype */
36 : edgomez 195 dev16FuncPtr dev16;
37 : edgomez 851 sad16vFuncPtr sad16v;
38 : edgomez 1382 sse8Func_16bitPtr sse8_16bit;
39 : edgomez 1424 sse8Func_8bitPtr sse8_8bit;
40 : edgomez 195
41 :     sadInitFuncPtr sadInit;
42 :    
43 :    
44 :     uint32_t
45 :     sad16_c(const uint8_t * const cur,
46 :     const uint8_t * const ref,
47 :     const uint32_t stride,
48 :     const uint32_t best_sad)
49 :     {
50 :    
51 :     uint32_t sad = 0;
52 : edgomez 851 uint32_t j;
53 : edgomez 195 uint8_t const *ptr_cur = cur;
54 :     uint8_t const *ptr_ref = ref;
55 :    
56 :     for (j = 0; j < 16; j++) {
57 : edgomez 1382 sad += abs(ptr_cur[0] - ptr_ref[0]);
58 :     sad += abs(ptr_cur[1] - ptr_ref[1]);
59 :     sad += abs(ptr_cur[2] - ptr_ref[2]);
60 :     sad += abs(ptr_cur[3] - ptr_ref[3]);
61 :     sad += abs(ptr_cur[4] - ptr_ref[4]);
62 :     sad += abs(ptr_cur[5] - ptr_ref[5]);
63 :     sad += abs(ptr_cur[6] - ptr_ref[6]);
64 :     sad += abs(ptr_cur[7] - ptr_ref[7]);
65 :     sad += abs(ptr_cur[8] - ptr_ref[8]);
66 :     sad += abs(ptr_cur[9] - ptr_ref[9]);
67 :     sad += abs(ptr_cur[10] - ptr_ref[10]);
68 :     sad += abs(ptr_cur[11] - ptr_ref[11]);
69 :     sad += abs(ptr_cur[12] - ptr_ref[12]);
70 :     sad += abs(ptr_cur[13] - ptr_ref[13]);
71 :     sad += abs(ptr_cur[14] - ptr_ref[14]);
72 :     sad += abs(ptr_cur[15] - ptr_ref[15]);
73 : edgomez 195
74 : edgomez 1382 if (sad >= best_sad)
75 : edgomez 195 return sad;
76 :    
77 : edgomez 851 ptr_cur += stride;
78 :     ptr_ref += stride;
79 : edgomez 195
80 :     }
81 :    
82 :     return sad;
83 :    
84 :     }
85 :    
86 :     uint32_t
87 :     sad16bi_c(const uint8_t * const cur,
88 :     const uint8_t * const ref1,
89 :     const uint8_t * const ref2,
90 :     const uint32_t stride)
91 :     {
92 :    
93 :     uint32_t sad = 0;
94 :     uint32_t i, j;
95 :     uint8_t const *ptr_cur = cur;
96 :     uint8_t const *ptr_ref1 = ref1;
97 :     uint8_t const *ptr_ref2 = ref2;
98 :    
99 :     for (j = 0; j < 16; j++) {
100 :    
101 :     for (i = 0; i < 16; i++) {
102 :     int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;
103 : edgomez 1382 sad += abs(ptr_cur[i] - pixel);
104 : edgomez 195 }
105 :    
106 :     ptr_cur += stride;
107 :     ptr_ref1 += stride;
108 :     ptr_ref2 += stride;
109 :    
110 :     }
111 :    
112 :     return sad;
113 :    
114 :     }
115 :    
116 :     uint32_t
117 :     sad8bi_c(const uint8_t * const cur,
118 :     const uint8_t * const ref1,
119 :     const uint8_t * const ref2,
120 :     const uint32_t stride)
121 :     {
122 :    
123 :     uint32_t sad = 0;
124 : chl 326 uint32_t i, j;
125 : edgomez 195 uint8_t const *ptr_cur = cur;
126 : chl 326 uint8_t const *ptr_ref1 = ref1;
127 :     uint8_t const *ptr_ref2 = ref2;
128 :    
129 :     for (j = 0; j < 8; j++) {
130 :    
131 :     for (i = 0; i < 8; i++) {
132 :     int pixel = (ptr_ref1[i] + ptr_ref2[i] + 1) / 2;
133 : edgomez 1382 sad += abs(ptr_cur[i] - pixel);
134 : chl 326 }
135 :    
136 :     ptr_cur += stride;
137 :     ptr_ref1 += stride;
138 :     ptr_ref2 += stride;
139 :    
140 :     }
141 :    
142 :     return sad;
143 :    
144 :     }
145 :    
146 :    
147 :    
148 :     uint32_t
149 :     sad8_c(const uint8_t * const cur,
150 :     const uint8_t * const ref,
151 :     const uint32_t stride)
152 :     {
153 :     uint32_t sad = 0;
154 : edgomez 851 uint32_t j;
155 : chl 326 uint8_t const *ptr_cur = cur;
156 : edgomez 195 uint8_t const *ptr_ref = ref;
157 :    
158 :     for (j = 0; j < 8; j++) {
159 :    
160 : edgomez 1382 sad += abs(ptr_cur[0] - ptr_ref[0]);
161 :     sad += abs(ptr_cur[1] - ptr_ref[1]);
162 :     sad += abs(ptr_cur[2] - ptr_ref[2]);
163 :     sad += abs(ptr_cur[3] - ptr_ref[3]);
164 :     sad += abs(ptr_cur[4] - ptr_ref[4]);
165 :     sad += abs(ptr_cur[5] - ptr_ref[5]);
166 :     sad += abs(ptr_cur[6] - ptr_ref[6]);
167 :     sad += abs(ptr_cur[7] - ptr_ref[7]);
168 :    
169 : edgomez 195 ptr_cur += stride;
170 :     ptr_ref += stride;
171 :    
172 :     }
173 :    
174 :     return sad;
175 :     }
176 :    
177 :    
178 :     /* average deviation from mean */
179 :    
180 :     uint32_t
181 :     dev16_c(const uint8_t * const cur,
182 :     const uint32_t stride)
183 :     {
184 :    
185 :     uint32_t mean = 0;
186 :     uint32_t dev = 0;
187 :     uint32_t i, j;
188 :     uint8_t const *ptr_cur = cur;
189 :    
190 :     for (j = 0; j < 16; j++) {
191 :    
192 :     for (i = 0; i < 16; i++)
193 :     mean += *(ptr_cur + i);
194 :    
195 :     ptr_cur += stride;
196 :    
197 :     }
198 :    
199 :     mean /= (16 * 16);
200 :     ptr_cur = cur;
201 :    
202 :     for (j = 0; j < 16; j++) {
203 :    
204 :     for (i = 0; i < 16; i++)
205 : edgomez 1382 dev += abs(*(ptr_cur + i) - (int32_t) mean);
206 : edgomez 195
207 :     ptr_cur += stride;
208 :    
209 :     }
210 :    
211 :     return dev;
212 :     }
213 : edgomez 851
214 : edgomez 1382 uint32_t sad16v_c(const uint8_t * const cur,
215 :     const uint8_t * const ref,
216 :     const uint32_t stride,
217 : edgomez 851 int32_t *sad)
218 :     {
219 :     sad[0] = sad8(cur, ref, stride);
220 :     sad[1] = sad8(cur + 8, ref + 8, stride);
221 :     sad[2] = sad8(cur + 8*stride, ref + 8*stride, stride);
222 :     sad[3] = sad8(cur + 8*stride + 8, ref + 8*stride + 8, stride);
223 : edgomez 1382
224 : edgomez 851 return sad[0]+sad[1]+sad[2]+sad[3];
225 :     }
226 :    
227 : edgomez 1382 uint32_t sad32v_c(const uint8_t * const cur,
228 :     const uint8_t * const ref,
229 :     const uint32_t stride,
230 : edgomez 851 int32_t *sad)
231 :     {
232 :     sad[0] = sad16(cur, ref, stride, 256*4096);
233 : edgomez 1382 sad[1] = sad16(cur + 16, ref + 16, stride, 256*4096);
234 :     sad[2] = sad16(cur + 16*stride, ref + 16*stride, stride, 256*4096);
235 :     sad[3] = sad16(cur + 16*stride + 16, ref + 16*stride + 16, stride, 256*4096);
236 :    
237 : edgomez 851 return sad[0]+sad[1]+sad[2]+sad[3];
238 :     }
239 :    
240 :    
241 :    
242 :     #define MRSAD16_CORRFACTOR 8
243 :     uint32_t
244 :     mrsad16_c(const uint8_t * const cur,
245 :     const uint8_t * const ref,
246 :     const uint32_t stride,
247 :     const uint32_t best_sad)
248 :     {
249 :    
250 :     uint32_t sad = 0;
251 :     int32_t mean = 0;
252 :     uint32_t i, j;
253 :     uint8_t const *ptr_cur = cur;
254 :     uint8_t const *ptr_ref = ref;
255 :    
256 :     for (j = 0; j < 16; j++) {
257 :     for (i = 0; i < 16; i++) {
258 :     mean += ((int) *(ptr_cur + i) - (int) *(ptr_ref + i));
259 :     }
260 :     ptr_cur += stride;
261 :     ptr_ref += stride;
262 :    
263 :     }
264 :     mean /= 256;
265 :    
266 :     for (j = 0; j < 16; j++) {
267 :    
268 :     ptr_cur -= stride;
269 :     ptr_ref -= stride;
270 :    
271 :     for (i = 0; i < 16; i++) {
272 :    
273 : edgomez 1382 sad += abs(*(ptr_cur + i) - *(ptr_ref + i) - mean);
274 : edgomez 851 if (sad >= best_sad) {
275 :     return MRSAD16_CORRFACTOR * sad;
276 :     }
277 :     }
278 :     }
279 :    
280 :     return MRSAD16_CORRFACTOR * sad;
281 :     }
282 :    
283 : edgomez 1382 uint32_t
284 :     sse8_16bit_c(const int16_t * b1,
285 :     const int16_t * b2,
286 :     const uint32_t stride)
287 :     {
288 :     int i;
289 :     int sse = 0;
290 : edgomez 851
291 : edgomez 1382 for (i=0; i<8; i++) {
292 :     sse += (b1[0] - b2[0])*(b1[0] - b2[0]);
293 :     sse += (b1[1] - b2[1])*(b1[1] - b2[1]);
294 :     sse += (b1[2] - b2[2])*(b1[2] - b2[2]);
295 :     sse += (b1[3] - b2[3])*(b1[3] - b2[3]);
296 :     sse += (b1[4] - b2[4])*(b1[4] - b2[4]);
297 :     sse += (b1[5] - b2[5])*(b1[5] - b2[5]);
298 :     sse += (b1[6] - b2[6])*(b1[6] - b2[6]);
299 :     sse += (b1[7] - b2[7])*(b1[7] - b2[7]);
300 :    
301 :     b1 = (const int16_t*)((int8_t*)b1+stride);
302 :     b2 = (const int16_t*)((int8_t*)b2+stride);
303 :     }
304 :    
305 :     return(sse);
306 :     }
307 : edgomez 1424
308 :     uint32_t
309 :     sse8_8bit_c(const uint8_t * b1,
310 :     const uint8_t * b2,
311 :     const uint32_t stride)
312 :     {
313 :     int i;
314 :     int sse = 0;
315 :    
316 :     for (i=0; i<8; i++) {
317 :     sse += (b1[0] - b2[0])*(b1[0] - b2[0]);
318 :     sse += (b1[1] - b2[1])*(b1[1] - b2[1]);
319 :     sse += (b1[2] - b2[2])*(b1[2] - b2[2]);
320 :     sse += (b1[3] - b2[3])*(b1[3] - b2[3]);
321 :     sse += (b1[4] - b2[4])*(b1[4] - b2[4]);
322 :     sse += (b1[5] - b2[5])*(b1[5] - b2[5]);
323 :     sse += (b1[6] - b2[6])*(b1[6] - b2[6]);
324 :     sse += (b1[7] - b2[7])*(b1[7] - b2[7]);
325 :    
326 :     b1 = b1+stride;
327 :     b2 = b2+stride;
328 :     }
329 :    
330 :     return(sse);
331 :     }

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