1 /*****************************************************************
2 * gavl - a general purpose audio/video processing library
3 *
4 * Copyright (c) 2001 - 2011 Members of the Gmerlin project
5 * gmerlin-general@lists.sourceforge.net
6 * http://gmerlin.sourceforge.net
7 *
8 * 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 *
13 * 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 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * *****************************************************************/
21 #include <stdlib.h>
22
23 #include <gavl/gavl.h>
24 #include <gavl/gavldsp.h>
25 #include <dsp.h>
26 #include <bswap.h>
27 #include <math.h>
28
29 #include "colorspace_tables.h"
30 #include "colorspace_macros.h"
31
32 /* Sum of absolute differences */
sad_rgb15_c(const uint8_t * src_1,const uint8_t * src_2,int stride_1,int stride_2,int w,int h)33 static int sad_rgb15_c(const uint8_t * src_1, const uint8_t * src_2,
34 int stride_1, int stride_2,
35 int w, int h)
36 {
37 int ret = 0, i, j;
38 uint16_t * s1, *s2;
39 for(i = 0; i < h; i++)
40 {
41 s1 = (uint16_t *)src_1;
42 s2 = (uint16_t *)src_2;
43
44 for(j = 0; j < w; j++)
45 {
46 ret +=
47 abs(RGB15_TO_R_8(*s1)-RGB15_TO_R_8(*s2)) +
48 abs(RGB15_TO_G_8(*s1)-RGB15_TO_G_8(*s2)) +
49 abs(RGB15_TO_B_8(*s1)-RGB15_TO_B_8(*s2));
50 s1++;
51 s2++;
52 }
53 src_1 += stride_1;
54 src_2 += stride_2;
55 }
56 return ret;
57 }
58
sad_rgb16_c(const uint8_t * src_1,const uint8_t * src_2,int stride_1,int stride_2,int w,int h)59 static int sad_rgb16_c(const uint8_t * src_1, const uint8_t * src_2,
60 int stride_1, int stride_2,
61 int w, int h)
62 {
63 int ret = 0, i, j;
64 uint16_t * s1, *s2;
65 for(i = 0; i < h; i++)
66 {
67 s1 = (uint16_t *)src_1;
68 s2 = (uint16_t *)src_2;
69
70 for(j = 0; j < w; j++)
71 {
72 ret +=
73 abs(RGB16_TO_R_8(*s1)-RGB16_TO_R_8(*s2)) +
74 abs(RGB16_TO_G_8(*s1)-RGB16_TO_G_8(*s2)) +
75 abs(RGB16_TO_B_8(*s1)-RGB16_TO_B_8(*s2));
76 s1++;
77 s2++;
78 }
79 src_1 += stride_1;
80 src_2 += stride_2;
81 }
82 return ret;
83 }
84
sad_8_c(const uint8_t * src_1,const uint8_t * src_2,int stride_1,int stride_2,int w,int h)85 static int sad_8_c(const uint8_t * src_1, const uint8_t * src_2,
86 int stride_1, int stride_2,
87 int w, int h)
88 {
89 int ret = 0, i, j;
90 const uint8_t * s1, *s2;
91 for(i = 0; i < h; i++)
92 {
93 s1 = src_1;
94 s2 = src_2;
95
96 for(j = 0; j < w; j++)
97 {
98 ret += abs((*s1)-(*s2));
99 s1++;
100 s2++;
101 }
102 src_1 += stride_1;
103 src_2 += stride_2;
104 }
105 return ret;
106 }
107
sad_16_c(const uint8_t * src_1,const uint8_t * src_2,int stride_1,int stride_2,int w,int h)108 static int sad_16_c(const uint8_t * src_1, const uint8_t * src_2,
109 int stride_1, int stride_2,
110 int w, int h)
111 {
112 int ret = 0, i, j;
113 const uint16_t * s1, *s2;
114 for(i = 0; i < h; i++)
115 {
116 s1 = (const uint16_t*)src_1;
117 s2 = (const uint16_t*)src_2;
118
119 for(j = 0; j < w; j++)
120 {
121 ret += abs((*s1)-(*s2));
122 s1++;
123 s2++;
124 }
125 src_1 += stride_1;
126 src_2 += stride_2;
127 }
128 return ret;
129 }
130
sad_f_c(const uint8_t * src_1,const uint8_t * src_2,int stride_1,int stride_2,int w,int h)131 static float sad_f_c(const uint8_t * src_1, const uint8_t * src_2,
132 int stride_1, int stride_2,
133 int w, int h)
134 {
135 float ret = 0.0;
136 int i, j;
137 const float * s1, *s2;
138 for(i = 0; i < h; i++)
139 {
140 s1 = (const float*)src_1;
141 s2 = (const float*)src_2;
142
143 for(j = 0; j < w; j++)
144 {
145 ret += fabs((*s1)-(*s2));
146 s1++;
147 s2++;
148 }
149 src_1 += stride_1;
150 src_2 += stride_2;
151 }
152 return ret;
153 }
154
155 /* Averaging */
average_rgb15_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num)156 static void average_rgb15_c(const uint8_t * src_1, const uint8_t * src_2,
157 uint8_t * dst, int num)
158 {
159 int i;
160 const uint16_t * s1, *s2;
161 uint16_t *d;
162
163 s1 = (const uint16_t*)src_1;
164 s2 = (const uint16_t*)src_2;
165 d = (uint16_t*)dst;
166
167 for(i = 0; i < num; i++)
168 {
169 *d =
170 (((*s1 & RGB15_LOWER_MASK) +
171 (*s2 & RGB15_LOWER_MASK)) >> 1) & RGB15_LOWER_MASK;
172 *d |=
173 (((*s1 & RGB15_MIDDLE_MASK) +
174 (*s2 & RGB15_MIDDLE_MASK)) >> 1) & RGB15_MIDDLE_MASK;
175 *d |=
176 (((*s1 & RGB15_UPPER_MASK) +
177 (*s2 & RGB15_UPPER_MASK)) >> 1) & RGB15_UPPER_MASK;
178 s1++;
179 s2++;
180 d++;
181 }
182
183 }
184
average_rgb16_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num)185 static void average_rgb16_c(const uint8_t * src_1, const uint8_t * src_2,
186 uint8_t * dst, int num)
187 {
188 int i;
189 const uint16_t * s1, *s2;
190 uint16_t *d;
191
192 s1 = (const uint16_t*)src_1;
193 s2 = (const uint16_t*)src_2;
194 d = (uint16_t*)dst;
195
196 for(i = 0; i < num; i++)
197 {
198 *d =
199 (((*s1 & RGB16_LOWER_MASK) +
200 (*s2 & RGB16_LOWER_MASK)) >> 1) & RGB16_LOWER_MASK;
201 *d |=
202 (((*s1 & RGB16_MIDDLE_MASK) +
203 (*s2 & RGB16_MIDDLE_MASK)) >> 1) & RGB16_MIDDLE_MASK;
204 *d |=
205 (((*s1 & RGB16_UPPER_MASK) +
206 (*s2 & RGB16_UPPER_MASK)) >> 1) & RGB16_UPPER_MASK;
207 s1++;
208 s2++;
209 d++;
210 }
211
212 }
213
average_8_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num)214 static void average_8_c(const uint8_t * src_1, const uint8_t * src_2,
215 uint8_t * dst, int num)
216 {
217 int i;
218 for(i = 0; i < num; i++)
219 {
220 *dst = (*src_1 + *src_2 + 1) >> 1;
221 src_1++;
222 src_2++;
223 dst++;
224 }
225 }
226
average_16_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num)227 static void average_16_c(const uint8_t * src_1, const uint8_t * src_2,
228 uint8_t * dst, int num)
229 {
230 int i;
231 const uint16_t * s1, *s2;
232 uint16_t *d;
233
234 s1 = (const uint16_t*)src_1;
235 s2 = (const uint16_t*)src_2;
236 d = (uint16_t*)dst;
237
238 for(i = 0; i < num; i++)
239 {
240 *d = (*s1 + *s2 + 1) >> 1;
241 s1++;
242 s2++;
243 d++;
244 }
245
246 }
247
average_f_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num)248 static void average_f_c(const uint8_t * src_1, const uint8_t * src_2,
249 uint8_t * dst, int num)
250 {
251 int i;
252 const float * s1, *s2;
253 float *d;
254
255 s1 = (const float*)src_1;
256 s2 = (const float*)src_2;
257 d = (float*)dst;
258
259 for(i = 0; i < num; i++)
260 {
261 *d = (*s1 + *s2) * 0.5;
262 s1++;
263 s2++;
264 d++;
265 }
266 }
267
268
269 /* */
270
271 /* Interpolating */
272
interpolate_rgb15_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num,float fac)273 static void interpolate_rgb15_c(const uint8_t * src_1, const uint8_t * src_2,
274 uint8_t * dst, int num, float fac)
275 {
276 int i;
277 const uint16_t * s1, *s2;
278 uint16_t *d;
279 int fac_i = (int)(fac * 0x10000 + 0.5);
280 int anti_fac = 0x10000 - fac_i;
281
282 s1 = (const uint16_t*)src_1;
283 s2 = (const uint16_t*)src_2;
284 d = (uint16_t*)dst;
285
286 for(i = 0; i < num; i++)
287 {
288 *d =
289 (((*s1 & RGB15_LOWER_MASK)*fac_i +
290 (*s2 & RGB15_LOWER_MASK)*anti_fac) >> 16) & RGB15_LOWER_MASK;
291 *d |=
292 (((*s1 & RGB15_MIDDLE_MASK)*fac_i +
293 (*s2 & RGB15_MIDDLE_MASK)*anti_fac) >> 16) & RGB15_MIDDLE_MASK;
294 *d |=
295 (((*s1 & RGB15_UPPER_MASK)*fac_i +
296 (*s2 & RGB15_UPPER_MASK)*anti_fac) >> 16) & RGB15_UPPER_MASK;
297 s1++;
298 s2++;
299 d++;
300 }
301
302 }
303
interpolate_rgb16_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num,float fac)304 static void interpolate_rgb16_c(const uint8_t * src_1, const uint8_t * src_2,
305 uint8_t * dst, int num, float fac)
306 {
307 int i;
308 const uint16_t * s1, *s2;
309 uint16_t *d;
310 int fac_i = (int)(fac * 0x10000 + 0.5);
311 int anti_fac = 0x10000 - fac_i;
312
313 s1 = (const uint16_t*)src_1;
314 s2 = (const uint16_t*)src_2;
315 d = (uint16_t*)dst;
316
317 for(i = 0; i < num; i++)
318 {
319 *d =
320 (((*s1 & RGB16_LOWER_MASK)*fac_i +
321 (*s2 & RGB16_LOWER_MASK)*anti_fac) >> 16) & RGB16_LOWER_MASK;
322 *d |=
323 (((*s1 & RGB16_MIDDLE_MASK)*fac_i +
324 (*s2 & RGB16_MIDDLE_MASK)*anti_fac) >> 16) & RGB16_MIDDLE_MASK;
325 *d |=
326 (((*s1 & RGB16_UPPER_MASK)*fac_i +
327 (*s2 & RGB16_UPPER_MASK)*anti_fac) >> 16) & RGB16_UPPER_MASK;
328 s1++;
329 s2++;
330 d++;
331 }
332
333 }
334
interpolate_8_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num,float fac)335 static void interpolate_8_c(const uint8_t * src_1, const uint8_t * src_2,
336 uint8_t * dst, int num, float fac)
337 {
338 int i;
339 int fac_i = (int)(fac * 0x10000 + 0.5);
340 int anti_fac = 0x10000 - fac_i;
341 for(i = 0; i < num; i++)
342 {
343 *dst = (*src_1 * fac_i + *src_2 * anti_fac) >> 16;
344 src_1++;
345 src_2++;
346 dst++;
347 }
348 }
349
interpolate_16_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num,float fac)350 static void interpolate_16_c(const uint8_t * src_1, const uint8_t * src_2,
351 uint8_t * dst, int num, float fac)
352 {
353 int i;
354 const uint16_t * s1, *s2;
355 uint16_t *d;
356 int fac_i = (int)(fac * 0x8000 + 0.5);
357 int anti_fac = 0x8000 - fac_i;
358
359 s1 = (const uint16_t*)src_1;
360 s2 = (const uint16_t*)src_2;
361 d = (uint16_t*)dst;
362
363 for(i = 0; i < num; i++)
364 {
365 *d = (*s1 * fac_i + *s2 * anti_fac) >> 15;
366 s1++;
367 s2++;
368 d++;
369 }
370
371 }
372
interpolate_f_c(const uint8_t * src_1,const uint8_t * src_2,uint8_t * dst,int num,float fac)373 static void interpolate_f_c(const uint8_t * src_1, const uint8_t * src_2,
374 uint8_t * dst, int num, float fac)
375 {
376 int i;
377 const float * s1, *s2;
378 float *d;
379 float anti_fac = 1.0 - fac;
380 s1 = (const float*)src_1;
381 s2 = (const float*)src_2;
382 d = (float*)dst;
383
384 for(i = 0; i < num; i++)
385 {
386 *d = *s1 * fac + *s2 * anti_fac;
387 s1++;
388 s2++;
389 d++;
390 }
391 }
392
bswap_16_c(void * data,int len)393 static void bswap_16_c(void * data, int len)
394 {
395 int i;
396 uint16_t * ptr = (uint16_t*)data;
397
398 for(i = 0; i < len; i++)
399 {
400 *ptr = bswap_16(*ptr);
401 ptr++;
402 }
403
404 }
405
bswap_32_c(void * data,int len)406 static void bswap_32_c(void * data, int len)
407 {
408 int i;
409 uint32_t * ptr = (uint32_t*)data;
410 for(i = 0; i < len; i++)
411 {
412 *ptr = bswap_32(*ptr);
413 ptr++;
414 }
415 }
416
bswap_64_c(void * data,int len)417 static void bswap_64_c(void * data, int len)
418 {
419 int i;
420 uint64_t * ptr = (uint64_t*)data;
421 for(i = 0; i < len; i++)
422 {
423 *ptr = bswap_64(*ptr);
424 ptr++;
425 }
426 }
427
428 #define GENERIC_CLIP(val, min, max) (val>max?max:(val<min?min:val))
429
430 /* Add functions */
431
add_u8_c(const void * _src1,const void * _src2,void * _dst,int num)432 static void add_u8_c(const void * _src1, const void * _src2,
433 void * _dst, int num)
434 {
435 int32_t tmp;
436 int i = num+1;
437 const uint8_t * src1 = _src1;
438 const uint8_t * src2 = _src2;
439 uint8_t * dst = _dst;
440
441 while(--i)
442 {
443 tmp = *(src1++) + *(src2++);
444 *(dst++) = RECLIP_32_TO_8(tmp);
445 }
446 }
447
add_s8_c(const void * _src1,const void * _src2,void * _dst,int num)448 static void add_s8_c(const void * _src1, const void * _src2,
449 void * _dst, int num)
450 {
451 int tmp;
452 int i = num+1;
453 const int8_t * src1 = _src1;
454 const int8_t * src2 = _src2;
455 int8_t * dst = _dst;
456
457 while(--i)
458 {
459 tmp = *(src1++) + *(src2++);
460 *(dst++) = GENERIC_CLIP(tmp,-128,127);
461 }
462 }
463
add_u8_s_c(const void * _src1,const void * _src2,void * _dst,int num)464 static void add_u8_s_c(const void * _src1, const void * _src2,
465 void * _dst, int num)
466 {
467 int tmp;
468 int i = num+1;
469 const uint8_t * src1 = _src1;
470 const uint8_t * src2 = _src2;
471 uint8_t * dst = _dst;
472
473 while(--i)
474 {
475 tmp = *(src1++) + *(src2++) - 256;
476 *(dst++) = GENERIC_CLIP(tmp,-128,127) + 128;
477 }
478 }
479
480
add_u16_c(const void * _src1,const void * _src2,void * _dst,int num)481 static void add_u16_c(const void * _src1, const void * _src2,
482 void * _dst, int num)
483 {
484 int32_t tmp;
485 int i = num+1;
486 const uint16_t * src1 = _src1;
487 const uint16_t * src2 = _src2;
488 uint16_t * dst = _dst;
489
490 while(--i)
491 {
492 tmp = *(src1++) + *(src2++);
493 *(dst++) = RECLIP_32_TO_16(tmp);
494 }
495
496 }
497
add_s16_c(const void * _src1,const void * _src2,void * _dst,int num)498 static void add_s16_c(const void * _src1, const void * _src2,
499 void * _dst, int num)
500 {
501 int tmp;
502 int i = num+1;
503 const int16_t * src1 = _src1;
504 const int16_t * src2 = _src2;
505 int16_t * dst = _dst;
506
507 while(--i)
508 {
509 tmp = *(src1++) + *(src2++);
510 *(dst++) = GENERIC_CLIP(tmp,-32768,32767);
511 }
512 }
513
add_u16_s_c(const void * _src1,const void * _src2,void * _dst,int num)514 static void add_u16_s_c(const void * _src1, const void * _src2,
515 void * _dst, int num)
516 {
517 int tmp;
518 int i = num+1;
519 const uint16_t * src1 = _src1;
520 const uint16_t * src2 = _src2;
521 uint16_t * dst = _dst;
522
523 while(--i)
524 {
525 tmp = *(src1++) + *(src2++) - 65536;
526 *(dst++) = GENERIC_CLIP(tmp,-32768,32767) + 32768;
527 }
528 }
529
add_s32_c(const void * _src1,const void * _src2,void * _dst,int num)530 static void add_s32_c(const void * _src1, const void * _src2,
531 void * _dst, int num)
532 {
533 int64_t tmp;
534 int i = num+1;
535 const int32_t * src1 = _src1;
536 const int32_t * src2 = _src2;
537 int32_t * dst = _dst;
538
539 while(--i)
540 {
541 tmp = *(src1++) + *(src2++);
542 *(dst++) = GENERIC_CLIP(tmp,-2147483648LL,2147483647LL);
543 }
544 }
545
add_float_c(const void * _src1,const void * _src2,void * _dst,int num)546 static void add_float_c(const void * _src1, const void * _src2,
547 void * _dst, int num)
548 {
549 int i = num+1;
550 const float * src1 = _src1;
551 const float * src2 = _src2;
552 float * dst = _dst;
553
554 while(--i)
555 {
556 *(dst++) = *(src1++) + *(src2++);
557 }
558 }
559
add_double_c(const void * _src1,const void * _src2,void * _dst,int num)560 static void add_double_c(const void * _src1, const void * _src2,
561 void * _dst, int num)
562 {
563 int i = num+1;
564 const double * src1 = _src1;
565 const double * src2 = _src2;
566 double * dst = _dst;
567
568 while(--i)
569 {
570 *(dst++) = *(src1++) + *(src2++);
571 }
572 }
573
574 /* Subtract functions */
575
sub_u8_c(const void * _src1,const void * _src2,void * _dst,int num)576 static void sub_u8_c(const void * _src1, const void * _src2,
577 void * _dst, int num)
578 {
579 int32_t tmp;
580 int i = num+1;
581 const uint8_t * src1 = _src1;
582 const uint8_t * src2 = _src2;
583 uint8_t * dst = _dst;
584
585 while(--i)
586 {
587 tmp = *(src1++) - *(src2++);
588 *(dst++) = RECLIP_32_TO_8(tmp);
589 }
590 }
591
sub_s8_c(const void * _src1,const void * _src2,void * _dst,int num)592 static void sub_s8_c(const void * _src1, const void * _src2,
593 void * _dst, int num)
594 {
595 int tmp;
596 int i = num+1;
597 const int8_t * src1 = _src1;
598 const int8_t * src2 = _src2;
599 int8_t * dst = _dst;
600
601 while(--i)
602 {
603 tmp = *(src1++) - *(src2++);
604 *(dst++) = GENERIC_CLIP(tmp,-128,127);
605 }
606 }
607
sub_u8_s_c(const void * _src1,const void * _src2,void * _dst,int num)608 static void sub_u8_s_c(const void * _src1, const void * _src2,
609 void * _dst, int num)
610 {
611 int tmp;
612 int i = num+1;
613 const uint8_t * src1 = _src1;
614 const uint8_t * src2 = _src2;
615 uint8_t * dst = _dst;
616
617 while(--i)
618 {
619 tmp = *(src1++) - *(src2++);
620 *(dst++) = GENERIC_CLIP(tmp,-128,127) + 128;
621 }
622 }
623
624
sub_u16_c(const void * _src1,const void * _src2,void * _dst,int num)625 static void sub_u16_c(const void * _src1, const void * _src2,
626 void * _dst, int num)
627 {
628 int32_t tmp;
629 int i = num+1;
630 const uint16_t * src1 = _src1;
631 const uint16_t * src2 = _src2;
632 uint16_t * dst = _dst;
633
634 while(--i)
635 {
636 tmp = *(src1++) - *(src2++);
637 *(dst++) = RECLIP_32_TO_16(tmp);
638 }
639
640 }
641
sub_s16_c(const void * _src1,const void * _src2,void * _dst,int num)642 static void sub_s16_c(const void * _src1, const void * _src2,
643 void * _dst, int num)
644 {
645 int tmp;
646 int i = num+1;
647 const int16_t * src1 = _src1;
648 const int16_t * src2 = _src2;
649 int16_t * dst = _dst;
650
651 while(--i)
652 {
653 tmp = *(src1++) - *(src2++);
654 *(dst++) = GENERIC_CLIP(tmp,-32768,32767);
655 }
656 }
657
sub_u16_s_c(const void * _src1,const void * _src2,void * _dst,int num)658 static void sub_u16_s_c(const void * _src1, const void * _src2,
659 void * _dst, int num)
660 {
661 int tmp;
662 int i = num+1;
663 const uint16_t * src1 = _src1;
664 const uint16_t * src2 = _src2;
665 uint16_t * dst = _dst;
666
667 while(--i)
668 {
669 tmp = *(src1++) + *(src2++);
670 *(dst++) = GENERIC_CLIP(tmp,-32768,32767) + 32768;
671 }
672 }
673
sub_s32_c(const void * _src1,const void * _src2,void * _dst,int num)674 static void sub_s32_c(const void * _src1, const void * _src2,
675 void * _dst, int num)
676 {
677 int64_t tmp;
678 int i = num+1;
679 const int32_t * src1 = _src1;
680 const int32_t * src2 = _src2;
681 int32_t * dst = _dst;
682
683 while(--i)
684 {
685 tmp = *(src1++) - *(src2++);
686 *(dst++) = GENERIC_CLIP(tmp,-2147483648LL,2147483647LL);
687 }
688 }
689
sub_float_c(const void * _src1,const void * _src2,void * _dst,int num)690 static void sub_float_c(const void * _src1, const void * _src2,
691 void * _dst, int num)
692 {
693 int i = num+1;
694 const float * src1 = _src1;
695 const float * src2 = _src2;
696 float * dst = _dst;
697
698 while(--i)
699 {
700 *(dst++) = *(src1++) - *(src2++);
701 }
702 }
703
sub_double_c(const void * _src1,const void * _src2,void * _dst,int num)704 static void sub_double_c(const void * _src1, const void * _src2,
705 void * _dst, int num)
706 {
707 int i = num+1;
708 const double * src1 = _src1;
709 const double * src2 = _src2;
710 double * dst = _dst;
711
712 while(--i)
713 {
714 *(dst++) = *(src1++) - *(src2++);
715 }
716 }
717
718
gavl_dsp_init_c(gavl_dsp_funcs_t * funcs,int quality)719 void gavl_dsp_init_c(gavl_dsp_funcs_t * funcs,
720 int quality)
721 {
722 funcs->sad_rgb15 = sad_rgb15_c;
723 funcs->sad_rgb16 = sad_rgb16_c;
724 funcs->sad_8 = sad_8_c;
725 funcs->sad_16 = sad_16_c;
726 funcs->sad_f = sad_f_c;
727
728 funcs->average_rgb15 = average_rgb15_c;
729 funcs->average_rgb16 = average_rgb16_c;
730 funcs->average_8 = average_8_c;
731 funcs->average_16 = average_16_c;
732 funcs->average_f = average_f_c;
733
734 funcs->interpolate_rgb15 = interpolate_rgb15_c;
735 funcs->interpolate_rgb16 = interpolate_rgb16_c;
736 funcs->interpolate_8 = interpolate_8_c;
737 funcs->interpolate_16 = interpolate_16_c;
738 funcs->interpolate_f = interpolate_f_c;
739
740 funcs->bswap_16 = bswap_16_c;
741 funcs->bswap_32 = bswap_32_c;
742 funcs->bswap_64 = bswap_64_c;
743
744 funcs->add_u8 = add_u8_c;
745 funcs->add_s8 = add_s8_c;
746 funcs->add_u8_s = add_u8_s_c;
747 funcs->add_u16 = add_u16_c;
748 funcs->add_s16 = add_s16_c;
749 funcs->add_u16_s = add_u16_s_c;
750 funcs->add_s32 = add_s32_c;
751 funcs->add_float = add_float_c;
752 funcs->add_double = add_double_c;
753
754 funcs->sub_u8 = sub_u8_c;
755 funcs->sub_s8 = sub_s8_c;
756 funcs->sub_u8_s = sub_u8_s_c;
757 funcs->sub_u16 = sub_u16_c;
758 funcs->sub_s16 = sub_s16_c;
759 funcs->sub_u16_s = sub_u16_s_c;
760 funcs->sub_s32 = sub_s32_c;
761 funcs->sub_float = sub_float_c;
762 funcs->sub_double = sub_double_c;
763
764 }
765