]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Use var_Inherit* instead of var_CreateGet*.
[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     B(VLC_CODEC_VP8, "Google/On2's VP8 Video"),
452         A("VP80"),
453
454
455     /* Xiph.org theora */
456     B(VLC_CODEC_THEORA, "Xiph.org's Theora Video"),
457         A("theo"),
458         A("Thra"),
459
460     /* Xiph.org tarkin */
461     B(VLC_CODEC_TARKIN, "Xiph.org's Tarkin Video"),
462         A("tark"),
463
464     /* Asus Video (Another thing that doesn't work on PPC) */
465     B(VLC_CODEC_ASV1, "Asus V1 Video"),
466         A("ASV1"),
467     B(VLC_CODEC_ASV2, "Asus V2 Video"),
468         A("ASV2"),
469
470     /* FFMPEG Video 1 (lossless codec) */
471     B(VLC_CODEC_FFV1, "FFMpeg Video 1"),
472         A("FFV1"),
473
474     /* ATI VCR1 */
475     B(VLC_CODEC_VCR1, "ATI VCR1 Video"),
476         A("VCR1"),
477
478     /* Cirrus Logic AccuPak */
479     B(VLC_CODEC_CLJR, "Creative Logic AccuPak"),
480         A("CLJR"),
481
482     /* Real Video */
483     B(VLC_CODEC_RV10, "Real Video 1.0"),
484         A("RV10"),
485         A("rv10"),
486
487     B(VLC_CODEC_RV13, "Real Video 1.3"),
488         A("RV13"),
489         A("rv13"),
490
491     B(VLC_CODEC_RV20, "Real Video 2.0"),
492         A("RV20"),
493         A("rv20"),
494
495     B(VLC_CODEC_RV30, "Real Video 3.0"),
496         A("RV30"),
497         A("rv30"),
498
499     B(VLC_CODEC_RV40, "Real Video 4.0"),
500         A("RV40"),
501         A("rv40"),
502
503     /* Apple Video */
504     B(VLC_CODEC_RPZA, "Apple Video"),
505         A("rpza"),
506         A("azpr"),
507         A("RPZA"),
508         A("AZPR"),
509
510     B(VLC_CODEC_SMC, "Apple graphics"),
511         A("smc "),
512
513     B(VLC_CODEC_CINEPAK, "Cinepak Video"),
514         A("CVID"),
515         A("cvid"),
516
517     /* Screen Capture Video Codecs */
518     B(VLC_CODEC_TSCC, "TechSmith Camtasia Screen Capture"),
519         A("TSCC"),
520         A("tscc"),
521
522     B(VLC_CODEC_CSCD, "CamStudio Screen Codec"),
523         A("CSCD"),
524         A("cscd"),
525
526     B(VLC_CODEC_ZMBV, "DosBox Capture Codec"),
527         A("ZMBV"),
528
529     B(VLC_CODEC_VMNC, "VMware Video"),
530         A("VMnc"),
531     B(VLC_CODEC_FRAPS, "FRAPS: Realtime Video Capture"),
532         A("FPS1"),
533         A("fps1"),
534
535     /* Duck TrueMotion */
536     B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
537         A("DUCK"),
538         A("PVEZ"),
539     B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
540         A("TM20"),
541
542     /* FFMPEG's SNOW wavelet codec */
543     B(VLC_CODEC_SNOW, "FFMpeg SNOW wavelet Video"),
544         A("SNOW"),
545         A("snow"),
546
547     B(VLC_CODEC_QTRLE, "Apple QuickTime RLE Video"),
548         A("rle "),
549
550     B(VLC_CODEC_QDRAW, "Apple QuickDraw Video"),
551         A("qdrw"),
552
553     B(VLC_CODEC_QPEG, "QPEG Video"),
554         A("QPEG"),
555         A("Q1.0"),
556         A("Q1.1"),
557
558     B(VLC_CODEC_ULTI, "IBM Ultimotion Video"),
559         A("ULTI"),
560
561     B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
562         A("VIXL"),
563         A("XIXL"),
564         E("PIXL", "Pinnacle VideoXL Video"),
565
566     B(VLC_CODEC_LOCO, "LOCO Video"),
567         A("LOCO"),
568
569     B(VLC_CODEC_WNV1, "Winnov WNV1 Video"),
570         A("WNV1"),
571
572     B(VLC_CODEC_AASC, "Autodesc RLE Video"),
573         A("AASC"),
574
575     B(VLC_CODEC_INDEO2, "Indeo Video v2"),
576         A("IV20"),
577         A("RT21"),
578
579         /* Flash Screen Video */
580     B(VLC_CODEC_FLASHSV, "Flash Screen Video"),
581         A("FSV1"),
582     B(VLC_CODEC_KMVC, "Karl Morton's Video Codec (Worms)"),
583         A("KMVC"),
584
585     B(VLC_CODEC_NUV, "Nuppel Video"),
586         A("RJPG"),
587         A("NUV1"),
588
589     /* CODEC_ID_SMACKVIDEO */
590     B(VLC_CODEC_SMACKVIDEO, "Smacker Video"),
591         A("SMK2"),
592         A("SMK4"),
593
594     /* Chinese AVS - Untested */
595     B(VLC_CODEC_CAVS, "Chinese AVS"),
596         A("CAVS"),
597         A("AVs2"),
598         A("avs2"),
599
600     B(VLC_CODEC_AMV, "AMV"),
601
602     /* */
603     B(VLC_CODEC_DNXHD, "DNxHD"),
604         A("AVdn"),
605     B(VLC_CODEC_8BPS, "8BPS"),
606         A("8BPS"),
607     B(VLC_CODEC_MIMIC, "Mimic"),
608         A("ML2O"),
609
610     B(VLC_CODEC_CDG, "CD-G Video"),
611         A("CDG "),
612
613     B(VLC_CODEC_FRWU, "Forward Uncompressed" ),
614         A("FRWU"),
615
616     B(VLC_CODEC_INDEO5, "Indeo Video v5"),
617         A("IV50"),
618         A("iv50"),
619
620
621     /* */
622     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
623         A("YV12"),
624         A("yv12"),
625     B(VLC_CODEC_YV9,  "Planar 4:1:0 YVU"),
626         A("YVU9"),
627     B(VLC_CODEC_I410, "Planar 4:1:0 YUV"),
628         A("I410"),
629     B(VLC_CODEC_I411, "Planar 4:1:1 YUV"),
630         A("I411"),
631     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
632         A("I420"),
633         A("IYUV"),
634     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
635         A("I422"),
636     B(VLC_CODEC_I444, "Planar 4:4:0 YUV"),
637         A("I440"),
638     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
639         A("I444"),
640
641     B(VLC_CODEC_J420, "Planar 4:2:0 YUV full scale"),
642         A("J420"),
643     B(VLC_CODEC_J422, "Planar 4:2:2 YUV full scale"),
644         A("J422"),
645     B(VLC_CODEC_J440, "Planar 4:4:0 YUV full scale"),
646         A("J440"),
647     B(VLC_CODEC_J444, "Planar 4:4:4 YUV full scale"),
648         A("J444"),
649
650     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
651         A("YUVP"),
652
653     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
654         A("YUVA"),
655
656     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
657         A("RGBP"),
658
659     B(VLC_CODEC_RGB8, "8 bits RGB"),
660         A("RGB2"),
661     B(VLC_CODEC_RGB15, "15 bits RGB"),
662         A("RV15"),
663     B(VLC_CODEC_RGB16, "16 bits RGB"),
664         A("RV16"),
665     B(VLC_CODEC_RGB24, "24 bits RGB"),
666         A("RV24"),
667     B(VLC_CODEC_RGB32, "32 bits RGB"),
668         A("RV32"),
669     B(VLC_CODEC_RGBA, "32 bits RGBA"),
670         A("RGBA"),
671
672     B(VLC_CODEC_GREY, "8 bits greyscale"),
673         A("GREY"),
674         A("Y800"),
675         A("Y8  "),
676
677     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
678         A("UYVY"),
679         A("UYNV"),
680         A("UYNY"),
681         A("Y422"),
682         A("HDYC"),
683         A("AVUI"),
684         A("uyv1"),
685         A("2vuy"),
686         A("2Vuy"),
687         A("2Vu1"),
688     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
689         A("VYUY"),
690     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
691         A("YUY2"),
692         A("YUYV"),
693         A("YUNV"),
694         A("V422"),
695     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
696         A("YVYU"),
697
698     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
699         A("Y211"),
700     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
701         A("cyuv"),
702         A("CYUV"),
703
704     B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
705         A("v210"),
706
707     B(VLC_CODEC_NV12, "Planar  Y, Packet UV (420)"),
708         A("NV12"),
709
710     /* Videogames Codecs */
711
712     /* Interplay MVE */
713     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
714         A("imve"),
715         A("INPV"),
716
717     /* Id Quake II CIN */
718     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
719         A("IDCI"),
720
721     /* 4X Technologies */
722     B(VLC_CODEC_4XM, "4X Technologies Video"),
723         A("4XMV"),
724         A("4xmv"),
725
726     /* Id RoQ */
727     B(VLC_CODEC_ROQ, "Id RoQ Video"),
728         A("RoQv"),
729
730     /* Sony Playstation MDEC */
731     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
732         A("MDEC"),
733
734     /* Sierra VMD */
735     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
736         A("VMDV"),
737         A("vmdv"),
738
739     B(VLC_CODEC_DIRAC, "Dirac" ),
740         A("drac"),
741
742     /* Image */
743     B(VLC_CODEC_PNG, "PNG Image"),
744         A("png "),
745
746     B(VLC_CODEC_PPM, "PPM Image"),
747         A("ppm "),
748
749     B(VLC_CODEC_PGM, "PGM Image"),
750         A("pgm "),
751
752     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
753         A("pgmy"),
754
755     B(VLC_CODEC_PAM, "PAM Image"),
756         A("pam "),
757
758     B(VLC_CODEC_JPEGLS, "Lossless JPEG"),
759         A("MJLS"),
760
761     B(VLC_CODEC_JPEG, "JPEG"),
762         A("jpeg"),
763         A("JPEG"),
764
765     B(VLC_CODEC_BMP, "BMP Image"),
766         A("bmp "),
767
768     B(VLC_CODEC_TIFF, "TIFF Image"),
769         A("tiff"),
770
771     B(VLC_CODEC_GIF, "GIF Image"),
772         A("gif "),
773
774
775     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
776         A("tga "),
777         A("mtga"),
778         A("MTGA"),
779
780     B(VLC_CODEC_SGI, "SGI Image"),
781         A("sgi "),
782
783     B(VLC_CODEC_PNM, "Portable Anymap Image"),
784         A("pnm "),
785
786     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
787         A("pcx "),
788
789     B(VLC_CODEC_JPEG2000, "JPEG 2000 Image"),
790         A("JP2K"),
791         A("mjp2"),
792         A("MJP2"),
793         A("MJ2C"),
794
795     B(0, "")
796 };
797 static const entry_t p_list_audio[] = {
798
799     /* Windows Media Audio 1 */
800     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
801         A("WMA1"),
802         A("wma1"),
803
804     /* Windows Media Audio 2 */
805     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
806         A("WMA2"),
807         A("wma2"),
808         A("wma "),
809
810     /* Windows Media Audio Professional */
811     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
812         A("WMAP"),
813         A("wmap"),
814
815     /* Windows Media Audio Lossless */
816     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
817         A("WMAL"),
818         A("wmal"),
819
820     /* Windows Media Audio Speech */
821     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
822         A("WMAS"),
823         A("wmas"),
824
825     /* DV Audio */
826     B(VLC_CODEC_DVAUDIO, "DV Audio"),
827         A("dvau"),
828         A("vdva"),
829         A("dvca"),
830         A("RADV"),
831
832     /* MACE-3 Audio */
833     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
834         A("MAC3"),
835
836     /* MACE-6 Audio */
837     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
838         A("MAC6"),
839
840     /* MUSEPACK7 Audio */
841     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
842         A("MPC "),
843
844     /* MUSEPACK8 Audio */
845     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
846         A("MPCK"),
847         A("MPC8"),
848
849     /* RealAudio 1.0 */
850     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
851         A("14_4"),
852         A("lpcJ"),
853
854     /* RealAudio 2.0 */
855     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
856         A("28_8"),
857
858     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
859         A("sipr"),
860
861     /* MPEG Audio layer 1/2/3 */
862     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
863         A("mpga"),
864         A("mp3 "),
865         A(".mp3"),
866         A("MP3 "),
867         A("LAME"),
868         A("ms\x00\x50"),
869         A("ms\x00\x55"),
870
871     /* A52 Audio (aka AC3) */
872     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
873         A("a52 "),
874         A("a52b"),
875         A("ac-3"),
876         A("ms\x20\x00"),
877
878     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
879         A("eac3"),
880
881     /* DTS Audio */
882     B(VLC_CODEC_DTS, "DTS Audio"),
883         A("dts "),
884         A("dtsb"),
885         A("ms\x20\x01"),
886
887     /* AAC audio */
888     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
889         A("mp4a"),
890         A("aac "),
891
892     /* ALS audio */
893     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
894         A("als "),
895
896     /* 4X Technologies */
897     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
898         A("4xma"),
899
900     /* EA ADPCM */
901     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
902         A("ADEA"),
903
904     /* Interplay DPCM */
905     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
906         A("idpc"),
907
908     /* Id RoQ */
909     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
910         A("RoQa"),
911
912     /* DCIN Audio */
913     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
914         A("DCIA"),
915
916     /* Sony Playstation XA ADPCM */
917     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
918         A("xa  "),
919
920     /* ADX ADPCM */
921     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
922         A("adx "),
923
924     /* Westwood ADPCM */
925     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
926         A("AIWS"),
927
928     /* MS ADPCM */
929     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
930         A("ms\x00\x02"),
931
932     /* Sierra VMD */
933     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
934         A("vmda"),
935
936     /* G.726 ADPCM */
937     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
938         A("g726"),
939
940     /* Flash ADPCM */
941     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
942         A("SWFa"),
943
944     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
945         A("ms\x00\x11"),
946
947     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
948         A("imav"),
949
950     /* AMR */
951     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
952         A("samr"),
953
954     B(VLC_CODEC_AMR_WB, "AMR wide band"),
955         A("sawb"),
956
957     /* FLAC */
958     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
959         A("flac"),
960
961     /* ALAC */
962     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
963         A("alac"),
964
965     /* QDM2 */
966     B(VLC_CODEC_QDM2, "QDM2 Audio"),
967         A("QDM2"),
968
969     /* COOK */
970     B(VLC_CODEC_COOK, "Cook Audio"),
971         A("cook"),
972
973     /* TTA: The Lossless True Audio */
974     B(VLC_CODEC_TTA, "The Lossless True Audio"),
975         A("TTA1"),
976
977     /* Shorten */
978     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
979         A("shn "),
980         A("shrn"),
981
982     B(VLC_CODEC_WAVPACK, "WavPack"),
983         A("WVPK"),
984         A("wvpk"),
985
986     B(VLC_CODEC_GSM, "GSM Audio"),
987         A("gsm "),
988
989     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
990         A("agsm"),
991
992     B(VLC_CODEC_ATRAC1, "atrac 1"),
993         A("atr1"),
994
995     B(VLC_CODEC_ATRAC3, "atrac 3"),
996         A("atrc"),
997         A("\x70\x02\x00\x00"),
998
999     B(VLC_CODEC_SONIC, "Sonic"),
1000         A("SONC"),
1001
1002     B(VLC_CODEC_IMC, "IMC" ),
1003         A("\x01\x04\x00\x00"),
1004
1005     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1006         A("\x22\x00\x00\x00"),
1007
1008     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1009         A("NELL"),
1010
1011     B(VLC_CODEC_APE, "Monkey's Audio"),
1012         A("APE "),
1013
1014     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1015         A("mlp "),
1016
1017     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1018         A("trhd"),
1019
1020     B(VLC_CODEC_QCELP, "QCELP Audio"),
1021         A("Qclp"),
1022
1023     B(VLC_CODEC_SPEEX, "Speex Audio"),
1024         A("spx "),
1025         A("spxr"),
1026
1027     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1028         A("vorb"),
1029
1030     B(VLC_CODEC_302M, "302M Audio"),
1031         A("302m"),
1032
1033     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1034         A("lpcm"),
1035
1036     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1037         A("apcm"),
1038
1039     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1040         A("bpcm"),
1041
1042     B(VLC_CODEC_SDDS, "SDDS Audio"),
1043         A("sdds"),
1044         A("sddb"),
1045
1046     B(VLC_CODEC_MIDI, "MIDI Audio"),
1047         A("MIDI"),
1048
1049     /* PCM */
1050     B(VLC_CODEC_S8, "PCM S8"),
1051         A("s8  "),
1052
1053     B(VLC_CODEC_U8, "PCM U8"),
1054         A("u8  "),
1055
1056     B(VLC_CODEC_S16L, "PCM S16 LE"),
1057         A("s16l"),
1058
1059     B(VLC_CODEC_S16B, "PCM S16 BE"),
1060         A("s16b"),
1061
1062     B(VLC_CODEC_U16L, "PCM U16 LE"),
1063         A("u16l"),
1064
1065     B(VLC_CODEC_U16B, "PCM U16 BE"),
1066         A("u16b"),
1067
1068     B(VLC_CODEC_S24L, "PCM S24 LE"),
1069         A("s24l"),
1070         A("42ni"),  /* Quicktime */
1071
1072     B(VLC_CODEC_S24B, "PCM S24 BE"),
1073         A("s24b"),
1074         A("in24"),  /* Quicktime */
1075
1076     B(VLC_CODEC_U24L, "PCM U24 LE"),
1077         A("u24l"),
1078
1079     B(VLC_CODEC_U24B, "PCM U24 BE"),
1080         A("u24b"),
1081
1082     B(VLC_CODEC_S32L, "PCM S32 LE"),
1083         A("s32l"),
1084         A("23ni"),  /* Quicktime */
1085
1086     B(VLC_CODEC_S32B, "PCM S32 BE"),
1087         A("s32b"),
1088         A("in32"),  /* Quicktime */
1089
1090     B(VLC_CODEC_U32L, "PCM U32 LE"),
1091         A("u32l"),
1092
1093     B(VLC_CODEC_U32B, "PCM U32 BE"),
1094         A("u32b"),
1095
1096     B(VLC_CODEC_ALAW, "PCM ALAW"),
1097         A("alaw"),
1098
1099     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1100         A("mlaw"),
1101         A("ulaw"),
1102
1103     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1104         A("daud"),
1105
1106     B(VLC_CODEC_FI32, "32 bits fixed float"),
1107         A("fi32"),
1108
1109     B(VLC_CODEC_F32L, "32 bits float LE"),
1110         A("f32l"),
1111         A("fl32"),
1112
1113     B(VLC_CODEC_F32B, "32 bits float BE"),
1114         A("f32b"),
1115
1116     B(VLC_CODEC_F64L, "64 bits float LE"),
1117         A("f64l"),
1118
1119     B(VLC_CODEC_F64L, "64 bits float BE"),
1120         A("f64b"),
1121
1122     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1123         A("TWIN"),
1124
1125     B(0, "")
1126 };
1127 static const entry_t p_list_spu[] = {
1128
1129     B(VLC_CODEC_SPU, "DVD Subtitles"),
1130         A("spu "),
1131         A("spub"),
1132
1133     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1134         A("dvbs"),
1135
1136     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1137         A("subt"),
1138
1139     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1140         A("XSUB"),
1141         A("xsub"),
1142         A("DXSB"),
1143
1144     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1145         A("ssa "),
1146
1147     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1148         A("TEXT"),
1149
1150     B(VLC_CODEC_TELETEXT, "Teletext"),
1151         A("telx"),
1152
1153     B(VLC_CODEC_KATE, "Kate subtitles"),
1154         A("kate"),
1155
1156     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1157         A("cmml"),
1158
1159     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1160         A("t140"),
1161
1162     B(VLC_CODEC_USF, "USF subtitles"),
1163         A("usf "),
1164
1165     B(VLC_CODEC_OGT, "OGT subtitles"),
1166         A("ogt "),
1167
1168     B(VLC_CODEC_CVD, "CVD subtitles"),
1169         A("cvd "),
1170
1171     B(VLC_CODEC_BD_PG, "BD subtitles"),
1172         A("bdpg"),
1173
1174     B(0, "")
1175 };
1176
1177 /* Create a fourcc from a string.
1178  * XXX it assumes that the string is at least four bytes */
1179 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1180 {
1181     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1182                        psz_fourcc[2], psz_fourcc[3] );
1183 }
1184
1185 /* */
1186 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1187 {
1188     const char *p_class = NULL;
1189     const char *psz_description = NULL;
1190
1191     entry_t e = B(0, "");
1192
1193     for( int i = 0; ; i++ )
1194     {
1195         const entry_t *p = &p_list[i];
1196         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1197         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1198
1199         if( i_entry_fourcc == 0 )
1200             break;
1201
1202         if( i_entry_class != 0 )
1203         {
1204             p_class = p->p_class;
1205             psz_description = p->psz_description;
1206         }
1207
1208         if( i_entry_fourcc == i_fourcc )
1209         {
1210             assert( p_class != NULL );
1211
1212             memcpy( e.p_class, p_class, 4 );
1213             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1214             e.psz_description = p->psz_description ?
1215                                 p->psz_description : psz_description;
1216             break;
1217         }
1218     }
1219     return e;
1220 }
1221
1222 /* */
1223 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1224 {
1225     entry_t e;
1226
1227     switch( i_cat )
1228     {
1229     case VIDEO_ES:
1230         return Lookup( p_list_video, i_fourcc );
1231     case AUDIO_ES:
1232         return Lookup( p_list_audio, i_fourcc );
1233     case SPU_ES:
1234         return Lookup( p_list_spu, i_fourcc );
1235
1236     default:
1237         e = Find( VIDEO_ES, i_fourcc );
1238         if( CreateFourcc( e.p_class ) == 0 )
1239             e = Find( AUDIO_ES, i_fourcc );
1240         if( CreateFourcc( e.p_class ) == 0 )
1241             e = Find( SPU_ES, i_fourcc );
1242         return e;
1243     }
1244 }
1245
1246 /* */
1247 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1248 {
1249     entry_t e = Find( i_cat, i_fourcc );
1250
1251     if( CreateFourcc( e.p_class ) == 0 )
1252         return i_fourcc;
1253     return CreateFourcc( e.p_class );
1254 }
1255
1256 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1257 {
1258     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1259         return 0;
1260     return vlc_fourcc_GetCodec( i_cat,
1261                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1262                                             psz_fourcc[2], psz_fourcc[3] ) );
1263 }
1264
1265 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1266 {
1267     const int i_bytes = ( i_bits + 7 ) / 8;
1268
1269     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1270     {
1271         switch( i_bytes )
1272         {
1273         case 4:
1274             return VLC_CODEC_FL32;
1275         case 8:
1276             return VLC_CODEC_FL64;
1277         default:
1278             return 0;
1279         }
1280     }
1281     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1282              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1283     {
1284         switch( i_bytes )
1285         {
1286         case 1:
1287             return VLC_CODEC_U8;
1288         case 2:
1289             return VLC_CODEC_S16L;
1290         case 3:
1291             return VLC_CODEC_S24L;
1292             break;
1293         case 4:
1294             return VLC_CODEC_S32L;
1295         default:
1296             return 0;
1297         }
1298     }
1299     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1300     {
1301         switch( i_bytes )
1302         {
1303         case 1:
1304             return VLC_CODEC_S8;
1305         case 2:
1306             return VLC_CODEC_S16B;
1307         case 3:
1308             return VLC_CODEC_S24B;
1309         case 4:
1310             return VLC_CODEC_S32B;
1311         default:
1312             return 0;
1313         }
1314     }
1315     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1316     {
1317         switch( i_bytes )
1318         {
1319         case 1:
1320             return VLC_CODEC_S8;
1321         case 2:
1322             return VLC_CODEC_S16L;
1323         case 3:
1324             return VLC_CODEC_S24L;
1325         case 4:
1326             return VLC_CODEC_S32L;
1327         default:
1328             return 0;
1329         }
1330     }
1331     else
1332     {
1333         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1334     }
1335 }
1336
1337 /* */
1338 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1339 {
1340     entry_t e = Find( i_cat, i_fourcc );
1341
1342     return e.psz_description;
1343 }
1344
1345
1346 /* */
1347 #define VLC_CODEC_YUV_PLANAR_410 \
1348     VLC_CODEC_I410, VLC_CODEC_YV9
1349
1350 #define VLC_CODEC_YUV_PLANAR_420 \
1351     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1352
1353 #define VLC_CODEC_YUV_PLANAR_422 \
1354     VLC_CODEC_I422, VLC_CODEC_J422
1355
1356 #define VLC_CODEC_YUV_PLANAR_440 \
1357     VLC_CODEC_I440, VLC_CODEC_J440
1358
1359 #define VLC_CODEC_YUV_PLANAR_444 \
1360     VLC_CODEC_I444, VLC_CODEC_J444
1361
1362 #define VLC_CODEC_YUV_PACKED \
1363     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1364     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1365
1366 #define VLC_CODEC_FALLBACK_420 \
1367     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1368     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1369     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1370
1371 static const vlc_fourcc_t p_I420_fallback[] = {
1372     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1373 };
1374 static const vlc_fourcc_t p_J420_fallback[] = {
1375     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1376 };
1377 static const vlc_fourcc_t p_YV12_fallback[] = {
1378     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1379 };
1380
1381 #define VLC_CODEC_FALLBACK_422 \
1382     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1383     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1384     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1385
1386 static const vlc_fourcc_t p_I422_fallback[] = {
1387     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1388 };
1389 static const vlc_fourcc_t p_J422_fallback[] = {
1390     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1391 };
1392
1393 #define VLC_CODEC_FALLBACK_444 \
1394     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1395     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1396     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1397
1398 static const vlc_fourcc_t p_I444_fallback[] = {
1399     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1400 };
1401 static const vlc_fourcc_t p_J444_fallback[] = {
1402     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1403 };
1404
1405 static const vlc_fourcc_t p_I440_fallback[] = {
1406     VLC_CODEC_I440,
1407     VLC_CODEC_YUV_PLANAR_420,
1408     VLC_CODEC_YUV_PLANAR_422,
1409     VLC_CODEC_YUV_PLANAR_444,
1410     VLC_CODEC_YUV_PACKED,
1411     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1412 };
1413
1414 #define VLC_CODEC_FALLBACK_PACKED \
1415     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1416     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1417     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1418
1419 static const vlc_fourcc_t p_YUYV_fallback[] = {
1420     VLC_CODEC_YUYV,
1421     VLC_CODEC_YVYU,
1422     VLC_CODEC_UYVY,
1423     VLC_CODEC_VYUY,
1424     VLC_CODEC_FALLBACK_PACKED, 0
1425 };
1426 static const vlc_fourcc_t p_YVYU_fallback[] = {
1427     VLC_CODEC_YVYU,
1428     VLC_CODEC_YUYV,
1429     VLC_CODEC_UYVY,
1430     VLC_CODEC_VYUY,
1431     VLC_CODEC_FALLBACK_PACKED, 0
1432 };
1433 static const vlc_fourcc_t p_UYVY_fallback[] = {
1434     VLC_CODEC_UYVY,
1435     VLC_CODEC_VYUY,
1436     VLC_CODEC_YUYV,
1437     VLC_CODEC_YVYU,
1438     VLC_CODEC_FALLBACK_PACKED, 0
1439 };
1440 static const vlc_fourcc_t p_VYUY_fallback[] = {
1441     VLC_CODEC_VYUY,
1442     VLC_CODEC_UYVY,
1443     VLC_CODEC_YUYV,
1444     VLC_CODEC_YVYU,
1445     VLC_CODEC_FALLBACK_PACKED, 0
1446 };
1447
1448 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1449     p_YV12_fallback,
1450     p_I420_fallback,
1451     p_J420_fallback,
1452     p_I422_fallback,
1453     p_J422_fallback,
1454     p_I444_fallback,
1455     p_J444_fallback,
1456     p_I440_fallback,
1457     p_YUYV_fallback,
1458     p_YVYU_fallback,
1459     p_UYVY_fallback,
1460     p_VYUY_fallback,
1461     NULL,
1462 };
1463
1464 static const vlc_fourcc_t p_list_YUV[] = {
1465     VLC_CODEC_YUV_PLANAR_420,
1466     VLC_CODEC_YUV_PLANAR_422,
1467     VLC_CODEC_YUV_PLANAR_440,
1468     VLC_CODEC_YUV_PLANAR_444,
1469     VLC_CODEC_YUV_PACKED,
1470     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1471     0,
1472 };
1473
1474 /* */
1475 static const vlc_fourcc_t p_RGB32_fallback[] = {
1476     VLC_CODEC_RGB32,
1477     VLC_CODEC_RGB24,
1478     VLC_CODEC_RGB16,
1479     VLC_CODEC_RGB15,
1480     VLC_CODEC_RGB8,
1481     0,
1482 };
1483 static const vlc_fourcc_t p_RGB24_fallback[] = {
1484     VLC_CODEC_RGB24,
1485     VLC_CODEC_RGB32,
1486     VLC_CODEC_RGB16,
1487     VLC_CODEC_RGB15,
1488     VLC_CODEC_RGB8,
1489     0,
1490 };
1491 static const vlc_fourcc_t p_RGB16_fallback[] = {
1492     VLC_CODEC_RGB16,
1493     VLC_CODEC_RGB24,
1494     VLC_CODEC_RGB32,
1495     VLC_CODEC_RGB15,
1496     VLC_CODEC_RGB8,
1497     0,
1498 };
1499 static const vlc_fourcc_t p_RGB15_fallback[] = {
1500     VLC_CODEC_RGB15,
1501     VLC_CODEC_RGB16,
1502     VLC_CODEC_RGB24,
1503     VLC_CODEC_RGB32,
1504     VLC_CODEC_RGB8,
1505     0,
1506 };
1507 static const vlc_fourcc_t p_RGB8_fallback[] = {
1508     VLC_CODEC_RGB8,
1509     VLC_CODEC_RGB15,
1510     VLC_CODEC_RGB16,
1511     VLC_CODEC_RGB24,
1512     VLC_CODEC_RGB32,
1513     0,
1514 };
1515 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1516     p_RGB32_fallback,
1517     p_RGB24_fallback,
1518     p_RGB16_fallback,
1519     p_RGB15_fallback,
1520     p_RGB8_fallback,
1521     NULL,
1522 };
1523
1524
1525 /* */
1526 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1527                                         const vlc_fourcc_t *pp_fallback[],
1528                                         const vlc_fourcc_t p_list[] )
1529 {
1530     for( unsigned i = 0; pp_fallback[i]; i++ )
1531     {
1532         if( pp_fallback[i][0] == i_fourcc )
1533             return pp_fallback[i];
1534     }
1535     return p_list;
1536 }
1537
1538 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1539 {
1540     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1541 }
1542 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1543 {
1544     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1545 }
1546
1547 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1548 {
1549     static const vlc_fourcc_t pp_swapped[][4] = {
1550         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1551         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1552         { 0 }
1553     };
1554
1555     for( int i = 0; pp_swapped[i][0]; i++ )
1556     {
1557         if( pp_swapped[i][0] == b )
1558         {
1559             vlc_fourcc_t t = a;
1560             a = b;
1561             b = t;
1562         }
1563         if( pp_swapped[i][0] != a )
1564             continue;
1565         for( int j = 1; pp_swapped[i][j]; j++ )
1566         {
1567             if( pp_swapped[i][j] == b )
1568                 return true;
1569         }
1570     }
1571     return false;
1572 }
1573
1574 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1575 {
1576     for( unsigned i = 0; p_list_YUV[i]; i++ )
1577     {
1578         if( p_list_YUV[i] == fcc )
1579             return true;
1580     }
1581     return false;
1582 }
1583
1584 #define PLANAR(n, w_den, h_den) \
1585     { .plane_count = n, \
1586       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1587              {.w = {1,w_den}, .h = {1,h_den}}, \
1588              {.w = {1,w_den}, .h = {1,h_den}}, \
1589              {.w = {1,    1}, .h = {1,    1}} }, \
1590       .pixel_size = 1 }
1591
1592 #define PACKED(size) \
1593     { .plane_count = 1, \
1594       .p = { {.w = {1,1}, .h = {1,1}} }, \
1595       .pixel_size = size }
1596
1597 static const struct
1598 {
1599     vlc_fourcc_t             p_fourcc[5];
1600     vlc_chroma_description_t description;
1601 } p_list_chroma_description[] = {
1602     { { VLC_CODEC_I411, 0 },                   PLANAR(3, 4, 1) },
1603     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR(3, 4, 4) },
1604     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR(3, 2, 2) },
1605     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR(3, 2, 1) },
1606     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR(3, 1, 2) },
1607     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR(3, 1, 1) },
1608     { { VLC_CODEC_YUVA, 0 },                   PLANAR(4, 1, 1) },
1609
1610     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED(2) },
1611     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1612         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED(1) },
1613     { { VLC_CODEC_RGB16, VLC_CODEC_RGB15, 0 }, PACKED(2) },
1614     { { VLC_CODEC_RGB24, 0 },                  PACKED(3) },
1615     { { VLC_CODEC_RGB32, VLC_CODEC_RGBA, 0 },  PACKED(4) },
1616
1617     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4 } },
1618
1619     { {0}, { 0, {}, 0 } }
1620 };
1621
1622 #undef PACKED
1623 #undef PLANAR
1624
1625 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1626 {
1627     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1628     {
1629         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1630         for( unsigned j = 0; p_fourcc[j]; j++ )
1631         {
1632             if( p_fourcc[j] == i_fourcc )
1633                 return &p_list_chroma_description[i].description;
1634         }
1635     }
1636     return NULL;
1637 }
1638