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