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 <gavl.h>
22 #include <config.h>
23 #include <video.h>
24 #include <colorspace.h>
25 #include <accel.h>
26 
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30 
31 typedef struct
32   {
33   gavl_pixelformat_t pixelformat;
34   char * name;
35   } pixelformat_tab_t;
36 
37 const pixelformat_tab_t pixelformat_tab[] =
38   {
39     { GAVL_GRAY_8,  "8 bpp gray" },
40     { GAVL_GRAY_16, "16 bpp gray" },
41     { GAVL_GRAY_FLOAT, "Float gray" },
42     { GAVL_GRAYA_16,  "16 bpp gray + alpha" },
43     { GAVL_GRAYA_32, "32 bpp gray + alpha" },
44     { GAVL_GRAYA_FLOAT, "Float gray + alpha" },
45     { GAVL_RGB_15, "15 bpp RGB" },
46     { GAVL_BGR_15, "15 bpp BGR" },
47     { GAVL_RGB_16, "16 bpp RGB" },
48     { GAVL_BGR_16, "16 bpp BGR" },
49     { GAVL_RGB_24, "24 bpp RGB" },
50     { GAVL_BGR_24, "24 bpp BGR" },
51     { GAVL_RGB_32, "32 bpp RGB" },
52     { GAVL_BGR_32, "32 bpp BGR" },
53     { GAVL_RGBA_32, "32 bpp RGBA" },
54     { GAVL_RGB_48, "48 bpp RGB" },
55     { GAVL_RGBA_64, "64 bpp RGBA" },
56     { GAVL_RGB_FLOAT, "Float RGB" },
57     { GAVL_RGBA_FLOAT, "Float RGBA" },
58     { GAVL_YUY2, "YUV 422 (YUY2)" },
59     { GAVL_UYVY, "YUV 422 (UYVY)" },
60     { GAVL_YUVA_32, "YUVA 4444 (8 bit)" },
61     { GAVL_YUVA_64, "YUVA 4444 (16 bit)" },
62     { GAVL_YUVA_FLOAT, "YUVA 4444 (float)" },
63     { GAVL_YUV_FLOAT, "YUV 444 (float)" },
64     { GAVL_YUV_420_P, "YUV 420 Planar" },
65     { GAVL_YUV_410_P, "YUV 410 Planar" },
66     { GAVL_YUV_411_P, "YUV 411 Planar" },
67     { GAVL_YUV_422_P, "YUV 422 Planar" },
68     { GAVL_YUV_422_P_16, "YUV 422 Planar (16 bit)" },
69     { GAVL_YUV_444_P, "YUV 444 Planar" },
70     { GAVL_YUV_444_P_16, "YUV 444 Planar (16 bit)" },
71     { GAVL_YUVJ_420_P, "YUVJ 420 Planar" },
72     { GAVL_YUVJ_422_P, "YUVJ 422 Planar" },
73     { GAVL_YUVJ_444_P, "YUVJ 444 Planar" },
74     { GAVL_PIXELFORMAT_NONE, "Undefined" }
75   };
76 
77 static const int num_pixelformats = sizeof(pixelformat_tab)/sizeof(pixelformat_tab_t);
78 
gavl_pixelformat_num_planes(gavl_pixelformat_t csp)79 int gavl_pixelformat_num_planes(gavl_pixelformat_t csp)
80   {
81   switch(csp)
82     {
83     case GAVL_GRAY_8:
84     case GAVL_GRAY_16:
85     case GAVL_GRAY_FLOAT:
86     case GAVL_GRAYA_16:
87     case GAVL_GRAYA_32:
88     case GAVL_GRAYA_FLOAT:
89     case GAVL_RGB_15:
90     case GAVL_BGR_15:
91     case GAVL_RGB_16:
92     case GAVL_BGR_16:
93     case GAVL_RGB_24:
94     case GAVL_BGR_24:
95     case GAVL_RGB_32:
96     case GAVL_BGR_32:
97     case GAVL_RGBA_32:
98     case GAVL_YUY2:
99     case GAVL_UYVY:
100     case GAVL_YUVA_32:
101     case GAVL_YUVA_64:
102     case GAVL_RGB_48:
103     case GAVL_RGBA_64:
104     case GAVL_RGB_FLOAT:
105     case GAVL_RGBA_FLOAT:
106     case GAVL_YUV_FLOAT:
107     case GAVL_YUVA_FLOAT:
108       return 1;
109       break;
110     case GAVL_YUV_420_P:
111     case GAVL_YUV_410_P:
112     case GAVL_YUV_422_P:
113     case GAVL_YUV_411_P:
114     case GAVL_YUV_444_P:
115     case GAVL_YUV_422_P_16:
116     case GAVL_YUV_444_P_16:
117     case GAVL_YUVJ_420_P:
118     case GAVL_YUVJ_422_P:
119     case GAVL_YUVJ_444_P:
120       return 3;
121       break;
122     case GAVL_PIXELFORMAT_NONE:
123       return 0;
124       break;
125     }
126   return 0;
127   }
128 
gavl_pixelformat_chroma_sub(gavl_pixelformat_t csp,int * sub_h,int * sub_v)129 void gavl_pixelformat_chroma_sub(gavl_pixelformat_t csp, int * sub_h,
130                                 int * sub_v)
131   {
132   switch(csp)
133     {
134     case GAVL_RGB_15:
135     case GAVL_BGR_15:
136     case GAVL_RGB_16:
137     case GAVL_BGR_16:
138     case GAVL_RGB_24:
139     case GAVL_BGR_24:
140     case GAVL_RGB_32:
141     case GAVL_BGR_32:
142     case GAVL_RGBA_32:
143     case GAVL_YUV_444_P:
144     case GAVL_YUV_444_P_16:
145     case GAVL_YUVJ_444_P:
146     case GAVL_YUVA_32:
147     case GAVL_YUVA_64:
148     case GAVL_RGB_48:
149     case GAVL_RGBA_64:
150     case GAVL_RGB_FLOAT:
151     case GAVL_RGBA_FLOAT:
152     case GAVL_YUV_FLOAT:
153     case GAVL_YUVA_FLOAT:
154     case GAVL_GRAY_8:
155     case GAVL_GRAY_16:
156     case GAVL_GRAY_FLOAT:
157     case GAVL_GRAYA_16:
158     case GAVL_GRAYA_32:
159     case GAVL_GRAYA_FLOAT:
160       *sub_h = 1;
161       *sub_v = 1;
162       break;
163     case GAVL_YUV_420_P:
164     case GAVL_YUVJ_420_P:
165       *sub_h = 2;
166       *sub_v = 2;
167       break;
168     case GAVL_YUV_422_P:
169     case GAVL_YUV_422_P_16:
170     case GAVL_YUVJ_422_P:
171     case GAVL_YUY2:
172     case GAVL_UYVY:
173       *sub_h = 2;
174       *sub_v = 1;
175       break;
176     case GAVL_YUV_411_P:
177       *sub_h = 4;
178       *sub_v = 1;
179       break;
180     case GAVL_YUV_410_P:
181       *sub_h = 4;
182       *sub_v = 4;
183       break;
184     case GAVL_PIXELFORMAT_NONE:
185       *sub_h = 0;
186       *sub_v = 0;
187       break;
188     }
189   }
190 
191 
192 
gavl_num_pixelformats()193 int gavl_num_pixelformats()
194   {
195   return num_pixelformats - 1;
196   }
197 
gavl_get_pixelformat(int index)198 gavl_pixelformat_t gavl_get_pixelformat(int index)
199   {
200   return pixelformat_tab[index].pixelformat;
201   }
202 
gavl_pixelformat_to_string(gavl_pixelformat_t pixelformat)203 const char * gavl_pixelformat_to_string(gavl_pixelformat_t pixelformat)
204   {
205   int i;
206   for(i = 0; i < num_pixelformats; i++)
207     {
208     if(pixelformat_tab[i].pixelformat == pixelformat)
209       return pixelformat_tab[i].name;
210     }
211   return NULL;
212   }
213 
gavl_string_to_pixelformat(const char * name)214 gavl_pixelformat_t gavl_string_to_pixelformat(const char * name)
215   {
216   int i;
217   for(i = 0; i < num_pixelformats; i++)
218     {
219     if(!strcmp(pixelformat_tab[i].name, name))
220       return pixelformat_tab[i].pixelformat;
221     }
222   return GAVL_PIXELFORMAT_NONE;
223   }
224 
225 
226 static gavl_pixelformat_function_table_t *
create_pixelformat_function_table(const gavl_video_options_t * opt,int width,int height)227 create_pixelformat_function_table(const gavl_video_options_t * opt,
228                                  int width, int height)
229   {
230   gavl_pixelformat_function_table_t * csp_tab;
231 
232   csp_tab =
233     calloc(1,sizeof(gavl_pixelformat_function_table_t));
234 
235   //  fprintf(stderr, "create_pixelformat_function_table, flags: %08x, q: %d\n",
236   //          opt->accel_flags, opt->quality);
237 
238   /* Standard C-routines, always complete */
239   if(opt->quality || (opt->accel_flags & GAVL_ACCEL_C))
240     {
241     gavl_init_rgb_rgb_funcs_c(csp_tab, opt);
242     gavl_init_rgb_yuv_funcs_c(csp_tab, opt);
243     gavl_init_yuv_rgb_funcs_c(csp_tab, opt);
244     gavl_init_yuv_yuv_funcs_c(csp_tab, opt);
245     gavl_init_rgb_gray_funcs_c(csp_tab, opt);
246     gavl_init_gray_rgb_funcs_c(csp_tab, opt);
247     gavl_init_yuv_gray_funcs_c(csp_tab, opt);
248     gavl_init_gray_yuv_funcs_c(csp_tab, opt);
249     gavl_init_gray_gray_funcs_c(csp_tab, opt);
250     }
251 
252 #ifdef HAVE_MMX
253   if(opt->accel_flags & GAVL_ACCEL_MMX)
254     {
255     //    fprintf(stderr, "Init MMX functions %08x\n", real_accel_flags);
256     gavl_init_rgb_rgb_funcs_mmx(csp_tab, width, opt);
257     gavl_init_rgb_yuv_funcs_mmx(csp_tab, width, opt);
258     gavl_init_yuv_yuv_funcs_mmx(csp_tab, width, opt);
259     gavl_init_yuv_rgb_funcs_mmx(csp_tab, width, opt);
260     }
261   if(opt->accel_flags & GAVL_ACCEL_MMXEXT)
262     {
263     //    fprintf(stderr, "Init MMXEXT functions %08x\n", real_accel_flags);
264     gavl_init_rgb_rgb_funcs_mmxext(csp_tab, width, opt);
265     gavl_init_rgb_yuv_funcs_mmxext(csp_tab, width, opt);
266     gavl_init_yuv_yuv_funcs_mmxext(csp_tab, width, opt);
267     gavl_init_yuv_rgb_funcs_mmxext(csp_tab, width, opt);
268     }
269 #endif
270 #ifdef HAVE_SSE
271   if(opt->accel_flags & GAVL_ACCEL_SSE)
272     {
273     //    fprintf(stderr, "Init MMXEXT functions %08x\n", real_accel_flags);
274     //    gavl_init_rgb_rgb_funcs_sse(csp_tab, opt);
275     gavl_init_rgb_yuv_funcs_sse(csp_tab, opt);
276     //    gavl_init_yuv_yuv_funcs_sse(csp_tab, opt);
277     //    gavl_init_yuv_rgb_funcs_sse(csp_tab, opt);
278     }
279 #endif
280 #ifdef HAVE_SSE3
281   if(opt->accel_flags & GAVL_ACCEL_SSE3)
282     {
283     //    fprintf(stderr, "Init MMXEXT functions %08x\n", real_accel_flags);
284     //    gavl_init_rgb_rgb_funcs_sse(csp_tab, opt);
285     gavl_init_rgb_yuv_funcs_sse3(csp_tab, opt);
286     //    gavl_init_yuv_yuv_funcs_sse(csp_tab, opt);
287     //    gavl_init_yuv_rgb_funcs_sse(csp_tab, opt);
288     }
289 #endif
290   /* High quality */
291 
292   if((opt->quality > 3) ||
293      ((!opt->quality) && (opt->accel_flags & GAVL_ACCEL_C_HQ)))
294     {
295     //    fprintf(stderr, "Init HQ\n");
296     gavl_init_rgb_rgb_funcs_hq(csp_tab, opt);
297     gavl_init_rgb_yuv_funcs_hq(csp_tab, opt);
298     gavl_init_yuv_rgb_funcs_hq(csp_tab, opt);
299     gavl_init_yuv_yuv_funcs_hq(csp_tab, opt);
300     }
301 
302 
303   return csp_tab;
304   }
305 
306 gavl_video_func_t
gavl_find_pixelformat_converter(const gavl_video_options_t * opt,gavl_pixelformat_t input_pixelformat,gavl_pixelformat_t output_pixelformat,int width,int height)307 gavl_find_pixelformat_converter(const gavl_video_options_t * opt,
308                                gavl_pixelformat_t input_pixelformat,
309                                gavl_pixelformat_t output_pixelformat,
310                                int width,
311                                int height)
312   {
313   gavl_video_func_t ret = NULL;
314   gavl_pixelformat_function_table_t * tab =
315     create_pixelformat_function_table(opt, width, height);
316 
317   switch(input_pixelformat)
318     {
319     case GAVL_GRAY_8:
320       switch(output_pixelformat)
321         {
322         case GAVL_GRAY_16:
323           ret = tab->gray_8_to_16;
324           break;
325         case GAVL_GRAY_FLOAT:
326           ret = tab->gray_8_to_float;
327           break;
328         case GAVL_GRAYA_16:
329           ret = tab->gray_8_to_graya_16;
330           break;
331         case GAVL_GRAYA_32:
332           ret = tab->gray_8_to_graya_32;
333           break;
334         case GAVL_GRAYA_FLOAT:
335           ret = tab->gray_8_to_graya_float;
336           break;
337         case GAVL_RGB_15:
338         case GAVL_BGR_15:
339           ret = tab->gray_8_to_rgb_15;
340           break;
341         case GAVL_RGB_16:
342         case GAVL_BGR_16:
343           ret = tab->gray_8_to_rgb_16;
344           break;
345         case GAVL_RGB_24:
346         case GAVL_BGR_24:
347           ret = tab->gray_8_to_rgb_24;
348           break;
349         case GAVL_RGB_32:
350         case GAVL_BGR_32:
351           ret = tab->gray_8_to_rgb_32;
352           break;
353         case GAVL_RGBA_32:
354           ret = tab->gray_8_to_rgba_32;
355           break;
356         case GAVL_RGB_48:
357           ret = tab->gray_8_to_rgb_48;
358           break;
359         case GAVL_RGBA_64:
360           ret = tab->gray_8_to_rgba_64;
361           break;
362         case GAVL_RGB_FLOAT:
363           ret = tab->gray_8_to_rgb_float;
364           break;
365         case GAVL_RGBA_FLOAT:
366           ret = tab->gray_8_to_rgba_float;
367           break;
368         case GAVL_YUY2:
369           ret = tab->gray_8_to_yuy2;
370           break;
371         case GAVL_UYVY:
372           ret = tab->gray_8_to_uyvy;
373           break;
374         case GAVL_YUVA_32:
375           ret = tab->gray_8_to_yuva_32;
376           break;
377         case GAVL_YUVA_64:
378           ret = tab->gray_8_to_yuva_64;
379           break;
380         case GAVL_YUVA_FLOAT:
381           ret = tab->gray_8_to_yuva_float;
382           break;
383         case GAVL_YUV_FLOAT:
384           ret = tab->gray_8_to_yuv_float;
385           break;
386         case GAVL_YUV_420_P:
387         case GAVL_YUV_410_P:
388         case GAVL_YUV_422_P:
389         case GAVL_YUV_411_P:
390         case GAVL_YUV_444_P:
391           ret = tab->gray_8_to_y_8;
392           break;
393         case GAVL_YUV_422_P_16:
394         case GAVL_YUV_444_P_16:
395           ret = tab->gray_8_to_y_16;
396           break;
397         case GAVL_YUVJ_420_P:
398         case GAVL_YUVJ_422_P:
399         case GAVL_YUVJ_444_P:
400           ret = tab->gray_8_to_yj_8;
401           break;
402           /* Keep GCC happy */
403         case GAVL_PIXELFORMAT_NONE:
404         case GAVL_GRAY_8:
405           break;
406         }
407       break;
408     case GAVL_GRAYA_16:
409       switch(output_pixelformat)
410         {
411         case GAVL_GRAY_8:
412           ret = tab->graya_16_to_gray_8;
413           break;
414         case GAVL_GRAY_16:
415           ret = tab->graya_16_to_gray_16;
416           break;
417         case GAVL_GRAY_FLOAT:
418           ret = tab->graya_16_to_gray_float;
419           break;
420         case GAVL_GRAYA_32:
421           ret = tab->graya_16_to_32;
422           break;
423         case GAVL_GRAYA_FLOAT:
424           ret = tab->graya_16_to_float;
425           break;
426         case GAVL_RGB_15:
427         case GAVL_BGR_15:
428           ret = tab->graya_16_to_rgb_15;
429           break;
430         case GAVL_RGB_16:
431         case GAVL_BGR_16:
432           ret = tab->graya_16_to_rgb_16;
433           break;
434         case GAVL_RGB_24:
435         case GAVL_BGR_24:
436           ret = tab->graya_16_to_rgb_24;
437           break;
438         case GAVL_RGB_32:
439         case GAVL_BGR_32:
440           ret = tab->graya_16_to_rgb_32;
441           break;
442         case GAVL_RGBA_32:
443           ret = tab->graya_16_to_rgba_32;
444           break;
445         case GAVL_RGB_48:
446           ret = tab->graya_16_to_rgb_48;
447           break;
448         case GAVL_RGBA_64:
449           ret = tab->graya_16_to_rgba_64;
450           break;
451         case GAVL_RGB_FLOAT:
452           ret = tab->graya_16_to_rgb_float;
453           break;
454         case GAVL_RGBA_FLOAT:
455           ret = tab->graya_16_to_rgba_float;
456           break;
457         case GAVL_YUY2:
458           ret = tab->graya_16_to_yuy2;
459           break;
460         case GAVL_UYVY:
461           ret = tab->graya_16_to_uyvy;
462           break;
463         case GAVL_YUVA_32:
464           ret = tab->graya_16_to_yuva_32;
465           break;
466         case GAVL_YUVA_64:
467           ret = tab->graya_16_to_yuva_64;
468           break;
469         case GAVL_YUVA_FLOAT:
470           ret = tab->graya_16_to_yuva_float;
471           break;
472         case GAVL_YUV_FLOAT:
473           ret = tab->graya_16_to_yuv_float;
474           break;
475         case GAVL_YUV_420_P:
476         case GAVL_YUV_410_P:
477         case GAVL_YUV_422_P:
478         case GAVL_YUV_411_P:
479         case GAVL_YUV_444_P:
480           ret = tab->graya_16_to_y_8;
481           break;
482         case GAVL_YUV_422_P_16:
483         case GAVL_YUV_444_P_16:
484           ret = tab->graya_16_to_y_16;
485           break;
486         case GAVL_YUVJ_420_P:
487         case GAVL_YUVJ_422_P:
488         case GAVL_YUVJ_444_P:
489           ret = tab->graya_16_to_yj_8;
490           break;
491           /* Keep GCC happy */
492         case GAVL_PIXELFORMAT_NONE:
493         case GAVL_GRAYA_16:
494           break;
495         }
496       break;
497 
498 
499     case GAVL_GRAY_16:
500       switch(output_pixelformat)
501         {
502         case GAVL_GRAY_8:
503           ret = tab->gray_16_to_8;
504           break;
505         case GAVL_GRAY_FLOAT:
506           ret  = tab->gray_16_to_float;
507           break;
508         case GAVL_GRAYA_16:
509           ret = tab->gray_16_to_graya_16;
510           break;
511         case GAVL_GRAYA_32:
512           ret = tab->gray_16_to_graya_32;
513           break;
514         case GAVL_GRAYA_FLOAT:
515           ret = tab->gray_16_to_graya_float;
516           break;
517         case GAVL_RGB_15:
518         case GAVL_BGR_15:
519           ret = tab->gray_16_to_rgb_15;
520           break;
521         case GAVL_RGB_16:
522         case GAVL_BGR_16:
523           ret = tab->gray_16_to_rgb_16;
524           break;
525         case GAVL_RGB_24:
526         case GAVL_BGR_24:
527           ret = tab->gray_16_to_rgb_24;
528           break;
529         case GAVL_RGB_32:
530         case GAVL_BGR_32:
531           ret = tab->gray_16_to_rgb_32;
532           break;
533         case GAVL_RGBA_32:
534           ret = tab->gray_16_to_rgba_32;
535           break;
536         case GAVL_RGB_48:
537           ret = tab->gray_16_to_rgb_48;
538           break;
539         case GAVL_RGBA_64:
540           ret = tab->gray_16_to_rgba_64;
541           break;
542         case GAVL_RGB_FLOAT:
543           ret = tab->gray_16_to_rgb_float;
544           break;
545         case GAVL_RGBA_FLOAT:
546           ret = tab->gray_16_to_rgba_float;
547           break;
548         case GAVL_YUY2:
549           ret = tab->gray_16_to_yuy2;
550           break;
551         case GAVL_UYVY:
552           ret = tab->gray_16_to_uyvy;
553           break;
554         case GAVL_YUVA_32:
555           ret = tab->gray_16_to_yuva_32;
556           break;
557         case GAVL_YUVA_64:
558           ret = tab->gray_16_to_yuva_64;
559           break;
560         case GAVL_YUVA_FLOAT:
561           ret = tab->gray_16_to_yuva_float;
562           break;
563         case GAVL_YUV_FLOAT:
564           ret = tab->gray_16_to_yuv_float;
565           break;
566         case GAVL_YUV_420_P:
567         case GAVL_YUV_410_P:
568         case GAVL_YUV_422_P:
569         case GAVL_YUV_411_P:
570         case GAVL_YUV_444_P:
571           ret = tab->gray_16_to_y_8;
572           break;
573         case GAVL_YUV_422_P_16:
574         case GAVL_YUV_444_P_16:
575           ret = tab->gray_16_to_y_16;
576           break;
577         case GAVL_YUVJ_420_P:
578         case GAVL_YUVJ_422_P:
579         case GAVL_YUVJ_444_P:
580           ret = tab->gray_16_to_yj_8;
581           break;
582           /* Keep GCC happy */
583         case GAVL_PIXELFORMAT_NONE:
584         case GAVL_GRAY_16:
585           break;
586         }
587       break;
588     case GAVL_GRAYA_32:
589       switch(output_pixelformat)
590         {
591         case GAVL_GRAY_8:
592           ret = tab->graya_32_to_gray_8;
593           break;
594         case GAVL_GRAY_16:
595           ret = tab->graya_32_to_gray_16;
596           break;
597         case GAVL_GRAY_FLOAT:
598           ret = tab->graya_32_to_gray_float;
599           break;
600         case GAVL_GRAYA_16:
601           ret = tab->graya_32_to_16;
602           break;
603         case GAVL_GRAYA_FLOAT:
604           ret  = tab->graya_32_to_float;
605           break;
606         case GAVL_RGB_15:
607         case GAVL_BGR_15:
608           ret = tab->graya_32_to_rgb_15;
609           break;
610         case GAVL_RGB_16:
611         case GAVL_BGR_16:
612           ret = tab->graya_32_to_rgb_16;
613           break;
614         case GAVL_RGB_24:
615         case GAVL_BGR_24:
616           ret = tab->graya_32_to_rgb_24;
617           break;
618         case GAVL_RGB_32:
619         case GAVL_BGR_32:
620           ret = tab->graya_32_to_rgb_32;
621           break;
622         case GAVL_RGBA_32:
623           ret = tab->graya_32_to_rgba_32;
624           break;
625         case GAVL_RGB_48:
626           ret = tab->graya_32_to_rgb_48;
627           break;
628         case GAVL_RGBA_64:
629           ret = tab->graya_32_to_rgba_64;
630           break;
631         case GAVL_RGB_FLOAT:
632           ret = tab->graya_32_to_rgb_float;
633           break;
634         case GAVL_RGBA_FLOAT:
635           ret = tab->graya_32_to_rgba_float;
636           break;
637         case GAVL_YUY2:
638           ret = tab->graya_32_to_yuy2;
639           break;
640         case GAVL_UYVY:
641           ret = tab->graya_32_to_uyvy;
642           break;
643         case GAVL_YUVA_32:
644           ret = tab->graya_32_to_yuva_32;
645           break;
646         case GAVL_YUVA_64:
647           ret = tab->graya_32_to_yuva_64;
648           break;
649         case GAVL_YUVA_FLOAT:
650           ret = tab->graya_32_to_yuva_float;
651           break;
652         case GAVL_YUV_FLOAT:
653           ret = tab->graya_32_to_yuv_float;
654           break;
655         case GAVL_YUV_420_P:
656         case GAVL_YUV_410_P:
657         case GAVL_YUV_422_P:
658         case GAVL_YUV_411_P:
659         case GAVL_YUV_444_P:
660           ret = tab->graya_32_to_y_8;
661           break;
662         case GAVL_YUV_422_P_16:
663         case GAVL_YUV_444_P_16:
664           ret = tab->graya_32_to_y_16;
665           break;
666         case GAVL_YUVJ_420_P:
667         case GAVL_YUVJ_422_P:
668         case GAVL_YUVJ_444_P:
669           ret = tab->graya_32_to_yj_8;
670           break;
671           /* Keep GCC happy */
672         case GAVL_PIXELFORMAT_NONE:
673         case GAVL_GRAYA_32:
674           break;
675         }
676       break;
677 
678 
679     case GAVL_GRAY_FLOAT:
680       switch(output_pixelformat)
681         {
682         case GAVL_GRAY_8:
683           ret = tab->gray_float_to_8;
684           break;
685         case GAVL_GRAY_16:
686           ret = tab->gray_float_to_16;
687           break;
688         case GAVL_GRAYA_16:
689           ret = tab->gray_float_to_graya_16;
690           break;
691         case GAVL_GRAYA_32:
692           ret = tab->gray_float_to_graya_32;
693           break;
694         case GAVL_GRAYA_FLOAT:
695           ret = tab->gray_float_to_graya_float;
696           break;
697         case GAVL_RGB_15:
698         case GAVL_BGR_15:
699           ret = tab->gray_float_to_rgb_15;
700           break;
701         case GAVL_RGB_16:
702         case GAVL_BGR_16:
703           ret = tab->gray_float_to_rgb_16;
704           break;
705         case GAVL_RGB_24:
706         case GAVL_BGR_24:
707           ret = tab->gray_float_to_rgb_24;
708           break;
709         case GAVL_RGB_32:
710         case GAVL_BGR_32:
711           ret = tab->gray_float_to_rgb_32;
712           break;
713         case GAVL_RGBA_32:
714           ret = tab->gray_float_to_rgba_32;
715           break;
716         case GAVL_RGB_48:
717           ret = tab->gray_float_to_rgb_48;
718           break;
719         case GAVL_RGBA_64:
720           ret = tab->gray_float_to_rgba_64;
721           break;
722         case GAVL_RGB_FLOAT:
723           ret = tab->gray_float_to_rgb_float;
724           break;
725         case GAVL_RGBA_FLOAT:
726           ret = tab->gray_float_to_rgba_float;
727           break;
728         case GAVL_YUY2:
729           ret = tab->gray_float_to_yuy2;
730           break;
731         case GAVL_UYVY:
732           ret = tab->gray_float_to_uyvy;
733           break;
734         case GAVL_YUVA_32:
735           ret = tab->gray_float_to_yuva_32;
736           break;
737         case GAVL_YUVA_64:
738           ret = tab->gray_float_to_yuva_64;
739           break;
740         case GAVL_YUVA_FLOAT:
741           ret = tab->gray_float_to_yuva_float;
742           break;
743         case GAVL_YUV_FLOAT:
744           ret = tab->gray_float_to_yuv_float;
745           break;
746         case GAVL_YUV_420_P:
747         case GAVL_YUV_410_P:
748         case GAVL_YUV_422_P:
749         case GAVL_YUV_411_P:
750         case GAVL_YUV_444_P:
751           ret = tab->gray_float_to_y_8;
752           break;
753         case GAVL_YUV_422_P_16:
754         case GAVL_YUV_444_P_16:
755           ret = tab->gray_float_to_y_16;
756           break;
757         case GAVL_YUVJ_420_P:
758         case GAVL_YUVJ_422_P:
759         case GAVL_YUVJ_444_P:
760           ret = tab->gray_float_to_yj_8;
761           break;
762           /* Keep GCC happy */
763         case GAVL_PIXELFORMAT_NONE:
764         case GAVL_GRAY_FLOAT:
765           break;
766         }
767       break;
768 
769     case GAVL_GRAYA_FLOAT:
770       switch(output_pixelformat)
771         {
772         case GAVL_GRAY_8:
773           ret = tab->graya_float_to_gray_8;
774           break;
775         case GAVL_GRAY_16:
776           ret = tab->graya_float_to_gray_16;
777           break;
778         case GAVL_GRAY_FLOAT:
779           ret = tab->graya_float_to_gray_float;
780           break;
781         case GAVL_GRAYA_16:
782           ret = tab->graya_float_to_16;
783           break;
784         case GAVL_GRAYA_32:
785           ret = tab->graya_float_to_32;
786           break;
787         case GAVL_RGB_15:
788         case GAVL_BGR_15:
789           ret = tab->graya_float_to_rgb_15;
790           break;
791         case GAVL_RGB_16:
792         case GAVL_BGR_16:
793           ret = tab->graya_float_to_rgb_16;
794           break;
795         case GAVL_RGB_24:
796         case GAVL_BGR_24:
797           ret = tab->graya_float_to_rgb_24;
798           break;
799         case GAVL_RGB_32:
800         case GAVL_BGR_32:
801           ret = tab->graya_float_to_rgb_32;
802           break;
803         case GAVL_RGBA_32:
804           ret = tab->graya_float_to_rgba_32;
805           break;
806         case GAVL_RGB_48:
807           ret = tab->graya_float_to_rgb_48;
808           break;
809         case GAVL_RGBA_64:
810           ret = tab->graya_float_to_rgba_64;
811           break;
812         case GAVL_RGB_FLOAT:
813           ret = tab->graya_float_to_rgb_float;
814           break;
815         case GAVL_RGBA_FLOAT:
816           ret = tab->graya_float_to_rgba_float;
817           break;
818         case GAVL_YUY2:
819           ret = tab->graya_float_to_yuy2;
820           break;
821         case GAVL_UYVY:
822           ret = tab->graya_float_to_uyvy;
823           break;
824         case GAVL_YUVA_32:
825           ret = tab->graya_float_to_yuva_32;
826           break;
827         case GAVL_YUVA_64:
828           ret = tab->graya_float_to_yuva_64;
829           break;
830         case GAVL_YUVA_FLOAT:
831           ret = tab->graya_float_to_yuva_float;
832           break;
833         case GAVL_YUV_FLOAT:
834           ret = tab->graya_float_to_yuv_float;
835           break;
836         case GAVL_YUV_420_P:
837         case GAVL_YUV_410_P:
838         case GAVL_YUV_422_P:
839         case GAVL_YUV_411_P:
840         case GAVL_YUV_444_P:
841           ret = tab->graya_float_to_y_8;
842           break;
843         case GAVL_YUV_422_P_16:
844         case GAVL_YUV_444_P_16:
845           ret = tab->graya_float_to_y_16;
846           break;
847         case GAVL_YUVJ_420_P:
848         case GAVL_YUVJ_422_P:
849         case GAVL_YUVJ_444_P:
850           ret = tab->graya_float_to_yj_8;
851           break;
852           /* Keep GCC happy */
853         case GAVL_PIXELFORMAT_NONE:
854         case GAVL_GRAYA_FLOAT:
855           break;
856         }
857       break;
858 
859     case GAVL_RGB_15:
860       switch(output_pixelformat)
861         {
862         case GAVL_GRAY_8:
863           ret = tab->rgb_15_to_gray_8;
864           break;
865         case GAVL_GRAY_16:
866           ret = tab->rgb_15_to_gray_16;
867           break;
868         case GAVL_GRAY_FLOAT:
869           ret = tab->rgb_15_to_gray_float;
870           break;
871         case GAVL_GRAYA_16:
872           ret = tab->rgb_15_to_graya_16;
873           break;
874         case GAVL_GRAYA_32:
875           ret = tab->rgb_15_to_graya_32;
876           break;
877         case GAVL_GRAYA_FLOAT:
878           ret = tab->rgb_15_to_graya_float;
879           break;
880         case GAVL_BGR_15:
881           ret = tab->swap_rgb_15;
882           break;
883         case GAVL_RGB_16:
884           ret = tab->rgb_15_to_16;
885           break;
886         case GAVL_BGR_16:
887           ret = tab->rgb_15_to_16_swap;
888           break;
889         case GAVL_RGB_24:
890           ret = tab->rgb_15_to_24;
891           break;
892         case GAVL_BGR_24:
893           ret = tab->rgb_15_to_24_swap;
894           break;
895         case GAVL_RGB_32:
896           ret = tab->rgb_15_to_32;
897           break;
898         case GAVL_BGR_32:
899           ret = tab->rgb_15_to_32_swap;
900           break;
901         case GAVL_RGBA_32:
902           ret = tab->rgb_15_to_rgba_32;
903           break;
904         case GAVL_RGB_48:
905           ret = tab->rgb_15_to_48;
906           break;
907         case GAVL_RGBA_64:
908           ret = tab->rgb_15_to_rgba_64;
909           break;
910         case GAVL_RGB_FLOAT:
911           ret = tab->rgb_15_to_float;
912           break;
913         case GAVL_RGBA_FLOAT:
914           ret = tab->rgb_15_to_rgba_float;
915           break;
916         case GAVL_YUY2:
917           ret = tab->rgb_15_to_yuy2;
918           break;
919         case GAVL_UYVY:
920           ret = tab->rgb_15_to_uyvy;
921           break;
922         case GAVL_YUVA_32:
923           ret = tab->rgb_15_to_yuva_32;
924           break;
925         case GAVL_YUVA_64:
926           ret = tab->rgb_15_to_yuva_64;
927           break;
928         case GAVL_YUVA_FLOAT:
929           ret = tab->rgb_15_to_yuva_float;
930           break;
931         case GAVL_YUV_FLOAT:
932           ret = tab->rgb_15_to_yuv_float;
933           break;
934         case GAVL_YUV_420_P:
935           ret = tab->rgb_15_to_yuv_420_p;
936           break;
937         case GAVL_YUV_410_P:
938           ret = tab->rgb_15_to_yuv_410_p;
939           break;
940         case GAVL_YUV_422_P:
941           ret = tab->rgb_15_to_yuv_422_p;
942           break;
943         case GAVL_YUV_422_P_16:
944           ret = tab->rgb_15_to_yuv_422_p_16;
945           break;
946         case GAVL_YUV_411_P:
947           ret = tab->rgb_15_to_yuv_411_p;
948           break;
949         case GAVL_YUV_444_P:
950           ret = tab->rgb_15_to_yuv_444_p;
951           break;
952         case GAVL_YUV_444_P_16:
953           ret = tab->rgb_15_to_yuv_444_p_16;
954           break;
955         case GAVL_YUVJ_420_P:
956           ret = tab->rgb_15_to_yuvj_420_p;
957           break;
958         case GAVL_YUVJ_422_P:
959           ret = tab->rgb_15_to_yuvj_422_p;
960           break;
961         case GAVL_YUVJ_444_P:
962           ret = tab->rgb_15_to_yuvj_444_p;
963           break;
964         /* Keep GCC happy */
965         case GAVL_PIXELFORMAT_NONE:
966         case GAVL_RGB_15:
967           break;
968         }
969       break;
970     case GAVL_BGR_15:
971       switch(output_pixelformat)
972         {
973         case GAVL_GRAY_8:
974           ret = tab->bgr_15_to_gray_8;
975           break;
976         case GAVL_GRAY_16:
977           ret = tab->bgr_15_to_gray_16;
978           break;
979         case GAVL_GRAY_FLOAT:
980           ret = tab->bgr_15_to_gray_float;
981           break;
982         case GAVL_GRAYA_16:
983           ret = tab->bgr_15_to_graya_16;
984           break;
985         case GAVL_GRAYA_32:
986           ret = tab->bgr_15_to_graya_32;
987           break;
988         case GAVL_GRAYA_FLOAT:
989           ret = tab->bgr_15_to_graya_float;
990           break;
991         case GAVL_RGB_15:
992           ret = tab->swap_rgb_15;
993           break;
994         case GAVL_RGB_16:
995           ret = tab->rgb_15_to_16_swap;
996           break;
997         case GAVL_BGR_16:
998           ret = tab->rgb_15_to_16;
999           break;
1000         case GAVL_RGB_24:
1001           ret = tab->rgb_15_to_24_swap;
1002           break;
1003         case GAVL_BGR_24:
1004           ret = tab->rgb_15_to_24;
1005           break;
1006         case GAVL_RGB_32:
1007           ret = tab->rgb_15_to_32_swap;
1008           break;
1009         case GAVL_BGR_32:
1010           ret = tab->rgb_15_to_32;
1011           break;
1012         case GAVL_RGBA_32:
1013           ret = tab->bgr_15_to_rgba_32;
1014           break;
1015         case GAVL_RGB_48:
1016           ret = tab->rgb_15_to_48_swap;
1017           break;
1018         case GAVL_RGBA_64:
1019           ret = tab->bgr_15_to_rgba_64;
1020           break;
1021         case GAVL_RGB_FLOAT:
1022           ret = tab->rgb_15_to_float_swap;
1023           break;
1024         case GAVL_RGBA_FLOAT:
1025           ret = tab->bgr_15_to_rgba_float;
1026           break;
1027         case GAVL_YUY2:
1028           ret = tab->bgr_15_to_yuy2;
1029           break;
1030         case GAVL_UYVY:
1031           ret = tab->bgr_15_to_uyvy;
1032           break;
1033         case GAVL_YUVA_32:
1034           ret = tab->bgr_15_to_yuva_32;
1035           break;
1036         case GAVL_YUVA_64:
1037           ret = tab->bgr_15_to_yuva_64;
1038           break;
1039         case GAVL_YUVA_FLOAT:
1040           ret = tab->bgr_15_to_yuva_float;
1041           break;
1042         case GAVL_YUV_FLOAT:
1043           ret = tab->bgr_15_to_yuv_float;
1044           break;
1045         case GAVL_YUV_420_P:
1046           ret = tab->bgr_15_to_yuv_420_p;
1047           break;
1048         case GAVL_YUV_410_P:
1049           ret = tab->bgr_15_to_yuv_410_p;
1050           break;
1051         case GAVL_YUV_422_P:
1052           ret = tab->bgr_15_to_yuv_422_p;
1053           break;
1054         case GAVL_YUV_422_P_16:
1055           ret = tab->bgr_15_to_yuv_422_p_16;
1056           break;
1057         case GAVL_YUV_411_P:
1058           ret = tab->bgr_15_to_yuv_411_p;
1059           break;
1060         case GAVL_YUV_444_P:
1061           ret = tab->bgr_15_to_yuv_444_p;
1062           break;
1063         case GAVL_YUV_444_P_16:
1064           ret = tab->bgr_15_to_yuv_444_p_16;
1065           break;
1066         case GAVL_YUVJ_420_P:
1067           ret = tab->bgr_15_to_yuvj_420_p;
1068           break;
1069         case GAVL_YUVJ_422_P:
1070           ret = tab->bgr_15_to_yuvj_422_p;
1071           break;
1072         case GAVL_YUVJ_444_P:
1073           ret = tab->bgr_15_to_yuvj_444_p;
1074           break;
1075         /* Keep GCC happy */
1076         case GAVL_PIXELFORMAT_NONE:
1077         case GAVL_BGR_15:
1078           break;
1079         }
1080       break;
1081     case GAVL_RGB_16:
1082       switch(output_pixelformat)
1083         {
1084         case GAVL_GRAY_8:
1085           ret = tab->rgb_16_to_gray_8;
1086           break;
1087         case GAVL_GRAY_16:
1088           ret = tab->rgb_16_to_gray_16;
1089           break;
1090         case GAVL_GRAY_FLOAT:
1091           ret = tab->rgb_16_to_gray_float;
1092           break;
1093         case GAVL_GRAYA_16:
1094           ret = tab->rgb_16_to_graya_16;
1095           break;
1096         case GAVL_GRAYA_32:
1097           ret = tab->rgb_16_to_graya_32;
1098           break;
1099         case GAVL_GRAYA_FLOAT:
1100           ret = tab->rgb_16_to_graya_float;
1101           break;
1102         case GAVL_RGB_15:
1103           ret = tab->rgb_16_to_15;
1104           break;
1105         case GAVL_BGR_15:
1106           ret = tab->rgb_16_to_15_swap;
1107           break;
1108         case GAVL_BGR_16:
1109           ret = tab->swap_rgb_16;
1110           break;
1111         case GAVL_RGB_24:
1112           ret = tab->rgb_16_to_24;
1113           break;
1114         case GAVL_BGR_24:
1115           ret = tab->rgb_16_to_24_swap;
1116           break;
1117         case GAVL_RGB_32:
1118           ret = tab->rgb_16_to_32;
1119           break;
1120         case GAVL_BGR_32:
1121           ret = tab->rgb_16_to_32_swap;
1122           break;
1123         case GAVL_RGBA_32:
1124           ret = tab->rgb_16_to_rgba_32;
1125           break;
1126         case GAVL_RGB_48:
1127           ret = tab->rgb_16_to_48;
1128           break;
1129         case GAVL_RGBA_64:
1130           ret = tab->rgb_16_to_rgba_64;
1131           break;
1132         case GAVL_RGB_FLOAT:
1133           ret = tab->rgb_16_to_float;
1134           break;
1135         case GAVL_RGBA_FLOAT:
1136           ret = tab->rgb_16_to_rgba_float;
1137           break;
1138 
1139         case GAVL_YUY2:
1140           ret = tab->rgb_16_to_yuy2;
1141           break;
1142         case GAVL_UYVY:
1143           ret = tab->rgb_16_to_uyvy;
1144           break;
1145         case GAVL_YUVA_32:
1146           ret = tab->rgb_16_to_yuva_32;
1147           break;
1148         case GAVL_YUVA_64:
1149           ret = tab->rgb_16_to_yuva_64;
1150           break;
1151         case GAVL_YUVA_FLOAT:
1152           ret = tab->rgb_16_to_yuva_float;
1153           break;
1154         case GAVL_YUV_FLOAT:
1155           ret = tab->rgb_16_to_yuv_float;
1156           break;
1157         case GAVL_YUV_420_P:
1158           ret = tab->rgb_16_to_yuv_420_p;
1159           break;
1160         case GAVL_YUV_410_P:
1161           ret = tab->rgb_16_to_yuv_410_p;
1162           break;
1163         case GAVL_YUV_422_P:
1164           ret = tab->rgb_16_to_yuv_422_p;
1165           break;
1166         case GAVL_YUV_422_P_16:
1167           ret = tab->rgb_16_to_yuv_422_p_16;
1168           break;
1169         case GAVL_YUV_411_P:
1170           ret = tab->rgb_16_to_yuv_411_p;
1171           break;
1172         case GAVL_YUV_444_P:
1173           ret = tab->rgb_16_to_yuv_444_p;
1174           break;
1175         case GAVL_YUV_444_P_16:
1176           ret = tab->rgb_16_to_yuv_444_p_16;
1177           break;
1178         case GAVL_YUVJ_420_P:
1179           ret = tab->rgb_16_to_yuvj_420_p;
1180           break;
1181         case GAVL_YUVJ_422_P:
1182           ret = tab->rgb_16_to_yuvj_422_p;
1183           break;
1184         case GAVL_YUVJ_444_P:
1185           ret = tab->rgb_16_to_yuvj_444_p;
1186           break;
1187         /* Keep GCC happy */
1188         case GAVL_PIXELFORMAT_NONE:
1189         case GAVL_RGB_16:
1190           break;
1191         }
1192       break;
1193     case GAVL_BGR_16:
1194       switch(output_pixelformat)
1195         {
1196         case GAVL_GRAY_8:
1197           ret = tab->bgr_16_to_gray_8;
1198           break;
1199         case GAVL_GRAY_16:
1200           ret = tab->bgr_16_to_gray_16;
1201           break;
1202         case GAVL_GRAY_FLOAT:
1203           ret = tab->bgr_16_to_gray_float;
1204           break;
1205         case GAVL_GRAYA_16:
1206           ret = tab->bgr_16_to_graya_16;
1207           break;
1208         case GAVL_GRAYA_32:
1209           ret = tab->bgr_16_to_graya_32;
1210           break;
1211         case GAVL_GRAYA_FLOAT:
1212           ret = tab->bgr_16_to_graya_float;
1213           break;
1214         case GAVL_RGB_15:
1215           ret = tab->rgb_16_to_15_swap;
1216           break;
1217         case GAVL_BGR_15:
1218           ret = tab->rgb_16_to_15;
1219           break;
1220         case GAVL_RGB_16:
1221           ret = tab->swap_rgb_16;
1222           break;
1223         case GAVL_RGB_24:
1224           ret = tab->rgb_16_to_24_swap;
1225           break;
1226         case GAVL_BGR_24:
1227           ret = tab->rgb_16_to_24;
1228           break;
1229         case GAVL_RGB_32:
1230           ret = tab->rgb_16_to_32_swap;
1231           break;
1232         case GAVL_BGR_32:
1233           ret = tab->rgb_16_to_32;
1234           break;
1235         case GAVL_RGBA_32:
1236           ret = tab->bgr_16_to_rgba_32;
1237           break;
1238         case GAVL_RGB_48:
1239           ret = tab->rgb_16_to_48_swap;
1240           break;
1241         case GAVL_RGBA_64:
1242           ret = tab->bgr_16_to_rgba_64;
1243           break;
1244         case GAVL_RGB_FLOAT:
1245           ret = tab->rgb_16_to_float_swap;
1246           break;
1247         case GAVL_RGBA_FLOAT:
1248           ret = tab->bgr_16_to_rgba_float;
1249           break;
1250 
1251         case GAVL_YUY2:
1252           ret = tab->bgr_16_to_yuy2;
1253           break;
1254         case GAVL_UYVY:
1255           ret = tab->bgr_16_to_uyvy;
1256           break;
1257         case GAVL_YUVA_32:
1258           ret = tab->bgr_16_to_yuva_32;
1259           break;
1260         case GAVL_YUVA_64:
1261           ret = tab->bgr_16_to_yuva_64;
1262           break;
1263         case GAVL_YUVA_FLOAT:
1264           ret = tab->bgr_16_to_yuva_float;
1265           break;
1266         case GAVL_YUV_FLOAT:
1267           ret = tab->bgr_16_to_yuv_float;
1268           break;
1269         case GAVL_YUV_420_P:
1270           ret = tab->bgr_16_to_yuv_420_p;
1271           break;
1272         case GAVL_YUV_410_P:
1273           ret = tab->bgr_16_to_yuv_410_p;
1274           break;
1275         case GAVL_YUV_422_P:
1276           ret = tab->bgr_16_to_yuv_422_p;
1277           break;
1278         case GAVL_YUV_422_P_16:
1279           ret = tab->bgr_16_to_yuv_422_p_16;
1280           break;
1281         case GAVL_YUV_411_P:
1282           ret = tab->bgr_16_to_yuv_411_p;
1283           break;
1284         case GAVL_YUV_444_P:
1285           ret = tab->bgr_16_to_yuv_444_p;
1286           break;
1287         case GAVL_YUV_444_P_16:
1288           ret = tab->bgr_16_to_yuv_444_p_16;
1289           break;
1290         case GAVL_YUVJ_420_P:
1291           ret = tab->bgr_16_to_yuvj_420_p;
1292           break;
1293         case GAVL_YUVJ_422_P:
1294           ret = tab->bgr_16_to_yuvj_422_p;
1295           break;
1296         case GAVL_YUVJ_444_P:
1297           ret = tab->bgr_16_to_yuvj_444_p;
1298           break;
1299         /* Keep GCC happy */
1300         case GAVL_PIXELFORMAT_NONE:
1301         case GAVL_BGR_16:
1302           break;
1303         }
1304       break;
1305     case GAVL_RGB_24:
1306       switch(output_pixelformat)
1307         {
1308         case GAVL_GRAY_8:
1309           ret = tab->rgb_24_to_gray_8;
1310           break;
1311         case GAVL_GRAY_16:
1312           ret = tab->rgb_24_to_gray_16;
1313           break;
1314         case GAVL_GRAY_FLOAT:
1315           ret = tab->rgb_24_to_gray_float;
1316           break;
1317         case GAVL_GRAYA_16:
1318           ret = tab->rgb_24_to_graya_16;
1319           break;
1320         case GAVL_GRAYA_32:
1321           ret = tab->rgb_24_to_graya_32;
1322           break;
1323         case GAVL_GRAYA_FLOAT:
1324           ret = tab->rgb_24_to_graya_float;
1325           break;
1326         case GAVL_RGB_15:
1327           ret = tab->rgb_24_to_15;
1328           break;
1329         case GAVL_BGR_15:
1330           ret = tab->rgb_24_to_15_swap;
1331           break;
1332         case GAVL_RGB_16:
1333           ret = tab->rgb_24_to_16;
1334           break;
1335         case GAVL_BGR_16:
1336           ret = tab->rgb_24_to_16_swap;
1337           break;
1338         case GAVL_BGR_24:
1339           ret = tab->swap_rgb_24;
1340           break;
1341         case GAVL_RGB_32:
1342           ret = tab->rgb_24_to_32;
1343           break;
1344         case GAVL_BGR_32:
1345           ret = tab->rgb_24_to_32_swap;
1346           break;
1347         case GAVL_RGBA_32:
1348           ret = tab->rgb_24_to_rgba_32;
1349           break;
1350         case GAVL_RGB_48:
1351           ret = tab->rgb_24_to_48;
1352           break;
1353         case GAVL_RGBA_64:
1354           ret = tab->rgb_24_to_rgba_64;
1355           break;
1356         case GAVL_RGB_FLOAT:
1357           ret = tab->rgb_24_to_float;
1358           break;
1359         case GAVL_RGBA_FLOAT:
1360           ret = tab->rgb_24_to_rgba_float;
1361           break;
1362         case GAVL_YUY2:
1363           ret = tab->rgb_24_to_yuy2;
1364           break;
1365         case GAVL_UYVY:
1366           ret = tab->rgb_24_to_uyvy;
1367           break;
1368         case GAVL_YUVA_32:
1369           ret = tab->rgb_24_to_yuva_32;
1370           break;
1371         case GAVL_YUVA_64:
1372           ret = tab->rgb_24_to_yuva_64;
1373           break;
1374         case GAVL_YUVA_FLOAT:
1375           ret = tab->rgb_24_to_yuva_float;
1376           break;
1377         case GAVL_YUV_FLOAT:
1378           ret = tab->rgb_24_to_yuv_float;
1379           break;
1380         case GAVL_YUV_420_P:
1381           ret = tab->rgb_24_to_yuv_420_p;
1382           break;
1383         case GAVL_YUV_410_P:
1384           ret = tab->rgb_24_to_yuv_410_p;
1385           break;
1386         case GAVL_YUV_422_P:
1387           ret = tab->rgb_24_to_yuv_422_p;
1388           break;
1389         case GAVL_YUV_422_P_16:
1390           ret = tab->rgb_24_to_yuv_422_p_16;
1391           break;
1392         case GAVL_YUV_411_P:
1393           ret = tab->rgb_24_to_yuv_411_p;
1394           break;
1395         case GAVL_YUV_444_P:
1396           ret = tab->rgb_24_to_yuv_444_p;
1397           break;
1398         case GAVL_YUV_444_P_16:
1399           ret = tab->rgb_24_to_yuv_444_p_16;
1400           break;
1401         case GAVL_YUVJ_420_P:
1402           ret = tab->rgb_24_to_yuvj_420_p;
1403           break;
1404         case GAVL_YUVJ_422_P:
1405           ret = tab->rgb_24_to_yuvj_422_p;
1406           break;
1407         case GAVL_YUVJ_444_P:
1408           ret = tab->rgb_24_to_yuvj_444_p;
1409           break;
1410         /* Keep GCC happy */
1411         case GAVL_PIXELFORMAT_NONE:
1412         case GAVL_RGB_24:
1413           break;
1414         }
1415       break;
1416     case GAVL_BGR_24:
1417       switch(output_pixelformat)
1418         {
1419         case GAVL_GRAY_8:
1420           ret = tab->bgr_24_to_gray_8;
1421           break;
1422         case GAVL_GRAY_16:
1423           ret = tab->bgr_24_to_gray_16;
1424           break;
1425         case GAVL_GRAY_FLOAT:
1426           ret = tab->bgr_24_to_gray_float;
1427           break;
1428         case GAVL_GRAYA_16:
1429           ret = tab->bgr_24_to_graya_16;
1430           break;
1431         case GAVL_GRAYA_32:
1432           ret = tab->bgr_24_to_graya_32;
1433           break;
1434         case GAVL_GRAYA_FLOAT:
1435           ret = tab->bgr_24_to_graya_float;
1436           break;
1437         case GAVL_RGB_15:
1438           ret = tab->rgb_24_to_15_swap;
1439           break;
1440         case GAVL_BGR_15:
1441           ret = tab->rgb_24_to_15;
1442           break;
1443         case GAVL_RGB_16:
1444           ret = tab->rgb_24_to_16_swap;
1445           break;
1446         case GAVL_BGR_16:
1447           ret = tab->rgb_24_to_16;
1448           break;
1449         case GAVL_RGB_24:
1450           ret = tab->swap_rgb_24;
1451           break;
1452         case GAVL_RGB_32:
1453           ret = tab->rgb_24_to_32_swap;
1454           break;
1455         case GAVL_BGR_32:
1456           ret = tab->rgb_24_to_32;
1457           break;
1458         case GAVL_RGBA_32:
1459           ret = tab->bgr_24_to_rgba_32;
1460           break;
1461         case GAVL_RGB_48:
1462           ret = tab->rgb_24_to_48_swap;
1463           break;
1464         case GAVL_RGBA_64:
1465           ret = tab->bgr_24_to_rgba_64;
1466           break;
1467         case GAVL_RGB_FLOAT:
1468           ret = tab->rgb_24_to_float_swap;
1469           break;
1470         case GAVL_RGBA_FLOAT:
1471           ret = tab->bgr_24_to_rgba_float;
1472           break;
1473         case GAVL_YUY2:
1474           ret = tab->bgr_24_to_yuy2;
1475           break;
1476         case GAVL_UYVY:
1477           ret = tab->bgr_24_to_uyvy;
1478           break;
1479         case GAVL_YUVA_32:
1480           ret = tab->bgr_24_to_yuva_32;
1481           break;
1482         case GAVL_YUVA_64:
1483           ret = tab->bgr_24_to_yuva_64;
1484           break;
1485         case GAVL_YUVA_FLOAT:
1486           ret = tab->bgr_24_to_yuva_float;
1487           break;
1488         case GAVL_YUV_FLOAT:
1489           ret = tab->bgr_24_to_yuv_float;
1490           break;
1491         case GAVL_YUV_420_P:
1492           ret = tab->bgr_24_to_yuv_420_p;
1493           break;
1494         case GAVL_YUV_410_P:
1495           ret = tab->bgr_24_to_yuv_410_p;
1496           break;
1497         case GAVL_YUV_422_P:
1498           ret = tab->bgr_24_to_yuv_422_p;
1499           break;
1500         case GAVL_YUV_422_P_16:
1501           ret = tab->bgr_24_to_yuv_422_p_16;
1502           break;
1503         case GAVL_YUV_411_P:
1504           ret = tab->bgr_24_to_yuv_411_p;
1505           break;
1506         case GAVL_YUV_444_P:
1507           ret = tab->bgr_24_to_yuv_444_p;
1508           break;
1509         case GAVL_YUV_444_P_16:
1510           ret = tab->bgr_24_to_yuv_444_p_16;
1511           break;
1512         case GAVL_YUVJ_420_P:
1513           ret = tab->bgr_24_to_yuvj_420_p;
1514           break;
1515         case GAVL_YUVJ_422_P:
1516           ret = tab->bgr_24_to_yuvj_422_p;
1517           break;
1518         case GAVL_YUVJ_444_P:
1519           ret = tab->bgr_24_to_yuvj_444_p;
1520           break;
1521         /* Keep GCC happy */
1522         case GAVL_PIXELFORMAT_NONE:
1523         case GAVL_BGR_24:
1524           break;
1525         }
1526       break;
1527     case GAVL_RGB_32:
1528       switch(output_pixelformat)
1529         {
1530         case GAVL_GRAY_8:
1531           ret = tab->rgb_32_to_gray_8;
1532           break;
1533         case GAVL_GRAY_16:
1534           ret = tab->rgb_32_to_gray_16;
1535           break;
1536         case GAVL_GRAY_FLOAT:
1537           ret = tab->rgb_32_to_gray_float;
1538           break;
1539         case GAVL_GRAYA_16:
1540           ret = tab->rgb_32_to_graya_16;
1541           break;
1542         case GAVL_GRAYA_32:
1543           ret = tab->rgb_32_to_graya_32;
1544           break;
1545         case GAVL_GRAYA_FLOAT:
1546           ret = tab->rgb_32_to_graya_float;
1547           break;
1548         case GAVL_RGB_15:
1549           ret = tab->rgb_32_to_15;
1550           break;
1551         case GAVL_BGR_15:
1552           ret = tab->rgb_32_to_15_swap;
1553           break;
1554         case GAVL_RGB_16:
1555           ret = tab->rgb_32_to_16;
1556           break;
1557         case GAVL_BGR_16:
1558           ret = tab->rgb_32_to_16_swap;
1559           break;
1560         case GAVL_RGB_24:
1561           ret = tab->rgb_32_to_24;
1562           break;
1563         case GAVL_BGR_24:
1564           ret = tab->rgb_32_to_24_swap;
1565           break;
1566         case GAVL_BGR_32:
1567           ret = tab->swap_rgb_32;
1568           break;
1569         case GAVL_RGBA_32:
1570           ret = tab->rgb_32_to_rgba_32;
1571           break;
1572         case GAVL_RGB_48:
1573           ret = tab->rgb_32_to_48;
1574           break;
1575         case GAVL_RGBA_64:
1576           ret = tab->rgb_32_to_rgba_64;
1577           break;
1578         case GAVL_RGB_FLOAT:
1579           ret = tab->rgb_32_to_float;
1580           break;
1581         case GAVL_RGBA_FLOAT:
1582           ret = tab->rgb_32_to_rgba_float;
1583           break;
1584         case GAVL_YUY2:
1585           ret = tab->rgb_32_to_yuy2;
1586           break;
1587         case GAVL_UYVY:
1588           ret = tab->rgb_32_to_uyvy;
1589           break;
1590         case GAVL_YUVA_32:
1591           ret = tab->rgb_32_to_yuva_32;
1592           break;
1593         case GAVL_YUVA_64:
1594           ret = tab->rgb_32_to_yuva_64;
1595           break;
1596         case GAVL_YUVA_FLOAT:
1597           ret = tab->rgb_32_to_yuva_float;
1598           break;
1599         case GAVL_YUV_FLOAT:
1600           ret = tab->rgb_32_to_yuv_float;
1601           break;
1602         case GAVL_YUV_420_P:
1603           ret = tab->rgb_32_to_yuv_420_p;
1604           break;
1605         case GAVL_YUV_410_P:
1606           ret = tab->rgb_32_to_yuv_410_p;
1607           break;
1608         case GAVL_YUV_422_P:
1609           ret = tab->rgb_32_to_yuv_422_p;
1610           break;
1611         case GAVL_YUV_422_P_16:
1612           ret = tab->rgb_32_to_yuv_422_p_16;
1613           break;
1614         case GAVL_YUV_411_P:
1615           ret = tab->rgb_32_to_yuv_411_p;
1616           break;
1617         case GAVL_YUV_444_P:
1618           ret = tab->rgb_32_to_yuv_444_p;
1619           break;
1620         case GAVL_YUV_444_P_16:
1621           ret = tab->rgb_32_to_yuv_444_p_16;
1622           break;
1623         case GAVL_YUVJ_420_P:
1624           ret = tab->rgb_32_to_yuvj_420_p;
1625           break;
1626         case GAVL_YUVJ_422_P:
1627           ret = tab->rgb_32_to_yuvj_422_p;
1628           break;
1629         case GAVL_YUVJ_444_P:
1630           ret = tab->rgb_32_to_yuvj_444_p;
1631           break;
1632         /* Keep GCC happy */
1633         case GAVL_PIXELFORMAT_NONE:
1634         case GAVL_RGB_32:
1635           break;
1636         }
1637       break;
1638     case GAVL_BGR_32:
1639       switch(output_pixelformat)
1640         {
1641         case GAVL_GRAY_8:
1642           ret = tab->bgr_32_to_gray_8;
1643           break;
1644         case GAVL_GRAY_16:
1645           ret = tab->bgr_32_to_gray_16;
1646           break;
1647         case GAVL_GRAY_FLOAT:
1648           ret = tab->bgr_32_to_gray_float;
1649           break;
1650         case GAVL_GRAYA_16:
1651           ret = tab->bgr_32_to_graya_16;
1652           break;
1653         case GAVL_GRAYA_32:
1654           ret = tab->bgr_32_to_graya_32;
1655           break;
1656         case GAVL_GRAYA_FLOAT:
1657           ret = tab->bgr_32_to_graya_float;
1658           break;
1659         case GAVL_RGB_15:
1660           ret = tab->rgb_32_to_15_swap;
1661           break;
1662         case GAVL_BGR_15:
1663           ret = tab->rgb_32_to_15;
1664           break;
1665         case GAVL_RGB_16:
1666           ret = tab->rgb_32_to_16_swap;
1667           break;
1668         case GAVL_BGR_16:
1669           ret = tab->rgb_32_to_16;
1670           break;
1671         case GAVL_RGB_24:
1672           ret = tab->rgb_32_to_24_swap;
1673           break;
1674         case GAVL_BGR_24:
1675           ret = tab->rgb_32_to_24;
1676           break;
1677         case GAVL_RGB_32:
1678           ret = tab->swap_rgb_32;
1679           break;
1680         case GAVL_RGBA_32:
1681           ret = tab->bgr_32_to_rgba_32;
1682           break;
1683         case GAVL_RGB_48:
1684           ret = tab->rgb_32_to_48_swap;
1685           break;
1686         case GAVL_RGBA_64:
1687           ret = tab->bgr_32_to_rgba_64;
1688           break;
1689         case GAVL_RGB_FLOAT:
1690           ret = tab->rgb_32_to_float_swap;
1691           break;
1692         case GAVL_RGBA_FLOAT:
1693           ret = tab->bgr_32_to_rgba_float;
1694           break;
1695         case GAVL_YUY2:
1696           ret = tab->bgr_32_to_yuy2;
1697           break;
1698         case GAVL_UYVY:
1699           ret = tab->bgr_32_to_uyvy;
1700           break;
1701         case GAVL_YUVA_32:
1702           ret = tab->bgr_32_to_yuva_32;
1703           break;
1704         case GAVL_YUVA_64:
1705           ret = tab->bgr_32_to_yuva_64;
1706           break;
1707         case GAVL_YUVA_FLOAT:
1708           ret = tab->bgr_32_to_yuva_float;
1709           break;
1710         case GAVL_YUV_FLOAT:
1711           ret = tab->bgr_32_to_yuv_float;
1712           break;
1713         case GAVL_YUV_420_P:
1714           ret = tab->bgr_32_to_yuv_420_p;
1715           break;
1716         case GAVL_YUV_410_P:
1717           ret = tab->bgr_32_to_yuv_410_p;
1718           break;
1719         case GAVL_YUV_422_P:
1720           ret = tab->bgr_32_to_yuv_422_p;
1721           break;
1722         case GAVL_YUV_422_P_16:
1723           ret = tab->bgr_32_to_yuv_422_p_16;
1724           break;
1725         case GAVL_YUV_411_P:
1726           ret = tab->bgr_32_to_yuv_411_p;
1727           break;
1728         case GAVL_YUV_444_P:
1729           ret = tab->bgr_32_to_yuv_444_p;
1730           break;
1731         case GAVL_YUV_444_P_16:
1732           ret = tab->bgr_32_to_yuv_444_p_16;
1733           break;
1734         case GAVL_YUVJ_420_P:
1735           ret = tab->bgr_32_to_yuvj_420_p;
1736           break;
1737         case GAVL_YUVJ_422_P:
1738           ret = tab->bgr_32_to_yuvj_422_p;
1739           break;
1740         case GAVL_YUVJ_444_P:
1741           ret = tab->bgr_32_to_yuvj_444_p;
1742           break;
1743         /* Keep GCC happy */
1744         case GAVL_PIXELFORMAT_NONE:
1745         case GAVL_BGR_32:
1746           break;
1747         }
1748       break;
1749     case GAVL_RGBA_32:
1750       switch(output_pixelformat)
1751         {
1752         case GAVL_GRAY_8:
1753           ret = tab->rgba_32_to_gray_8;
1754           break;
1755         case GAVL_GRAY_16:
1756           ret = tab->rgba_32_to_gray_16;
1757           break;
1758         case GAVL_GRAY_FLOAT:
1759           ret = tab->rgba_32_to_gray_float;
1760           break;
1761         case GAVL_GRAYA_16:
1762           ret = tab->rgba_32_to_graya_16;
1763           break;
1764         case GAVL_GRAYA_32:
1765           ret = tab->rgba_32_to_graya_32;
1766           break;
1767         case GAVL_GRAYA_FLOAT:
1768           ret = tab->rgba_32_to_graya_float;
1769           break;
1770         case GAVL_RGB_15:
1771           ret = tab->rgba_32_to_rgb_15;
1772           break;
1773         case GAVL_BGR_15:
1774           ret = tab->rgba_32_to_bgr_15;
1775           break;
1776         case GAVL_RGB_16:
1777           ret = tab->rgba_32_to_rgb_16;
1778           break;
1779         case GAVL_BGR_16:
1780           ret = tab->rgba_32_to_bgr_16;
1781           break;
1782         case GAVL_RGB_24:
1783           ret = tab->rgba_32_to_rgb_24;
1784           break;
1785         case GAVL_BGR_24:
1786           ret = tab->rgba_32_to_bgr_24;
1787           break;
1788         case GAVL_RGB_32:
1789           ret = tab->rgba_32_to_rgb_32;
1790           break;
1791         case GAVL_BGR_32:
1792           ret = tab->rgba_32_to_bgr_32;
1793           break;
1794         case GAVL_RGB_48:
1795           ret = tab->rgba_32_to_rgb_48;
1796           break;
1797         case GAVL_RGBA_64:
1798           ret = tab->rgba_32_to_rgba_64;
1799           break;
1800         case GAVL_RGB_FLOAT:
1801           ret = tab->rgba_32_to_rgb_float;
1802           break;
1803         case GAVL_RGBA_FLOAT:
1804           ret = tab->rgba_32_to_rgba_float;
1805           break;
1806         case GAVL_YUY2:
1807           ret = tab->rgba_32_to_yuy2;
1808           break;
1809         case GAVL_UYVY:
1810           ret = tab->rgba_32_to_uyvy;
1811           break;
1812         case GAVL_YUVA_32:
1813           ret = tab->rgba_32_to_yuva_32;
1814           break;
1815         case GAVL_YUVA_64:
1816           ret = tab->rgba_32_to_yuva_64;
1817           break;
1818         case GAVL_YUVA_FLOAT:
1819           ret = tab->rgba_32_to_yuva_float;
1820           break;
1821         case GAVL_YUV_FLOAT:
1822           ret = tab->rgba_32_to_yuv_float;
1823           break;
1824         case GAVL_YUV_420_P:
1825           ret = tab->rgba_32_to_yuv_420_p;
1826           break;
1827         case GAVL_YUV_410_P:
1828           ret = tab->rgba_32_to_yuv_410_p;
1829           break;
1830         case GAVL_YUV_422_P:
1831           ret = tab->rgba_32_to_yuv_422_p;
1832           break;
1833         case GAVL_YUV_422_P_16:
1834           ret = tab->rgba_32_to_yuv_422_p_16;
1835           break;
1836         case GAVL_YUV_411_P:
1837           ret = tab->rgba_32_to_yuv_411_p;
1838           break;
1839         case GAVL_YUV_444_P:
1840           ret = tab->rgba_32_to_yuv_444_p;
1841           break;
1842         case GAVL_YUV_444_P_16:
1843           ret = tab->rgba_32_to_yuv_444_p_16;
1844           break;
1845         case GAVL_YUVJ_420_P:
1846           ret = tab->rgba_32_to_yuvj_420_p;
1847           break;
1848         case GAVL_YUVJ_422_P:
1849           ret = tab->rgba_32_to_yuvj_422_p;
1850           break;
1851         case GAVL_YUVJ_444_P:
1852           ret = tab->rgba_32_to_yuvj_444_p;
1853           break;
1854         /* Keep GCC happy */
1855         case GAVL_PIXELFORMAT_NONE:
1856         case GAVL_RGBA_32:
1857           break;
1858         }
1859       break;
1860 
1861     case GAVL_RGBA_64:
1862       switch(output_pixelformat)
1863         {
1864         case GAVL_GRAY_8:
1865           ret = tab->rgba_64_to_gray_8;
1866           break;
1867         case GAVL_GRAY_16:
1868           ret = tab->rgba_64_to_gray_16;
1869           break;
1870         case GAVL_GRAY_FLOAT:
1871           ret = tab->rgba_64_to_gray_float;
1872           break;
1873         case GAVL_GRAYA_16:
1874           ret = tab->rgba_64_to_graya_16;
1875           break;
1876         case GAVL_GRAYA_32:
1877           ret = tab->rgba_64_to_graya_32;
1878           break;
1879         case GAVL_GRAYA_FLOAT:
1880           ret = tab->rgba_64_to_graya_float;
1881           break;
1882         case GAVL_RGB_15:
1883           ret = tab->rgba_64_to_rgb_15;
1884           break;
1885         case GAVL_BGR_15:
1886           ret = tab->rgba_64_to_bgr_15;
1887           break;
1888         case GAVL_RGB_16:
1889           ret = tab->rgba_64_to_rgb_16;
1890           break;
1891         case GAVL_BGR_16:
1892           ret = tab->rgba_64_to_bgr_16;
1893           break;
1894         case GAVL_RGB_24:
1895           ret = tab->rgba_64_to_rgb_24;
1896           break;
1897         case GAVL_BGR_24:
1898           ret = tab->rgba_64_to_bgr_24;
1899           break;
1900         case GAVL_RGB_32:
1901           ret = tab->rgba_64_to_rgb_32;
1902           break;
1903         case GAVL_BGR_32:
1904           ret = tab->rgba_64_to_bgr_32;
1905           break;
1906         case GAVL_RGBA_32:
1907           ret = tab->rgba_64_to_rgba_32;
1908           break;
1909         case GAVL_RGB_48:
1910           ret = tab->rgba_64_to_rgb_48;
1911           break;
1912         case GAVL_RGB_FLOAT:
1913           ret = tab->rgba_64_to_rgb_float;
1914           break;
1915         case GAVL_RGBA_FLOAT:
1916           ret = tab->rgba_64_to_rgba_float;
1917           break;
1918         case GAVL_YUY2:
1919           ret = tab->rgba_64_to_yuy2;
1920           break;
1921         case GAVL_UYVY:
1922           ret = tab->rgba_64_to_uyvy;
1923           break;
1924         case GAVL_YUVA_32:
1925           ret = tab->rgba_64_to_yuva_32;
1926           break;
1927         case GAVL_YUVA_64:
1928           ret = tab->rgba_64_to_yuva_64;
1929           break;
1930         case GAVL_YUVA_FLOAT:
1931           ret = tab->rgba_64_to_yuva_float;
1932           break;
1933         case GAVL_YUV_FLOAT:
1934           ret = tab->rgba_64_to_yuv_float;
1935           break;
1936         case GAVL_YUV_420_P:
1937           ret = tab->rgba_64_to_yuv_420_p;
1938           break;
1939         case GAVL_YUV_410_P:
1940           ret = tab->rgba_64_to_yuv_410_p;
1941           break;
1942         case GAVL_YUV_422_P:
1943           ret = tab->rgba_64_to_yuv_422_p;
1944           break;
1945         case GAVL_YUV_422_P_16:
1946           ret = tab->rgba_64_to_yuv_422_p_16;
1947           break;
1948         case GAVL_YUV_411_P:
1949           ret = tab->rgba_64_to_yuv_411_p;
1950           break;
1951         case GAVL_YUV_444_P:
1952           ret = tab->rgba_64_to_yuv_444_p;
1953           break;
1954         case GAVL_YUV_444_P_16:
1955           ret = tab->rgba_64_to_yuv_444_p_16;
1956           break;
1957         case GAVL_YUVJ_420_P:
1958           ret = tab->rgba_64_to_yuvj_420_p;
1959           break;
1960         case GAVL_YUVJ_422_P:
1961           ret = tab->rgba_64_to_yuvj_422_p;
1962           break;
1963         case GAVL_YUVJ_444_P:
1964           ret = tab->rgba_64_to_yuvj_444_p;
1965           break;
1966         /* Keep GCC happy */
1967         case GAVL_PIXELFORMAT_NONE:
1968         case GAVL_RGBA_64:
1969           break;
1970         }
1971       break;
1972 
1973     case GAVL_RGBA_FLOAT:
1974       switch(output_pixelformat)
1975         {
1976         case GAVL_GRAY_8:
1977           ret = tab->rgba_float_to_gray_8;
1978           break;
1979         case GAVL_GRAY_16:
1980           ret = tab->rgba_float_to_gray_16;
1981           break;
1982         case GAVL_GRAY_FLOAT:
1983           ret = tab->rgba_float_to_gray_float;
1984           break;
1985         case GAVL_GRAYA_16:
1986           ret = tab->rgba_float_to_graya_16;
1987           break;
1988         case GAVL_GRAYA_32:
1989           ret = tab->rgba_float_to_graya_32;
1990           break;
1991         case GAVL_GRAYA_FLOAT:
1992           ret = tab->rgba_float_to_graya_float;
1993           break;
1994         case GAVL_RGB_15:
1995           ret = tab->rgba_float_to_rgb_15;
1996           break;
1997         case GAVL_BGR_15:
1998           ret = tab->rgba_float_to_bgr_15;
1999           break;
2000         case GAVL_RGB_16:
2001           ret = tab->rgba_float_to_rgb_16;
2002           break;
2003         case GAVL_BGR_16:
2004           ret = tab->rgba_float_to_bgr_16;
2005           break;
2006         case GAVL_RGB_24:
2007           ret = tab->rgba_float_to_rgb_24;
2008           break;
2009         case GAVL_BGR_24:
2010           ret = tab->rgba_float_to_bgr_24;
2011           break;
2012         case GAVL_RGB_32:
2013           ret = tab->rgba_float_to_rgb_32;
2014           break;
2015         case GAVL_BGR_32:
2016           ret = tab->rgba_float_to_bgr_32;
2017           break;
2018         case GAVL_RGBA_32:
2019           ret = tab->rgba_float_to_rgba_32;
2020           break;
2021         case GAVL_RGB_48:
2022           ret = tab->rgba_float_to_rgb_48;
2023           break;
2024         case GAVL_RGBA_64:
2025           ret = tab->rgba_float_to_rgba_64;
2026           break;
2027         case GAVL_RGB_FLOAT:
2028           ret = tab->rgba_float_to_rgb_float;
2029           break;
2030         case GAVL_YUY2:
2031           ret = tab->rgba_float_to_yuy2;
2032           break;
2033         case GAVL_UYVY:
2034           ret = tab->rgba_float_to_uyvy;
2035           break;
2036         case GAVL_YUVA_32:
2037           ret = tab->rgba_float_to_yuva_32;
2038           break;
2039         case GAVL_YUVA_64:
2040           ret = tab->rgba_float_to_yuva_64;
2041           break;
2042         case GAVL_YUVA_FLOAT:
2043           ret = tab->rgba_float_to_yuva_float;
2044           break;
2045         case GAVL_YUV_FLOAT:
2046           ret = tab->rgba_float_to_yuv_float;
2047           break;
2048         case GAVL_YUV_420_P:
2049           ret = tab->rgba_float_to_yuv_420_p;
2050           break;
2051         case GAVL_YUV_410_P:
2052           ret = tab->rgba_float_to_yuv_410_p;
2053           break;
2054         case GAVL_YUV_422_P:
2055           ret = tab->rgba_float_to_yuv_422_p;
2056           break;
2057         case GAVL_YUV_422_P_16:
2058           ret = tab->rgba_float_to_yuv_422_p_16;
2059           break;
2060         case GAVL_YUV_411_P:
2061           ret = tab->rgba_float_to_yuv_411_p;
2062           break;
2063         case GAVL_YUV_444_P:
2064           ret = tab->rgba_float_to_yuv_444_p;
2065           break;
2066         case GAVL_YUV_444_P_16:
2067           ret = tab->rgba_float_to_yuv_444_p_16;
2068           break;
2069         case GAVL_YUVJ_420_P:
2070           ret = tab->rgba_float_to_yuvj_420_p;
2071           break;
2072         case GAVL_YUVJ_422_P:
2073           ret = tab->rgba_float_to_yuvj_422_p;
2074           break;
2075         case GAVL_YUVJ_444_P:
2076           ret = tab->rgba_float_to_yuvj_444_p;
2077           break;
2078         /* Keep GCC happy */
2079         case GAVL_PIXELFORMAT_NONE:
2080         case GAVL_RGBA_FLOAT:
2081           break;
2082         }
2083       break;
2084 
2085 
2086     case GAVL_RGB_48:
2087       switch(output_pixelformat)
2088         {
2089         case GAVL_GRAY_8:
2090           ret = tab->rgb_48_to_gray_8;
2091           break;
2092         case GAVL_GRAY_16:
2093           ret = tab->rgb_48_to_gray_16;
2094           break;
2095         case GAVL_GRAY_FLOAT:
2096           ret = tab->rgb_48_to_gray_float;
2097           break;
2098         case GAVL_GRAYA_16:
2099           ret = tab->rgb_48_to_graya_16;
2100           break;
2101         case GAVL_GRAYA_32:
2102           ret = tab->rgb_48_to_graya_32;
2103           break;
2104         case GAVL_GRAYA_FLOAT:
2105           ret = tab->rgb_48_to_graya_float;
2106           break;
2107         case GAVL_RGB_15:
2108           ret = tab->rgb_48_to_15;
2109           break;
2110         case GAVL_BGR_15:
2111           ret = tab->rgb_48_to_15_swap;
2112           break;
2113         case GAVL_RGB_16:
2114           ret = tab->rgb_48_to_16;
2115           break;
2116         case GAVL_BGR_16:
2117           ret = tab->rgb_48_to_16_swap;
2118           break;
2119         case GAVL_RGB_24:
2120           ret = tab->rgb_48_to_24;
2121           break;
2122         case GAVL_BGR_24:
2123           ret = tab->rgb_48_to_24_swap;
2124           break;
2125         case GAVL_RGB_32:
2126           ret = tab->rgb_48_to_32;
2127           break;
2128         case GAVL_BGR_32:
2129           ret = tab->rgb_48_to_32_swap;
2130           break;
2131         case GAVL_RGBA_32:
2132           ret = tab->rgb_48_to_rgba_32;
2133           break;
2134         case GAVL_RGBA_64:
2135           ret = tab->rgb_48_to_rgba_64;
2136           break;
2137         case GAVL_RGB_FLOAT:
2138           ret = tab->rgb_48_to_float;
2139           break;
2140         case GAVL_RGBA_FLOAT:
2141           ret = tab->rgb_48_to_rgba_float;
2142           break;
2143         case GAVL_YUY2:
2144           ret = tab->rgb_48_to_yuy2;
2145           break;
2146         case GAVL_UYVY:
2147           ret = tab->rgb_48_to_uyvy;
2148           break;
2149         case GAVL_YUVA_32:
2150           ret = tab->rgb_48_to_yuva_32;
2151           break;
2152         case GAVL_YUVA_64:
2153           ret = tab->rgb_48_to_yuva_64;
2154           break;
2155         case GAVL_YUVA_FLOAT:
2156           ret = tab->rgb_48_to_yuva_float;
2157           break;
2158         case GAVL_YUV_FLOAT:
2159           ret = tab->rgb_48_to_yuv_float;
2160           break;
2161         case GAVL_YUV_420_P:
2162           ret = tab->rgb_48_to_yuv_420_p;
2163           break;
2164         case GAVL_YUV_410_P:
2165           ret = tab->rgb_48_to_yuv_410_p;
2166           break;
2167         case GAVL_YUV_422_P:
2168           ret = tab->rgb_48_to_yuv_422_p;
2169           break;
2170         case GAVL_YUV_422_P_16:
2171           ret = tab->rgb_48_to_yuv_422_p_16;
2172           break;
2173         case GAVL_YUV_411_P:
2174           ret = tab->rgb_48_to_yuv_411_p;
2175           break;
2176         case GAVL_YUV_444_P:
2177           ret = tab->rgb_48_to_yuv_444_p;
2178           break;
2179         case GAVL_YUV_444_P_16:
2180           ret = tab->rgb_48_to_yuv_444_p_16;
2181           break;
2182         case GAVL_YUVJ_420_P:
2183           ret = tab->rgb_48_to_yuvj_420_p;
2184           break;
2185         case GAVL_YUVJ_422_P:
2186           ret = tab->rgb_48_to_yuvj_422_p;
2187           break;
2188         case GAVL_YUVJ_444_P:
2189           ret = tab->rgb_48_to_yuvj_444_p;
2190           break;
2191         /* Keep GCC happy */
2192         case GAVL_PIXELFORMAT_NONE:
2193         case GAVL_RGB_48:
2194           break;
2195         }
2196       break;
2197     case GAVL_RGB_FLOAT:
2198       switch(output_pixelformat)
2199         {
2200         case GAVL_GRAY_8:
2201           ret = tab->rgb_float_to_gray_8;
2202           break;
2203         case GAVL_GRAY_16:
2204           ret = tab->rgb_float_to_gray_16;
2205           break;
2206         case GAVL_GRAY_FLOAT:
2207           ret = tab->rgb_float_to_gray_float;
2208           break;
2209         case GAVL_GRAYA_16:
2210           ret = tab->rgb_float_to_graya_16;
2211           break;
2212         case GAVL_GRAYA_32:
2213           ret = tab->rgb_float_to_graya_32;
2214           break;
2215         case GAVL_GRAYA_FLOAT:
2216           ret = tab->rgb_float_to_graya_float;
2217           break;
2218         case GAVL_RGB_15:
2219           ret = tab->rgb_float_to_15;
2220           break;
2221         case GAVL_BGR_15:
2222           ret = tab->rgb_float_to_15_swap;
2223           break;
2224         case GAVL_RGB_16:
2225           ret = tab->rgb_float_to_16;
2226           break;
2227         case GAVL_BGR_16:
2228           ret = tab->rgb_float_to_16_swap;
2229           break;
2230         case GAVL_RGB_24:
2231           ret = tab->rgb_float_to_24;
2232           break;
2233         case GAVL_BGR_24:
2234           ret = tab->rgb_float_to_24_swap;
2235           break;
2236         case GAVL_RGB_32:
2237           ret = tab->rgb_float_to_32;
2238           break;
2239         case GAVL_BGR_32:
2240           ret = tab->rgb_float_to_32_swap;
2241           break;
2242         case GAVL_RGBA_32:
2243           ret = tab->rgb_float_to_rgba_32;
2244           break;
2245         case GAVL_RGB_48:
2246           ret = tab->rgb_float_to_48;
2247           break;
2248         case GAVL_RGBA_64:
2249           ret = tab->rgb_float_to_rgba_64;
2250           break;
2251         case GAVL_RGBA_FLOAT:
2252           ret = tab->rgb_float_to_rgba_float;
2253           break;
2254         case GAVL_YUY2:
2255           ret = tab->rgb_float_to_yuy2;
2256           break;
2257         case GAVL_UYVY:
2258           ret = tab->rgb_float_to_uyvy;
2259           break;
2260         case GAVL_YUVA_32:
2261           ret = tab->rgb_float_to_yuva_32;
2262           break;
2263         case GAVL_YUVA_64:
2264           ret = tab->rgb_float_to_yuva_64;
2265           break;
2266         case GAVL_YUVA_FLOAT:
2267           ret = tab->rgb_float_to_yuva_float;
2268           break;
2269         case GAVL_YUV_FLOAT:
2270           ret = tab->rgb_float_to_yuv_float;
2271           break;
2272         case GAVL_YUV_420_P:
2273           ret = tab->rgb_float_to_yuv_420_p;
2274           break;
2275         case GAVL_YUV_410_P:
2276           ret = tab->rgb_float_to_yuv_410_p;
2277           break;
2278         case GAVL_YUV_422_P:
2279           ret = tab->rgb_float_to_yuv_422_p;
2280           break;
2281         case GAVL_YUV_422_P_16:
2282           ret = tab->rgb_float_to_yuv_422_p_16;
2283           break;
2284         case GAVL_YUV_411_P:
2285           ret = tab->rgb_float_to_yuv_411_p;
2286           break;
2287         case GAVL_YUV_444_P:
2288           ret = tab->rgb_float_to_yuv_444_p;
2289           break;
2290         case GAVL_YUV_444_P_16:
2291           ret = tab->rgb_float_to_yuv_444_p_16;
2292           break;
2293         case GAVL_YUVJ_420_P:
2294           ret = tab->rgb_float_to_yuvj_420_p;
2295           break;
2296         case GAVL_YUVJ_422_P:
2297           ret = tab->rgb_float_to_yuvj_422_p;
2298           break;
2299         case GAVL_YUVJ_444_P:
2300           ret = tab->rgb_float_to_yuvj_444_p;
2301           break;
2302         /* Keep GCC happy */
2303         case GAVL_PIXELFORMAT_NONE:
2304         case GAVL_RGB_FLOAT:
2305           break;
2306         }
2307       break;
2308 
2309 
2310 
2311     case GAVL_YUY2:
2312       switch(output_pixelformat)
2313         {
2314         case GAVL_GRAY_8:
2315           ret = tab->yuy2_to_gray_8;
2316           break;
2317         case GAVL_GRAY_16:
2318           ret = tab->yuy2_to_gray_16;
2319           break;
2320         case GAVL_GRAY_FLOAT:
2321           ret = tab->yuy2_to_gray_float;
2322           break;
2323         case GAVL_GRAYA_16:
2324           ret = tab->yuy2_to_graya_16;
2325           break;
2326         case GAVL_GRAYA_32:
2327           ret = tab->yuy2_to_graya_32;
2328           break;
2329         case GAVL_GRAYA_FLOAT:
2330           ret = tab->yuy2_to_graya_float;
2331           break;
2332         case GAVL_RGB_15:
2333           ret = tab->yuy2_to_rgb_15;
2334           break;
2335         case GAVL_BGR_15:
2336           ret = tab->yuy2_to_bgr_15;
2337           break;
2338         case GAVL_RGB_16:
2339           ret = tab->yuy2_to_rgb_16;
2340           break;
2341         case GAVL_BGR_16:
2342           ret = tab->yuy2_to_bgr_16;
2343           break;
2344         case GAVL_RGB_24:
2345           ret = tab->yuy2_to_rgb_24;
2346           break;
2347         case GAVL_BGR_24:
2348           ret = tab->yuy2_to_bgr_24;
2349           break;
2350         case GAVL_RGB_32:
2351           ret = tab->yuy2_to_rgb_32;
2352           break;
2353         case GAVL_BGR_32:
2354           ret = tab->yuy2_to_bgr_32;
2355           break;
2356         case GAVL_RGBA_32:
2357           ret = tab->yuy2_to_rgba_32;
2358           break;
2359         case GAVL_RGB_48:
2360           ret = tab->yuy2_to_rgb_48;
2361           break;
2362         case GAVL_RGBA_64:
2363           ret = tab->yuy2_to_rgba_64;
2364           break;
2365         case GAVL_RGB_FLOAT:
2366           ret = tab->yuy2_to_rgb_float;
2367           break;
2368         case GAVL_RGBA_FLOAT:
2369           ret = tab->yuy2_to_rgba_float;
2370           break;
2371         case GAVL_YUV_420_P:
2372           ret = tab->yuy2_to_yuv_420_p;
2373           break;
2374         case GAVL_YUV_410_P:
2375           ret = tab->yuy2_to_yuv_410_p;
2376           break;
2377         case GAVL_YUV_422_P:
2378           ret = tab->yuy2_to_yuv_422_p;
2379           break;
2380         case GAVL_YUV_422_P_16:
2381           ret = tab->yuy2_to_yuv_422_p_16;
2382           break;
2383         case GAVL_YUV_411_P:
2384           ret = tab->yuy2_to_yuv_411_p;
2385           break;
2386         case GAVL_YUV_444_P:
2387           ret = tab->yuy2_to_yuv_444_p;
2388           break;
2389         case GAVL_YUV_444_P_16:
2390           ret = tab->yuy2_to_yuv_444_p_16;
2391           break;
2392         case GAVL_YUVJ_420_P:
2393           ret = tab->yuy2_to_yuvj_420_p;
2394           break;
2395         case GAVL_YUVJ_422_P:
2396           ret = tab->yuy2_to_yuvj_422_p;
2397           break;
2398         case GAVL_YUVJ_444_P:
2399           ret = tab->yuy2_to_yuvj_444_p;
2400           break;
2401         case GAVL_UYVY:
2402           ret = tab->uyvy_to_yuy2;
2403           break;
2404         case GAVL_YUVA_32:
2405           ret = tab->yuy2_to_yuva_32;
2406           break;
2407         case GAVL_YUVA_64:
2408           ret = tab->yuy2_to_yuva_64;
2409           break;
2410         case GAVL_YUVA_FLOAT:
2411           ret = tab->yuy2_to_yuva_float;
2412           break;
2413         case GAVL_YUV_FLOAT:
2414           ret = tab->yuy2_to_yuv_float;
2415           break;
2416         /* Keep GCC happy */
2417         case GAVL_PIXELFORMAT_NONE:
2418         case GAVL_YUY2:
2419           break;
2420         }
2421       break;
2422     case GAVL_UYVY:
2423       switch(output_pixelformat)
2424         {
2425         case GAVL_GRAY_8:
2426           ret = tab->uyvy_to_gray_8;
2427           break;
2428         case GAVL_GRAY_16:
2429           ret = tab->uyvy_to_gray_16;
2430           break;
2431         case GAVL_GRAY_FLOAT:
2432           ret = tab->uyvy_to_gray_float;
2433           break;
2434         case GAVL_GRAYA_16:
2435           ret = tab->uyvy_to_graya_16;
2436           break;
2437         case GAVL_GRAYA_32:
2438           ret = tab->uyvy_to_graya_32;
2439           break;
2440         case GAVL_GRAYA_FLOAT:
2441           ret = tab->uyvy_to_graya_float;
2442           break;
2443         case GAVL_RGB_15:
2444           ret = tab->uyvy_to_rgb_15;
2445           break;
2446         case GAVL_BGR_15:
2447           ret = tab->uyvy_to_bgr_15;
2448           break;
2449         case GAVL_RGB_16:
2450           ret = tab->uyvy_to_rgb_16;
2451           break;
2452         case GAVL_BGR_16:
2453           ret = tab->uyvy_to_bgr_16;
2454           break;
2455         case GAVL_RGB_24:
2456           ret = tab->uyvy_to_rgb_24;
2457           break;
2458         case GAVL_BGR_24:
2459           ret = tab->uyvy_to_bgr_24;
2460           break;
2461         case GAVL_RGB_32:
2462           ret = tab->uyvy_to_rgb_32;
2463           break;
2464         case GAVL_BGR_32:
2465           ret = tab->uyvy_to_bgr_32;
2466           break;
2467         case GAVL_RGBA_32:
2468           ret = tab->uyvy_to_rgba_32;
2469           break;
2470         case GAVL_RGB_48:
2471           ret = tab->uyvy_to_rgb_48;
2472           break;
2473         case GAVL_RGBA_64:
2474           ret = tab->uyvy_to_rgba_64;
2475           break;
2476         case GAVL_RGB_FLOAT:
2477           ret = tab->uyvy_to_rgb_float;
2478           break;
2479         case GAVL_RGBA_FLOAT:
2480           ret = tab->uyvy_to_rgba_float;
2481           break;
2482         case GAVL_YUV_420_P:
2483           ret = tab->uyvy_to_yuv_420_p;
2484           break;
2485         case GAVL_YUV_410_P:
2486           ret = tab->uyvy_to_yuv_410_p;
2487           break;
2488         case GAVL_YUV_422_P:
2489           ret = tab->uyvy_to_yuv_422_p;
2490           break;
2491         case GAVL_YUV_422_P_16:
2492           ret = tab->uyvy_to_yuv_422_p_16;
2493           break;
2494         case GAVL_YUV_411_P:
2495           ret = tab->uyvy_to_yuv_411_p;
2496           break;
2497         case GAVL_YUV_444_P:
2498           ret = tab->uyvy_to_yuv_444_p;
2499           break;
2500         case GAVL_YUV_444_P_16:
2501           ret = tab->uyvy_to_yuv_444_p_16;
2502           break;
2503         case GAVL_YUVJ_420_P:
2504           ret = tab->uyvy_to_yuvj_420_p;
2505           break;
2506         case GAVL_YUVJ_422_P:
2507           ret = tab->uyvy_to_yuvj_422_p;
2508           break;
2509         case GAVL_YUVJ_444_P:
2510           ret = tab->uyvy_to_yuvj_444_p;
2511           break;
2512         case GAVL_YUY2:
2513           ret = tab->uyvy_to_yuy2;
2514           break;
2515         case GAVL_YUVA_32:
2516           ret = tab->uyvy_to_yuva_32;
2517           break;
2518         case GAVL_YUVA_64:
2519           ret = tab->uyvy_to_yuva_64;
2520           break;
2521         case GAVL_YUVA_FLOAT:
2522           ret = tab->uyvy_to_yuva_float;
2523           break;
2524         case GAVL_YUV_FLOAT:
2525           ret = tab->uyvy_to_yuv_float;
2526           break;
2527         /* Keep GCC happy */
2528         case GAVL_PIXELFORMAT_NONE:
2529         case GAVL_UYVY:
2530           break;
2531         }
2532       break;
2533 
2534      case GAVL_YUVA_32:
2535       switch(output_pixelformat)
2536         {
2537         case GAVL_GRAY_8:
2538           ret = tab->yuva_32_to_gray_8;
2539           break;
2540         case GAVL_GRAY_16:
2541           ret = tab->yuva_32_to_gray_16;
2542           break;
2543         case GAVL_GRAY_FLOAT:
2544           ret = tab->yuva_32_to_gray_float;
2545           break;
2546         case GAVL_GRAYA_16:
2547           ret = tab->yuva_32_to_graya_16;
2548           break;
2549         case GAVL_GRAYA_32:
2550           ret = tab->yuva_32_to_graya_32;
2551           break;
2552         case GAVL_GRAYA_FLOAT:
2553           ret = tab->yuva_32_to_graya_float;
2554           break;
2555         case GAVL_RGB_15:
2556           ret = tab->yuva_32_to_rgb_15;
2557           break;
2558         case GAVL_BGR_15:
2559           ret = tab->yuva_32_to_bgr_15;
2560           break;
2561         case GAVL_RGB_16:
2562           ret = tab->yuva_32_to_rgb_16;
2563           break;
2564         case GAVL_BGR_16:
2565           ret = tab->yuva_32_to_bgr_16;
2566           break;
2567         case GAVL_RGB_24:
2568           ret = tab->yuva_32_to_rgb_24;
2569           break;
2570         case GAVL_BGR_24:
2571           ret = tab->yuva_32_to_bgr_24;
2572           break;
2573         case GAVL_RGB_32:
2574           ret = tab->yuva_32_to_rgb_32;
2575           break;
2576         case GAVL_BGR_32:
2577           ret = tab->yuva_32_to_bgr_32;
2578           break;
2579         case GAVL_RGBA_32:
2580           ret = tab->yuva_32_to_rgba_32;
2581           break;
2582         case GAVL_RGB_48:
2583           ret = tab->yuva_32_to_rgb_48;
2584           break;
2585         case GAVL_RGBA_64:
2586           ret = tab->yuva_32_to_rgba_64;
2587           break;
2588         case GAVL_RGB_FLOAT:
2589           ret = tab->yuva_32_to_rgb_float;
2590           break;
2591         case GAVL_RGBA_FLOAT:
2592           ret = tab->yuva_32_to_rgba_float;
2593           break;
2594         case GAVL_YUV_420_P:
2595           ret = tab->yuva_32_to_yuv_420_p;
2596           break;
2597         case GAVL_YUV_410_P:
2598           ret = tab->yuva_32_to_yuv_410_p;
2599           break;
2600         case GAVL_YUV_422_P:
2601           ret = tab->yuva_32_to_yuv_422_p;
2602           break;
2603         case GAVL_YUV_422_P_16:
2604           ret = tab->yuva_32_to_yuv_422_p_16;
2605           break;
2606         case GAVL_YUV_411_P:
2607           ret = tab->yuva_32_to_yuv_411_p;
2608           break;
2609         case GAVL_YUV_444_P:
2610           ret = tab->yuva_32_to_yuv_444_p;
2611           break;
2612         case GAVL_YUV_444_P_16:
2613           ret = tab->yuva_32_to_yuv_444_p_16;
2614           break;
2615         case GAVL_YUVJ_420_P:
2616           ret = tab->yuva_32_to_yuvj_420_p;
2617           break;
2618         case GAVL_YUVJ_422_P:
2619           ret = tab->yuva_32_to_yuvj_422_p;
2620           break;
2621         case GAVL_YUVJ_444_P:
2622           ret = tab->yuva_32_to_yuvj_444_p;
2623           break;
2624         case GAVL_YUY2:
2625           ret = tab->yuva_32_to_yuy2;
2626           break;
2627         case GAVL_UYVY:
2628           ret = tab->yuva_32_to_uyvy;
2629           break;
2630         case GAVL_YUVA_64:
2631           ret = tab->yuva_32_to_yuva_64;
2632           break;
2633         case GAVL_YUVA_FLOAT:
2634           ret = tab->yuva_32_to_yuva_float;
2635           break;
2636         case GAVL_YUV_FLOAT:
2637           ret = tab->yuva_32_to_yuv_float;
2638           break;
2639         /* Keep GCC happy */
2640         case GAVL_PIXELFORMAT_NONE:
2641         case GAVL_YUVA_32:
2642           break;
2643         }
2644       break;
2645 
2646     case GAVL_YUVA_64:
2647       switch(output_pixelformat)
2648         {
2649         case GAVL_GRAY_8:
2650           ret = tab->yuva_64_to_gray_8;
2651           break;
2652         case GAVL_GRAY_16:
2653           ret = tab->yuva_64_to_gray_16;
2654           break;
2655         case GAVL_GRAY_FLOAT:
2656           ret = tab->yuva_64_to_gray_float;
2657           break;
2658         case GAVL_GRAYA_16:
2659           ret = tab->yuva_64_to_graya_16;
2660           break;
2661         case GAVL_GRAYA_32:
2662           ret = tab->yuva_64_to_graya_32;
2663           break;
2664         case GAVL_GRAYA_FLOAT:
2665           ret = tab->yuva_64_to_graya_float;
2666           break;
2667         case GAVL_RGB_15:
2668           ret = tab->yuva_64_to_rgb_15;
2669           break;
2670         case GAVL_BGR_15:
2671           ret = tab->yuva_64_to_bgr_15;
2672           break;
2673         case GAVL_RGB_16:
2674           ret = tab->yuva_64_to_rgb_16;
2675           break;
2676         case GAVL_BGR_16:
2677           ret = tab->yuva_64_to_bgr_16;
2678           break;
2679         case GAVL_RGB_24:
2680           ret = tab->yuva_64_to_rgb_24;
2681           break;
2682         case GAVL_BGR_24:
2683           ret = tab->yuva_64_to_bgr_24;
2684           break;
2685         case GAVL_RGB_32:
2686           ret = tab->yuva_64_to_rgb_32;
2687           break;
2688         case GAVL_BGR_32:
2689           ret = tab->yuva_64_to_bgr_32;
2690           break;
2691         case GAVL_RGBA_32:
2692           ret = tab->yuva_64_to_rgba_32;
2693           break;
2694         case GAVL_RGB_48:
2695           ret = tab->yuva_64_to_rgb_48;
2696           break;
2697         case GAVL_RGBA_64:
2698           ret = tab->yuva_64_to_rgba_64;
2699           break;
2700         case GAVL_RGB_FLOAT:
2701           ret = tab->yuva_64_to_rgb_float;
2702           break;
2703         case GAVL_RGBA_FLOAT:
2704           ret = tab->yuva_64_to_rgba_float;
2705           break;
2706         case GAVL_YUV_420_P:
2707           ret = tab->yuva_64_to_yuv_420_p;
2708           break;
2709         case GAVL_YUV_410_P:
2710           ret = tab->yuva_64_to_yuv_410_p;
2711           break;
2712         case GAVL_YUV_422_P:
2713           ret = tab->yuva_64_to_yuv_422_p;
2714           break;
2715         case GAVL_YUV_422_P_16:
2716           ret = tab->yuva_64_to_yuv_422_p_16;
2717           break;
2718         case GAVL_YUV_411_P:
2719           ret = tab->yuva_64_to_yuv_411_p;
2720           break;
2721         case GAVL_YUV_444_P:
2722           ret = tab->yuva_64_to_yuv_444_p;
2723           break;
2724         case GAVL_YUV_444_P_16:
2725           ret = tab->yuva_64_to_yuv_444_p_16;
2726           break;
2727         case GAVL_YUVJ_420_P:
2728           ret = tab->yuva_64_to_yuvj_420_p;
2729           break;
2730         case GAVL_YUVJ_422_P:
2731           ret = tab->yuva_64_to_yuvj_422_p;
2732           break;
2733         case GAVL_YUVJ_444_P:
2734           ret = tab->yuva_64_to_yuvj_444_p;
2735           break;
2736         case GAVL_YUY2:
2737           ret = tab->yuva_64_to_yuy2;
2738           break;
2739         case GAVL_UYVY:
2740           ret = tab->yuva_64_to_uyvy;
2741           break;
2742         case GAVL_YUVA_32:
2743           ret = tab->yuva_64_to_yuva_32;
2744           break;
2745         case GAVL_YUVA_FLOAT:
2746           ret = tab->yuva_64_to_yuva_float;
2747           break;
2748         case GAVL_YUV_FLOAT:
2749           ret = tab->yuva_64_to_yuv_float;
2750           break;
2751         /* Keep GCC happy */
2752         case GAVL_PIXELFORMAT_NONE:
2753         case GAVL_YUVA_64:
2754           break;
2755         }
2756       break;
2757 
2758     case GAVL_YUVA_FLOAT:
2759       switch(output_pixelformat)
2760         {
2761         case GAVL_GRAY_8:
2762           ret = tab->yuva_float_to_gray_8;
2763           break;
2764         case GAVL_GRAY_16:
2765           ret = tab->yuva_float_to_gray_16;
2766           break;
2767         case GAVL_GRAY_FLOAT:
2768           ret = tab->yuva_float_to_gray_float;
2769           break;
2770         case GAVL_GRAYA_16:
2771           ret = tab->yuva_float_to_graya_16;
2772           break;
2773         case GAVL_GRAYA_32:
2774           ret = tab->yuva_float_to_graya_32;
2775           break;
2776         case GAVL_GRAYA_FLOAT:
2777           ret = tab->yuva_float_to_graya_float;
2778           break;
2779         case GAVL_RGB_15:
2780           ret = tab->yuva_float_to_rgb_15;
2781           break;
2782         case GAVL_BGR_15:
2783           ret = tab->yuva_float_to_bgr_15;
2784           break;
2785         case GAVL_RGB_16:
2786           ret = tab->yuva_float_to_rgb_16;
2787           break;
2788         case GAVL_BGR_16:
2789           ret = tab->yuva_float_to_bgr_16;
2790           break;
2791         case GAVL_RGB_24:
2792           ret = tab->yuva_float_to_rgb_24;
2793           break;
2794         case GAVL_BGR_24:
2795           ret = tab->yuva_float_to_bgr_24;
2796           break;
2797         case GAVL_RGB_32:
2798           ret = tab->yuva_float_to_rgb_32;
2799           break;
2800         case GAVL_BGR_32:
2801           ret = tab->yuva_float_to_bgr_32;
2802           break;
2803         case GAVL_RGBA_32:
2804           ret = tab->yuva_float_to_rgba_32;
2805           break;
2806         case GAVL_RGB_48:
2807           ret = tab->yuva_float_to_rgb_48;
2808           break;
2809         case GAVL_RGBA_64:
2810           ret = tab->yuva_float_to_rgba_64;
2811           break;
2812         case GAVL_RGB_FLOAT:
2813           ret = tab->yuva_float_to_rgb_float;
2814           break;
2815         case GAVL_RGBA_FLOAT:
2816           ret = tab->yuva_float_to_rgba_float;
2817           break;
2818         case GAVL_YUV_420_P:
2819           ret = tab->yuva_float_to_yuv_420_p;
2820           break;
2821         case GAVL_YUV_410_P:
2822           ret = tab->yuva_float_to_yuv_410_p;
2823           break;
2824         case GAVL_YUV_422_P:
2825           ret = tab->yuva_float_to_yuv_422_p;
2826           break;
2827         case GAVL_YUV_422_P_16:
2828           ret = tab->yuva_float_to_yuv_422_p_16;
2829           break;
2830         case GAVL_YUV_411_P:
2831           ret = tab->yuva_float_to_yuv_411_p;
2832           break;
2833         case GAVL_YUV_444_P:
2834           ret = tab->yuva_float_to_yuv_444_p;
2835           break;
2836         case GAVL_YUV_444_P_16:
2837           ret = tab->yuva_float_to_yuv_444_p_16;
2838           break;
2839         case GAVL_YUVJ_420_P:
2840           ret = tab->yuva_float_to_yuvj_420_p;
2841           break;
2842         case GAVL_YUVJ_422_P:
2843           ret = tab->yuva_float_to_yuvj_422_p;
2844           break;
2845         case GAVL_YUVJ_444_P:
2846           ret = tab->yuva_float_to_yuvj_444_p;
2847           break;
2848         case GAVL_YUY2:
2849           ret = tab->yuva_float_to_yuy2;
2850           break;
2851         case GAVL_UYVY:
2852           ret = tab->yuva_float_to_uyvy;
2853           break;
2854         case GAVL_YUVA_64:
2855           ret = tab->yuva_float_to_yuva_64;
2856           break;
2857         case GAVL_YUVA_32:
2858           ret = tab->yuva_float_to_yuva_32;
2859           break;
2860         case GAVL_YUV_FLOAT:
2861           ret = tab->yuva_float_to_yuv_float;
2862           break;
2863         /* Keep GCC happy */
2864         case GAVL_PIXELFORMAT_NONE:
2865         case GAVL_YUVA_FLOAT:
2866           break;
2867         }
2868       break;
2869 
2870     case GAVL_YUV_FLOAT:
2871       switch(output_pixelformat)
2872         {
2873         case GAVL_GRAY_8:
2874           ret = tab->yuv_float_to_gray_8;
2875           break;
2876         case GAVL_GRAY_16:
2877           ret = tab->yuv_float_to_gray_16;
2878           break;
2879         case GAVL_GRAY_FLOAT:
2880           ret = tab->yuv_float_to_gray_float;
2881           break;
2882         case GAVL_GRAYA_16:
2883           ret = tab->yuv_float_to_graya_16;
2884           break;
2885         case GAVL_GRAYA_32:
2886           ret = tab->yuv_float_to_graya_32;
2887           break;
2888         case GAVL_GRAYA_FLOAT:
2889           ret = tab->yuv_float_to_graya_float;
2890           break;
2891         case GAVL_RGB_15:
2892           ret = tab->yuv_float_to_rgb_15;
2893           break;
2894         case GAVL_BGR_15:
2895           ret = tab->yuv_float_to_bgr_15;
2896           break;
2897         case GAVL_RGB_16:
2898           ret = tab->yuv_float_to_rgb_16;
2899           break;
2900         case GAVL_BGR_16:
2901           ret = tab->yuv_float_to_bgr_16;
2902           break;
2903         case GAVL_RGB_24:
2904           ret = tab->yuv_float_to_rgb_24;
2905           break;
2906         case GAVL_BGR_24:
2907           ret = tab->yuv_float_to_bgr_24;
2908           break;
2909         case GAVL_RGB_32:
2910           ret = tab->yuv_float_to_rgb_32;
2911           break;
2912         case GAVL_BGR_32:
2913           ret = tab->yuv_float_to_bgr_32;
2914           break;
2915         case GAVL_RGBA_32:
2916           ret = tab->yuv_float_to_rgba_32;
2917           break;
2918         case GAVL_RGB_48:
2919           ret = tab->yuv_float_to_rgb_48;
2920           break;
2921         case GAVL_RGBA_64:
2922           ret = tab->yuv_float_to_rgba_64;
2923           break;
2924         case GAVL_RGB_FLOAT:
2925           ret = tab->yuv_float_to_rgb_float;
2926           break;
2927         case GAVL_RGBA_FLOAT:
2928           ret = tab->yuv_float_to_rgba_float;
2929           break;
2930         case GAVL_YUV_420_P:
2931           ret = tab->yuv_float_to_yuv_420_p;
2932           break;
2933         case GAVL_YUV_410_P:
2934           ret = tab->yuv_float_to_yuv_410_p;
2935           break;
2936         case GAVL_YUV_422_P:
2937           ret = tab->yuv_float_to_yuv_422_p;
2938           break;
2939         case GAVL_YUV_422_P_16:
2940           ret = tab->yuv_float_to_yuv_422_p_16;
2941           break;
2942         case GAVL_YUV_411_P:
2943           ret = tab->yuv_float_to_yuv_411_p;
2944           break;
2945         case GAVL_YUV_444_P:
2946           ret = tab->yuv_float_to_yuv_444_p;
2947           break;
2948         case GAVL_YUV_444_P_16:
2949           ret = tab->yuv_float_to_yuv_444_p_16;
2950           break;
2951         case GAVL_YUVJ_420_P:
2952           ret = tab->yuv_float_to_yuvj_420_p;
2953           break;
2954         case GAVL_YUVJ_422_P:
2955           ret = tab->yuv_float_to_yuvj_422_p;
2956           break;
2957         case GAVL_YUVJ_444_P:
2958           ret = tab->yuv_float_to_yuvj_444_p;
2959           break;
2960         case GAVL_YUY2:
2961           ret = tab->yuv_float_to_yuy2;
2962           break;
2963         case GAVL_UYVY:
2964           ret = tab->yuv_float_to_uyvy;
2965           break;
2966         case GAVL_YUVA_64:
2967           ret = tab->yuv_float_to_yuva_64;
2968           break;
2969         case GAVL_YUVA_32:
2970           ret = tab->yuv_float_to_yuva_32;
2971           break;
2972         case GAVL_YUVA_FLOAT:
2973           ret = tab->yuv_float_to_yuva_float;
2974           break;
2975         /* Keep GCC happy */
2976         case GAVL_PIXELFORMAT_NONE:
2977         case GAVL_YUV_FLOAT:
2978           break;
2979         }
2980       break;
2981 
2982     case GAVL_YUV_420_P:
2983       switch(output_pixelformat)
2984         {
2985         case GAVL_GRAY_8:
2986           ret = tab->y_8_to_gray_8;
2987           break;
2988         case GAVL_GRAY_16:
2989           ret = tab->y_8_to_gray_16;
2990           break;
2991         case GAVL_GRAY_FLOAT:
2992           ret = tab->y_8_to_gray_float;
2993           break;
2994         case GAVL_GRAYA_16:
2995           ret = tab->y_8_to_graya_16;
2996           break;
2997         case GAVL_GRAYA_32:
2998           ret = tab->y_8_to_graya_32;
2999           break;
3000         case GAVL_GRAYA_FLOAT:
3001           ret = tab->y_8_to_graya_float;
3002           break;
3003         case GAVL_RGB_15:
3004           ret = tab->yuv_420_p_to_rgb_15;
3005           break;
3006         case GAVL_BGR_15:
3007           ret = tab->yuv_420_p_to_bgr_15;
3008           break;
3009         case GAVL_RGB_16:
3010           ret = tab->yuv_420_p_to_rgb_16;
3011           break;
3012         case GAVL_BGR_16:
3013           ret = tab->yuv_420_p_to_bgr_16;
3014           break;
3015         case GAVL_RGB_24:
3016           ret = tab->yuv_420_p_to_rgb_24;
3017           break;
3018         case GAVL_BGR_24:
3019           ret = tab->yuv_420_p_to_bgr_24;
3020           break;
3021         case GAVL_RGB_32:
3022           ret = tab->yuv_420_p_to_rgb_32;
3023           break;
3024         case GAVL_BGR_32:
3025           ret = tab->yuv_420_p_to_bgr_32;
3026           break;
3027         case GAVL_RGBA_32:
3028           ret = tab->yuv_420_p_to_rgba_32;
3029           break;
3030         case GAVL_RGB_48:
3031           ret = tab->yuv_420_p_to_rgb_48;
3032           break;
3033         case GAVL_RGBA_64:
3034           ret = tab->yuv_420_p_to_rgba_64;
3035           break;
3036         case GAVL_RGB_FLOAT:
3037           ret = tab->yuv_420_p_to_rgb_float;
3038           break;
3039         case GAVL_RGBA_FLOAT:
3040           ret = tab->yuv_420_p_to_rgba_float;
3041           break;
3042 
3043         case GAVL_YUY2:
3044           ret = tab->yuv_420_p_to_yuy2;
3045           break;
3046         case GAVL_UYVY:
3047           ret = tab->yuv_420_p_to_uyvy;
3048           break;
3049         case GAVL_YUVA_32:
3050           ret = tab->yuv_420_p_to_yuva_32;
3051           break;
3052         case GAVL_YUVA_64:
3053           ret = tab->yuv_420_p_to_yuva_64;
3054           break;
3055         case GAVL_YUVA_FLOAT:
3056           ret = tab->yuv_420_p_to_yuva_float;
3057           break;
3058         case GAVL_YUV_FLOAT:
3059           ret = tab->yuv_420_p_to_yuv_float;
3060           break;
3061         case GAVL_YUV_410_P:
3062           ret = tab->yuv_420_p_to_yuv_410_p;
3063           break;
3064         case GAVL_YUV_422_P:
3065           ret = tab->yuv_420_p_to_yuv_422_p;
3066           break;
3067         case GAVL_YUV_422_P_16:
3068           ret = tab->yuv_420_p_to_yuv_422_p_16;
3069           break;
3070         case GAVL_YUV_411_P:
3071           ret = tab->yuv_420_p_to_yuv_411_p;
3072           break;
3073         case GAVL_YUV_444_P:
3074           ret = tab->yuv_420_p_to_yuv_444_p;
3075           break;
3076         case GAVL_YUV_444_P_16:
3077           ret = tab->yuv_420_p_to_yuv_444_p_16;
3078           break;
3079         case GAVL_YUVJ_420_P:
3080           ret = tab->yuv_420_p_to_yuvj_420_p;
3081           break;
3082         case GAVL_YUVJ_422_P:
3083           ret = tab->yuv_420_p_to_yuvj_422_p;
3084           break;
3085         case GAVL_YUVJ_444_P:
3086           ret = tab->yuv_420_p_to_yuvj_444_p;
3087           break;
3088         /* Keep GCC happy */
3089         case GAVL_PIXELFORMAT_NONE:
3090         case GAVL_YUV_420_P:
3091           break;
3092         }
3093       break;
3094     case GAVL_YUV_410_P:
3095       switch(output_pixelformat)
3096         {
3097         case GAVL_GRAY_8:
3098           ret = tab->y_8_to_gray_8;
3099           break;
3100         case GAVL_GRAY_16:
3101           ret = tab->y_8_to_gray_16;
3102           break;
3103         case GAVL_GRAY_FLOAT:
3104           ret = tab->y_8_to_gray_float;
3105           break;
3106         case GAVL_GRAYA_16:
3107           ret = tab->y_8_to_graya_16;
3108           break;
3109         case GAVL_GRAYA_32:
3110           ret = tab->y_8_to_graya_32;
3111           break;
3112         case GAVL_GRAYA_FLOAT:
3113           ret = tab->y_8_to_graya_float;
3114           break;
3115         case GAVL_RGB_15:
3116           ret = tab->yuv_410_p_to_rgb_15;
3117           break;
3118         case GAVL_BGR_15:
3119           ret = tab->yuv_410_p_to_bgr_15;
3120           break;
3121         case GAVL_RGB_16:
3122           ret = tab->yuv_410_p_to_rgb_16;
3123           break;
3124         case GAVL_BGR_16:
3125           ret = tab->yuv_410_p_to_bgr_16;
3126           break;
3127         case GAVL_RGB_24:
3128           ret = tab->yuv_410_p_to_rgb_24;
3129           break;
3130         case GAVL_BGR_24:
3131           ret = tab->yuv_410_p_to_bgr_24;
3132           break;
3133         case GAVL_RGB_32:
3134           ret = tab->yuv_410_p_to_rgb_32;
3135           break;
3136         case GAVL_BGR_32:
3137           ret = tab->yuv_410_p_to_bgr_32;
3138           break;
3139         case GAVL_RGBA_32:
3140           ret = tab->yuv_410_p_to_rgba_32;
3141           break;
3142         case GAVL_RGB_48:
3143           ret = tab->yuv_410_p_to_rgb_48;
3144           break;
3145         case GAVL_RGBA_64:
3146           ret = tab->yuv_410_p_to_rgba_64;
3147           break;
3148         case GAVL_RGB_FLOAT:
3149           ret = tab->yuv_410_p_to_rgb_float;
3150           break;
3151         case GAVL_RGBA_FLOAT:
3152           ret = tab->yuv_410_p_to_rgba_float;
3153           break;
3154 
3155         case GAVL_YUY2:
3156           ret = tab->yuv_410_p_to_yuy2;
3157           break;
3158         case GAVL_UYVY:
3159           ret = tab->yuv_410_p_to_uyvy;
3160           break;
3161         case GAVL_YUVA_32:
3162           ret = tab->yuv_410_p_to_yuva_32;
3163           break;
3164         case GAVL_YUVA_64:
3165           ret = tab->yuv_410_p_to_yuva_64;
3166           break;
3167         case GAVL_YUVA_FLOAT:
3168           ret = tab->yuv_410_p_to_yuva_float;
3169           break;
3170         case GAVL_YUV_FLOAT:
3171           ret = tab->yuv_410_p_to_yuv_float;
3172           break;
3173         case GAVL_YUV_420_P:
3174           ret = tab->yuv_410_p_to_yuv_420_p;
3175           break;
3176         case GAVL_YUV_422_P:
3177           ret = tab->yuv_410_p_to_yuv_422_p;
3178           break;
3179         case GAVL_YUV_422_P_16:
3180           ret = tab->yuv_410_p_to_yuv_422_p_16;
3181           break;
3182         case GAVL_YUV_411_P:
3183           ret = tab->yuv_410_p_to_yuv_411_p;
3184           break;
3185         case GAVL_YUV_444_P:
3186           ret = tab->yuv_410_p_to_yuv_444_p;
3187           break;
3188         case GAVL_YUV_444_P_16:
3189           ret = tab->yuv_410_p_to_yuv_444_p_16;
3190           break;
3191         case GAVL_YUVJ_420_P:
3192           ret = tab->yuv_410_p_to_yuvj_420_p;
3193           break;
3194         case GAVL_YUVJ_422_P:
3195           ret = tab->yuv_410_p_to_yuvj_422_p;
3196           break;
3197         case GAVL_YUVJ_444_P:
3198           ret = tab->yuv_410_p_to_yuvj_444_p;
3199           break;
3200         /* Keep GCC happy */
3201         case GAVL_PIXELFORMAT_NONE:
3202         case GAVL_YUV_410_P:
3203           break;
3204         }
3205       break;
3206     case GAVL_YUV_422_P:
3207       switch(output_pixelformat)
3208         {
3209         case GAVL_GRAY_8:
3210           ret = tab->y_8_to_gray_8;
3211           break;
3212         case GAVL_GRAY_16:
3213           ret = tab->y_8_to_gray_16;
3214           break;
3215         case GAVL_GRAY_FLOAT:
3216           ret = tab->y_8_to_gray_float;
3217           break;
3218         case GAVL_GRAYA_16:
3219           ret = tab->y_8_to_graya_16;
3220           break;
3221         case GAVL_GRAYA_32:
3222           ret = tab->y_8_to_graya_32;
3223           break;
3224         case GAVL_GRAYA_FLOAT:
3225           ret = tab->y_8_to_graya_float;
3226           break;
3227         case GAVL_RGB_15:
3228           ret = tab->yuv_422_p_to_rgb_15;
3229           break;
3230         case GAVL_BGR_15:
3231           ret = tab->yuv_422_p_to_bgr_15;
3232           break;
3233         case GAVL_RGB_16:
3234           ret = tab->yuv_422_p_to_rgb_16;
3235           break;
3236         case GAVL_BGR_16:
3237           ret = tab->yuv_422_p_to_bgr_16;
3238           break;
3239         case GAVL_RGB_24:
3240           ret = tab->yuv_422_p_to_rgb_24;
3241           break;
3242         case GAVL_BGR_24:
3243           ret = tab->yuv_422_p_to_bgr_24;
3244           break;
3245         case GAVL_RGB_32:
3246           ret = tab->yuv_422_p_to_rgb_32;
3247           break;
3248         case GAVL_BGR_32:
3249           ret = tab->yuv_422_p_to_bgr_32;
3250           break;
3251         case GAVL_RGBA_32:
3252           ret = tab->yuv_422_p_to_rgba_32;
3253           break;
3254         case GAVL_RGB_48:
3255           ret = tab->yuv_422_p_to_rgb_48;
3256           break;
3257         case GAVL_RGBA_64:
3258           ret = tab->yuv_422_p_to_rgba_64;
3259           break;
3260         case GAVL_RGB_FLOAT:
3261           ret = tab->yuv_422_p_to_rgb_float;
3262           break;
3263         case GAVL_RGBA_FLOAT:
3264           ret = tab->yuv_422_p_to_rgba_float;
3265           break;
3266         case GAVL_YUY2:
3267           ret = tab->yuv_422_p_to_yuy2;
3268           break;
3269         case GAVL_UYVY:
3270           ret = tab->yuv_422_p_to_uyvy;
3271           break;
3272         case GAVL_YUVA_32:
3273           ret = tab->yuv_422_p_to_yuva_32;
3274           break;
3275         case GAVL_YUVA_64:
3276           ret = tab->yuv_422_p_to_yuva_64;
3277           break;
3278         case GAVL_YUVA_FLOAT:
3279           ret = tab->yuv_422_p_to_yuva_float;
3280           break;
3281         case GAVL_YUV_FLOAT:
3282           ret = tab->yuv_422_p_to_yuv_float;
3283           break;
3284         case GAVL_YUV_420_P:
3285           ret = tab->yuv_422_p_to_yuv_420_p;
3286           break;
3287         case GAVL_YUV_410_P:
3288           ret = tab->yuv_422_p_to_yuv_410_p;
3289           break;
3290         case GAVL_YUV_411_P:
3291           ret = tab->yuv_422_p_to_yuv_411_p;
3292           break;
3293         case GAVL_YUV_444_P:
3294           ret = tab->yuv_422_p_to_yuv_444_p;
3295           break;
3296         case GAVL_YUV_444_P_16:
3297           ret = tab->yuv_422_p_to_yuv_444_p_16;
3298           break;
3299         case GAVL_YUV_422_P_16:
3300           ret = tab->yuv_422_p_to_yuv_422_p_16;
3301           break;
3302         case GAVL_YUVJ_420_P:
3303           ret = tab->yuv_422_p_to_yuvj_420_p;
3304           break;
3305         case GAVL_YUVJ_422_P:
3306           ret = tab->yuv_422_p_to_yuvj_422_p;
3307           break;
3308         case GAVL_YUVJ_444_P:
3309           ret = tab->yuv_422_p_to_yuvj_444_p;
3310           break;
3311         /* Keep GCC happy */
3312         case GAVL_PIXELFORMAT_NONE:
3313         case GAVL_YUV_422_P:
3314           break;
3315         }
3316       break;
3317 
3318     case GAVL_YUV_422_P_16:
3319       switch(output_pixelformat)
3320         {
3321         case GAVL_GRAY_8:
3322           ret = tab->y_16_to_gray_8;
3323           break;
3324         case GAVL_GRAY_16:
3325           ret = tab->y_16_to_gray_16;
3326           break;
3327         case GAVL_GRAY_FLOAT:
3328           ret = tab->y_16_to_gray_float;
3329           break;
3330         case GAVL_GRAYA_16:
3331           ret = tab->y_16_to_graya_16;
3332           break;
3333         case GAVL_GRAYA_32:
3334           ret = tab->y_16_to_graya_32;
3335           break;
3336         case GAVL_GRAYA_FLOAT:
3337           ret = tab->y_16_to_graya_float;
3338           break;
3339         case GAVL_RGB_15:
3340           ret = tab->yuv_422_p_16_to_rgb_15;
3341           break;
3342         case GAVL_BGR_15:
3343           ret = tab->yuv_422_p_16_to_bgr_15;
3344           break;
3345         case GAVL_RGB_16:
3346           ret = tab->yuv_422_p_16_to_rgb_16;
3347           break;
3348         case GAVL_BGR_16:
3349           ret = tab->yuv_422_p_16_to_bgr_16;
3350           break;
3351         case GAVL_RGB_24:
3352           ret = tab->yuv_422_p_16_to_rgb_24;
3353           break;
3354         case GAVL_BGR_24:
3355           ret = tab->yuv_422_p_16_to_bgr_24;
3356           break;
3357         case GAVL_RGB_32:
3358           ret = tab->yuv_422_p_16_to_rgb_32;
3359           break;
3360         case GAVL_BGR_32:
3361           ret = tab->yuv_422_p_16_to_bgr_32;
3362           break;
3363         case GAVL_RGBA_32:
3364           ret = tab->yuv_422_p_16_to_rgba_32;
3365           break;
3366         case GAVL_RGB_48:
3367           ret = tab->yuv_422_p_16_to_rgb_48;
3368           break;
3369         case GAVL_RGBA_64:
3370           ret = tab->yuv_422_p_16_to_rgba_64;
3371           break;
3372         case GAVL_RGB_FLOAT:
3373           ret = tab->yuv_422_p_16_to_rgb_float;
3374           break;
3375         case GAVL_RGBA_FLOAT:
3376           ret = tab->yuv_422_p_16_to_rgba_float;
3377           break;
3378         case GAVL_YUY2:
3379           ret = tab->yuv_422_p_16_to_yuy2;
3380           break;
3381         case GAVL_UYVY:
3382           ret = tab->yuv_422_p_16_to_uyvy;
3383           break;
3384         case GAVL_YUVA_32:
3385           ret = tab->yuv_422_p_16_to_yuva_32;
3386           break;
3387         case GAVL_YUVA_64:
3388           ret = tab->yuv_422_p_16_to_yuva_64;
3389           break;
3390         case GAVL_YUVA_FLOAT:
3391           ret = tab->yuv_422_p_16_to_yuva_float;
3392           break;
3393         case GAVL_YUV_FLOAT:
3394           ret = tab->yuv_422_p_16_to_yuv_float;
3395           break;
3396         case GAVL_YUV_420_P:
3397           ret = tab->yuv_422_p_16_to_yuv_420_p;
3398           break;
3399         case GAVL_YUV_410_P:
3400           ret = tab->yuv_422_p_16_to_yuv_410_p;
3401           break;
3402         case GAVL_YUV_411_P:
3403           ret = tab->yuv_422_p_16_to_yuv_411_p;
3404           break;
3405         case GAVL_YUV_444_P:
3406           ret = tab->yuv_422_p_16_to_yuv_444_p;
3407           break;
3408         case GAVL_YUV_444_P_16:
3409           ret = tab->yuv_422_p_16_to_yuv_444_p_16;
3410           break;
3411         case GAVL_YUV_422_P:
3412           ret = tab->yuv_422_p_16_to_yuv_422_p;
3413           break;
3414         case GAVL_YUVJ_420_P:
3415           ret = tab->yuv_422_p_16_to_yuvj_420_p;
3416           break;
3417         case GAVL_YUVJ_422_P:
3418           ret = tab->yuv_422_p_16_to_yuvj_422_p;
3419           break;
3420         case GAVL_YUVJ_444_P:
3421           ret = tab->yuv_422_p_16_to_yuvj_444_p;
3422           break;
3423         /* Keep GCC happy */
3424         case GAVL_PIXELFORMAT_NONE:
3425         case GAVL_YUV_422_P_16:
3426           break;
3427         }
3428       break;
3429 
3430     case GAVL_YUV_411_P:
3431       switch(output_pixelformat)
3432         {
3433         case GAVL_GRAY_8:
3434           ret = tab->y_8_to_gray_8;
3435           break;
3436         case GAVL_GRAY_16:
3437           ret = tab->y_8_to_gray_16;
3438           break;
3439         case GAVL_GRAY_FLOAT:
3440           ret = tab->y_8_to_gray_float;
3441           break;
3442         case GAVL_GRAYA_16:
3443           ret = tab->y_8_to_graya_16;
3444           break;
3445         case GAVL_GRAYA_32:
3446           ret = tab->y_8_to_graya_32;
3447           break;
3448         case GAVL_GRAYA_FLOAT:
3449           ret = tab->y_8_to_graya_float;
3450           break;
3451         case GAVL_RGB_15:
3452           ret = tab->yuv_411_p_to_rgb_15;
3453           break;
3454         case GAVL_BGR_15:
3455           ret = tab->yuv_411_p_to_bgr_15;
3456           break;
3457         case GAVL_RGB_16:
3458           ret = tab->yuv_411_p_to_rgb_16;
3459           break;
3460         case GAVL_BGR_16:
3461           ret = tab->yuv_411_p_to_bgr_16;
3462           break;
3463         case GAVL_RGB_24:
3464           ret = tab->yuv_411_p_to_rgb_24;
3465           break;
3466         case GAVL_BGR_24:
3467           ret = tab->yuv_411_p_to_bgr_24;
3468           break;
3469         case GAVL_RGB_32:
3470           ret = tab->yuv_411_p_to_rgb_32;
3471           break;
3472         case GAVL_BGR_32:
3473           ret = tab->yuv_411_p_to_bgr_32;
3474           break;
3475         case GAVL_RGBA_32:
3476           ret = tab->yuv_411_p_to_rgba_32;
3477           break;
3478         case GAVL_RGB_48:
3479           ret = tab->yuv_411_p_to_rgb_48;
3480           break;
3481         case GAVL_RGBA_64:
3482           ret = tab->yuv_411_p_to_rgba_64;
3483           break;
3484         case GAVL_RGB_FLOAT:
3485           ret = tab->yuv_411_p_to_rgb_float;
3486           break;
3487         case GAVL_RGBA_FLOAT:
3488           ret = tab->yuv_411_p_to_rgba_float;
3489           break;
3490 
3491         case GAVL_YUY2:
3492           ret = tab->yuv_411_p_to_yuy2;
3493           break;
3494         case GAVL_UYVY:
3495           ret = tab->yuv_411_p_to_uyvy;
3496           break;
3497         case GAVL_YUVA_32:
3498           ret = tab->yuv_411_p_to_yuva_32;
3499           break;
3500         case GAVL_YUVA_64:
3501           ret = tab->yuv_411_p_to_yuva_64;
3502           break;
3503         case GAVL_YUVA_FLOAT:
3504           ret = tab->yuv_411_p_to_yuva_float;
3505           break;
3506         case GAVL_YUV_FLOAT:
3507           ret = tab->yuv_411_p_to_yuv_float;
3508           break;
3509         case GAVL_YUV_420_P:
3510           ret = tab->yuv_411_p_to_yuv_420_p;
3511           break;
3512         case GAVL_YUV_410_P:
3513           ret = tab->yuv_411_p_to_yuv_410_p;
3514           break;
3515         case GAVL_YUV_422_P:
3516           ret = tab->yuv_411_p_to_yuv_422_p;
3517           break;
3518         case GAVL_YUV_422_P_16:
3519           ret = tab->yuv_411_p_to_yuv_422_p_16;
3520           break;
3521         case GAVL_YUV_444_P:
3522           ret = tab->yuv_411_p_to_yuv_444_p;
3523           break;
3524         case GAVL_YUV_444_P_16:
3525           ret = tab->yuv_411_p_to_yuv_444_p_16;
3526           break;
3527         case GAVL_YUVJ_420_P:
3528           ret = tab->yuv_411_p_to_yuvj_420_p;
3529           break;
3530         case GAVL_YUVJ_422_P:
3531           ret = tab->yuv_411_p_to_yuvj_422_p;
3532           break;
3533         case GAVL_YUVJ_444_P:
3534           ret = tab->yuv_411_p_to_yuvj_444_p;
3535           break;
3536         /* Keep GCC happy */
3537         case GAVL_PIXELFORMAT_NONE:
3538         case GAVL_YUV_411_P:
3539           break;
3540         }
3541       break;
3542     case GAVL_YUV_444_P:
3543       switch(output_pixelformat)
3544         {
3545         case GAVL_GRAY_8:
3546           ret = tab->y_8_to_gray_8;
3547           break;
3548         case GAVL_GRAY_16:
3549           ret = tab->y_8_to_gray_16;
3550           break;
3551         case GAVL_GRAY_FLOAT:
3552           ret = tab->y_8_to_gray_float;
3553           break;
3554         case GAVL_GRAYA_16:
3555           ret = tab->y_8_to_graya_16;
3556           break;
3557         case GAVL_GRAYA_32:
3558           ret = tab->y_8_to_graya_32;
3559           break;
3560         case GAVL_GRAYA_FLOAT:
3561           ret = tab->y_8_to_graya_float;
3562           break;
3563         case GAVL_RGB_15:
3564           ret = tab->yuv_444_p_to_rgb_15;
3565           break;
3566         case GAVL_BGR_15:
3567           ret = tab->yuv_444_p_to_bgr_15;
3568           break;
3569         case GAVL_RGB_16:
3570           ret = tab->yuv_444_p_to_rgb_16;
3571           break;
3572         case GAVL_BGR_16:
3573           ret = tab->yuv_444_p_to_bgr_16;
3574           break;
3575         case GAVL_RGB_24:
3576           ret = tab->yuv_444_p_to_rgb_24;
3577           break;
3578         case GAVL_BGR_24:
3579           ret = tab->yuv_444_p_to_bgr_24;
3580           break;
3581         case GAVL_RGB_32:
3582           ret = tab->yuv_444_p_to_rgb_32;
3583           break;
3584         case GAVL_BGR_32:
3585           ret = tab->yuv_444_p_to_bgr_32;
3586           break;
3587         case GAVL_RGBA_32:
3588           ret = tab->yuv_444_p_to_rgba_32;
3589           break;
3590         case GAVL_RGB_48:
3591           ret = tab->yuv_444_p_to_rgb_48;
3592           break;
3593         case GAVL_RGBA_64:
3594           ret = tab->yuv_444_p_to_rgba_64;
3595           break;
3596         case GAVL_RGB_FLOAT:
3597           ret = tab->yuv_444_p_to_rgb_float;
3598           break;
3599         case GAVL_RGBA_FLOAT:
3600           ret = tab->yuv_444_p_to_rgba_float;
3601           break;
3602 
3603         case GAVL_YUY2:
3604           ret = tab->yuv_444_p_to_yuy2;
3605           break;
3606         case GAVL_UYVY:
3607           ret = tab->yuv_444_p_to_uyvy;
3608           break;
3609         case GAVL_YUVA_32:
3610           ret = tab->yuv_444_p_to_yuva_32;
3611           break;
3612         case GAVL_YUVA_64:
3613           ret = tab->yuv_444_p_to_yuva_64;
3614           break;
3615         case GAVL_YUVA_FLOAT:
3616           ret = tab->yuv_444_p_to_yuva_float;
3617           break;
3618         case GAVL_YUV_FLOAT:
3619           ret = tab->yuv_444_p_to_yuv_float;
3620           break;
3621         case GAVL_YUV_410_P:
3622           ret = tab->yuv_444_p_to_yuv_410_p;
3623           break;
3624         case GAVL_YUV_420_P:
3625           ret = tab->yuv_444_p_to_yuv_420_p;
3626           break;
3627         case GAVL_YUV_422_P:
3628           ret = tab->yuv_444_p_to_yuv_422_p;
3629           break;
3630         case GAVL_YUV_422_P_16:
3631           ret = tab->yuv_444_p_to_yuv_422_p_16;
3632           break;
3633         case GAVL_YUV_444_P_16:
3634           ret = tab->yuv_444_p_to_yuv_444_p_16;
3635           break;
3636         case GAVL_YUV_411_P:
3637           ret = tab->yuv_444_p_to_yuv_411_p;
3638           break;
3639         case GAVL_YUVJ_420_P:
3640           ret = tab->yuv_444_p_to_yuvj_420_p;
3641           break;
3642         case GAVL_YUVJ_422_P:
3643           ret = tab->yuv_444_p_to_yuvj_422_p;
3644           break;
3645         case GAVL_YUVJ_444_P:
3646           ret = tab->yuv_444_p_to_yuvj_444_p;
3647           break;
3648         /* Keep GCC happy */
3649         case GAVL_PIXELFORMAT_NONE:
3650         case GAVL_YUV_444_P:
3651           break;
3652         }
3653       break;
3654 
3655     case GAVL_YUV_444_P_16:
3656       switch(output_pixelformat)
3657         {
3658         case GAVL_GRAY_8:
3659           ret = tab->y_16_to_gray_8;
3660           break;
3661         case GAVL_GRAY_16:
3662           ret = tab->y_16_to_gray_16;
3663           break;
3664         case GAVL_GRAY_FLOAT:
3665           ret = tab->y_16_to_gray_float;
3666           break;
3667         case GAVL_GRAYA_16:
3668           ret = tab->y_16_to_graya_16;
3669           break;
3670         case GAVL_GRAYA_32:
3671           ret = tab->y_16_to_graya_32;
3672           break;
3673         case GAVL_GRAYA_FLOAT:
3674           ret = tab->y_16_to_graya_float;
3675           break;
3676         case GAVL_RGB_15:
3677           ret = tab->yuv_444_p_16_to_rgb_15;
3678           break;
3679         case GAVL_BGR_15:
3680           ret = tab->yuv_444_p_16_to_bgr_15;
3681           break;
3682         case GAVL_RGB_16:
3683           ret = tab->yuv_444_p_16_to_rgb_16;
3684           break;
3685         case GAVL_BGR_16:
3686           ret = tab->yuv_444_p_16_to_bgr_16;
3687           break;
3688         case GAVL_RGB_24:
3689           ret = tab->yuv_444_p_16_to_rgb_24;
3690           break;
3691         case GAVL_BGR_24:
3692           ret = tab->yuv_444_p_16_to_bgr_24;
3693           break;
3694         case GAVL_RGB_32:
3695           ret = tab->yuv_444_p_16_to_rgb_32;
3696           break;
3697         case GAVL_BGR_32:
3698           ret = tab->yuv_444_p_16_to_bgr_32;
3699           break;
3700         case GAVL_RGBA_32:
3701           ret = tab->yuv_444_p_16_to_rgba_32;
3702           break;
3703         case GAVL_RGB_48:
3704           ret = tab->yuv_444_p_16_to_rgb_48;
3705           break;
3706         case GAVL_RGBA_64:
3707           ret = tab->yuv_444_p_16_to_rgba_64;
3708           break;
3709         case GAVL_RGB_FLOAT:
3710           ret = tab->yuv_444_p_16_to_rgb_float;
3711           break;
3712         case GAVL_RGBA_FLOAT:
3713           ret = tab->yuv_444_p_16_to_rgba_float;
3714           break;
3715 
3716         case GAVL_YUY2:
3717           ret = tab->yuv_444_p_16_to_yuy2;
3718           break;
3719         case GAVL_UYVY:
3720           ret = tab->yuv_444_p_16_to_uyvy;
3721           break;
3722         case GAVL_YUVA_32:
3723           ret = tab->yuv_444_p_16_to_yuva_32;
3724           break;
3725         case GAVL_YUVA_64:
3726           ret = tab->yuv_444_p_16_to_yuva_64;
3727           break;
3728         case GAVL_YUVA_FLOAT:
3729           ret = tab->yuv_444_p_16_to_yuva_float;
3730           break;
3731         case GAVL_YUV_FLOAT:
3732           ret = tab->yuv_444_p_16_to_yuv_float;
3733           break;
3734         case GAVL_YUV_410_P:
3735           ret = tab->yuv_444_p_16_to_yuv_410_p;
3736           break;
3737         case GAVL_YUV_420_P:
3738           ret = tab->yuv_444_p_16_to_yuv_420_p;
3739           break;
3740         case GAVL_YUV_422_P:
3741           ret = tab->yuv_444_p_16_to_yuv_422_p;
3742           break;
3743         case GAVL_YUV_422_P_16:
3744           ret = tab->yuv_444_p_16_to_yuv_422_p_16;
3745           break;
3746         case GAVL_YUV_444_P:
3747           ret = tab->yuv_444_p_16_to_yuv_444_p;
3748           break;
3749         case GAVL_YUV_411_P:
3750           ret = tab->yuv_444_p_16_to_yuv_411_p;
3751           break;
3752         case GAVL_YUVJ_420_P:
3753           ret = tab->yuv_444_p_16_to_yuvj_420_p;
3754           break;
3755         case GAVL_YUVJ_422_P:
3756           ret = tab->yuv_444_p_16_to_yuvj_422_p;
3757           break;
3758         case GAVL_YUVJ_444_P:
3759           ret = tab->yuv_444_p_16_to_yuvj_444_p;
3760           break;
3761         /* Keep GCC happy */
3762         case GAVL_PIXELFORMAT_NONE:
3763         case GAVL_YUV_444_P_16:
3764           break;
3765         }
3766       break;
3767 
3768     case GAVL_YUVJ_420_P:
3769       switch(output_pixelformat)
3770         {
3771         case GAVL_GRAY_8:
3772           ret = tab->yj_8_to_gray_8;
3773           break;
3774         case GAVL_GRAY_16:
3775           ret = tab->yj_8_to_gray_16;
3776           break;
3777         case GAVL_GRAY_FLOAT:
3778           ret = tab->yj_8_to_gray_float;
3779           break;
3780         case GAVL_GRAYA_16:
3781           ret = tab->yj_8_to_graya_16;
3782           break;
3783         case GAVL_GRAYA_32:
3784           ret = tab->yj_8_to_graya_32;
3785           break;
3786         case GAVL_GRAYA_FLOAT:
3787           ret = tab->yj_8_to_graya_float;
3788           break;
3789         case GAVL_RGB_15:
3790           ret = tab->yuvj_420_p_to_rgb_15;
3791           break;
3792         case GAVL_BGR_15:
3793           ret = tab->yuvj_420_p_to_bgr_15;
3794           break;
3795         case GAVL_RGB_16:
3796           ret = tab->yuvj_420_p_to_rgb_16;
3797           break;
3798         case GAVL_BGR_16:
3799           ret = tab->yuvj_420_p_to_bgr_16;
3800           break;
3801         case GAVL_RGB_24:
3802           ret = tab->yuvj_420_p_to_rgb_24;
3803           break;
3804         case GAVL_BGR_24:
3805           ret = tab->yuvj_420_p_to_bgr_24;
3806           break;
3807         case GAVL_RGB_32:
3808           ret = tab->yuvj_420_p_to_rgb_32;
3809           break;
3810         case GAVL_BGR_32:
3811           ret = tab->yuvj_420_p_to_bgr_32;
3812           break;
3813         case GAVL_RGBA_32:
3814           ret = tab->yuvj_420_p_to_rgba_32;
3815           break;
3816         case GAVL_RGB_48:
3817           ret = tab->yuvj_420_p_to_rgb_48;
3818           break;
3819         case GAVL_RGBA_64:
3820           ret = tab->yuvj_420_p_to_rgba_64;
3821           break;
3822         case GAVL_RGB_FLOAT:
3823           ret = tab->yuvj_420_p_to_rgb_float;
3824           break;
3825         case GAVL_RGBA_FLOAT:
3826           ret = tab->yuvj_420_p_to_rgba_float;
3827           break;
3828 
3829         case GAVL_YUY2:
3830           ret = tab->yuvj_420_p_to_yuy2;
3831           break;
3832         case GAVL_UYVY:
3833           ret = tab->yuvj_420_p_to_uyvy;
3834           break;
3835         case GAVL_YUVA_32:
3836           ret = tab->yuvj_420_p_to_yuva_32;
3837           break;
3838         case GAVL_YUVA_64:
3839           ret = tab->yuvj_420_p_to_yuva_64;
3840           break;
3841         case GAVL_YUVA_FLOAT:
3842           ret = tab->yuvj_420_p_to_yuva_float;
3843           break;
3844         case GAVL_YUV_FLOAT:
3845           ret = tab->yuvj_420_p_to_yuv_float;
3846           break;
3847         case GAVL_YUV_422_P:
3848           ret = tab->yuvj_420_p_to_yuv_422_p;
3849           break;
3850         case GAVL_YUV_422_P_16:
3851           ret = tab->yuvj_420_p_to_yuv_422_p_16;
3852           break;
3853         case GAVL_YUV_444_P:
3854           ret = tab->yuvj_420_p_to_yuv_444_p;
3855           break;
3856         case GAVL_YUV_444_P_16:
3857           ret = tab->yuvj_420_p_to_yuv_444_p_16;
3858           break;
3859         case GAVL_YUV_420_P:
3860           ret = tab->yuvj_420_p_to_yuv_420_p;
3861           break;
3862         case GAVL_YUV_410_P:
3863           ret = tab->yuvj_420_p_to_yuv_410_p;
3864           break;
3865         case GAVL_YUVJ_422_P:
3866           ret = tab->yuv_420_p_to_yuv_422_p;
3867           break;
3868         case GAVL_YUV_411_P:
3869           ret = tab->yuv_420_p_to_yuv_411_p;
3870           break;
3871         case GAVL_YUVJ_444_P:
3872           ret = tab->yuv_420_p_to_yuv_444_p;
3873           break;
3874         /* Keep GCC happy */
3875         case GAVL_PIXELFORMAT_NONE:
3876         case GAVL_YUVJ_420_P:
3877           break;
3878         }
3879       break;
3880     case GAVL_YUVJ_422_P:
3881       switch(output_pixelformat)
3882         {
3883         case GAVL_GRAY_8:
3884           ret = tab->yj_8_to_gray_8;
3885           break;
3886         case GAVL_GRAY_16:
3887           ret = tab->yj_8_to_gray_16;
3888           break;
3889         case GAVL_GRAY_FLOAT:
3890           ret = tab->yj_8_to_gray_float;
3891           break;
3892         case GAVL_GRAYA_16:
3893           ret = tab->yj_8_to_graya_16;
3894           break;
3895         case GAVL_GRAYA_32:
3896           ret = tab->yj_8_to_graya_32;
3897           break;
3898         case GAVL_GRAYA_FLOAT:
3899           ret = tab->yj_8_to_graya_float;
3900           break;
3901         case GAVL_RGB_15:
3902           ret = tab->yuvj_422_p_to_rgb_15;
3903           break;
3904         case GAVL_BGR_15:
3905           ret = tab->yuvj_422_p_to_bgr_15;
3906           break;
3907         case GAVL_RGB_16:
3908           ret = tab->yuvj_422_p_to_rgb_16;
3909           break;
3910         case GAVL_BGR_16:
3911           ret = tab->yuvj_422_p_to_bgr_16;
3912           break;
3913         case GAVL_RGB_24:
3914           ret = tab->yuvj_422_p_to_rgb_24;
3915           break;
3916         case GAVL_BGR_24:
3917           ret = tab->yuvj_422_p_to_bgr_24;
3918           break;
3919         case GAVL_RGB_32:
3920           ret = tab->yuvj_422_p_to_rgb_32;
3921           break;
3922         case GAVL_BGR_32:
3923           ret = tab->yuvj_422_p_to_bgr_32;
3924           break;
3925         case GAVL_RGBA_32:
3926           ret = tab->yuvj_422_p_to_rgba_32;
3927           break;
3928         case GAVL_RGB_48:
3929           ret = tab->yuvj_422_p_to_rgb_48;
3930           break;
3931         case GAVL_RGBA_64:
3932           ret = tab->yuvj_422_p_to_rgba_64;
3933           break;
3934         case GAVL_RGB_FLOAT:
3935           ret = tab->yuvj_422_p_to_rgb_float;
3936           break;
3937         case GAVL_RGBA_FLOAT:
3938           ret = tab->yuvj_422_p_to_rgba_float;
3939           break;
3940         case GAVL_YUY2:
3941           ret = tab->yuvj_422_p_to_yuy2;
3942           break;
3943         case GAVL_UYVY:
3944           ret = tab->yuvj_422_p_to_uyvy;
3945           break;
3946         case GAVL_YUVA_32:
3947           ret = tab->yuvj_422_p_to_yuva_32;
3948           break;
3949         case GAVL_YUVA_64:
3950           ret = tab->yuvj_422_p_to_yuva_64;
3951           break;
3952         case GAVL_YUVA_FLOAT:
3953           ret = tab->yuvj_422_p_to_yuva_float;
3954           break;
3955         case GAVL_YUV_FLOAT:
3956           ret = tab->yuvj_422_p_to_yuv_float;
3957           break;
3958         case GAVL_YUV_420_P:
3959           ret = tab->yuvj_422_p_to_yuv_420_p;
3960           break;
3961         case GAVL_YUV_411_P:
3962           ret = tab->yuvj_422_p_to_yuv_411_p;
3963           break;
3964         case GAVL_YUV_410_P:
3965           ret = tab->yuvj_422_p_to_yuv_410_p;
3966           break;
3967         case GAVL_YUV_444_P:
3968           ret = tab->yuvj_422_p_to_yuv_444_p;
3969           break;
3970         case GAVL_YUV_444_P_16:
3971           ret = tab->yuvj_422_p_to_yuv_444_p_16;
3972           break;
3973         case GAVL_YUVJ_420_P:
3974           ret = tab->yuv_422_p_to_yuv_420_p;
3975           break;
3976         case GAVL_YUV_422_P:
3977           ret = tab->yuvj_422_p_to_yuv_422_p;
3978           break;
3979         case GAVL_YUV_422_P_16:
3980           ret = tab->yuvj_422_p_to_yuv_422_p_16;
3981           break;
3982         case GAVL_YUVJ_444_P:
3983           ret = tab->yuv_422_p_to_yuv_444_p;
3984           break;
3985         /* Keep GCC happy */
3986         case GAVL_PIXELFORMAT_NONE:
3987         case GAVL_YUVJ_422_P:
3988           break;
3989         }
3990       break;
3991     case GAVL_YUVJ_444_P:
3992       switch(output_pixelformat)
3993         {
3994         case GAVL_GRAY_8:
3995           ret = tab->yj_8_to_gray_8;
3996           break;
3997         case GAVL_GRAY_16:
3998           ret = tab->yj_8_to_gray_16;
3999           break;
4000         case GAVL_GRAY_FLOAT:
4001           ret = tab->yj_8_to_gray_float;
4002           break;
4003         case GAVL_GRAYA_16:
4004           ret = tab->yj_8_to_graya_16;
4005           break;
4006         case GAVL_GRAYA_32:
4007           ret = tab->yj_8_to_graya_32;
4008           break;
4009         case GAVL_GRAYA_FLOAT:
4010           ret = tab->yj_8_to_graya_float;
4011           break;
4012         case GAVL_RGB_15:
4013           ret = tab->yuvj_444_p_to_rgb_15;
4014           break;
4015         case GAVL_BGR_15:
4016           ret = tab->yuvj_444_p_to_bgr_15;
4017           break;
4018         case GAVL_RGB_16:
4019           ret = tab->yuvj_444_p_to_rgb_16;
4020           break;
4021         case GAVL_BGR_16:
4022           ret = tab->yuvj_444_p_to_bgr_16;
4023           break;
4024         case GAVL_RGB_24:
4025           ret = tab->yuvj_444_p_to_rgb_24;
4026           break;
4027         case GAVL_BGR_24:
4028           ret = tab->yuvj_444_p_to_bgr_24;
4029           break;
4030         case GAVL_RGB_32:
4031           ret = tab->yuvj_444_p_to_rgb_32;
4032           break;
4033         case GAVL_BGR_32:
4034           ret = tab->yuvj_444_p_to_bgr_32;
4035           break;
4036         case GAVL_RGBA_32:
4037           ret = tab->yuvj_444_p_to_rgba_32;
4038           break;
4039         case GAVL_RGB_48:
4040           ret = tab->yuvj_444_p_to_rgb_48;
4041           break;
4042         case GAVL_RGBA_64:
4043           ret = tab->yuvj_444_p_to_rgba_64;
4044           break;
4045         case GAVL_RGB_FLOAT:
4046           ret = tab->yuvj_444_p_to_rgb_float;
4047           break;
4048         case GAVL_RGBA_FLOAT:
4049           ret = tab->yuvj_444_p_to_rgba_float;
4050           break;
4051         case GAVL_YUY2:
4052           ret = tab->yuvj_444_p_to_yuy2;
4053           break;
4054         case GAVL_UYVY:
4055           ret = tab->yuvj_444_p_to_uyvy;
4056           break;
4057         case GAVL_YUVA_32:
4058           ret = tab->yuvj_444_p_to_yuva_32;
4059           break;
4060         case GAVL_YUVA_64:
4061           ret = tab->yuvj_444_p_to_yuva_64;
4062           break;
4063         case GAVL_YUVA_FLOAT:
4064           ret = tab->yuvj_444_p_to_yuva_float;
4065           break;
4066         case GAVL_YUV_FLOAT:
4067           ret = tab->yuvj_444_p_to_yuv_float;
4068           break;
4069         case GAVL_YUV_420_P:
4070           ret = tab->yuvj_444_p_to_yuv_420_p;
4071           break;
4072         case GAVL_YUV_410_P:
4073           ret = tab->yuvj_444_p_to_yuv_410_p;
4074           break;
4075         case GAVL_YUV_422_P:
4076           ret = tab->yuvj_444_p_to_yuv_422_p;
4077           break;
4078         case GAVL_YUV_422_P_16:
4079           ret = tab->yuvj_444_p_to_yuv_422_p_16;
4080           break;
4081         case GAVL_YUV_411_P:
4082           ret = tab->yuvj_444_p_to_yuv_411_p;
4083           break;
4084         case GAVL_YUVJ_420_P:
4085           ret = tab->yuv_444_p_to_yuv_420_p;
4086           break;
4087         case GAVL_YUVJ_422_P:
4088           ret = tab->yuv_444_p_to_yuv_422_p;
4089           break;
4090         case GAVL_YUV_444_P:
4091           ret = tab->yuvj_444_p_to_yuv_444_p;
4092           break;
4093         case GAVL_YUV_444_P_16:
4094           ret = tab->yuvj_444_p_to_yuv_444_p_16;
4095           break;
4096         /* Keep GCC happy */
4097         case GAVL_PIXELFORMAT_NONE:
4098         case GAVL_YUVJ_444_P:
4099           break;
4100         }
4101       break;
4102 
4103 
4104     case GAVL_PIXELFORMAT_NONE:
4105       break;
4106     }
4107   free(tab);
4108   return ret;
4109   }
4110 
4111 /* bytes_per_component is only valid for planar formats */
4112 
gavl_pixelformat_bytes_per_component(gavl_pixelformat_t csp)4113 int gavl_pixelformat_bytes_per_component(gavl_pixelformat_t csp)
4114   {
4115   switch(csp)
4116     {
4117     case GAVL_PIXELFORMAT_NONE:
4118     case GAVL_RGB_15:
4119     case GAVL_BGR_15:
4120     case GAVL_RGB_16:
4121     case GAVL_BGR_16:
4122     case GAVL_RGB_24:
4123     case GAVL_BGR_24:
4124     case GAVL_RGB_32:
4125     case GAVL_BGR_32:
4126     case GAVL_RGBA_32:
4127     case GAVL_RGB_48:
4128     case GAVL_RGBA_64:
4129     case GAVL_RGB_FLOAT:
4130     case GAVL_RGBA_FLOAT:
4131     case GAVL_YUY2:
4132     case GAVL_UYVY:
4133     case GAVL_YUVA_32:
4134     case GAVL_YUVA_64:
4135     case GAVL_YUVA_FLOAT:
4136     case GAVL_YUV_FLOAT:
4137     case GAVL_GRAY_8:
4138     case GAVL_GRAY_16:
4139     case GAVL_GRAY_FLOAT:
4140     case GAVL_GRAYA_16:
4141     case GAVL_GRAYA_32:
4142     case GAVL_GRAYA_FLOAT:
4143       return 0;
4144       break;
4145     case GAVL_YUV_420_P:
4146     case GAVL_YUV_422_P:
4147     case GAVL_YUV_444_P:
4148     case GAVL_YUV_411_P:
4149     case GAVL_YUV_410_P:
4150     case GAVL_YUVJ_420_P:
4151     case GAVL_YUVJ_422_P:
4152     case GAVL_YUVJ_444_P:
4153       return 1;
4154       break;
4155     case GAVL_YUV_444_P_16:
4156     case GAVL_YUV_422_P_16:
4157       return 2;
4158     }
4159   return 0;
4160   }
4161 
4162 /* bytes_per_pixel is only valid for packed formats */
4163 
gavl_pixelformat_bytes_per_pixel(gavl_pixelformat_t csp)4164 int gavl_pixelformat_bytes_per_pixel(gavl_pixelformat_t csp)
4165   {
4166   switch(csp)
4167     {
4168     case GAVL_PIXELFORMAT_NONE:
4169       return 0;
4170       break;
4171     case GAVL_GRAY_8:
4172       return 1;
4173     case GAVL_RGB_15:
4174     case GAVL_BGR_15:
4175     case GAVL_RGB_16:
4176     case GAVL_BGR_16:
4177     case GAVL_GRAY_16:
4178     case GAVL_GRAYA_16:
4179       return 2;
4180       break;
4181     case GAVL_RGB_24:
4182     case GAVL_BGR_24:
4183       return 3;
4184       break;
4185     case GAVL_RGB_32:
4186     case GAVL_BGR_32:
4187     case GAVL_RGBA_32:
4188     case GAVL_YUVA_32:
4189     case GAVL_GRAYA_32:
4190       return 4;
4191       break;
4192     case GAVL_GRAY_FLOAT:
4193       return sizeof(float);
4194       break;
4195     case GAVL_GRAYA_FLOAT:
4196       return 2*sizeof(float);
4197       break;
4198     case GAVL_RGB_48:
4199       return 6;
4200       break;
4201     case GAVL_RGBA_64:
4202     case GAVL_YUVA_64:
4203       return 8;
4204       break;
4205     case GAVL_RGB_FLOAT:
4206     case GAVL_YUV_FLOAT:
4207       return 3*sizeof(float);
4208       break;
4209     case GAVL_RGBA_FLOAT:
4210     case GAVL_YUVA_FLOAT:
4211       return 4*sizeof(float);
4212       break;
4213     case GAVL_YUY2:
4214     case GAVL_UYVY:
4215       return 2;
4216     case GAVL_YUV_420_P:
4217     case GAVL_YUV_422_P:
4218     case GAVL_YUV_422_P_16:
4219     case GAVL_YUV_444_P:
4220     case GAVL_YUV_444_P_16:
4221     case GAVL_YUV_411_P:
4222     case GAVL_YUV_410_P:
4223     case GAVL_YUVJ_420_P:
4224     case GAVL_YUVJ_422_P:
4225     case GAVL_YUVJ_444_P:
4226       return 0;
4227     }
4228   return 0;
4229   }
4230 
gavl_pixelformat_bits_per_pixel(gavl_pixelformat_t pixelformat)4231 int gavl_pixelformat_bits_per_pixel(gavl_pixelformat_t pixelformat)
4232   {
4233   switch(pixelformat)
4234     {
4235     case GAVL_PIXELFORMAT_NONE:
4236       return 0;
4237       break;
4238     case GAVL_GRAY_8:
4239       return 8;
4240       break;
4241     case GAVL_RGB_15:
4242     case GAVL_BGR_15:
4243       return 15;
4244     case GAVL_RGB_16:
4245     case GAVL_BGR_16:
4246     case GAVL_GRAY_16:
4247     case GAVL_GRAYA_16:
4248       return 16;
4249       break;
4250     case GAVL_RGB_24:
4251     case GAVL_BGR_24:
4252     case GAVL_RGB_32:
4253     case GAVL_BGR_32:
4254       return 24;
4255       break;
4256     case GAVL_RGBA_32:
4257     case GAVL_YUVA_32:
4258     case GAVL_GRAYA_32:
4259       return 32;
4260       break;
4261     case GAVL_RGB_48:
4262       return 48;
4263       break;
4264     case GAVL_RGBA_64:
4265     case GAVL_YUVA_64:
4266       return 64;
4267       break;
4268     case GAVL_GRAY_FLOAT:
4269       return 8*sizeof(float);
4270       break;
4271     case GAVL_GRAYA_FLOAT:
4272       return 8*2*sizeof(float);
4273       break;
4274     case GAVL_RGB_FLOAT:
4275     case GAVL_YUV_FLOAT:
4276       return 8*3*sizeof(float);
4277       break;
4278     case GAVL_RGBA_FLOAT:
4279     case GAVL_YUVA_FLOAT:
4280       return 8*4*sizeof(float);
4281       break;
4282     case GAVL_YUY2:
4283     case GAVL_UYVY:
4284     case GAVL_YUV_422_P:
4285     case GAVL_YUVJ_422_P:
4286       return 16;
4287       break;
4288     case GAVL_YUV_420_P:
4289     case GAVL_YUVJ_420_P:
4290     case GAVL_YUV_411_P:
4291       return 12;
4292       break;
4293     case GAVL_YUV_444_P:
4294     case GAVL_YUVJ_444_P:
4295       return 24;
4296       break;
4297     case GAVL_YUV_422_P_16:
4298       return 32;
4299       break;
4300     case GAVL_YUV_444_P_16:
4301       return 48;
4302       break;
4303     case GAVL_YUV_410_P:
4304       return 9;
4305       break;
4306     }
4307   return 0;
4308 
4309   }
4310 
gavl_pixelformat_conversion_penalty(gavl_pixelformat_t src,gavl_pixelformat_t dst)4311 int gavl_pixelformat_conversion_penalty(gavl_pixelformat_t src,
4312                                         gavl_pixelformat_t dst)
4313   {
4314   int ret;
4315   int sub_h_src, sub_h_dst;
4316   int sub_v_src, sub_v_dst;
4317   int src_bits, dst_bits;
4318 
4319   if(src == dst)
4320     return 0;
4321 
4322   gavl_pixelformat_chroma_sub(src, &sub_h_src, &sub_v_src);
4323   gavl_pixelformat_chroma_sub(dst, &sub_h_dst, &sub_v_dst);
4324 
4325   ret = 0;
4326 
4327   /* Loosing the color is the worst */
4328   if(!gavl_pixelformat_is_gray(src) &&
4329      gavl_pixelformat_is_gray(dst))
4330     ret += 1;
4331 
4332   /* Loosing the alpha channel is second worst */
4333   ret <<= 1;
4334   if(gavl_pixelformat_has_alpha(src) &&
4335      !gavl_pixelformat_has_alpha(dst))
4336     ret += 1;
4337 
4338   /* Converting gray to colored format is bloat */
4339   ret <<= 1;
4340   if(gavl_pixelformat_is_gray(src) &&
4341      !gavl_pixelformat_is_gray(dst))
4342     ret += 1;
4343 
4344   /* Colorspace conversions aren't good either */
4345 
4346   ret <<= 1;
4347   if(gavl_pixelformat_is_rgb(src) !=
4348      gavl_pixelformat_is_rgb(dst))
4349     ret += 1;
4350 
4351 
4352   /* Chroma subsampling is next */
4353   ret <<= 1;
4354   if((sub_h_src != sub_h_dst) || (sub_v_src != sub_v_dst))
4355     ret += 1;
4356 
4357   /* Bits per pixel difference is maximum 256
4358      (one extra bit for src_bits > dst_bits) */
4359   ret <<= 9;
4360 
4361   src_bits = gavl_pixelformat_bits_per_pixel(src);
4362   dst_bits = gavl_pixelformat_bits_per_pixel(dst);
4363 
4364   /* Increasing precision is bad... */
4365   if(src_bits < dst_bits)
4366     {
4367     /*
4368      *  Special case: Conversions from e.g. RGB_24 to
4369      *  RGBA_32 don't really mean changed precision.
4370      *  They are, in fact, almost as cheap as RGB_24 -> RGB_32.
4371      *  Thus, they get one penalty credit (for setting the
4372      *  alpha value in the destination frame)
4373      */
4374     if(!gavl_pixelformat_has_alpha(src) &&
4375        gavl_pixelformat_has_alpha(dst) &&
4376        (4 * src_bits == 3 * dst_bits))
4377       ret++;
4378     else
4379       ret += (dst_bits - src_bits);
4380     }
4381   /* ... but descreasing precision is worse */
4382   else if(src_bits > dst_bits)
4383     ret += (src_bits - dst_bits) * 2;
4384 
4385   /*
4386    *   Converting between YUV and YUVJ is done via lookup tables,
4387    *   (efficient but lossy)
4388    */
4389 
4390   ret <<= 1;
4391   if(gavl_pixelformat_is_yuv(src) &&
4392      gavl_pixelformat_is_yuv(dst) &&
4393      (gavl_pixelformat_is_jpeg_scaled(src) !=
4394       gavl_pixelformat_is_jpeg_scaled(dst)))
4395     ret += 1;
4396 
4397   /* Remaining differences should be packing format.
4398      Conversions here are lossless and efficient */
4399   ret <<= 1;
4400   ret += 1;
4401   return ret;
4402   }
4403 
4404 gavl_pixelformat_t
gavl_pixelformat_get_best(gavl_pixelformat_t src,const gavl_pixelformat_t * dst_supported,int * penalty)4405 gavl_pixelformat_get_best(gavl_pixelformat_t src,
4406                           const gavl_pixelformat_t * dst_supported,
4407                           int *penalty)
4408   {
4409   int min_penalty;
4410   int min_index;
4411   int i, test;
4412 
4413   if(!dst_supported || (dst_supported[0] == GAVL_PIXELFORMAT_NONE))
4414     return GAVL_PIXELFORMAT_NONE;
4415 
4416   min_penalty =
4417     gavl_pixelformat_conversion_penalty(src,
4418                                         dst_supported[0]);
4419   min_index = 0;
4420 
4421   i = 1;
4422   while(dst_supported[i] != GAVL_PIXELFORMAT_NONE)
4423     {
4424     test = gavl_pixelformat_conversion_penalty(src,
4425                                                dst_supported[i]);
4426     if(test < min_penalty)
4427       {
4428       min_penalty = test;
4429       min_index = i;
4430       }
4431     i++;
4432     }
4433   if(penalty)
4434     *penalty = min_penalty;
4435   return dst_supported[min_index];
4436   }
4437 
4438 
4439 
4440 /* Check if a pixelformat can be converted by simple scaling */
4441 
gavl_pixelformat_can_scale(gavl_pixelformat_t in_csp,gavl_pixelformat_t out_csp)4442 int gavl_pixelformat_can_scale(gavl_pixelformat_t in_csp, gavl_pixelformat_t out_csp)
4443   {
4444     int sub_v_in,  sub_h_in;
4445   int sub_v_out, sub_h_out;
4446   if(gavl_pixelformat_is_rgb(in_csp) ||
4447      gavl_pixelformat_is_rgb(out_csp))
4448     {
4449     return 0;
4450     }
4451 
4452   if(gavl_pixelformat_is_jpeg_scaled(in_csp) !=
4453      gavl_pixelformat_is_jpeg_scaled(out_csp))
4454     {
4455     return 0;
4456     }
4457   if(gavl_pixelformat_has_alpha(in_csp) !=
4458      gavl_pixelformat_has_alpha(out_csp))
4459     {
4460     return 0;
4461     }
4462 
4463 
4464 
4465   gavl_pixelformat_chroma_sub(in_csp, &sub_h_in, &sub_v_in);
4466   gavl_pixelformat_chroma_sub(out_csp, &sub_h_out, &sub_v_out);
4467 
4468   if((sub_h_in == sub_h_out) && (sub_v_in == sub_v_out))
4469     {
4470     return 0;
4471     }
4472 
4473   if(!gavl_pixelformat_is_planar(in_csp))
4474     {
4475     // fprintf(stderr, "BLUPPPP: %d %d\n", gavl_pixelformat_is_planar(out_csp),
4476     //         gavl_pixelformat_bytes_per_component(out_csp));
4477 
4478     if(gavl_pixelformat_is_planar(out_csp) &&
4479        (gavl_pixelformat_bytes_per_component(out_csp) == 1))
4480       return 1;
4481     else
4482       return 0;
4483     }
4484   else
4485     {
4486     if(!gavl_pixelformat_is_planar(out_csp) &&
4487        (gavl_pixelformat_bytes_per_component(in_csp) == 1))
4488       return 1;
4489     else if(gavl_pixelformat_bytes_per_component(in_csp) ==
4490             gavl_pixelformat_bytes_per_component(out_csp))
4491       return 1;
4492     else
4493       return 0;
4494     }
4495   return 0;
4496   }
4497 
4498 /*
4499  *  Return a pixelformat (or GAVL_PIXELFORMAT_NONE) as an intermediate pixelformat
4500  *  for which the conversion quality can be improved. E.g. instead of
4501  *  RGB -> YUV420P, we can do RGB -> YUV444P -> YUV420P with proper chroma scaling
4502  */
4503 
gavl_pixelformat_get_intermediate(gavl_pixelformat_t in_csp,gavl_pixelformat_t out_csp)4504 gavl_pixelformat_t gavl_pixelformat_get_intermediate(gavl_pixelformat_t in_csp,
4505                                                    gavl_pixelformat_t out_csp)
4506   {
4507   switch(in_csp)
4508     {
4509     case GAVL_PIXELFORMAT_NONE: return GAVL_PIXELFORMAT_NONE; break;
4510     case GAVL_GRAY_8:
4511     case GAVL_GRAY_16:
4512     case GAVL_GRAY_FLOAT:
4513     case GAVL_GRAYA_16:
4514     case GAVL_GRAYA_32:
4515     case GAVL_GRAYA_FLOAT:
4516     case GAVL_RGB_15:
4517     case GAVL_BGR_15:
4518     case GAVL_RGB_16:
4519     case GAVL_BGR_16:
4520     case GAVL_RGB_24:
4521     case GAVL_BGR_24:
4522     case GAVL_RGB_32:
4523     case GAVL_BGR_32:
4524     case GAVL_RGBA_32:
4525     case GAVL_RGB_48:
4526     case GAVL_RGBA_64:
4527     case GAVL_RGB_FLOAT:
4528     case GAVL_RGBA_FLOAT:
4529     case GAVL_YUVA_32:
4530     case GAVL_YUVA_64:
4531     case GAVL_YUVA_FLOAT:
4532     case GAVL_YUV_FLOAT:
4533       /*4:4:4 -> */
4534       switch(out_csp)
4535         {
4536         case GAVL_PIXELFORMAT_NONE:
4537         case GAVL_RGB_15:
4538         case GAVL_BGR_15:
4539         case GAVL_RGB_16:
4540         case GAVL_BGR_16:
4541         case GAVL_RGB_24:
4542         case GAVL_BGR_24:
4543         case GAVL_RGB_32:
4544         case GAVL_BGR_32:
4545         case GAVL_RGB_48:
4546         case GAVL_RGBA_64:
4547         case GAVL_RGB_FLOAT:
4548         case GAVL_RGBA_FLOAT:
4549         case GAVL_RGBA_32:
4550         case GAVL_YUVA_32:
4551         case GAVL_YUVA_64:
4552         case GAVL_YUVA_FLOAT:
4553         case GAVL_YUV_FLOAT:
4554         case GAVL_YUV_444_P:
4555         case GAVL_YUVJ_444_P:
4556         case GAVL_YUV_444_P_16:
4557         case GAVL_GRAY_8:
4558         case GAVL_GRAY_16:
4559         case GAVL_GRAY_FLOAT:
4560         case GAVL_GRAYA_16:
4561         case GAVL_GRAYA_32:
4562         case GAVL_GRAYA_FLOAT:
4563           return GAVL_PIXELFORMAT_NONE; break;
4564         case GAVL_YUY2:
4565         case GAVL_UYVY:
4566         case GAVL_YUV_420_P:
4567         case GAVL_YUV_422_P:
4568         case GAVL_YUV_411_P:
4569         case GAVL_YUV_410_P:
4570           return GAVL_YUV_444_P; break;
4571         case GAVL_YUVJ_420_P:
4572         case GAVL_YUVJ_422_P:
4573           return GAVL_YUVJ_444_P; break;
4574         case GAVL_YUV_422_P_16:
4575           return GAVL_YUV_444_P_16; break;
4576         }
4577       break;
4578     case GAVL_YUY2:
4579     case GAVL_UYVY:
4580     case GAVL_YUV_422_P:
4581       switch(out_csp)
4582         {
4583         case GAVL_PIXELFORMAT_NONE:
4584           return GAVL_PIXELFORMAT_NONE; break;
4585           /* YUV422 -> RGB */
4586         case GAVL_RGB_15:
4587         case GAVL_BGR_15:
4588         case GAVL_RGB_16:
4589         case GAVL_BGR_16:
4590         case GAVL_RGB_24:
4591         case GAVL_BGR_24:
4592         case GAVL_RGB_32:
4593         case GAVL_BGR_32:
4594         case GAVL_RGB_48:
4595         case GAVL_RGBA_64:
4596         case GAVL_RGB_FLOAT:
4597         case GAVL_RGBA_FLOAT:
4598         case GAVL_RGBA_32:
4599         case GAVL_YUVA_32:
4600           return GAVL_YUV_444_P; break;
4601         case GAVL_YUV_422_P:
4602         case GAVL_YUV_422_P_16:
4603         case GAVL_YUVJ_422_P:
4604         case GAVL_YUY2:
4605         case GAVL_UYVY:
4606         case GAVL_YUV_420_P:
4607         case GAVL_YUV_411_P:
4608         case GAVL_YUV_410_P:
4609         case GAVL_GRAY_8:
4610         case GAVL_GRAY_16:
4611         case GAVL_GRAY_FLOAT:
4612         case GAVL_GRAYA_16:
4613         case GAVL_GRAYA_32:
4614         case GAVL_GRAYA_FLOAT:
4615           return GAVL_PIXELFORMAT_NONE; break;
4616         case GAVL_YUV_444_P_16:
4617         case GAVL_YUVA_64:
4618         case GAVL_YUVA_FLOAT:
4619         case GAVL_YUV_FLOAT:
4620           return GAVL_YUV_422_P_16; break;
4621         case GAVL_YUV_444_P:
4622           return GAVL_YUV_422_P; break;
4623         case GAVL_YUVJ_444_P:
4624           return GAVL_YUVJ_422_P; break;
4625         case GAVL_YUVJ_420_P:
4626           return GAVL_YUVJ_422_P; break;
4627         }
4628       break;
4629     case GAVL_YUV_420_P:
4630       switch(out_csp)
4631         {
4632         case GAVL_PIXELFORMAT_NONE:
4633           return GAVL_PIXELFORMAT_NONE; break;
4634           /* YUV420 -> RGB */
4635         case GAVL_RGB_15:
4636         case GAVL_BGR_15:
4637         case GAVL_RGB_16:
4638         case GAVL_BGR_16:
4639         case GAVL_RGB_24:
4640         case GAVL_BGR_24:
4641         case GAVL_RGB_32:
4642         case GAVL_BGR_32:
4643         case GAVL_RGB_48:
4644         case GAVL_RGBA_64:
4645         case GAVL_RGB_FLOAT:
4646         case GAVL_RGBA_FLOAT:
4647         case GAVL_RGBA_32:
4648         case GAVL_YUVA_32:
4649           return GAVL_YUV_444_P; break;
4650         case GAVL_YUV_422_P:
4651         case GAVL_YUY2:
4652         case GAVL_UYVY:
4653         case GAVL_YUV_420_P:
4654         case GAVL_YUV_411_P:
4655         case GAVL_YUV_410_P:
4656         case GAVL_YUV_444_P:
4657         case GAVL_YUVJ_420_P:
4658         case GAVL_GRAY_8:
4659         case GAVL_GRAY_16:
4660         case GAVL_GRAY_FLOAT:
4661         case GAVL_GRAYA_16:
4662         case GAVL_GRAYA_32:
4663         case GAVL_GRAYA_FLOAT:
4664           return GAVL_PIXELFORMAT_NONE; break;
4665         case GAVL_YUV_422_P_16:
4666           return GAVL_YUV_422_P; break;
4667         case GAVL_YUVJ_422_P:
4668           return GAVL_YUVJ_420_P; break;
4669         case GAVL_YUV_444_P_16:
4670         case GAVL_YUVA_64:
4671         case GAVL_YUVA_FLOAT:
4672         case GAVL_YUV_FLOAT:
4673           return GAVL_YUV_444_P; break;
4674         case GAVL_YUVJ_444_P:
4675           return GAVL_YUVJ_420_P; break;
4676         }
4677       break;
4678     case GAVL_YUV_444_P:
4679       switch(out_csp)
4680         {
4681         case GAVL_PIXELFORMAT_NONE:
4682         case GAVL_RGB_15:
4683         case GAVL_BGR_15:
4684         case GAVL_RGB_16:
4685         case GAVL_BGR_16:
4686         case GAVL_RGB_24:
4687         case GAVL_BGR_24:
4688         case GAVL_RGB_32:
4689         case GAVL_BGR_32:
4690         case GAVL_RGB_48:
4691         case GAVL_RGBA_64:
4692         case GAVL_RGB_FLOAT:
4693         case GAVL_RGBA_FLOAT:
4694         case GAVL_RGBA_32:
4695         case GAVL_YUVA_32:
4696         case GAVL_GRAY_8:
4697         case GAVL_GRAY_16:
4698         case GAVL_GRAY_FLOAT:
4699         case GAVL_GRAYA_16:
4700         case GAVL_GRAYA_32:
4701         case GAVL_GRAYA_FLOAT:
4702           return GAVL_PIXELFORMAT_NONE; break;
4703         case GAVL_YUV_422_P:
4704         case GAVL_YUY2:
4705         case GAVL_UYVY:
4706         case GAVL_YUV_420_P:
4707         case GAVL_YUV_411_P:
4708         case GAVL_YUV_410_P:
4709         case GAVL_YUV_444_P:
4710         case GAVL_YUVJ_444_P:
4711         case GAVL_YUV_444_P_16:
4712           return GAVL_PIXELFORMAT_NONE; break;
4713         case GAVL_YUV_422_P_16:
4714         case GAVL_YUVA_64:
4715         case GAVL_YUVA_FLOAT:
4716         case GAVL_YUV_FLOAT:
4717           return GAVL_YUV_422_P; break;
4718         case GAVL_YUVJ_422_P:
4719           return GAVL_YUVJ_420_P; break;
4720         case GAVL_YUVJ_420_P:
4721           return GAVL_YUVJ_444_P; break;
4722         }
4723       break;
4724 
4725     case GAVL_YUV_411_P:
4726     case GAVL_YUV_410_P:
4727       switch(out_csp)
4728         {
4729         case GAVL_PIXELFORMAT_NONE:
4730         case GAVL_GRAY_8:
4731         case GAVL_GRAY_16:
4732         case GAVL_GRAY_FLOAT:
4733         case GAVL_GRAYA_16:
4734         case GAVL_GRAYA_32:
4735         case GAVL_GRAYA_FLOAT:
4736           return GAVL_PIXELFORMAT_NONE; break;
4737         case GAVL_RGB_15:
4738         case GAVL_BGR_15:
4739         case GAVL_RGB_16:
4740         case GAVL_BGR_16:
4741         case GAVL_RGB_24:
4742         case GAVL_BGR_24:
4743         case GAVL_RGB_32:
4744         case GAVL_BGR_32:
4745         case GAVL_RGB_48:
4746         case GAVL_RGBA_64:
4747         case GAVL_RGB_FLOAT:
4748         case GAVL_RGBA_FLOAT:
4749         case GAVL_RGBA_32:
4750         case GAVL_YUVA_32:
4751           return GAVL_YUV_444_P; break;
4752         case GAVL_YUV_422_P:
4753         case GAVL_YUY2:
4754         case GAVL_UYVY:
4755         case GAVL_YUV_420_P:
4756         case GAVL_YUV_411_P:
4757         case GAVL_YUV_410_P:
4758         case GAVL_YUV_444_P:
4759           return GAVL_PIXELFORMAT_NONE; break;
4760 
4761         case GAVL_YUVJ_444_P:
4762           return GAVL_YUV_444_P; break;
4763         case GAVL_YUV_422_P_16:
4764           return GAVL_YUV_422_P; break;
4765         case GAVL_YUVJ_422_P:
4766           return GAVL_YUV_422_P; break;
4767         case GAVL_YUV_444_P_16:
4768         case GAVL_YUVA_64:
4769         case GAVL_YUVA_FLOAT:
4770         case GAVL_YUV_FLOAT:
4771           return GAVL_YUV_444_P; break;
4772         case GAVL_YUVJ_420_P:
4773           return GAVL_YUV_420_P; break;
4774         }
4775       break;
4776     case GAVL_YUVJ_420_P:
4777       switch(out_csp)
4778         {
4779         case GAVL_PIXELFORMAT_NONE:
4780         case GAVL_GRAY_8:
4781         case GAVL_GRAY_16:
4782         case GAVL_GRAY_FLOAT:
4783         case GAVL_GRAYA_16:
4784         case GAVL_GRAYA_32:
4785         case GAVL_GRAYA_FLOAT:
4786           return GAVL_PIXELFORMAT_NONE; break;
4787         case GAVL_RGB_15:
4788         case GAVL_BGR_15:
4789         case GAVL_RGB_16:
4790         case GAVL_BGR_16:
4791         case GAVL_RGB_24:
4792         case GAVL_BGR_24:
4793         case GAVL_RGB_32:
4794         case GAVL_BGR_32:
4795         case GAVL_RGB_48:
4796         case GAVL_RGBA_64:
4797         case GAVL_RGB_FLOAT:
4798         case GAVL_RGBA_FLOAT:
4799         case GAVL_RGBA_32:
4800         case GAVL_YUVA_32:
4801           return GAVL_YUVJ_444_P; break;
4802         case GAVL_YUV_422_P:
4803         case GAVL_YUY2:
4804         case GAVL_UYVY:
4805         case GAVL_YUV_411_P:
4806         case GAVL_YUV_410_P:
4807         case GAVL_YUV_444_P:
4808           return GAVL_YUV_420_P; break;
4809         case GAVL_YUV_420_P:
4810         case GAVL_YUVJ_444_P:
4811         case GAVL_YUVJ_422_P:
4812         case GAVL_YUVJ_420_P:
4813           return GAVL_PIXELFORMAT_NONE; break;
4814 
4815         case GAVL_YUV_422_P_16:
4816           return GAVL_YUVJ_422_P; break;
4817         case GAVL_YUV_444_P_16:
4818         case GAVL_YUVA_64:
4819         case GAVL_YUVA_FLOAT:
4820         case GAVL_YUV_FLOAT:
4821           return GAVL_YUVJ_444_P; break;
4822         }
4823       break;
4824 
4825     case GAVL_YUVJ_422_P:
4826       switch(out_csp)
4827         {
4828         case GAVL_PIXELFORMAT_NONE:
4829         case GAVL_GRAY_8:
4830         case GAVL_GRAY_16:
4831         case GAVL_GRAY_FLOAT:
4832         case GAVL_GRAYA_16:
4833         case GAVL_GRAYA_32:
4834         case GAVL_GRAYA_FLOAT:
4835           return GAVL_PIXELFORMAT_NONE; break;
4836         case GAVL_RGB_15:
4837         case GAVL_BGR_15:
4838         case GAVL_RGB_16:
4839         case GAVL_BGR_16:
4840         case GAVL_RGB_24:
4841         case GAVL_BGR_24:
4842         case GAVL_RGB_32:
4843         case GAVL_BGR_32:
4844         case GAVL_RGB_48:
4845         case GAVL_RGBA_64:
4846         case GAVL_RGB_FLOAT:
4847         case GAVL_RGBA_FLOAT:
4848         case GAVL_RGBA_32:
4849         case GAVL_YUVA_32:
4850           return GAVL_YUVJ_444_P; break;
4851         case GAVL_YUV_411_P:
4852         case GAVL_YUV_410_P:
4853         case GAVL_YUV_444_P:
4854         case GAVL_YUV_420_P:
4855           return GAVL_YUV_422_P; break;
4856         case GAVL_YUV_422_P:
4857         case GAVL_YUY2:
4858         case GAVL_UYVY:
4859         case GAVL_YUVJ_444_P:
4860         case GAVL_YUVJ_422_P:
4861         case GAVL_YUVJ_420_P:
4862         case GAVL_YUV_422_P_16:
4863           return GAVL_PIXELFORMAT_NONE; break;
4864         case GAVL_YUV_444_P_16:
4865         case GAVL_YUVA_64:
4866         case GAVL_YUVA_FLOAT:
4867         case GAVL_YUV_FLOAT:
4868           return GAVL_YUV_422_P_16; break;
4869         }
4870       break;
4871     case GAVL_YUVJ_444_P:
4872       switch(out_csp)
4873         {
4874         case GAVL_PIXELFORMAT_NONE:
4875         case GAVL_GRAY_8:
4876         case GAVL_GRAY_16:
4877         case GAVL_GRAY_FLOAT:
4878         case GAVL_GRAYA_16:
4879         case GAVL_GRAYA_32:
4880         case GAVL_GRAYA_FLOAT:
4881         case GAVL_RGB_15:
4882         case GAVL_BGR_15:
4883         case GAVL_RGB_16:
4884         case GAVL_BGR_16:
4885         case GAVL_RGB_24:
4886         case GAVL_BGR_24:
4887         case GAVL_RGB_32:
4888         case GAVL_BGR_32:
4889         case GAVL_RGB_48:
4890         case GAVL_RGBA_64:
4891         case GAVL_RGB_FLOAT:
4892         case GAVL_RGBA_FLOAT:
4893         case GAVL_RGBA_32:
4894         case GAVL_YUVA_32:
4895         case GAVL_YUV_444_P:
4896         case GAVL_YUV_444_P_16:
4897         case GAVL_YUVA_64:
4898         case GAVL_YUVA_FLOAT:
4899         case GAVL_YUV_FLOAT:
4900           return GAVL_PIXELFORMAT_NONE; break;
4901         case GAVL_YUV_411_P:
4902         case GAVL_YUV_410_P:
4903         case GAVL_YUV_420_P:
4904           return GAVL_YUV_444_P; break;
4905         case GAVL_YUV_422_P:
4906         case GAVL_YUY2:
4907         case GAVL_UYVY:
4908         case GAVL_YUVJ_444_P:
4909         case GAVL_YUVJ_422_P:
4910         case GAVL_YUVJ_420_P:
4911           return GAVL_PIXELFORMAT_NONE; break;
4912 
4913         case GAVL_YUV_422_P_16:
4914           return GAVL_YUVJ_422_P; break;
4915           return GAVL_YUV_422_P_16; break;
4916         }
4917       break;
4918     case GAVL_YUV_444_P_16:
4919       switch(out_csp)
4920         {
4921         case GAVL_PIXELFORMAT_NONE:
4922         case GAVL_GRAY_8:
4923         case GAVL_GRAY_16:
4924         case GAVL_GRAY_FLOAT:
4925         case GAVL_GRAYA_16:
4926         case GAVL_GRAYA_32:
4927         case GAVL_GRAYA_FLOAT:
4928         case GAVL_RGB_15:
4929         case GAVL_BGR_15:
4930         case GAVL_RGB_16:
4931         case GAVL_BGR_16:
4932         case GAVL_RGB_24:
4933         case GAVL_BGR_24:
4934         case GAVL_RGB_32:
4935         case GAVL_BGR_32:
4936         case GAVL_RGB_48:
4937         case GAVL_RGBA_64:
4938         case GAVL_RGB_FLOAT:
4939         case GAVL_RGBA_FLOAT:
4940         case GAVL_RGBA_32:
4941         case GAVL_YUVA_32:
4942         case GAVL_YUV_444_P:
4943         case GAVL_YUV_444_P_16:
4944         case GAVL_YUVJ_444_P:
4945         case GAVL_YUV_422_P_16:
4946         case GAVL_YUVA_64:
4947         case GAVL_YUVA_FLOAT:
4948         case GAVL_YUV_FLOAT:
4949           return GAVL_PIXELFORMAT_NONE; break;
4950         case GAVL_YUV_422_P:
4951         case GAVL_YUY2:
4952         case GAVL_UYVY:
4953         case GAVL_YUV_411_P:
4954         case GAVL_YUV_410_P:
4955         case GAVL_YUV_420_P:
4956           return GAVL_YUV_444_P; break;
4957         case GAVL_YUVJ_422_P:
4958         case GAVL_YUVJ_420_P:
4959           return GAVL_YUVJ_444_P; break;
4960         }
4961       break;
4962     case GAVL_YUV_422_P_16:
4963       switch(out_csp)
4964         {
4965         case GAVL_PIXELFORMAT_NONE:
4966         case GAVL_RGB_15:
4967         case GAVL_BGR_15:
4968         case GAVL_RGB_16:
4969         case GAVL_BGR_16:
4970         case GAVL_RGB_24:
4971         case GAVL_BGR_24:
4972         case GAVL_RGB_32:
4973         case GAVL_BGR_32:
4974         case GAVL_RGB_48:
4975         case GAVL_RGBA_64:
4976         case GAVL_RGB_FLOAT:
4977         case GAVL_RGBA_FLOAT:
4978         case GAVL_RGBA_32:
4979         case GAVL_YUVA_32:
4980         case GAVL_YUV_444_P:
4981         case GAVL_YUVJ_444_P:
4982         case GAVL_YUVA_64:
4983         case GAVL_YUVA_FLOAT:
4984         case GAVL_YUV_FLOAT:
4985           return GAVL_YUV_444_P_16; break;
4986         case GAVL_YUV_444_P_16:
4987         case GAVL_YUV_422_P_16:
4988         case GAVL_YUV_422_P:
4989         case GAVL_YUY2:
4990         case GAVL_UYVY:
4991         case GAVL_YUVJ_422_P:
4992         case GAVL_GRAY_8:
4993         case GAVL_GRAY_16:
4994         case GAVL_GRAY_FLOAT:
4995         case GAVL_GRAYA_16:
4996         case GAVL_GRAYA_32:
4997         case GAVL_GRAYA_FLOAT:
4998           return GAVL_PIXELFORMAT_NONE; break;
4999         case GAVL_YUV_411_P:
5000         case GAVL_YUV_410_P:
5001         case GAVL_YUV_420_P:
5002           return GAVL_YUV_422_P; break;
5003         case GAVL_YUVJ_420_P:
5004           return GAVL_YUVJ_422_P; break;
5005         }
5006 
5007       break;
5008     }
5009   return GAVL_PIXELFORMAT_NONE;
5010   }
5011 
gavl_pixelformat_get_offset(gavl_pixelformat_t pixelformat,int plane,int * advance,int * offset)5012 void gavl_pixelformat_get_offset(gavl_pixelformat_t pixelformat,
5013                                  int plane,
5014                                  int * advance, int * offset)
5015   {
5016   switch(pixelformat)
5017     {
5018     case GAVL_PIXELFORMAT_NONE:
5019       break;
5020     case GAVL_RGB_15:
5021     case GAVL_BGR_15:
5022       *advance = 2;
5023       *offset = 0;
5024       break;
5025     case GAVL_GRAY_8:
5026       *advance = 1;
5027       *offset = 0;
5028       break;
5029     case GAVL_RGB_16:
5030     case GAVL_BGR_16:
5031     case GAVL_GRAY_16:
5032     case GAVL_GRAYA_16:
5033       *advance = 2;
5034       *offset = 0;
5035       break;
5036     case GAVL_RGB_24:
5037     case GAVL_BGR_24:
5038       *advance = 3;
5039       *offset = 0;
5040       break;
5041     case GAVL_RGB_32:
5042     case GAVL_BGR_32:
5043     case GAVL_YUVA_32:
5044     case GAVL_RGBA_32:
5045     case GAVL_GRAYA_32:
5046       *advance = 4;
5047       *offset = 0;
5048       break;
5049     case GAVL_YUY2:
5050       switch(plane)
5051         {
5052         /* YUYV */
5053         case 0:
5054           *advance = 2;
5055           *offset = 0;
5056           break;
5057         case 1:
5058           *advance = 4;
5059           *offset = 1;
5060           break;
5061         case 2:
5062           *advance = 4;
5063           *offset = 3;
5064           break;
5065         }
5066       break;
5067     case GAVL_UYVY:
5068       switch(plane)
5069         {
5070         /* UYVY */
5071         case 0:
5072           *advance = 2;
5073           *offset = 1;
5074           break;
5075         case 1:
5076           *advance = 4;
5077           *offset = 0;
5078           break;
5079         case 2:
5080           *advance = 4;
5081           *offset = 2;
5082           break;
5083         }
5084       break;
5085     case GAVL_YUV_420_P:
5086     case GAVL_YUV_422_P:
5087     case GAVL_YUV_444_P:
5088     case GAVL_YUV_411_P:
5089     case GAVL_YUV_410_P:
5090       *advance = 1;
5091       *offset = 0;
5092       break;
5093     case GAVL_YUVJ_420_P:
5094     case GAVL_YUVJ_422_P:
5095     case GAVL_YUVJ_444_P:
5096       *advance = 1;
5097       *offset = 0;
5098       break;
5099     case GAVL_YUV_444_P_16:
5100     case GAVL_YUV_422_P_16:
5101       *advance = 2;
5102       *offset = 0;
5103       break;
5104     case GAVL_RGB_48:
5105       *advance = 6;
5106       *offset = 0;
5107       break;
5108     case GAVL_RGBA_64:
5109     case GAVL_YUVA_64:
5110       *advance = 8;
5111       *offset = 0;
5112       break;
5113     case GAVL_GRAY_FLOAT:
5114       *advance = sizeof(float);
5115       *offset = 0;
5116       break;
5117     case GAVL_GRAYA_FLOAT:
5118       *advance = 2 * sizeof(float);
5119       *offset = 0;
5120       break;
5121     case GAVL_RGB_FLOAT:
5122     case GAVL_YUV_FLOAT:
5123       *advance = 3 * sizeof(float);
5124       *offset = 0;
5125       break;
5126     case GAVL_RGBA_FLOAT:
5127     case GAVL_YUVA_FLOAT:
5128       *advance = 4 * sizeof(float);
5129       *offset = 0;
5130       break;
5131     }
5132 
5133   }
5134 
5135