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