]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Add a new FourCC to VP6F
[vlc] / src / misc / fourcc.c
1 /*****************************************************************************
2  * fourcc.c: fourcc helpers functions
3  *****************************************************************************
4  * Copyright (C) 2009 Laurent Aimar
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_fourcc.h>
32 #include <assert.h>
33
34 typedef struct
35 {
36     char p_class[4];
37     char p_fourcc[4];
38     const char *psz_description;
39 } entry_t;
40
41 #define NULL4 "\x00\x00\x00\x00"
42
43 /* XXX You don't want to see the preprocessor generated code ;) */
44 #ifdef WORDS_BIGENDIAN
45 #   define FCC2STR(f) { ((f)>>24)&0xff, ((f)>>16)&0xff, ((f)>>8)&0xff, ((f)>>0)&0xff }
46 #else
47 #   define FCC2STR(f) { ((f)>>0)&0xff, ((f)>>8)&0xff, ((f)>>16)&0xff, ((f)>>24)&0xff }
48 #endif
49 /* Begin a new class */
50 #define B(a, c) { .p_class = FCC2STR(a), .p_fourcc = FCC2STR(a), .psz_description = c }
51 /* Create a sub-class entry with description */
52 #define E(b, c) { .p_class = NULL4, .p_fourcc = b, .psz_description = c }
53 /* Create a sub-class entry without description (alias) */
54 #define A(b) E(b, NULL4)
55
56
57 /* */
58 static const entry_t p_list_video[] = {
59
60     B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
61         A("mpgv"),
62         A("mp1v"),
63         A("mpeg"),
64         A("mpg1"),
65         A("mp2v"),
66         A("MPEG"),
67         A("mpg2"),
68         A("MPG2"),
69
70         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
71
72         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
73         E("hdv2", "Sony HDV (MPEG-2 Video)"),
74         E("hdv3", "FCP HDV (MPEG-2 Video)"),
75         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
76         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
77         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
78         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
79
80         E("mx5n", "MPEG2 IMX NTSC 525/60 50mb/s (FCP)"),
81         E("mx5p", "MPEG2 IMX PAL 625/60 50mb/s (FCP)"),
82         E("mx4n", "MPEG2 IMX NTSC 525/60 40mb/s (FCP)"),
83         E("mx4p", "MPEG2 IMX PAL 625/50 40mb/s (FCP)"),
84         E("mx3n", "MPEG2 IMX NTSC 525/60 30mb/s (FCP)"),
85         E("mx3p", "MPEG2 IMX NTSC 625/50 30mb/s (FCP)"),
86
87         E("xdv1", "XDCAM HD"),
88         E("xdv2", "XDCAM HD 1080i60 35mb/s"),
89         E("xdv3", "XDCAM HD 1080i50 35mb/s"),
90         E("xdv4", "XDCAM HD"),
91         E("xdv5", "XDCAM HD"),
92         E("xdv6", "XDCAM HD 1080p24 35mb/s"),
93         E("xdv7", "XDCAM HD 1080p25 35mb/s"),
94         E("xdv8", "XDCAM HD 1080p30 35mb/s"),
95         E("xdv9", "XDCAM HD"),
96
97         E("xdva", "XDCAM"),
98         E("xdvb", "XDCAM"),
99         E("xdvc", "XDCAM"),
100         E("xdvd", "XDCAM"),
101         E("xdve", "XDCAM"),
102         E("xdvf", "XDCAM"),
103
104         E("xd5a", "XDCAM"),
105         E("xd5b", "XDCAM"),
106         E("xd5c", "XDCAM"),
107         E("xd5d", "XDCAM"),
108         E("xd5e", "XDCAM"),
109         E("xd5f", "XDCAM"),
110         E("xd59", "XDCAM"),
111
112         E("AVmp", "AVID IMX PAL"),
113         E("MMES", "Matrox MPEG-2"),
114         E("mmes", "Matrox MPEG-2"),
115         E("PIM2", "Pinnacle MPEG-2"),
116         E("LMP2", "Lead MPEG-2"),
117
118         E("VCR2", "ATI VCR-2"),
119
120     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
121         A("mp4v"),
122         A("DIVX"),
123         A("divx"),
124         A("MP4S"),
125         A("mp4s"),
126         A("M4S2"),
127         A("m4s2"),
128         A("MP4V"),
129         A("\x04\x00\x00\x00"),
130         A("m4cc"),
131         A("M4CC"),
132         A("FMP4"),
133         A("fmp4"),
134         A("DCOD"),
135         A("MVXM"),
136         A("PM4V"),
137         A("M4T3"),
138         A("GEOX"),
139         A("GEOV"),
140         A("DMK2"),
141         A("WV1F"),
142         A("DIGI"),
143         A("INMC"),
144         A("SN40"),
145         A("EPHV"),
146         /* XVID flavours */
147         E("xvid", "Xvid MPEG-4 Video"),
148         E("XVID", "Xvid MPEG-4 Video"),
149         E("XviD", "Xvid MPEG-4 Video"),
150         E("XVIX", "Xvid MPEG-4 Video"),
151         E("xvix", "Xvid MPEG-4 Video"),
152         /* DX50 */
153         E("DX50", "DivX MPEG-4 Video"),
154         E("dx50", "DivX MPEG-4 Video"),
155         E("BLZ0", "Blizzard MPEG-4 Video"),
156         E("DXGM", "Electronic Arts Game MPEG-4 Video"),
157         /* 3ivx delta 4 */
158         E("3IV2", "3ivx MPEG-4 Video"),
159         E("3iv2", "3ivx MPEG-4 Video"),
160         /* Various */
161         E("UMP4", "UB MPEG-4 Video"),
162         E("SEDG", "Samsung MPEG-4 Video"),
163         E("RMP4", "REALmagic MPEG-4 Video"),
164         E("HDX4", "Jomigo HDX4 (MPEG-4 Video)"),
165         E("hdx4", "Jomigo HDX4 (MPEG-4 Video)"),
166         E("SMP4", "Samsung SMP4 (MPEG-4 Video)"),
167         E("smp4", "Samsung SMP4 (MPEG-4 Video)"),
168         E("fvfw", "FFmpeg MPEG-4"),
169         E("FVFW", "FFmpeg MPEG-4"),
170         E("FFDS", "FFDShow MPEG-4"),
171         E("VIDM", "vidm 4.01 codec"),
172         /* 3ivx delta 3.5 Unsupported
173          * putting it here gives extreme distorted images */
174         //E("3IV1", "3ivx delta 3.5 MPEG-4 Video"),
175         //E("3iv1", "3ivx delta 3.5 MPEG-4 Video"),
176
177     /* MSMPEG4 v1 */
178     B(VLC_CODEC_DIV1, "MS MPEG-4 Video v1"),
179         A("DIV1"),
180         A("div1"),
181         A("MPG4"),
182         A("mpg4"),
183         A("mp41"),
184
185     /* MSMPEG4 v2 */
186     B(VLC_CODEC_DIV2, "MS MPEG-4 Video v2"),
187         A("DIV2"),
188         A("div2"),
189         A("MP42"),
190         A("mp42"),
191
192     /* MSMPEG4 v3 / M$ mpeg4 v3 */
193     B(VLC_CODEC_DIV3, "MS MPEG-4 Video v3"),
194         A("DIV3"),
195         A("MPG3"),
196         A("mpg3"),
197         A("div3"),
198         A("MP43"),
199         A("mp43"),
200         /* DivX 3.20 */
201         A("DIV4"),
202         A("div4"),
203         A("DIV5"),
204         A("div5"),
205         A("DIV6"),
206         A("div6"),
207         E("divf", "DivX 4.12"),
208         E("DIVF", "DivX 4.12"),
209         /* Cool Codec */
210         A("COL1"),
211         A("col1"),
212         A("COL0"),
213         A("col0"),
214         /* AngelPotion stuff */
215         A("AP41"),
216         /* 3ivx doctered divx files */
217         A("3IVD"),
218         A("3ivd"),
219         /* who knows? */
220         A("3VID"),
221         A("3vid"),
222         A("DVX3"),
223
224     /* Sorenson v1 */
225     B(VLC_CODEC_SVQ1, "SVQ-1 (Sorenson Video v1)"),
226         A("SVQ1"),
227         A("svq1"),
228         A("svqi"),
229
230     /* Sorenson v3 */
231     B(VLC_CODEC_SVQ3, "SVQ-3 (Sorenson Video v3)"),
232         A("SVQ3"),
233
234     /* h264 */
235     B(VLC_CODEC_H264, "H264 - MPEG-4 AVC (part 10)"),
236         A("H264"),
237         A("h264"),
238         A("x264"),
239         A("X264"),
240         /* avc1: special case h264 */
241         A("avc1"),
242         A("AVC1"),
243         E("VSSH", "Vanguard VSS H264"),
244         E("VSSW", "Vanguard VSS H264"),
245         E("vssh", "Vanguard VSS H264"),
246         E("DAVC", "Dicas MPEGable H.264/MPEG-4 AVC"),
247         E("davc", "Dicas MPEGable H.264/MPEG-4 AVC"),
248
249     /* H263 and H263i */
250     /* H263(+) is also known as Real Video 1.0 */
251
252     /* H263 */
253     B(VLC_CODEC_H263, "H263"),
254         A("H263"),
255         A("h263"),
256         A("VX1K"),
257         A("s263"),
258         A("S263"),
259         A("U263"),
260         A("u263"),
261         E("D263", "DEC H263"),
262         E("L263", "LEAD H263"),
263         E("M263", "Microsoft H263"),
264         E("X263", "Xirlink H263"),
265         /* Zygo (partial) */
266         E("ZyGo", "ITU H263+"),
267
268     /* H263i */
269     B(VLC_CODEC_H263I, "I263.I"),
270         A("I263"),
271         A("i263"),
272
273     /* H263P */
274     B(VLC_CODEC_H263P, "ITU H263+"),
275         E("ILVR", "ITU H263+"),
276         E("viv1", "H263+"),
277         E("vivO", "H263+"),
278         E("viv2", "H263+"),
279         E("U263", "UB H263+"),
280
281     /* Flash (H263) variant */
282     B(VLC_CODEC_FLV1, "Flash Video"),
283         A("FLV1"),
284         A("flv "),
285
286     /* H261 */
287     B(VLC_CODEC_H261, "H.261"),
288         A("H261"),
289         A("h261"),
290
291     B(VLC_CODEC_FLIC, "Flic Video"),
292         A("FLIC"),
293
294     /* MJPEG */
295     B(VLC_CODEC_MJPG, "Motion JPEG Video"),
296         A("MJPG"),
297         A("mjpg"),
298         A("mjpa"),
299         A("jpeg"),
300         A("JPEG"),
301         A("JFIF"),
302         A("JPGL"),
303         A("AVDJ"),
304         A("MMJP"),
305         A("QIVG"),
306         /* AVID MJPEG */
307         E("AVRn", "Avid Motion JPEG"),
308         E("AVDJ", "Avid Motion JPEG"),
309         E("ADJV", "Avid Motion JPEG"),
310         E("dmb1", "Motion JPEG OpenDML Video"),
311         E("ijpg", "Intergraph JPEG Video"),
312         E("IJPG", "Intergraph JPEG Video"),
313         E("ACDV", "ACD Systems Digital"),
314         E("SLMJ", "SL M-JPEG"),
315
316     B(VLC_CODEC_MJPGB, "Motion JPEG B Video"),
317         A("mjpb"),
318
319     B(VLC_CODEC_LJPG, "Lead Motion JPEG Video"),
320         A("LJPG"),
321
322     // ? from avcodec/fourcc.c but makes not sense.
323     //{ VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_MJPEG,       VIDEO_ES, "Lead Motion JPEG Video" },
324
325     /* SP5x */
326     B(VLC_CODEC_SP5X, "Sunplus Motion JPEG Video"),
327         A("SP5X"),
328         A("SP53"),
329         A("SP54"),
330         A("SP55"),
331         A("SP56"),
332         A("SP57"),
333         A("SP58"),
334
335     /* DV */
336     B(VLC_CODEC_DV, "DV Video"),
337         A("dv  "),
338         A("dvsl"),
339         A("DVSD"),
340         A("dvsd"),
341         A("DVCS"),
342         A("dvcs"),
343         A("dvhd"),
344         A("dvhp"),
345         A("dvhq"),
346         A("dvh3"),
347         A("dvh5"),
348         A("dvh6"),
349         A("dv1n"),
350         A("dv1p"),
351         A("dvc "),
352         A("dv25"),
353         A("dvh1"),
354         A("dvs1"),
355         E("dvcp", "DV Video PAL"),
356         E("dvp ", "DV Video Pro"),
357         E("dvpp", "DV Video Pro PAL"),
358         E("dv50", "DV Video C Pro 50"),
359         E("dv5p", "DV Video C Pro 50 PAL"),
360         E("dv5n", "DV Video C Pro 50 NTSC"),
361         E("AVdv", "AVID DV"),
362         E("AVd1", "AVID DV"),
363         E("CDVC", "Canopus DV Video"),
364         E("cdvc", "Canopus DV Video"),
365         E("CDVH", "Canopus DV Video"),
366         E("cdvh", "Canopus DV Video"),
367
368     /* Windows Media Video */
369     B(VLC_CODEC_WMV1, "Windows Media Video 7"),
370         A("WMV1"),
371         A("wmv1"),
372
373     B(VLC_CODEC_WMV2, "Windows Media Video 8"),
374         A("WMV2"),
375         A("wmv2"),
376
377     B(VLC_CODEC_WMV3, "Windows Media Video 9"),
378         A("WMV3"),
379         A("wmv3"),
380
381     /* WMVA is the VC-1 codec before the standardization proces,
382      * it is not bitstream compatible and deprecated  */
383     B(VLC_CODEC_WMVA, "Windows Media Video Advanced Profile"),
384         A("WMVA"),
385         A("wmva"),
386         A("WVP2"),
387         A("wvp2"),
388
389     B(VLC_CODEC_VC1, "Windows Media Video VC1"),
390         A("WVC1"),
391         A("wvc1"),
392         A("vc-1"),
393         A("VC-1"),
394
395     /* Microsoft Video 1 */
396     B(VLC_CODEC_MSVIDEO1, "Microsoft Video 1"),
397         A("MSVC"),
398         A("msvc"),
399         A("CRAM"),
400         A("cram"),
401         A("WHAM"),
402         A("wham"),
403
404     /* Microsoft RLE */
405     B(VLC_CODEC_MSRLE, "Microsoft RLE Video"),
406         A("mrle"),
407         A("WRLE"),
408         A("\x01\x00\x00\x00"),
409         A("\x02\x00\x00\x00"),
410
411     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
412     B(VLC_CODEC_INDEO3, "Indeo Video v3"),
413         A("IV31"),
414         A("iv31"),
415         A("IV32"),
416         A("iv32"),
417
418     /* Huff YUV */
419     B(VLC_CODEC_HUFFYUV, "Huff YUV Video"),
420         A("HFYU"),
421
422     B(VLC_CODEC_FFVHUFF, "Huff YUV Video"),
423         A("FFVH"),
424
425     /* On2 VP3 Video Codecs */
426     B(VLC_CODEC_VP3, "On2's VP3 Video"),
427         A("VP3 "),
428         A("VP30"),
429         A("vp30"),
430         A("VP31"),
431         A("vp31"),
432
433     /* On2  VP5, VP6 codecs */
434     B(VLC_CODEC_VP5, "On2's VP5 Video"),
435         A("VP5 "),
436         A("VP50"),
437
438     B(VLC_CODEC_VP6, "On2's VP6.2 Video"),
439         A("VP62"),
440         A("vp62"),
441         E("VP60", "On2's VP6.0 Video"),
442         E("VP61", "On2's VP6.1 Video"),
443
444     B(VLC_CODEC_VP6F, "On2's VP6.2 Video (Flash)"),
445         A("VP6F"),
446         A("FLV4"),
447
448     B(VLC_CODEC_VP6A, "On2's VP6 A Video"),
449         A("VP6A"),
450
451     /* Xiph.org theora */
452     B(VLC_CODEC_THEORA, "Xiph.org's Theora Video"),
453         A("theo"),
454         A("Thra"),
455
456     /* Xiph.org tarkin */
457     B(VLC_CODEC_TARKIN, "Xiph.org's Tarkin Video"),
458         A("tark"),
459
460     /* Asus Video (Another thing that doesn't work on PPC) */
461     B(VLC_CODEC_ASV1, "Asus V1 Video"),
462         A("ASV1"),
463     B(VLC_CODEC_ASV2, "Asus V2 Video"),
464         A("ASV2"),
465
466     /* FFMPEG Video 1 (lossless codec) */
467     B(VLC_CODEC_FFV1, "FFMpeg Video 1"),
468         A("FFV1"),
469
470     /* ATI VCR1 */
471     B(VLC_CODEC_VCR1, "ATI VCR1 Video"),
472         A("VCR1"),
473
474     /* Cirrus Logic AccuPak */
475     B(VLC_CODEC_CLJR, "Creative Logic AccuPak"),
476         A("CLJR"),
477
478     /* Real Video */
479     B(VLC_CODEC_RV10, "Real Video 1.0"),
480         A("RV10"),
481         A("rv10"),
482
483     B(VLC_CODEC_RV13, "Real Video 1.3"),
484         A("RV13"),
485         A("rv13"),
486
487     B(VLC_CODEC_RV20, "Real Video 2.0"),
488         A("RV20"),
489         A("rv20"),
490
491     B(VLC_CODEC_RV30, "Real Video 3.0"),
492         A("RV30"),
493         A("rv30"),
494
495     B(VLC_CODEC_RV40, "Real Video 4.0"),
496         A("RV40"),
497         A("rv40"),
498
499     /* Apple Video */
500     B(VLC_CODEC_RPZA, "Apple Video"),
501         A("rpza"),
502         A("azpr"),
503         A("RPZA"),
504         A("AZPR"),
505
506     B(VLC_CODEC_SMC, "Apple graphics"),
507         A("smc "),
508
509     B(VLC_CODEC_CINEPAK, "Cinepak Video"),
510         A("CVID"),
511         A("cvid"),
512
513     /* Screen Capture Video Codecs */
514     B(VLC_CODEC_TSCC, "TechSmith Camtasia Screen Capture"),
515         A("TSCC"),
516         A("tscc"),
517
518     B(VLC_CODEC_CSCD, "CamStudio Screen Codec"),
519         A("CSCD"),
520         A("cscd"),
521
522     B(VLC_CODEC_ZMBV, "DosBox Capture Codec"),
523         A("ZMBV"),
524
525     B(VLC_CODEC_VMNC, "VMware Video"),
526         A("VMnc"),
527     B(VLC_CODEC_FRAPS, "FRAPS: Realtime Video Capture"),
528         A("FPS1"),
529         A("fps1"),
530
531     /* Duck TrueMotion */
532     B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
533         A("DUCK"),
534         A("PVEZ"),
535     B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
536         A("TM20"),
537
538     /* FFMPEG's SNOW wavelet codec */
539     B(VLC_CODEC_SNOW, "FFMpeg SNOW wavelet Video"),
540         A("SNOW"),
541         A("snow"),
542
543     B(VLC_CODEC_QTRLE, "Apple QuickTime RLE Video"),
544         A("rle "),
545
546     B(VLC_CODEC_QDRAW, "Apple QuickDraw Video"),
547         A("qdrw"),
548
549     B(VLC_CODEC_QPEG, "QPEG Video"),
550         A("QPEG"),
551         A("Q1.0"),
552         A("Q1.1"),
553
554     B(VLC_CODEC_ULTI, "IBM Ultimotion Video"),
555         A("ULTI"),
556
557     B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
558         A("VIXL"),
559         A("XIXL"),
560         E("PIXL", "Pinnacle VideoXL Video"),
561
562     B(VLC_CODEC_LOCO, "LOCO Video"),
563         A("LOCO"),
564
565     B(VLC_CODEC_WNV1, "Winnov WNV1 Video"),
566         A("WNV1"),
567
568     B(VLC_CODEC_AASC, "Autodesc RLE Video"),
569         A("AASC"),
570
571     B(VLC_CODEC_INDEO2, "Indeo Video v2"),
572         A("IV20"),
573         A("RT21"),
574
575         /* Flash Screen Video */
576     B(VLC_CODEC_FLASHSV, "Flash Screen Video"),
577         A("FSV1"),
578     B(VLC_CODEC_KMVC, "Karl Morton's Video Codec (Worms)"),
579         A("KMVC"),
580
581     B(VLC_CODEC_NUV, "Nuppel Video"),
582         A("RJPG"),
583         A("NUV1"),
584
585     /* CODEC_ID_SMACKVIDEO */
586     B(VLC_CODEC_SMACKVIDEO, "Smacker Video"),
587         A("SMK2"),
588         A("SMK4"),
589
590     /* Chinese AVS - Untested */
591     B(VLC_CODEC_CAVS, "Chinese AVS"),
592         A("CAVS"),
593         A("AVs2"),
594         A("avs2"),
595
596     B(VLC_CODEC_AMV, "AMV"),
597
598     /* */
599     B(VLC_CODEC_DNXHD, "DNxHD"),
600         A("AVdn"),
601     B(VLC_CODEC_8BPS, "8BPS"),
602         A("8BPS"),
603     B(VLC_CODEC_MIMIC, "Mimic"),
604         A("ML2O"),
605
606     B(VLC_CODEC_CDG, "CD-G Video"),
607         A("CDG "),
608
609     B(VLC_CODEC_FRWU, "Forward Uncompressed" ),
610         A("FRWU"),
611
612     B(VLC_CODEC_INDEO5, "Indeo Video v5"),
613         A("IV50"),
614         A("iv50"),
615
616
617     /* */
618     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
619         A("YV12"),
620         A("yv12"),
621     B(VLC_CODEC_YV9,  "Planar 4:1:0 YVU"),
622         A("YVU9"),
623     B(VLC_CODEC_I410, "Planar 4:1:0 YUV"),
624         A("I410"),
625     B(VLC_CODEC_I411, "Planar 4:1:1 YUV"),
626         A("I411"),
627     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
628         A("I420"),
629         A("IYUV"),
630     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
631         A("I422"),
632     B(VLC_CODEC_I444, "Planar 4:4:0 YUV"),
633         A("I440"),
634     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
635         A("I444"),
636
637     B(VLC_CODEC_J420, "Planar 4:2:0 YUV full scale"),
638         A("J420"),
639     B(VLC_CODEC_J422, "Planar 4:2:2 YUV full scale"),
640         A("J422"),
641     B(VLC_CODEC_J440, "Planar 4:4:0 YUV full scale"),
642         A("J440"),
643     B(VLC_CODEC_J444, "Planar 4:4:4 YUV full scale"),
644         A("J444"),
645
646     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
647         A("YUVP"),
648
649     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
650         A("YUVA"),
651
652     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
653         A("RGBP"),
654
655     B(VLC_CODEC_RGB8, "8 bits RGB"),
656         A("RGB2"),
657     B(VLC_CODEC_RGB15, "15 bits RGB"),
658         A("RV15"),
659     B(VLC_CODEC_RGB16, "16 bits RGB"),
660         A("RV16"),
661     B(VLC_CODEC_RGB24, "24 bits RGB"),
662         A("RV24"),
663     B(VLC_CODEC_RGB32, "32 bits RGB"),
664         A("RV32"),
665     B(VLC_CODEC_RGBA, "32 bits RGBA"),
666         A("RGBA"),
667
668     B(VLC_CODEC_GREY, "8 bits greyscale"),
669         A("GREY"),
670         A("Y800"),
671         A("Y8  "),
672
673     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
674         A("UYVY"),
675         A("UYNV"),
676         A("UYNY"),
677         A("Y422"),
678         A("HDYC"),
679         A("AVUI"),
680         A("uyv1"),
681         A("2vuy"),
682         A("2Vuy"),
683         A("2Vu1"),
684     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
685         A("VYUY"),
686     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
687         A("YUY2"),
688         A("YUYV"),
689         A("YUNV"),
690         A("V422"),
691     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
692         A("YVYU"),
693
694     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
695         A("Y211"),
696     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
697         A("cyuv"),
698         A("CYUV"),
699
700     B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
701         A("v210"),
702
703     /* Videogames Codecs */
704
705     /* Interplay MVE */
706     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
707         A("imve"),
708         A("INPV"),
709
710     /* Id Quake II CIN */
711     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
712         A("IDCI"),
713
714     /* 4X Technologies */
715     B(VLC_CODEC_4XM, "4X Technologies Video"),
716         A("4XMV"),
717         A("4xmv"),
718
719     /* Id RoQ */
720     B(VLC_CODEC_ROQ, "Id RoQ Video"),
721         A("RoQv"),
722
723     /* Sony Playstation MDEC */
724     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
725         A("MDEC"),
726
727     /* Sierra VMD */
728     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
729         A("VMDV"),
730         A("vmdv"),
731
732     B(VLC_CODEC_DIRAC, "Dirac" ),
733         A("drac"),
734
735     /* Image */
736     B(VLC_CODEC_PNG, "PNG Image"),
737         A("png "),
738
739     B(VLC_CODEC_PPM, "PPM Image"),
740         A("ppm "),
741
742     B(VLC_CODEC_PGM, "PGM Image"),
743         A("pgm "),
744
745     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
746         A("pgmy"),
747
748     B(VLC_CODEC_PAM, "PAM Image"),
749         A("pam "),
750
751     B(VLC_CODEC_JPEGLS, "Lossless JPEG"),
752         A("MJLS"),
753
754     B(VLC_CODEC_JPEG, "JPEG"),
755         A("jpeg"),
756         A("JPEG"),
757
758     B(VLC_CODEC_BMP, "BMP Image"),
759         A("bmp "),
760
761     B(VLC_CODEC_TIFF, "TIFF Image"),
762         A("tiff"),
763
764     B(VLC_CODEC_GIF, "GIF Image"),
765         A("gif "),
766
767
768     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
769         A("tga "),
770         A("mtga"),
771         A("MTGA"),
772
773     B(VLC_CODEC_SGI, "SGI Image"),
774         A("sgi "),
775
776     B(VLC_CODEC_PNM, "Portable Anymap Image"),
777         A("pnm "),
778
779     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
780         A("pcx "),
781
782     B(0, "")
783 };
784 static const entry_t p_list_audio[] = {
785
786     /* Windows Media Audio 1 */
787     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
788         A("WMA1"),
789         A("wma1"),
790
791     /* Windows Media Audio 2 */
792     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
793         A("WMA2"),
794         A("wma2"),
795         A("wma "),
796
797     /* Windows Media Audio Professional */
798     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
799         A("WMAP"),
800         A("wmap"),
801
802     /* Windows Media Audio Lossless */
803     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
804         A("WMAL"),
805         A("wmal"),
806
807     /* Windows Media Audio Speech */
808     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
809         A("WMAS"),
810         A("wmas"),
811
812     /* DV Audio */
813     B(VLC_CODEC_DVAUDIO, "DV Audio"),
814         A("dvau"),
815         A("vdva"),
816         A("dvca"),
817         A("RADV"),
818
819     /* MACE-3 Audio */
820     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
821         A("MAC3"),
822
823     /* MACE-6 Audio */
824     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
825         A("MAC6"),
826
827     /* MUSEPACK7 Audio */
828     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
829         A("MPC "),
830
831     /* MUSEPACK8 Audio */
832     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
833         A("MPCK"),
834         A("MPC8"),
835
836     /* RealAudio 1.0 */
837     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
838         A("14_4"),
839         A("lpcJ"),
840
841     /* RealAudio 2.0 */
842     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
843         A("28_8"),
844
845     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
846         A("sipr"),
847
848     /* MPEG Audio layer 1/2/3 */
849     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
850         A("mpga"),
851         A("mp3 "),
852         A(".mp3"),
853         A("MP3 "),
854         A("LAME"),
855         A("ms\x00\x50"),
856         A("ms\x00\x55"),
857
858     /* A52 Audio (aka AC3) */
859     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
860         A("a52 "),
861         A("a52b"),
862         A("ac-3"),
863         A("ms\x20\x00"),
864
865     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
866         A("eac3"),
867
868     /* DTS Audio */
869     B(VLC_CODEC_DTS, "DTS Audio"),
870         A("dts "),
871         A("dtsb"),
872         A("ms\x20\x01"),
873
874     /* AAC audio */
875     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
876         A("mp4a"),
877         A("aac "),
878
879     /* ALS audio */
880     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
881         A("als "),
882
883     /* 4X Technologies */
884     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
885         A("4xma"),
886
887     /* EA ADPCM */
888     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
889         A("ADEA"),
890
891     /* Interplay DPCM */
892     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
893         A("idpc"),
894
895     /* Id RoQ */
896     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
897         A("RoQa"),
898
899     /* DCIN Audio */
900     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
901         A("DCIA"),
902
903     /* Sony Playstation XA ADPCM */
904     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
905         A("xa  "),
906
907     /* ADX ADPCM */
908     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
909         A("adx "),
910
911     /* Westwood ADPCM */
912     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
913         A("AIWS"),
914
915     /* MS ADPCM */
916     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
917         A("ms\x00\x02"),
918
919     /* Sierra VMD */
920     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
921         A("vmda"),
922
923     /* G.726 ADPCM */
924     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
925         A("g726"),
926
927     /* Flash ADPCM */
928     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
929         A("SWFa"),
930
931     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
932         A("ms\x00\x11"),
933
934     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
935         A("imav"),
936
937     /* AMR */
938     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
939         A("samr"),
940
941     B(VLC_CODEC_AMR_WB, "AMR wide band"),
942         A("sawb"),
943
944     /* FLAC */
945     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
946         A("flac"),
947
948     /* ALAC */
949     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
950         A("alac"),
951
952     /* QDM2 */
953     B(VLC_CODEC_QDM2, "QDM2 Audio"),
954         A("QDM2"),
955
956     /* COOK */
957     B(VLC_CODEC_COOK, "Cook Audio"),
958         A("cook"),
959
960     /* TTA: The Lossless True Audio */
961     B(VLC_CODEC_TTA, "The Lossless True Audio"),
962         A("TTA1"),
963
964     /* Shorten */
965     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
966         A("shn "),
967         A("shrn"),
968
969     B(VLC_CODEC_WAVPACK, "WavPack"),
970         A("WVPK"),
971         A("wvpk"),
972
973     B(VLC_CODEC_GSM, "GSM Audio"),
974         A("gsm "),
975
976     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
977         A("agsm"),
978
979     B(VLC_CODEC_ATRAC1, "atrac 1"),
980         A("atr1"),
981
982     B(VLC_CODEC_ATRAC3, "atrac 3"),
983         A("atrc"),
984         A("\x70\x02\x00\x00"),
985
986     B(VLC_CODEC_SONIC, "Sonic"),
987         A("SONC"),
988
989     B(VLC_CODEC_IMC, "IMC" ),
990         A("\x01\x04\x00\x00"),
991
992     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
993         A("\x22\x00\x00\x00"),
994
995     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
996         A("NELL"),
997
998     B(VLC_CODEC_APE, "Monkey's Audio"),
999         A("APE "),
1000
1001     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1002         A("mlp "),
1003
1004     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1005         A("trhd"),
1006
1007     B(VLC_CODEC_QCELP, "QCELP Audio"),
1008         A("Qclp"),
1009
1010     B(VLC_CODEC_SPEEX, "Speex Audio"),
1011         A("spx "),
1012         A("spxr"),
1013
1014     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1015         A("vorb"),
1016
1017     B(VLC_CODEC_302M, "302M Audio"),
1018         A("302m"),
1019
1020     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1021         A("lpcm"),
1022
1023     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1024         A("apcm"),
1025
1026     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1027         A("bpcm"),
1028
1029     B(VLC_CODEC_SDDS, "SDDS Audio"),
1030         A("sdds"),
1031         A("sddb"),
1032
1033     B(VLC_CODEC_MIDI, "MIDI Audio"),
1034         A("MIDI"),
1035
1036     /* PCM */
1037     B(VLC_CODEC_S8, "PCM S8"),
1038         A("s8  "),
1039
1040     B(VLC_CODEC_U8, "PCM U8"),
1041         A("u8  "),
1042
1043     B(VLC_CODEC_S16L, "PCM S16 LE"),
1044         A("s16l"),
1045
1046     B(VLC_CODEC_S16B, "PCM S16 BE"),
1047         A("s16b"),
1048
1049     B(VLC_CODEC_U16L, "PCM U16 LE"),
1050         A("u16l"),
1051
1052     B(VLC_CODEC_U16B, "PCM U16 BE"),
1053         A("u16b"),
1054
1055     B(VLC_CODEC_S24L, "PCM S24 LE"),
1056         A("s24l"),
1057         A("42ni"),  /* Quicktime */
1058
1059     B(VLC_CODEC_S24B, "PCM S24 BE"),
1060         A("s24b"),
1061         A("in24"),  /* Quicktime */
1062
1063     B(VLC_CODEC_U24L, "PCM U24 LE"),
1064         A("u24l"),
1065
1066     B(VLC_CODEC_U24B, "PCM U24 BE"),
1067         A("u24b"),
1068
1069     B(VLC_CODEC_S32L, "PCM S32 LE"),
1070         A("s32l"),
1071         A("23ni"),  /* Quicktime */
1072
1073     B(VLC_CODEC_S32B, "PCM S32 BE"),
1074         A("s32b"),
1075         A("in32"),  /* Quicktime */
1076
1077     B(VLC_CODEC_U32L, "PCM U32 LE"),
1078         A("u32l"),
1079
1080     B(VLC_CODEC_U32B, "PCM U32 BE"),
1081         A("u32b"),
1082
1083     B(VLC_CODEC_ALAW, "PCM ALAW"),
1084         A("alaw"),
1085
1086     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1087         A("mlaw"),
1088         A("ulaw"),
1089
1090     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1091         A("daud"),
1092
1093     B(VLC_CODEC_FI32, "32 bits fixed float"),
1094         A("fi32"),
1095
1096     B(VLC_CODEC_F32L, "32 bits float LE"),
1097         A("f32l"),
1098         A("fl32"),
1099
1100     B(VLC_CODEC_F32B, "32 bits float BE"),
1101         A("f32b"),
1102
1103     B(VLC_CODEC_F64L, "64 bits float LE"),
1104         A("f64l"),
1105
1106     B(VLC_CODEC_F64L, "64 bits float BE"),
1107         A("f64b"),
1108
1109     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1110         A("TWIN"),
1111
1112     B(0, "")
1113 };
1114 static const entry_t p_list_spu[] = {
1115
1116     B(VLC_CODEC_SPU, "DVD Subtitles"),
1117         A("spu "),
1118         A("spub"),
1119
1120     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1121         A("dvbs"),
1122
1123     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1124         A("subt"),
1125
1126     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1127         A("XSUB"),
1128         A("xsub"),
1129         A("DXSB"),
1130
1131     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1132         A("ssa "),
1133
1134     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1135         A("TEXT"),
1136
1137     B(VLC_CODEC_TELETEXT, "Teletext"),
1138         A("telx"),
1139
1140     B(VLC_CODEC_KATE, "Kate subtitles"),
1141         A("kate"),
1142
1143     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1144         A("cmml"),
1145
1146     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1147         A("t140"),
1148
1149     B(VLC_CODEC_USF, "USF subtitles"),
1150         A("usf "),
1151
1152     B(VLC_CODEC_OGT, "OGT subtitles"),
1153         A("ogt "),
1154
1155     B(VLC_CODEC_CVD, "CVD subtitles"),
1156         A("cvd "),
1157
1158     B(VLC_CODEC_BD_PG, "BD subtitles"),
1159         A("bdpg"),
1160
1161     B(0, "")
1162 };
1163
1164 /* Create a fourcc from a string.
1165  * XXX it assumes that the string is at least four bytes */
1166 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1167 {
1168     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1169                        psz_fourcc[2], psz_fourcc[3] );
1170 }
1171
1172 /* */
1173 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1174 {
1175     const char *p_class = NULL;
1176     const char *psz_description = NULL;
1177
1178     entry_t e = B(0, "");
1179
1180     for( int i = 0; ; i++ )
1181     {
1182         const entry_t *p = &p_list[i];
1183         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1184         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1185
1186         if( i_entry_fourcc == 0 )
1187             break;
1188
1189         if( i_entry_class != 0 )
1190         {
1191             p_class = p->p_class;
1192             psz_description = p->psz_description;
1193         }
1194
1195         if( i_entry_fourcc == i_fourcc )
1196         {
1197             assert( p_class != NULL );
1198
1199             memcpy( e.p_class, p_class, 4 );
1200             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1201             e.psz_description = p->psz_description ?
1202                                 p->psz_description : psz_description;
1203             break;
1204         }
1205     }
1206     return e;
1207 }
1208
1209 /* */
1210 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1211 {
1212     entry_t e;
1213
1214     switch( i_cat )
1215     {
1216     case VIDEO_ES:
1217         return Lookup( p_list_video, i_fourcc );
1218     case AUDIO_ES:
1219         return Lookup( p_list_audio, i_fourcc );
1220     case SPU_ES:
1221         return Lookup( p_list_spu, i_fourcc );
1222
1223     default:
1224         e = Find( VIDEO_ES, i_fourcc );
1225         if( CreateFourcc( e.p_class ) == 0 )
1226             e = Find( AUDIO_ES, i_fourcc );
1227         if( CreateFourcc( e.p_class ) == 0 )
1228             e = Find( SPU_ES, i_fourcc );
1229         return e;
1230     }
1231 }
1232
1233 /* */
1234 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1235 {
1236     entry_t e = Find( i_cat, i_fourcc );
1237
1238     if( CreateFourcc( e.p_class ) == 0 )
1239         return i_fourcc;
1240     return CreateFourcc( e.p_class );
1241 }
1242
1243 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1244 {
1245     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1246         return 0;
1247     return vlc_fourcc_GetCodec( i_cat,
1248                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1249                                             psz_fourcc[2], psz_fourcc[3] ) );
1250 }
1251
1252 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1253 {
1254     const int i_bytes = ( i_bits + 7 ) / 8;
1255
1256     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1257     {
1258         switch( i_bytes )
1259         {
1260         case 4:
1261             return VLC_CODEC_FL32;
1262         case 8:
1263             return VLC_CODEC_FL64;
1264         default:
1265             return 0;
1266         }
1267     }
1268     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1269              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1270     {
1271         switch( i_bytes )
1272         {
1273         case 1:
1274             return VLC_CODEC_U8;
1275         case 2:
1276             return VLC_CODEC_S16L;
1277         case 3:
1278             return VLC_CODEC_S24L;
1279             break;
1280         case 4:
1281             return VLC_CODEC_S32L;
1282         default:
1283             return 0;
1284         }
1285     }
1286     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1287     {
1288         switch( i_bytes )
1289         {
1290         case 1:
1291             return VLC_CODEC_S8;
1292         case 2:
1293             return VLC_CODEC_S16B;
1294         case 3:
1295             return VLC_CODEC_S24B;
1296         case 4:
1297             return VLC_CODEC_S32B;
1298         default:
1299             return 0;
1300         }
1301     }
1302     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1303     {
1304         switch( i_bytes )
1305         {
1306         case 1:
1307             return VLC_CODEC_S8;
1308         case 2:
1309             return VLC_CODEC_S16L;
1310         case 3:
1311             return VLC_CODEC_S24L;
1312         case 4:
1313             return VLC_CODEC_S32L;
1314         default:
1315             return 0;
1316         }
1317     }
1318     else
1319     {
1320         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1321     }
1322 }
1323
1324 /* */
1325 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1326 {
1327     entry_t e = Find( i_cat, i_fourcc );
1328
1329     return e.psz_description;
1330 }
1331
1332
1333 /* */
1334 #define VLC_CODEC_YUV_PLANAR_410 \
1335     VLC_CODEC_I410, VLC_CODEC_YV9
1336
1337 #define VLC_CODEC_YUV_PLANAR_420 \
1338     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1339
1340 #define VLC_CODEC_YUV_PLANAR_422 \
1341     VLC_CODEC_I422, VLC_CODEC_J422
1342
1343 #define VLC_CODEC_YUV_PLANAR_440 \
1344     VLC_CODEC_I440, VLC_CODEC_J440
1345
1346 #define VLC_CODEC_YUV_PLANAR_444 \
1347     VLC_CODEC_I444, VLC_CODEC_J444
1348
1349 #define VLC_CODEC_YUV_PACKED \
1350     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1351     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1352
1353 #define VLC_CODEC_FALLBACK_420 \
1354     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1355     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1356     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1357
1358 static const vlc_fourcc_t p_I420_fallback[] = {
1359     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1360 };
1361 static const vlc_fourcc_t p_J420_fallback[] = {
1362     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1363 };
1364 static const vlc_fourcc_t p_YV12_fallback[] = {
1365     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1366 };
1367
1368 #define VLC_CODEC_FALLBACK_422 \
1369     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1370     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1371     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1372
1373 static const vlc_fourcc_t p_I422_fallback[] = {
1374     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1375 };
1376 static const vlc_fourcc_t p_J422_fallback[] = {
1377     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1378 };
1379
1380 #define VLC_CODEC_FALLBACK_444 \
1381     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1382     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1383     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1384
1385 static const vlc_fourcc_t p_I444_fallback[] = {
1386     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1387 };
1388 static const vlc_fourcc_t p_J444_fallback[] = {
1389     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1390 };
1391
1392 static const vlc_fourcc_t p_I440_fallback[] = {
1393     VLC_CODEC_I440,
1394     VLC_CODEC_YUV_PLANAR_420,
1395     VLC_CODEC_YUV_PLANAR_422,
1396     VLC_CODEC_YUV_PLANAR_444,
1397     VLC_CODEC_YUV_PACKED,
1398     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1399 };
1400
1401 #define VLC_CODEC_FALLBACK_PACKED \
1402     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1403     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1404     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1405
1406 static const vlc_fourcc_t p_YUYV_fallback[] = {
1407     VLC_CODEC_YUYV,
1408     VLC_CODEC_YVYU,
1409     VLC_CODEC_UYVY,
1410     VLC_CODEC_VYUY,
1411     VLC_CODEC_FALLBACK_PACKED, 0
1412 };
1413 static const vlc_fourcc_t p_YVYU_fallback[] = {
1414     VLC_CODEC_YVYU,
1415     VLC_CODEC_YUYV,
1416     VLC_CODEC_UYVY,
1417     VLC_CODEC_VYUY,
1418     VLC_CODEC_FALLBACK_PACKED, 0
1419 };
1420 static const vlc_fourcc_t p_UYVY_fallback[] = {
1421     VLC_CODEC_UYVY,
1422     VLC_CODEC_VYUY,
1423     VLC_CODEC_YUYV,
1424     VLC_CODEC_YVYU,
1425     VLC_CODEC_FALLBACK_PACKED, 0
1426 };
1427 static const vlc_fourcc_t p_VYUY_fallback[] = {
1428     VLC_CODEC_VYUY,
1429     VLC_CODEC_UYVY,
1430     VLC_CODEC_YUYV,
1431     VLC_CODEC_YVYU,
1432     VLC_CODEC_FALLBACK_PACKED, 0
1433 };
1434
1435 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1436     p_YV12_fallback,
1437     p_I420_fallback,
1438     p_J420_fallback,
1439     p_I422_fallback,
1440     p_J422_fallback,
1441     p_I444_fallback,
1442     p_J444_fallback,
1443     p_I440_fallback,
1444     p_YUYV_fallback,
1445     p_YVYU_fallback,
1446     p_UYVY_fallback,
1447     p_VYUY_fallback,
1448     NULL,
1449 };
1450
1451 static const vlc_fourcc_t p_list_YUV[] = {
1452     VLC_CODEC_YUV_PLANAR_420,
1453     VLC_CODEC_YUV_PLANAR_422,
1454     VLC_CODEC_YUV_PLANAR_440,
1455     VLC_CODEC_YUV_PLANAR_444,
1456     VLC_CODEC_YUV_PACKED,
1457     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1458     0,
1459 };
1460
1461 /* */
1462 static const vlc_fourcc_t p_RGB32_fallback[] = {
1463     VLC_CODEC_RGB32,
1464     VLC_CODEC_RGB24,
1465     VLC_CODEC_RGB16,
1466     VLC_CODEC_RGB15,
1467     VLC_CODEC_RGB8,
1468     0,
1469 };
1470 static const vlc_fourcc_t p_RGB24_fallback[] = {
1471     VLC_CODEC_RGB24,
1472     VLC_CODEC_RGB32,
1473     VLC_CODEC_RGB16,
1474     VLC_CODEC_RGB15,
1475     VLC_CODEC_RGB8,
1476     0,
1477 };
1478 static const vlc_fourcc_t p_RGB16_fallback[] = {
1479     VLC_CODEC_RGB16,
1480     VLC_CODEC_RGB24,
1481     VLC_CODEC_RGB32,
1482     VLC_CODEC_RGB15,
1483     VLC_CODEC_RGB8,
1484     0,
1485 };
1486 static const vlc_fourcc_t p_RGB15_fallback[] = {
1487     VLC_CODEC_RGB15,
1488     VLC_CODEC_RGB16,
1489     VLC_CODEC_RGB24,
1490     VLC_CODEC_RGB32,
1491     VLC_CODEC_RGB8,
1492     0,
1493 };
1494 static const vlc_fourcc_t p_RGB8_fallback[] = {
1495     VLC_CODEC_RGB8,
1496     VLC_CODEC_RGB15,
1497     VLC_CODEC_RGB16,
1498     VLC_CODEC_RGB24,
1499     VLC_CODEC_RGB32,
1500     0,
1501 };
1502 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1503     p_RGB32_fallback,
1504     p_RGB24_fallback,
1505     p_RGB16_fallback,
1506     p_RGB15_fallback,
1507     p_RGB8_fallback,
1508     NULL,
1509 };
1510
1511
1512 /* */
1513 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1514                                         const vlc_fourcc_t *pp_fallback[],
1515                                         const vlc_fourcc_t p_list[] )
1516 {
1517     for( unsigned i = 0; pp_fallback[i]; i++ )
1518     {
1519         if( pp_fallback[i][0] == i_fourcc )
1520             return pp_fallback[i];
1521     }
1522     return p_list;
1523 }
1524
1525 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1526 {
1527     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1528 }
1529 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1530 {
1531     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1532 }
1533
1534 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1535 {
1536     static const vlc_fourcc_t pp_swapped[][4] = {
1537         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1538         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1539         { 0 }
1540     };
1541
1542     for( int i = 0; pp_swapped[i][0]; i++ )
1543     {
1544         if( pp_swapped[i][0] == b )
1545         {
1546             vlc_fourcc_t t = a;
1547             a = b;
1548             b = t;
1549         }
1550         if( pp_swapped[i][0] != a )
1551             continue;
1552         for( int j = 1; pp_swapped[i][j]; j++ )
1553         {
1554             if( pp_swapped[i][j] == b )
1555                 return true;
1556         }
1557     }
1558     return false;
1559 }
1560
1561 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1562 {
1563     for( unsigned i = 0; p_list_YUV[i]; i++ )
1564     {
1565         if( p_list_YUV[i] == fcc )
1566             return true;
1567     }
1568     return false;
1569 }
1570