]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Introduce ICOD fourCC
[vlc] / src / misc / fourcc.c
1 /*****************************************************************************
2  * fourcc.c: fourcc helpers functions
3  *****************************************************************************
4  * Copyright © 2009-2011 Laurent Aimar
5  *
6  * Authors: Laurent Aimar <fenrir@videolan.org>
7  *          Jean-Baptiste Kempf <jb@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * 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_common.h>
32 #include <vlc_fourcc.h>
33 #include <vlc_es.h>
34 #include <assert.h>
35
36
37 typedef struct
38 {
39     char p_class[4];
40     char p_fourcc[4];
41     char psz_description[56];
42 } staticentry_t;
43
44 typedef struct
45 {
46     char p_class[4];
47     char p_fourcc[4];
48     const char *psz_description;
49 } entry_t;
50
51 #define NULL4 "\x00\x00\x00\x00"
52
53 /* XXX You don't want to see the preprocessor generated code ;) */
54 #ifdef WORDS_BIGENDIAN
55 #   define FCC2STR(f) { ((f)>>24)&0xff, ((f)>>16)&0xff, ((f)>>8)&0xff, ((f)>>0)&0xff }
56 #else
57 #   define FCC2STR(f) { ((f)>>0)&0xff, ((f)>>8)&0xff, ((f)>>16)&0xff, ((f)>>24)&0xff }
58 #endif
59 /* Begin a new class */
60 #define B(a, c) { .p_class = FCC2STR(a), .p_fourcc = FCC2STR(a), .psz_description = c }
61 /* Create a sub-class entry with description */
62 #define E(b, c) { .p_class = NULL4, .p_fourcc = b, .psz_description = c }
63 /* Create a sub-class entry without description (alias) */
64 #define A(b) E(b, NULL4)
65
66
67 /* */
68 static const staticentry_t p_list_video[] = {
69
70     B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
71         A("mpgv"),
72         A("mp1v"),
73         A("mpeg"),
74         A("mpg1"),
75         A("mp2v"),
76         A("MPEG"),
77         A("mpg2"),
78         A("MPG2"),
79         A("H262"),
80
81         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
82
83         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
84         E("hdv2", "Sony HDV 1080i60 (MPEG-2 Video)"),
85         E("hdv3", "FCP HDV 1080i50 (MPEG-2 Video)"),
86         E("hdv4", "HDV 720p24 (MPEG-2 Video)"),
87         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
88         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
89         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
90         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
91         E("hdv9", "HDV 720p60 JVC (MPEG-2 Video)"),
92         E("hdva", "HDV 720p50 (MPEG-2 Video)"),
93
94         E("mx5n", "MPEG2 IMX NTSC 525/60 50Mb/s (FCP)"),
95         E("mx5p", "MPEG2 IMX PAL 625/60 50Mb/s (FCP)"),
96         E("mx4n", "MPEG2 IMX NTSC 525/60 40Mb/s (FCP)"),
97         E("mx4p", "MPEG2 IMX PAL 625/50 40Mb/s (FCP)"),
98         E("mx3n", "MPEG2 IMX NTSC 525/60 30Mb/s (FCP)"),
99         E("mx3p", "MPEG2 IMX NTSC 625/50 30Mb/s (FCP)"),
100
101         E("xdv1", "XDCAM HD 720p30 35Mb/s"),
102         E("xdv2", "XDCAM HD 1080i60 35Mb/s"),
103         E("xdv3", "XDCAM HD 1080i50 35Mb/s"),
104         E("xdv4", "XDCAM HD 720p24 35Mb/s"),
105         E("xdv5", "XDCAM HD 720p25 35Mb/s"),
106         E("xdv6", "XDCAM HD 1080p24 35Mb/s"),
107         E("xdv7", "XDCAM HD 1080p25 35Mb/s"),
108         E("xdv8", "XDCAM HD 1080p30 35Mb/s"),
109         E("xdv9", "XDCAM HD 720p60 35Mb/s"),
110         E("xdva", "XDCAM HD 720p50 35Mb/s"),
111
112         E("xdvb", "XDCAM EX 1080i60 50Mb/s CBR"),
113         E("xdvc", "XDCAM EX 1080i50 50Mb/s CBR"),
114         E("xdvd", "XDCAM EX 1080p24 50Mb/s CBR"),
115         E("xdve", "XDCAM EX 1080p25 50Mb/s CBR"),
116         E("xdvf", "XDCAM EX 1080p30 50Mb/s CBR"),
117
118         E("xd54", "XDCAM HD422 720p24 50Mb/s CBR"),
119         E("xd55", "XDCAM HD422 720p25 50Mb/s CBR"),
120         E("xd59", "XDCAM HD422 720p60 50Mb/s CBR"),
121         E("xd5a", "XDCAM HD422 720p50 50Mb/s CBR"),
122         E("xd5b", "XDCAM HD422 1080i60 50Mb/s CBR"),
123         E("xd5c", "XDCAM HD422 1080i50 50Mb/s CBR"),
124         E("xd5d", "XDCAM HD422 1080p24 50Mb/s CBR"),
125         E("xd5e", "XDCAM HD422 1080p25 50Mb/s CBR"),
126         E("xd5f", "XDCAM HD422 1080p30 50Mb/s CBR"),
127
128         E("xdhd", "XDCAM HD 540p"),
129         E("xdh2", "XDCAM HD422 540p"),
130
131         E("AVmp", "AVID IMX PAL"),
132         E("MMES", "Matrox MPEG-2"),
133         E("mmes", "Matrox MPEG-2"),
134         E("PIM2", "Pinnacle MPEG-2"),
135         E("LMP2", "Lead MPEG-2"),
136
137         E("VCR2", "ATI VCR-2"),
138
139     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
140         A("mp4v"),
141         A("DIVX"),
142         A("divx"),
143         A("MP4S"),
144         A("mp4s"),
145         A("M4S2"),
146         A("m4s2"),
147         A("MP4V"),
148         A("\x04\x00\x00\x00"),
149         A("m4cc"),
150         A("M4CC"),
151         A("FMP4"),
152         A("fmp4"),
153         A("DCOD"),
154         A("MVXM"),
155         A("PM4V"),
156         A("M4T3"),
157         A("GEOX"),
158         A("GEOV"),
159         A("DMK2"),
160         A("WV1F"),
161         A("DIGI"),
162         A("INMC"),
163         A("SN40"),
164         A("EPHV"),
165         A("DM4V"),
166         A("SM4V"),
167         /* XVID flavours */
168         E("xvid", "Xvid MPEG-4 Video"),
169         E("XVID", "Xvid MPEG-4 Video"),
170         E("XviD", "Xvid MPEG-4 Video"),
171         E("XVIX", "Xvid MPEG-4 Video"),
172         E("xvix", "Xvid MPEG-4 Video"),
173         /* DX50 */
174         E("DX50", "DivX MPEG-4 Video"),
175         E("dx50", "DivX MPEG-4 Video"),
176         E("BLZ0", "Blizzard MPEG-4 Video"),
177         E("DXGM", "Electronic Arts Game MPEG-4 Video"),
178         E("DreX", "DreX Mpeg-4"),
179         /* 3ivx delta 4 */
180         E("3IV2", "3ivx MPEG-4 Video"),
181         E("3iv2", "3ivx MPEG-4 Video"),
182         /* Various */
183         E("UMP4", "UB MPEG-4 Video"),
184         E("SEDG", "Samsung MPEG-4 Video"),
185         E("RMP4", "REALmagic MPEG-4 Video"),
186         E("LMP4", "Lead MPEG-4 Video"),
187         E("HDX4", "Jomigo HDX4 (MPEG-4 Video)"),
188         E("hdx4", "Jomigo HDX4 (MPEG-4 Video)"),
189         E("SMP4", "Samsung SMP4 (MPEG-4 Video)"),
190         E("smp4", "Samsung SMP4 (MPEG-4 Video)"),
191         E("fvfw", "FFmpeg MPEG-4"),
192         E("FVFW", "FFmpeg MPEG-4"),
193         E("FFDS", "FFDShow MPEG-4"),
194         E("VIDM", "vidm 4.01 codec"),
195         E("DP02", "DynaPel MPEG-4 codec"),
196         E("PLV1", "Pelco DVR MPEG-4"),
197         E("QMP4", "QNAP Systems MPEG-4"),
198         /* 3ivx delta 3.5 Unsupported
199          * putting it here gives extreme distorted images */
200         //E("3IV1", "3ivx delta 3.5 MPEG-4 Video"),
201         //E("3iv1", "3ivx delta 3.5 MPEG-4 Video"),
202
203     /* MSMPEG4 v1 */
204     B(VLC_CODEC_DIV1, "MS MPEG-4 Video v1"),
205         A("DIV1"),
206         A("div1"),
207         A("MPG4"),
208         A("mpg4"),
209         A("mp41"),
210
211     /* MSMPEG4 v2 */
212     B(VLC_CODEC_DIV2, "MS MPEG-4 Video v2"),
213         A("DIV2"),
214         A("div2"),
215         A("MP42"),
216         A("mp42"),
217
218     /* MSMPEG4 v3 / M$ mpeg4 v3 */
219     B(VLC_CODEC_DIV3, "MS MPEG-4 Video v3"),
220         A("DIV3"),
221         A("MPG3"),
222         A("mpg3"),
223         A("div3"),
224         A("MP43"),
225         A("mp43"),
226         /* DivX 3.20 */
227         A("DIV4"),
228         A("div4"),
229         A("DIV5"),
230         A("div5"),
231         A("DIV6"),
232         A("div6"),
233         E("divf", "DivX 4.12"),
234         E("DIVF", "DivX 4.12"),
235         /* Cool Codec */
236         A("COL1"),
237         A("col1"),
238         A("COL0"),
239         A("col0"),
240         /* AngelPotion stuff */
241         A("AP41"),
242         /* 3ivx doctered divx files */
243         A("3IVD"),
244         A("3ivd"),
245         /* who knows? */
246         A("3VID"),
247         A("3vid"),
248         A("DVX1"),
249         A("DVX3"),
250
251     /* Sorenson v1 */
252     B(VLC_CODEC_SVQ1, "SVQ-1 (Sorenson Video v1)"),
253         A("SVQ1"),
254         A("svq1"),
255         A("svqi"),
256
257     /* Sorenson v3 */
258     B(VLC_CODEC_SVQ3, "SVQ-3 (Sorenson Video v3)"),
259         A("SVQ3"),
260
261     /* HEVC / H.265 */
262     B(VLC_CODEC_HEVC, "MPEG-H Part2/HEVC (H.265)"),
263         A("hevc"),
264         A("HEVC"),
265         A("h265"),
266         A("H265"),
267         A("x265"),
268
269     /* h264 */
270     B(VLC_CODEC_H264, "H264 - MPEG-4 AVC (part 10)"),
271         A("H264"),
272         A("h264"),
273         A("x264"),
274         A("X264"),
275         A("V264"),
276         /* avc1: special case h264 */
277         A("avc1"),
278         A("AVC1"),
279         E("ai5p", "AVC-Intra  50M 720p24/30/60"),
280         E("ai5q", "AVC-Intra  50M 720p25/50"),
281         E("ai52", "AVC-Intra  50M 1080p25/50"),
282         E("ai53", "AVC-Intra  50M 1080p24/30/60"),
283         E("ai55", "AVC-Intra  50M 1080i50"),
284         E("ai56", "AVC-Intra  50M 1080i60"),
285         E("ai1p", "AVC-Intra 100M 720p24/30/60"),
286         E("ai1q", "AVC-Intra 100M 720p25/50"),
287         E("ai12", "AVC-Intra 100M 1080p25/50"),
288         E("ai13", "AVC-Intra 100M 1080p24/30/60"),
289         E("ai15", "AVC-Intra 100M 1080i50"),
290         E("ai16", "AVC-Intra 100M 1080i60"),
291         E("VSSH", "Vanguard VSS H264"),
292         E("VSSW", "Vanguard VSS H264"),
293         E("vssh", "Vanguard VSS H264"),
294         E("DAVC", "Dicas MPEGable H.264/MPEG-4 AVC"),
295         E("davc", "Dicas MPEGable H.264/MPEG-4 AVC"),
296         E("x3eV", "DreX H.264"),
297
298     /* H263 and H263i */
299     /* H263(+) is also known as Real Video 1.0 */
300
301     /* H263 */
302     B(VLC_CODEC_H263, "H263"),
303         A("H263"),
304         A("h263"),
305         A("VX1K"),
306         A("s263"),
307         A("S263"),
308         A("U263"),
309         A("u263"),
310         A("lsvm"),
311         E("D263", "DEC H263"),
312         E("d263", "DEC H263"),
313         E("L263", "LEAD H263"),
314         E("M263", "Microsoft H263"),
315         E("X263", "Xirlink H263"),
316         /* Zygo (partial) */
317         E("ZyGo", "ITU H263+"),
318
319     /* H263i */
320     B(VLC_CODEC_H263I, "I263.I"),
321         A("I263"),
322         A("i263"),
323
324     /* H263P */
325     B(VLC_CODEC_H263P, "ITU H263+"),
326         E("ILVR", "ITU H263+"),
327         E("viv1", "H263+"),
328         E("vivO", "H263+"),
329         E("viv2", "H263+"),
330         E("VIVO", "H263+"),
331         E("U263", "UB H263+"),
332
333     /* Flash (H263) variant */
334     B(VLC_CODEC_FLV1, "Flash Video"),
335         A("FLV1"),
336         A("flv "),
337
338     /* H261 */
339     B(VLC_CODEC_H261, "H.261"),
340         A("H261"),
341         A("h261"),
342
343     B(VLC_CODEC_FLIC, "Flic Video"),
344         A("FLIC"),
345
346     /* MJPEG */
347     B(VLC_CODEC_MJPG, "Motion JPEG Video"),
348         A("MJPG"),
349         A("MJPx"),
350         A("mjpg"),
351         A("mJPG"),
352         A("mjpa"),
353         A("jpeg"),
354         A("JPEG"),
355         A("JFIF"),
356         A("JPGL"),
357         A("AVDJ"),
358         A("MMJP"),
359         A("FLJP"),
360         A("FMJP"),
361         A("SJPG"),
362         A("QIVG"),
363         E("AVRn", "Avid Motion JPEG"),
364         E("AVDJ", "Avid Motion JPEG"),
365         E("ADJV", "Avid Motion JPEG"),
366         E("dmb1", "Motion JPEG OpenDML Video"),
367         E("DMB1", "Motion JPEG OpenDML Video"),
368         E("ijpg", "Intergraph JPEG Video"),
369         E("IJPG", "Intergraph JPEG Video"),
370         E("ACDV", "ACD Systems Digital"),
371         E("SLMJ", "SL M-JPEG"),
372
373     B(VLC_CODEC_MJPGB, "Motion JPEG B Video"),
374         A("mjpb"),
375
376     B(VLC_CODEC_LJPG, "Lead Motion JPEG Video"),
377         A("LJPG"),
378         E("Ljpg", "Lead Motion JPEG"),
379
380     // ? from avcodec/fourcc.c but makes not sense.
381     //{ VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_MJPEG,       VIDEO_ES, "Lead Motion JPEG Video" },
382
383     /* SP5x */
384     B(VLC_CODEC_SP5X, "Sunplus Motion JPEG Video"),
385         A("SP5X"),
386         A("SP53"),
387         A("SP54"),
388         A("SP55"),
389         A("SP56"),
390         A("SP57"),
391         A("SP58"),
392
393     /* DV */
394     B(VLC_CODEC_DV, "DV Video"),
395         A("dv  "),
396         A("dvsl"),
397         A("DVSD"),
398         A("dvsd"),
399         A("DVCS"),
400         A("dvcs"),
401         A("dvhd"),
402         A("dvhq"),
403         A("dvh1"),
404         E("dvh2", "DV Video 720p24"),
405         E("dvh3", "DV Video 720p25"),
406         E("dvh4", "DV Video 720p30"),
407         A("dv25"),
408         A("dc25"),
409         A("dvs1"),
410         A("dvis"),
411         A("CDV2"),
412         A("CDVP"),
413         A("PDVC"),
414         A("IPDV"),
415         A("ipdv"),
416         E("dvcp", "DV Video PAL"),
417         E("dvc ", "DV Video NTSC" ),
418         E("dvp ", "DV Video Pro"),
419         E("dvpp", "DV Video Pro PAL"),
420         E("dv50", "DV Video C Pro 50"),
421         E("dv5p", "DV Video C Pro 50 PAL"),
422         E("dv5n", "DV Video C Pro 50 NTSC"),
423         E("dv1p", "DV Video C Pro 100 PAL" ),
424         E("dv1n", "DV Video C Pro 100 NTSC" ),
425         E("dvhp", "DV Video C Pro HD 720p" ),
426         E("dvh5", "DV Video C Pro HD 1080i50" ),
427         E("dvh6", "DV Video C Pro HD 1080i60" ),
428         E("AVdv", "AVID DV"),
429         E("AVd1", "AVID DV"),
430         E("CDVC", "Canopus DV Video"),
431         E("cdvc", "Canopus DV Video"),
432         E("CDVH", "Canopus DV Video"),
433         E("cdvh", "Canopus DV Video"),
434         E("CDV5", "Canopus DV Video"),
435         E("SLDV", "SoftLab DVCAM codec"),
436
437     /* Windows Media Video */
438     B(VLC_CODEC_WMV1, "Windows Media Video 7"),
439         A("WMV1"),
440         A("wmv1"),
441
442     B(VLC_CODEC_WMV2, "Windows Media Video 8"),
443         A("WMV2"),
444         A("wmv2"),
445
446     B(VLC_CODEC_WMV3, "Windows Media Video 9"),
447         A("WMV3"),
448         A("wmv3"),
449
450     /* WMVA is the VC-1 codec before the standardization proces,
451      * it is not bitstream compatible and deprecated  */
452     B(VLC_CODEC_WMVA, "Windows Media Video Advanced Profile"),
453         A("WMVA"),
454         A("wmva"),
455
456     B(VLC_CODEC_VC1, "Windows Media Video VC1"),
457         A("WVC1"),
458         A("wvc1"),
459         A("vc-1"),
460         A("VC-1"),
461
462     B(VLC_CODEC_WMVP, "Windows Media Video Presentation"),
463         A("WMVP"),
464         A("wmvp"),
465
466     B(VLC_CODEC_WMVP2, "Windows Media Video Presentation, v2"),
467         A("WVP2"),
468         A("wvp2"),
469
470     /* Microsoft Video 1 */
471     B(VLC_CODEC_MSVIDEO1, "Microsoft Video 1"),
472         A("MSVC"),
473         A("msvc"),
474         A("CRAM"),
475         A("cram"),
476         A("WHAM"),
477         A("wham"),
478
479     /* Microsoft RLE */
480     B(VLC_CODEC_MSRLE, "Microsoft RLE Video"),
481         A("mrle"),
482         A("WRLE"),
483         A("\x01\x00\x00\x00"),
484         A("\x02\x00\x00\x00"),
485
486     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
487     B(VLC_CODEC_INDEO3, "Indeo Video v3"),
488         A("IV31"),
489         A("iv31"),
490         A("IV32"),
491         A("iv32"),
492
493     /* Huff YUV */
494     B(VLC_CODEC_HUFFYUV, "Huff YUV Video"),
495         A("HFYU"),
496
497     B(VLC_CODEC_FFVHUFF, "Huff YUV Video"),
498         A("FFVH"),
499
500     /* On2 VP3 Video Codecs */
501     B(VLC_CODEC_VP3, "On2's VP3 Video"),
502         A("VP3 "),
503         A("VP30"),
504         A("vp30"),
505         A("VP31"),
506         A("vp31"),
507
508     /* On2  VP5, VP6 codecs */
509     B(VLC_CODEC_VP5, "On2's VP5 Video"),
510         A("VP5 "),
511         A("VP50"),
512
513     B(VLC_CODEC_VP6, "On2's VP6.2 Video"),
514         A("VP62"),
515         A("vp62"),
516         E("VP60", "On2's VP6.0 Video"),
517         E("VP61", "On2's VP6.1 Video"),
518
519     B(VLC_CODEC_VP6F, "On2's VP6.2 Video (Flash)"),
520         A("VP6F"),
521         A("FLV4"),
522
523     B(VLC_CODEC_VP6A, "On2's VP6 A Video"),
524         A("VP6A"),
525
526     B(VLC_CODEC_VP8, "Google/On2's VP8 Video"),
527         A("VP80"),
528
529     B(VLC_CODEC_VP9, "Google/On2's VP9 Video"),
530         A("VP90"),
531
532
533     /* Xiph.org theora */
534     B(VLC_CODEC_THEORA, "Xiph.org's Theora Video"),
535         A("theo"),
536         A("THEO"),
537         A("Thra"),
538
539     /* Xiph.org tarkin */
540     B(VLC_CODEC_TARKIN, "Xiph.org's Tarkin Video"),
541         A("tark"),
542
543     /* Asus Video (Another thing that doesn't work on PPC) */
544     B(VLC_CODEC_ASV1, "Asus V1 Video"),
545         A("ASV1"),
546     B(VLC_CODEC_ASV2, "Asus V2 Video"),
547         A("ASV2"),
548
549     /* FFMPEG Video 1 (lossless codec) */
550     B(VLC_CODEC_FFV1, "FFMpeg Video 1"),
551         A("FFV1"),
552
553     /* ATI VCR1 */
554     B(VLC_CODEC_VCR1, "ATI VCR1 Video"),
555         A("VCR1"),
556
557     /* Cirrus Logic AccuPak */
558     B(VLC_CODEC_CLJR, "Creative Logic AccuPak"),
559         A("CLJR"),
560
561     /* Real Video */
562     B(VLC_CODEC_RV10, "RealVideo 1.0"),
563         A("RV10"),
564         A("rv10"),
565
566     B(VLC_CODEC_RV13, "RealVideo 1.3"),
567         A("RV13"),
568         A("rv13"),
569
570     B(VLC_CODEC_RV20, "RealVideo G2 (2.0)"),
571         A("RV20"),
572         A("rv20"),
573
574     B(VLC_CODEC_RV30, "RealVideo 8 (3.0)"),
575         A("RV30"),
576         A("rv30"),
577
578     B(VLC_CODEC_RV40, "RealVideo 9/10 (4.0)"),
579         A("RV40"),
580         A("rv40"),
581
582     /* Apple Video */
583     B(VLC_CODEC_RPZA, "Apple Video"),
584         A("rpza"),
585         A("azpr"),
586         A("RPZA"),
587         A("AZPR"),
588
589     B(VLC_CODEC_SMC, "Apple graphics"),
590         A("smc "),
591
592     B(VLC_CODEC_CINEPAK, "Cinepak Video"),
593         A("CVID"),
594         A("cvid"),
595
596     /* Screen Capture Video Codecs */
597     B(VLC_CODEC_TSCC, "TechSmith Camtasia Screen Capture"),
598         A("TSCC"),
599         A("tscc"),
600
601     B(VLC_CODEC_CSCD, "CamStudio Screen Codec"),
602         A("CSCD"),
603         A("cscd"),
604
605     B(VLC_CODEC_ZMBV, "DosBox Capture Codec"),
606         A("ZMBV"),
607
608     B(VLC_CODEC_VMNC, "VMware Video"),
609         A("VMnc"),
610     B(VLC_CODEC_FRAPS, "FRAPS: Realtime Video Capture"),
611         A("FPS1"),
612         A("fps1"),
613
614     /* Duck TrueMotion */
615     B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
616         A("DUCK"),
617         A("PVEZ"),
618     B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
619         A("TM20"),
620
621     B(VLC_CODEC_QTRLE, "Apple QuickTime RLE Video"),
622         A("rle "),
623
624     B(VLC_CODEC_QDRAW, "Apple QuickDraw Video"),
625         A("qdrw"),
626
627     B(VLC_CODEC_QPEG, "QPEG Video"),
628         A("QPEG"),
629         A("Q1.0"),
630         A("Q1.1"),
631
632     B(VLC_CODEC_ULTI, "IBM Ultimotion Video"),
633         A("ULTI"),
634
635     B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
636         A("VIXL"),
637         A("XIXL"),
638         E("PIXL", "Pinnacle VideoXL Video"),
639
640     B(VLC_CODEC_LOCO, "LOCO Video"),
641         A("LOCO"),
642
643     B(VLC_CODEC_WNV1, "Winnov WNV1 Video"),
644         A("WNV1"),
645
646     B(VLC_CODEC_AASC, "Autodesc RLE Video"),
647         A("AASC"),
648
649     B(VLC_CODEC_INDEO2, "Indeo Video v2"),
650         A("IV20"),
651         E("RT21", "Indeo Video 2.1" ),
652
653     /* Flash Screen Video */
654     B(VLC_CODEC_FLASHSV, "Flash Screen Video"),
655         A("FSV1"),
656     B(VLC_CODEC_FLASHSV2, "Flash Screen Video 2"),
657         A("FSV2"),
658
659     B(VLC_CODEC_KMVC, "Karl Morton's Video Codec (Worms)"),
660         A("KMVC"),
661
662     B(VLC_CODEC_NUV, "Nuppel Video"),
663         A("RJPG"),
664         A("NUV1"),
665
666     /* CODEC_ID_SMACKVIDEO */
667     B(VLC_CODEC_SMACKVIDEO, "Smacker Video"),
668         A("SMK2"),
669         A("SMK4"),
670
671     /* Chinese AVS - Untested */
672     B(VLC_CODEC_CAVS, "Chinese AVS"),
673         A("CAVS"),
674         A("AVs2"),
675         A("avs2"),
676
677     B(VLC_CODEC_AMV, "AMV"),
678
679     /* */
680     B(VLC_CODEC_DNXHD, "DNxHD"),
681         A("AVdn"),
682     B(VLC_CODEC_8BPS, "8BPS"),
683         A("8BPS"),
684     B(VLC_CODEC_MIMIC, "Mimic"),
685         A("ML2O"),
686
687     B(VLC_CODEC_CDG, "CD-G Video"),
688         A("CDG "),
689
690     B(VLC_CODEC_FRWU, "Forward Uncompressed" ),
691         A("FRWU"),
692
693     B(VLC_CODEC_INDEO4, "Indeo Video v4"),
694         A("IV41"),
695         A("iv41"),
696
697     B(VLC_CODEC_INDEO5, "Indeo Video v5"),
698         A("IV50"),
699         A("iv50"),
700
701     B(VLC_CODEC_PRORES, "Apple ProRes"),
702         E("apcn", "Apple ProRes 422 Standard"),
703         E("apch", "Apple ProRes 422 HQ"),
704         E("apcs", "Apple ProRes 422 LT"),
705         E("apco", "Apple ProRes 422 Proxy"),
706         E("ap4c", "Apple ProRes 4444"),
707         E("ap4h", "Apple ProRes 4444"),
708
709     B(VLC_CODEC_ICOD, "Apple Intermediate Codec"),
710         A("icod"),
711
712     /* */
713     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
714         A("YV12"),
715         A("yv12"),
716     B(VLC_CODEC_YV9,  "Planar 4:1:0 YVU"),
717         A("YVU9"),
718     B(VLC_CODEC_I410, "Planar 4:1:0 YUV"),
719         A("I410"),
720     B(VLC_CODEC_I411, "Planar 4:1:1 YUV"),
721         A("I411"),
722     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
723         A("I420"),
724         A("IYUV"),
725     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
726         A("I422"),
727     B(VLC_CODEC_I440, "Planar 4:4:0 YUV"),
728         A("I440"),
729     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
730         A("I444"),
731
732     B(VLC_CODEC_J420, "Planar 4:2:0 YUV full scale"),
733         A("J420"),
734     B(VLC_CODEC_J422, "Planar 4:2:2 YUV full scale"),
735         A("J422"),
736     B(VLC_CODEC_J440, "Planar 4:4:0 YUV full scale"),
737         A("J440"),
738     B(VLC_CODEC_J444, "Planar 4:4:4 YUV full scale"),
739         A("J444"),
740
741     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
742         A("YUVP"),
743
744     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
745         A("YUVA"),
746     B(VLC_CODEC_YUV420A, "Planar YUV 4:2:0 Y:U:V:A"),
747         A("I40A"),
748     B(VLC_CODEC_YUV422A, "Planar YUV 4:2:2 Y:U:V:A"),
749         A("I42A"),
750
751     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
752         A("RGBP"),
753
754     B(VLC_CODEC_RGB8, "8 bits RGB"),
755         A("RGB2"),
756     B(VLC_CODEC_RGB12, "12 bits RGB"),
757         A("RV12"),
758     B(VLC_CODEC_RGBA16, "16 bits RGBA"),
759         A("AV16"),
760     B(VLC_CODEC_RGB15, "15 bits RGB"),
761         A("RV15"),
762     B(VLC_CODEC_RGBT, "16 bits RGBT"),
763         A("RGBT"),
764     B(VLC_CODEC_RGB16, "16 bits RGB"),
765         A("RV16"),
766     B(VLC_CODEC_RGB24, "24 bits RGB"),
767         A("RV24"),
768     B(VLC_CODEC_RGB32, "32 bits RGB"),
769         A("RV32"),
770     B(VLC_CODEC_RGBA, "32 bits RGBA"),
771         A("RGBA"),
772         A("AV32"),
773
774     B(VLC_CODEC_GREY, "8 bits greyscale"),
775         A("GREY"),
776         A("Y800"),
777         A("Y8  "),
778
779     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
780         A("UYVY"),
781         A("UYNV"),
782         A("UYNY"),
783         A("Y422"),
784         A("HDYC"),
785         A("AVUI"),
786         A("uyv1"),
787         A("2vuy"),
788         A("2Vuy"),
789         A("2Vu1"),
790     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
791         A("VYUY"),
792     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
793         A("YUY2"),
794         A("YUYV"),
795         A("YUNV"),
796         A("V422"),
797     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
798         A("YVYU"),
799
800     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
801         A("Y211"),
802     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
803         A("cyuv"),
804         A("CYUV"),
805
806     B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
807         A("v210"),
808
809     B(VLC_CODEC_NV12, "Biplanar 4:2:0 Y/UV"),
810         A("NV12"),
811     B(VLC_CODEC_NV21, "Biplanar 4:2:0 Y/VU"),
812         A("NV21"),
813     B(VLC_CODEC_NV16, "Biplanar 4:2:2 Y/UV"),
814         A("NV16"),
815     B(VLC_CODEC_NV61, "Biplanar 4:2:2 Y/VU"),
816         A("NV61"),
817
818     B(VLC_CODEC_I420_9L, "Planar 4:2:0 YUV 9-bit LE"),
819         A("I09L"),
820     B(VLC_CODEC_I420_9B, "Planar 4:2:0 YUV 9-bit BE"),
821         A("I09B"),
822     B(VLC_CODEC_I422_9L, "Planar 4:2:2 YUV 9-bit LE"),
823         A("I29L"),
824     B(VLC_CODEC_I422_9B, "Planar 4:2:2 YUV 9-bit BE"),
825         A("I29B"),
826     B(VLC_CODEC_I444_9L, "Planar 4:4:4 YUV 9-bit LE"),
827         A("I49L"),
828     B(VLC_CODEC_I444_9B, "Planar 4:4:4 YUV 9-bit BE"),
829         A("I49B"),
830
831     B(VLC_CODEC_I420_10L, "Planar 4:2:0 YUV 10-bit LE"),
832         A("I0AL"),
833     B(VLC_CODEC_I420_10B, "Planar 4:2:0 YUV 10-bit BE"),
834         A("I0AB"),
835     B(VLC_CODEC_I422_10L, "Planar 4:2:2 YUV 10-bit LE"),
836         A("I2AL"),
837     B(VLC_CODEC_I422_10B, "Planar 4:2:2 YUV 10-bit BE"),
838         A("I2AB"),
839     B(VLC_CODEC_I444_10L, "Planar 4:4:4 YUV 10-bit LE"),
840         A("I4AL"),
841     B(VLC_CODEC_I444_10B, "Planar 4:4:4 YUV 10-bit BE"),
842         A("I4AB"),
843
844     /* XYZ color space */
845     B(VLC_CODEC_XYZ12, "Packed XYZ 12-bit BE"),
846         A("XY12"),
847
848     /* Videogames Codecs */
849
850     /* Interplay MVE */
851     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
852         A("imve"),
853         A("INPV"),
854
855     /* Id Quake II CIN */
856     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
857         A("IDCI"),
858
859     /* 4X Technologies */
860     B(VLC_CODEC_4XM, "4X Technologies Video"),
861         A("4XMV"),
862         A("4xmv"),
863
864     /* Id RoQ */
865     B(VLC_CODEC_ROQ, "Id RoQ Video"),
866         A("RoQv"),
867
868     /* Sony Playstation MDEC */
869     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
870         A("MDEC"),
871
872     /* Sierra VMD */
873     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
874         A("VMDV"),
875         A("vmdv"),
876
877     B(VLC_CODEC_DIRAC, "Dirac" ),
878         A("drac"),
879
880     /* Image */
881     B(VLC_CODEC_PNG, "PNG Image"),
882         A("png "),
883
884     B(VLC_CODEC_PPM, "PPM Image"),
885         A("ppm "),
886
887     B(VLC_CODEC_PGM, "PGM Image"),
888         A("pgm "),
889
890     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
891         A("pgmy"),
892
893     B(VLC_CODEC_PAM, "PAM Image"),
894         A("pam "),
895
896     B(VLC_CODEC_JPEGLS, "JPEG-LS"),
897         A("MJLS"),
898
899     B(VLC_CODEC_JPEG, "JPEG"),
900         A("jpeg"),
901         A("JPEG"),
902
903     B(VLC_CODEC_BMP, "BMP Image"),
904         A("bmp "),
905
906     B(VLC_CODEC_TIFF, "TIFF Image"),
907         A("tiff"),
908
909     B(VLC_CODEC_GIF, "GIF Image"),
910         A("gif "),
911
912
913     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
914         A("tga "),
915         A("mtga"),
916         A("MTGA"),
917
918     B(VLC_CODEC_SGI, "SGI Image"),
919         A("sgi "),
920
921     B(VLC_CODEC_PNM, "Portable Anymap Image"),
922         A("pnm "),
923
924     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
925         A("pcx "),
926
927     B(VLC_CODEC_XWD, "X Window system raster image"),
928
929     B(VLC_CODEC_JPEG2000, "JPEG 2000 Image"),
930         A("JP2K"),
931         A("mjp2"),
932         A("MJP2"),
933         A("MJ2C"),
934         A("LJ2C"),
935         A("LJ2K"),
936
937     B(VLC_CODEC_LAGARITH, "Lagarith Lossless"),
938         A("LAGS"),
939
940     B(VLC_CODEC_MXPEG, "Mxpeg"),
941         A("MXPG"),
942
943     B(VLC_CODEC_CDXL, "Commodore CDXL video format"),
944         A("CDXL"),
945
946     B(VLC_CODEC_BMVVIDEO, "Discworld II BMV video"),
947         A("BMVV"),
948
949     B(VLC_CODEC_UTVIDEO, "Ut Video"),
950         A("ULRA"),
951         A("ULRG"),
952         A("ULY0"),
953         A("ULY2"),
954
955     B(VLC_CODEC_VBLE, "VBLE Lossless"),
956         A("VBLE"),
957
958     B(VLC_CODEC_DXTORY, "Dxtory capture format"),
959         A("xtor"),
960
961     B(VLC_CODEC_MSS1, "Windows Media Video 7 Screen"),
962         A("MSS1"),
963         A("mss1"),
964
965     B(VLC_CODEC_MSS2, "Windows Media Video 9 Screen"),
966         A("MSS2"),
967         A("mss2"),
968
969     B(VLC_CODEC_MSA1, "Microsoft Application Screen Decoder 1"),
970         A("MSA1"),
971
972     B(VLC_CODEC_TSC2, "TechSmith Screen Codec 2"),
973         A("MSA1"),
974         A("tsc2"),
975
976     B(VLC_CODEC_MTS2, "Microsoft Expression Encoder Screen"),
977         A("MTS2"),
978
979     B(0, "")
980 };
981 static const staticentry_t p_list_audio[] = {
982
983     /* Windows Media Audio 1 */
984     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
985         A("WMA1"),
986         A("wma1"),
987
988     /* Windows Media Audio 2 */
989     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
990         A("WMA2"),
991         A("wma2"),
992         A("wma "),
993
994     /* Windows Media Audio Professional */
995     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
996         A("WMAP"),
997         A("wmap"),
998
999     /* Windows Media Audio Lossless */
1000     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
1001         A("WMAL"),
1002         A("wmal"),
1003
1004     /* Windows Media Audio Speech */
1005     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
1006         A("WMAS"),
1007         A("wmas"),
1008
1009     /* DV Audio */
1010     B(VLC_CODEC_DVAUDIO, "DV Audio"),
1011         A("dvau"),
1012         A("vdva"),
1013         A("dvca"),
1014         A("RADV"),
1015
1016     /* MACE-3 Audio */
1017     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
1018         A("MAC3"),
1019
1020     /* MACE-6 Audio */
1021     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
1022         A("MAC6"),
1023
1024     /* MUSEPACK7 Audio */
1025     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
1026         A("MPC "),
1027
1028     /* MUSEPACK8 Audio */
1029     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
1030         A("MPCK"),
1031         A("MPC8"),
1032
1033     /* RealAudio 1.0 */
1034     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
1035         A("14_4"),
1036         A("lpcJ"),
1037
1038     /* RealAudio 2.0 */
1039     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
1040         A("28_8"),
1041
1042     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
1043         A("sipr"),
1044
1045     /* MPEG Audio layer 1/2/3 */
1046     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
1047         A("mpga"),
1048         A("mp2a"),
1049         A(".mp1"),
1050         A(".mp2"),
1051         A("mp3 "),
1052         A(".mp3"),
1053         A("MP3 "),
1054         A("LAME"),
1055         A("ms\x00\x50"),
1056         A("ms\x00\x55"),
1057
1058     /* A52 Audio (aka AC3) */
1059     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
1060         A("a52 "),
1061         A("a52b"),
1062         A("ac-3"),
1063         A("sac3"),
1064         A("ms\x20\x00"),
1065
1066     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
1067         A("eac3"),
1068
1069     /* DTS Audio */
1070     B(VLC_CODEC_DTS, "DTS Audio"),
1071         A("dts "),
1072         A("DTS "),
1073         A("dtsb"),
1074         A("dtsc"),
1075         E("dtse", "DTS Express"),
1076         E("dtsh", "DTS-HD High Resolution Audio"),
1077         E("dtsl", "DTS-HD Lossless"),
1078         A("ms\x20\x01"),
1079
1080     /* AAC audio */
1081     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
1082         A("mp4a"),
1083         A("aac "),
1084         A("AACL"),
1085         A("AACH"),
1086
1087     /* ALS audio */
1088     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
1089         A("als "),
1090
1091     /* 4X Technologies */
1092     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
1093         A("4xma"),
1094
1095     /* EA ADPCM */
1096     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
1097         A("ADEA"),
1098
1099     /* Interplay DPCM */
1100     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
1101         A("idpc"),
1102
1103     /* Id RoQ */
1104     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
1105         A("RoQa"),
1106
1107     /* DCIN Audio */
1108     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
1109         A("DCIA"),
1110
1111     /* Sony Playstation XA ADPCM */
1112     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
1113         A("xa  "),
1114
1115     /* ADX ADPCM */
1116     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
1117         A("adx "),
1118
1119     /* Westwood ADPCM */
1120     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
1121         A("AIWS"),
1122
1123     /* MS ADPCM */
1124     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
1125         A("ms\x00\x02"),
1126
1127     /* Sierra VMD */
1128     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
1129         A("vmda"),
1130
1131     /* G.726 ADPCM */
1132     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
1133         A("g726"),
1134
1135     /* G.722 ADPCM */
1136     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
1137         A("g722"),
1138
1139     /* Flash ADPCM */
1140     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
1141         A("SWFa"),
1142
1143     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
1144         A("ms\x00\x11"),
1145
1146     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
1147         A("imav"),
1148
1149     B(VLC_CODEC_ADPCM_IMA_QT, "IMA QT ADPCM Audio"),
1150         A("ima4"),
1151
1152     B(VLC_CODEC_ADPCM_YAMAHA, "Yamaha ADPCM Audio" ),
1153         A("ms\x00\x20"),
1154
1155     /* AMR */
1156     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1157         A("samr"),
1158
1159     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1160         A("sawb"),
1161
1162     /* FLAC */
1163     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1164         A("flac"),
1165
1166     /* ALAC */
1167     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1168         A("alac"),
1169
1170     /* QDM2 */
1171     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1172         A("QDM2"),
1173
1174     /* COOK */
1175     B(VLC_CODEC_COOK, "Cook Audio"),
1176         A("cook"),
1177
1178     /* TTA: The Lossless True Audio */
1179     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1180         A("TTA1"),
1181
1182     /* Shorten */
1183     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1184         A("shn "),
1185         A("shrn"),
1186
1187     B(VLC_CODEC_WAVPACK, "WavPack"),
1188         A("WVPK"),
1189         A("wvpk"),
1190
1191     B(VLC_CODEC_GSM, "GSM Audio"),
1192         A("gsm "),
1193
1194     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1195         A("agsm"),
1196
1197     B(VLC_CODEC_ATRAC1, "atrac 1"),
1198         A("atr1"),
1199
1200     B(VLC_CODEC_ATRAC3, "atrac 3"),
1201         A("atrc"),
1202         A("\x70\x02\x00\x00"),
1203
1204     B(VLC_CODEC_IMC, "IMC" ),
1205         A("\x01\x04\x00\x00"),
1206
1207     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1208         A("\x22\x00\x00\x00"),
1209
1210     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1211         A("NELL"),
1212         A("nmos"),
1213
1214     B(VLC_CODEC_APE, "Monkey's Audio"),
1215         A("APE "),
1216
1217     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1218         A("mlp "),
1219
1220     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1221         A("trhd"),
1222
1223     B(VLC_CODEC_QCELP, "QCELP Audio"),
1224         A("Qclp"),
1225         A("Qclq"),
1226         A("sqcp"),
1227
1228     B(VLC_CODEC_SPEEX, "Speex Audio"),
1229         A("spx "),
1230         A("spxr"),
1231
1232     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1233         A("vorb"),
1234         A("vor1"),
1235
1236     B(VLC_CODEC_OPUS, "Opus Audio"),
1237         A("Opus"),
1238
1239     B(VLC_CODEC_302M, "302M Audio"),
1240         A("302m"),
1241
1242     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1243         A("lpcm"),
1244
1245     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1246         A("apcm"),
1247
1248     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1249         A("bpcm"),
1250
1251     B(VLC_CODEC_SDDS, "SDDS Audio"),
1252         A("sdds"),
1253         A("sddb"),
1254
1255     B(VLC_CODEC_MIDI, "MIDI Audio"),
1256         A("MIDI"),
1257
1258     B(VLC_CODEC_RALF, "RealAudio Lossless"),
1259         A("LSD:"),
1260
1261     /* G.723.1 */
1262     B(VLC_CODEC_G723_1, "G.723.1 Audio"),
1263         A("g72\x31"),
1264
1265     /* PCM */
1266     B(VLC_CODEC_S8, "PCM S8"),
1267         A("s8  "),
1268
1269     B(VLC_CODEC_U8, "PCM U8"),
1270         A("u8  "),
1271
1272     B(VLC_CODEC_S16L, "PCM S16 LE"),
1273         A("s16l"),
1274
1275     B(VLC_CODEC_S16B, "PCM S16 BE"),
1276         A("s16b"),
1277
1278     B(VLC_CODEC_U16L, "PCM U16 LE"),
1279         A("u16l"),
1280
1281     B(VLC_CODEC_U16B, "PCM U16 BE"),
1282         A("u16b"),
1283
1284     B(VLC_CODEC_S20B, "PCM S20 BE"),
1285
1286     B(VLC_CODEC_S24L, "PCM S24 LE"),
1287         A("s24l"),
1288         A("42ni"),  /* Quicktime */
1289
1290     B(VLC_CODEC_S24B, "PCM S24 BE"),
1291         A("s24b"),
1292         A("in24"),  /* Quicktime */
1293
1294     B(VLC_CODEC_U24L, "PCM U24 LE"),
1295         A("u24l"),
1296
1297     B(VLC_CODEC_U24B, "PCM U24 BE"),
1298         A("u24b"),
1299
1300     B(VLC_CODEC_S24L32, "PCM S24 in 32 LE"),
1301
1302     B(VLC_CODEC_S24B32, "PCM S24 in 32 BE"),
1303
1304     B(VLC_CODEC_S32L, "PCM S32 LE"),
1305         A("s32l"),
1306         A("23ni"),  /* Quicktime */
1307
1308     B(VLC_CODEC_S32B, "PCM S32 BE"),
1309         A("s32b"),
1310         A("in32"),  /* Quicktime */
1311
1312     B(VLC_CODEC_U32L, "PCM U32 LE"),
1313         A("u32l"),
1314
1315     B(VLC_CODEC_U32B, "PCM U32 BE"),
1316         A("u32b"),
1317
1318     B(VLC_CODEC_ALAW, "PCM ALAW"),
1319         A("alaw"),
1320
1321     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1322         A("mlaw"),
1323         A("ulaw"),
1324
1325     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1326
1327     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1328         A("daud"),
1329
1330     B(VLC_CODEC_F32L, "32 bits float LE"),
1331         A("f32l"),
1332         A("fl32"),
1333
1334     B(VLC_CODEC_F32B, "32 bits float BE"),
1335         A("f32b"),
1336
1337     B(VLC_CODEC_F64L, "64 bits float LE"),
1338         A("f64l"),
1339
1340     B(VLC_CODEC_F64L, "64 bits float BE"),
1341         A("f64b"),
1342
1343     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1344         A("TWIN"),
1345
1346     B(VLC_CODEC_BMVAUDIO, "Discworld II BMV audio"),
1347         A("BMVA"),
1348
1349     B(VLC_CODEC_ULEAD_DV_AUDIO_NTSC, "Ulead DV audio NTSC"),
1350         A("ms\x02\x15"),
1351     B(VLC_CODEC_ULEAD_DV_AUDIO_PAL, "Ulead DV audio PAL"),
1352         A("ms\x02\x16"),
1353
1354     B(VLC_CODEC_INDEO_AUDIO, "Indeo Audio Coder"),
1355         A("ms\x04\x02"),
1356
1357     B(0, "")
1358 };
1359 static const staticentry_t p_list_spu[] = {
1360
1361     B(VLC_CODEC_SPU, "DVD Subtitles"),
1362         A("spu "),
1363         A("spub"),
1364
1365     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1366         A("dvbs"),
1367
1368     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1369         A("subt"),
1370
1371     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1372         A("XSUB"),
1373         A("xsub"),
1374         A("DXSB"),
1375
1376     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1377         A("ssa "),
1378
1379     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1380         A("TEXT"),
1381
1382     B(VLC_CODEC_TELETEXT, "Teletext"),
1383         A("telx"),
1384
1385     B(VLC_CODEC_KATE, "Kate subtitles"),
1386         A("kate"),
1387
1388     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1389         A("cmml"),
1390
1391     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1392         A("t140"),
1393
1394     B(VLC_CODEC_USF, "USF subtitles"),
1395         A("usf "),
1396
1397     B(VLC_CODEC_OGT, "OGT subtitles"),
1398         A("ogt "),
1399
1400     B(VLC_CODEC_CVD, "CVD subtitles"),
1401         A("cvd "),
1402
1403     B(VLC_CODEC_BD_PG, "BD subtitles"),
1404         A("bdpg"),
1405
1406     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1407         A("STL "),
1408
1409     B(VLC_CODEC_SCTE_27, "SCTE-27 subtitles"),
1410         A("SC27"),
1411
1412     B(0, "")
1413 };
1414
1415 /* Create a fourcc from a string.
1416  * XXX it assumes that the string is at least four bytes */
1417 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1418 {
1419     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1420                        psz_fourcc[2], psz_fourcc[3] );
1421 }
1422
1423 /* */
1424 static entry_t Lookup( const staticentry_t p_list[], vlc_fourcc_t i_fourcc )
1425 {
1426     const char *p_class = NULL;
1427     const char *psz_description = NULL;
1428
1429     entry_t e = B(0, "");
1430
1431     for( int i = 0; ; i++ )
1432     {
1433         const staticentry_t *p = &p_list[i];
1434         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1435         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1436
1437         if( i_entry_fourcc == 0 )
1438             break;
1439
1440         if( i_entry_class != 0 )
1441         {
1442             p_class = p->p_class;
1443             psz_description = p->psz_description;
1444         }
1445
1446         if( i_entry_fourcc == i_fourcc )
1447         {
1448             assert( p_class != NULL );
1449
1450             memcpy( e.p_class, p_class, 4 );
1451             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1452             e.psz_description = p->psz_description ?
1453                                 p->psz_description : psz_description;
1454             break;
1455         }
1456     }
1457     return e;
1458 }
1459
1460 /* */
1461 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1462 {
1463     entry_t e;
1464
1465     switch( i_cat )
1466     {
1467     case VIDEO_ES:
1468         return Lookup( p_list_video, i_fourcc );
1469     case AUDIO_ES:
1470         return Lookup( p_list_audio, i_fourcc );
1471     case SPU_ES:
1472         return Lookup( p_list_spu, i_fourcc );
1473
1474     default:
1475         e = Find( VIDEO_ES, i_fourcc );
1476         if( CreateFourcc( e.p_class ) == 0 )
1477             e = Find( AUDIO_ES, i_fourcc );
1478         if( CreateFourcc( e.p_class ) == 0 )
1479             e = Find( SPU_ES, i_fourcc );
1480         return e;
1481     }
1482 }
1483
1484 /* */
1485 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1486 {
1487     entry_t e = Find( i_cat, i_fourcc );
1488
1489     if( CreateFourcc( e.p_class ) == 0 )
1490         return i_fourcc;
1491     return CreateFourcc( e.p_class );
1492 }
1493
1494 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1495 {
1496     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1497         return 0;
1498     return vlc_fourcc_GetCodec( i_cat,
1499                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1500                                             psz_fourcc[2], psz_fourcc[3] ) );
1501 }
1502
1503 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1504 {
1505     const int i_bytes = ( i_bits + 7 ) / 8;
1506
1507     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1508     {
1509         switch( i_bytes )
1510         {
1511         case 4:
1512             return VLC_CODEC_FL32;
1513         case 8:
1514             return VLC_CODEC_FL64;
1515         default:
1516             return 0;
1517         }
1518     }
1519     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
1520     {
1521         switch( i_bytes )
1522         {
1523         case 1:
1524             return VLC_CODEC_U8;
1525         case 2:
1526             return VLC_CODEC_S16L;
1527         case 3:
1528             return VLC_CODEC_S24L;
1529             break;
1530         case 4:
1531             return VLC_CODEC_S32L;
1532         default:
1533             return 0;
1534         }
1535     }
1536     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1537     {
1538         switch( i_bytes )
1539         {
1540         case 1:
1541             return VLC_CODEC_S8;
1542         case 2:
1543             return VLC_CODEC_S16B;
1544         case 3:
1545             return VLC_CODEC_S24B;
1546         case 4:
1547             return VLC_CODEC_S32B;
1548         default:
1549             return 0;
1550         }
1551     }
1552     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1553     {
1554         switch( i_bytes )
1555         {
1556         case 1:
1557             return VLC_CODEC_S8;
1558         case 2:
1559             return VLC_CODEC_S16L;
1560         case 3:
1561             return VLC_CODEC_S24L;
1562         case 4:
1563             return VLC_CODEC_S32L;
1564         default:
1565             return 0;
1566         }
1567     }
1568     else
1569     {
1570         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1571     }
1572 }
1573
1574 /* */
1575 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1576 {
1577     entry_t e = Find( i_cat, i_fourcc );
1578
1579     return e.psz_description;
1580 }
1581
1582
1583 /* */
1584 #define VLC_CODEC_YUV_PLANAR_410 \
1585     VLC_CODEC_I410, VLC_CODEC_YV9
1586
1587 #define VLC_CODEC_YUV_PLANAR_420 \
1588     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1589
1590 #define VLC_CODEC_YUV_SEMIPLANAR_420 \
1591     VLC_CODEC_NV12, VLC_CODEC_NV21
1592
1593 #define VLC_CODEC_YUV_PLANAR_420_16 \
1594     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1595
1596 #define VLC_CODEC_YUV_PLANAR_422 \
1597     VLC_CODEC_I422, VLC_CODEC_J422
1598
1599 #define VLC_CODEC_YUV_PLANAR_422_16 \
1600     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1601
1602 #define VLC_CODEC_YUV_PLANAR_440 \
1603     VLC_CODEC_I440, VLC_CODEC_J440
1604
1605 #define VLC_CODEC_YUV_PLANAR_444 \
1606     VLC_CODEC_I444, VLC_CODEC_J444
1607
1608 #define VLC_CODEC_YUV_PLANAR_444_16 \
1609     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1610
1611 #define VLC_CODEC_YUV_PACKED \
1612     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1613     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1614
1615 #define VLC_CODEC_FALLBACK_420 \
1616     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1617     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1618     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1619
1620 static const vlc_fourcc_t p_I420_fallback[] = {
1621     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1622 };
1623 static const vlc_fourcc_t p_J420_fallback[] = {
1624     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1625 };
1626 static const vlc_fourcc_t p_YV12_fallback[] = {
1627     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1628 };
1629
1630 #define VLC_CODEC_FALLBACK_420_16 \
1631     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1632
1633 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1634     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1635 };
1636 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1637     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1638 };
1639 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1640     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1641 };
1642 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1643     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1644 };
1645
1646 #define VLC_CODEC_FALLBACK_422 \
1647     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1648     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1649     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1650
1651 static const vlc_fourcc_t p_I422_fallback[] = {
1652     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1653 };
1654 static const vlc_fourcc_t p_J422_fallback[] = {
1655     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1656 };
1657
1658 #define VLC_CODEC_FALLBACK_422_16 \
1659     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1660
1661 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1662     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1663 };
1664 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1665     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1666 };
1667 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1668     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1669 };
1670 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1671     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1672 };
1673
1674 #define VLC_CODEC_FALLBACK_444 \
1675     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1676     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1677     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1678
1679 static const vlc_fourcc_t p_I444_fallback[] = {
1680     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1681 };
1682 static const vlc_fourcc_t p_J444_fallback[] = {
1683     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1684 };
1685
1686 #define VLC_CODEC_FALLBACK_444_16 \
1687     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1688
1689 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1690     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1691 };
1692 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1693     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1694 };
1695 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1696     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1697 };
1698 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1699     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1700 };
1701
1702 static const vlc_fourcc_t p_I440_fallback[] = {
1703     VLC_CODEC_I440,
1704     VLC_CODEC_YUV_PLANAR_420,
1705     VLC_CODEC_YUV_PLANAR_422,
1706     VLC_CODEC_YUV_PLANAR_444,
1707     VLC_CODEC_YUV_PACKED,
1708     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1709 };
1710
1711 #define VLC_CODEC_FALLBACK_PACKED \
1712     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1713     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1714     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1715
1716 static const vlc_fourcc_t p_YUYV_fallback[] = {
1717     VLC_CODEC_YUYV,
1718     VLC_CODEC_YVYU,
1719     VLC_CODEC_UYVY,
1720     VLC_CODEC_VYUY,
1721     VLC_CODEC_FALLBACK_PACKED, 0
1722 };
1723 static const vlc_fourcc_t p_YVYU_fallback[] = {
1724     VLC_CODEC_YVYU,
1725     VLC_CODEC_YUYV,
1726     VLC_CODEC_UYVY,
1727     VLC_CODEC_VYUY,
1728     VLC_CODEC_FALLBACK_PACKED, 0
1729 };
1730 static const vlc_fourcc_t p_UYVY_fallback[] = {
1731     VLC_CODEC_UYVY,
1732     VLC_CODEC_VYUY,
1733     VLC_CODEC_YUYV,
1734     VLC_CODEC_YVYU,
1735     VLC_CODEC_FALLBACK_PACKED, 0
1736 };
1737 static const vlc_fourcc_t p_VYUY_fallback[] = {
1738     VLC_CODEC_VYUY,
1739     VLC_CODEC_UYVY,
1740     VLC_CODEC_YUYV,
1741     VLC_CODEC_YVYU,
1742     VLC_CODEC_FALLBACK_PACKED, 0
1743 };
1744
1745 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1746     p_YV12_fallback,
1747     p_I420_fallback,
1748     p_I420_9L_fallback,
1749     p_I420_9B_fallback,
1750     p_I420_10L_fallback,
1751     p_I420_10B_fallback,
1752     p_J420_fallback,
1753     p_I422_fallback,
1754     p_I422_9L_fallback,
1755     p_I422_9B_fallback,
1756     p_I422_10L_fallback,
1757     p_I422_10B_fallback,
1758     p_J422_fallback,
1759     p_I444_fallback,
1760     p_J444_fallback,
1761     p_I444_9L_fallback,
1762     p_I444_9B_fallback,
1763     p_I444_10L_fallback,
1764     p_I444_10B_fallback,
1765     p_I440_fallback,
1766     p_YUYV_fallback,
1767     p_YVYU_fallback,
1768     p_UYVY_fallback,
1769     p_VYUY_fallback,
1770
1771
1772     NULL,
1773 };
1774
1775 static const vlc_fourcc_t p_list_YUV[] = {
1776     VLC_CODEC_YUV_PLANAR_420,
1777     VLC_CODEC_YUV_SEMIPLANAR_420,
1778     VLC_CODEC_YUV_PLANAR_422,
1779     VLC_CODEC_YUV_PLANAR_440,
1780     VLC_CODEC_YUV_PLANAR_444,
1781     VLC_CODEC_YUV_PACKED,
1782     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1783     VLC_CODEC_YUV_PLANAR_420_16,
1784     VLC_CODEC_YUV_PLANAR_422_16,
1785     VLC_CODEC_YUV_PLANAR_444_16,
1786     0,
1787 };
1788
1789 /* */
1790 static const vlc_fourcc_t p_RGB32_fallback[] = {
1791     VLC_CODEC_RGB32,
1792     VLC_CODEC_RGB24,
1793     VLC_CODEC_RGB16,
1794     VLC_CODEC_RGB15,
1795     VLC_CODEC_RGB8,
1796     0,
1797 };
1798 static const vlc_fourcc_t p_RGB24_fallback[] = {
1799     VLC_CODEC_RGB24,
1800     VLC_CODEC_RGB32,
1801     VLC_CODEC_RGB16,
1802     VLC_CODEC_RGB15,
1803     VLC_CODEC_RGB8,
1804     0,
1805 };
1806 static const vlc_fourcc_t p_RGB16_fallback[] = {
1807     VLC_CODEC_RGB16,
1808     VLC_CODEC_RGB24,
1809     VLC_CODEC_RGB32,
1810     VLC_CODEC_RGB15,
1811     VLC_CODEC_RGB8,
1812     0,
1813 };
1814 static const vlc_fourcc_t p_RGB15_fallback[] = {
1815     VLC_CODEC_RGB15,
1816     VLC_CODEC_RGB16,
1817     VLC_CODEC_RGB24,
1818     VLC_CODEC_RGB32,
1819     VLC_CODEC_RGB8,
1820     0,
1821 };
1822 static const vlc_fourcc_t p_RGB8_fallback[] = {
1823     VLC_CODEC_RGB8,
1824     VLC_CODEC_RGB15,
1825     VLC_CODEC_RGB16,
1826     VLC_CODEC_RGB24,
1827     VLC_CODEC_RGB32,
1828     0,
1829 };
1830 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1831     p_RGB32_fallback,
1832     p_RGB24_fallback,
1833     p_RGB16_fallback,
1834     p_RGB15_fallback,
1835     p_RGB8_fallback,
1836     NULL,
1837 };
1838
1839
1840 /* */
1841 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1842                                         const vlc_fourcc_t *pp_fallback[],
1843                                         const vlc_fourcc_t p_list[] )
1844 {
1845     for( unsigned i = 0; pp_fallback[i]; i++ )
1846     {
1847         if( pp_fallback[i][0] == i_fourcc )
1848             return pp_fallback[i];
1849     }
1850     return p_list;
1851 }
1852
1853 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1854 {
1855     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1856 }
1857 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1858 {
1859     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1860 }
1861
1862 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1863 {
1864     static const vlc_fourcc_t pp_swapped[][4] = {
1865         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1866         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1867         { 0 }
1868     };
1869
1870     for( int i = 0; pp_swapped[i][0]; i++ )
1871     {
1872         if( pp_swapped[i][0] == b )
1873         {
1874             vlc_fourcc_t t = a;
1875             a = b;
1876             b = t;
1877         }
1878         if( pp_swapped[i][0] != a )
1879             continue;
1880         for( int j = 1; pp_swapped[i][j]; j++ )
1881         {
1882             if( pp_swapped[i][j] == b )
1883                 return true;
1884         }
1885     }
1886     return false;
1887 }
1888
1889 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1890 {
1891     for( unsigned i = 0; p_list_YUV[i]; i++ )
1892     {
1893         if( p_list_YUV[i] == fcc )
1894             return true;
1895     }
1896     return false;
1897 }
1898
1899 #define PLANAR(n, w_den, h_den, size, bits) \
1900     { .plane_count = n, \
1901       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1902              {.w = {1,w_den}, .h = {1,h_den}}, \
1903              {.w = {1,w_den}, .h = {1,h_den}}, \
1904              {.w = {1,    1}, .h = {1,    1}} }, \
1905       .pixel_size = size, \
1906       .pixel_bits = bits }
1907
1908 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
1909 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
1910
1911 #define PACKED_FMT(size, bits) \
1912     { .plane_count = 1, \
1913       .p = { {.w = {1,1}, .h = {1,1}} }, \
1914       .pixel_size = size, \
1915       .pixel_bits = bits }
1916
1917 static const struct
1918 {
1919     vlc_fourcc_t             p_fourcc[6];
1920     vlc_chroma_description_t description;
1921 } p_list_chroma_description[] = {
1922     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
1923     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
1924     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
1925     { { VLC_CODEC_NV12, VLC_CODEC_NV21, 0 },   PLANAR_8(2, 1, 2) },
1926     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
1927     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
1928     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
1929     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
1930     { { VLC_CODEC_YUV420A, 0 },                PLANAR_8(4, 2, 2) },
1931     { { VLC_CODEC_YUV422A, 0 },                PLANAR_8(4, 2, 1) },
1932
1933     { { VLC_CODEC_I420_10L,
1934         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2, 10) },
1935     { { VLC_CODEC_I420_9L,
1936         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2,  9) },
1937     { { VLC_CODEC_I422_10L,
1938         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1, 10) },
1939     { { VLC_CODEC_I422_9L,
1940         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1,  9) },
1941     { { VLC_CODEC_I444_10L,
1942         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1, 10) },
1943     { { VLC_CODEC_I444_9L,
1944         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1,  9) },
1945
1946     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2, 16) },
1947     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1948         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1, 8) },
1949
1950     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
1951     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
1952     { { VLC_CODEC_RGB16, VLC_CODEC_RGBT,
1953         VLC_CODEC_RGBA16, 0 },                 PACKED_FMT(2, 16) },
1954     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
1955     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
1956     { { VLC_CODEC_RGBA,  0 },                  PACKED_FMT(4, 32) },
1957
1958     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
1959     { { VLC_CODEC_XYZ12,  0 },                 PACKED_FMT(6, 48) },
1960
1961     { {0}, { 0, {}, 0, 0 } }
1962 };
1963
1964 #undef PACKED_FMT
1965 #undef PLANAR_16
1966 #undef PLANAR_8
1967 #undef PLANAR
1968
1969 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1970 {
1971     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1972     {
1973         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1974         for( unsigned j = 0; p_fourcc[j]; j++ )
1975         {
1976             if( p_fourcc[j] == i_fourcc )
1977                 return &p_list_chroma_description[i].description;
1978         }
1979     }
1980     return NULL;
1981 }