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