]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
avcodec: map Auravision AURA
[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     B(VLC_CODEC_BINKVIDEO, "Bink Video"),
682
683     B(VLC_CODEC_BINKAUDIO_DCT, "Bink Audio (DCT)"),
684
685     B(VLC_CODEC_BINKAUDIO_RDFT, "Bink Audio (RDFT)"),
686
687     /* */
688     B(VLC_CODEC_DNXHD, "DNxHD"),
689         A("AVdn"),
690     B(VLC_CODEC_8BPS, "8BPS"),
691         A("8BPS"),
692     B(VLC_CODEC_MIMIC, "Mimic"),
693         A("ML2O"),
694
695     B(VLC_CODEC_CDG, "CD-G Video"),
696         A("CDG "),
697
698     B(VLC_CODEC_FRWU, "Forward Uncompressed" ),
699         A("FRWU"),
700
701     B(VLC_CODEC_INDEO4, "Indeo Video v4"),
702         A("IV41"),
703         A("iv41"),
704
705     B(VLC_CODEC_INDEO5, "Indeo Video v5"),
706         A("IV50"),
707         A("iv50"),
708
709     B(VLC_CODEC_PRORES, "Apple ProRes"),
710         E("apcn", "Apple ProRes 422 Standard"),
711         E("apch", "Apple ProRes 422 HQ"),
712         E("apcs", "Apple ProRes 422 LT"),
713         E("apco", "Apple ProRes 422 Proxy"),
714         E("ap4c", "Apple ProRes 4444"),
715         E("ap4h", "Apple ProRes 4444"),
716
717     B(VLC_CODEC_ICOD, "Apple Intermediate Codec"),
718         A("icod"),
719
720     B(VLC_CODEC_G2M2, "GoTo Meeting Codec 2"),
721         A("G2M2"),
722
723     B(VLC_CODEC_G2M3, "GoTo Meeting Codec 3"),
724         A("G2M3"),
725
726     B(VLC_CODEC_G2M4, "GoTo Meeting Codec 4"),
727         A("G2M4"),
728
729     /* */
730     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
731         A("YV12"),
732         A("yv12"),
733     B(VLC_CODEC_YV9,  "Planar 4:1:0 YVU"),
734         A("YVU9"),
735     B(VLC_CODEC_I410, "Planar 4:1:0 YUV"),
736         A("I410"),
737     B(VLC_CODEC_I411, "Planar 4:1:1 YUV"),
738         A("I411"),
739     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
740         A("I420"),
741         A("IYUV"),
742     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
743         A("I422"),
744     B(VLC_CODEC_I440, "Planar 4:4:0 YUV"),
745         A("I440"),
746     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
747         A("I444"),
748
749     B(VLC_CODEC_J420, "Planar 4:2:0 YUV full scale"),
750         A("J420"),
751     B(VLC_CODEC_J422, "Planar 4:2:2 YUV full scale"),
752         A("J422"),
753     B(VLC_CODEC_J440, "Planar 4:4:0 YUV full scale"),
754         A("J440"),
755     B(VLC_CODEC_J444, "Planar 4:4:4 YUV full scale"),
756         A("J444"),
757
758     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
759         A("YUVP"),
760
761     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
762         A("YUVA"),
763     B(VLC_CODEC_YUV420A, "Planar YUV 4:2:0 Y:U:V:A"),
764         A("I40A"),
765     B(VLC_CODEC_YUV422A, "Planar YUV 4:2:2 Y:U:V:A"),
766         A("I42A"),
767
768     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
769         A("RGBP"),
770
771     B(VLC_CODEC_RGB8, "8 bits RGB"),
772         A("RGB2"),
773     B(VLC_CODEC_RGB12, "12 bits RGB"),
774         A("RV12"),
775     B(VLC_CODEC_RGBA16, "16 bits RGBA"),
776         A("AV16"),
777     B(VLC_CODEC_RGB15, "15 bits RGB"),
778         A("RV15"),
779     B(VLC_CODEC_RGBT, "16 bits RGBT"),
780         A("RGBT"),
781     B(VLC_CODEC_RGB16, "16 bits RGB"),
782         A("RV16"),
783     B(VLC_CODEC_RGB24, "24 bits RGB"),
784         A("RV24"),
785     B(VLC_CODEC_RGB32, "32 bits RGB"),
786         A("RV32"),
787     B(VLC_CODEC_RGBA, "32 bits RGBA"),
788         A("RGBA"),
789     B(VLC_CODEC_RGBA, "32 bits ARGB"),
790         A("ARGB"),
791         A("AV32"),
792
793     B(VLC_CODEC_GREY, "8 bits greyscale"),
794         A("GREY"),
795         A("Y800"),
796         A("Y8  "),
797
798     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
799         A("UYVY"),
800         A("UYNV"),
801         A("UYNY"),
802         A("Y422"),
803         A("HDYC"),
804         A("AVUI"),
805         A("uyv1"),
806         A("2vuy"),
807         A("2Vuy"),
808         A("2Vu1"),
809     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
810         A("VYUY"),
811     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
812         A("YUY2"),
813         A("YUYV"),
814         A("YUNV"),
815         A("V422"),
816     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
817         A("YVYU"),
818
819     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
820         A("Y211"),
821     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
822         A("cyuv"),
823         A("CYUV"),
824
825     B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
826         A("v210"),
827
828     B(VLC_CODEC_NV12, "Biplanar 4:2:0 Y/UV"),
829         A("NV12"),
830     B(VLC_CODEC_NV21, "Biplanar 4:2:0 Y/VU"),
831         A("NV21"),
832     B(VLC_CODEC_NV16, "Biplanar 4:2:2 Y/UV"),
833         A("NV16"),
834     B(VLC_CODEC_NV61, "Biplanar 4:2:2 Y/VU"),
835         A("NV61"),
836     B(VLC_CODEC_NV24, "Biplanar 4:4:4 Y/UV"),
837         A("NV24"),
838     B(VLC_CODEC_NV42, "Biplanar 4:4:4 Y/VU"),
839         A("NV42"),
840
841     B(VLC_CODEC_I420_9L, "Planar 4:2:0 YUV 9-bit LE"),
842         A("I09L"),
843     B(VLC_CODEC_I420_9B, "Planar 4:2:0 YUV 9-bit BE"),
844         A("I09B"),
845     B(VLC_CODEC_I422_9L, "Planar 4:2:2 YUV 9-bit LE"),
846         A("I29L"),
847     B(VLC_CODEC_I422_9B, "Planar 4:2:2 YUV 9-bit BE"),
848         A("I29B"),
849     B(VLC_CODEC_I444_9L, "Planar 4:4:4 YUV 9-bit LE"),
850         A("I49L"),
851     B(VLC_CODEC_I444_9B, "Planar 4:4:4 YUV 9-bit BE"),
852         A("I49B"),
853
854     B(VLC_CODEC_I420_10L, "Planar 4:2:0 YUV 10-bit LE"),
855         A("I0AL"),
856     B(VLC_CODEC_I420_10B, "Planar 4:2:0 YUV 10-bit BE"),
857         A("I0AB"),
858     B(VLC_CODEC_I422_10L, "Planar 4:2:2 YUV 10-bit LE"),
859         A("I2AL"),
860     B(VLC_CODEC_I422_10B, "Planar 4:2:2 YUV 10-bit BE"),
861         A("I2AB"),
862     B(VLC_CODEC_I444_10L, "Planar 4:4:4 YUV 10-bit LE"),
863         A("I4AL"),
864     B(VLC_CODEC_I444_10B, "Planar 4:4:4 YUV 10-bit BE"),
865         A("I4AB"),
866
867     /* XYZ color space */
868     B(VLC_CODEC_XYZ12, "Packed XYZ 12-bit BE"),
869         A("XY12"),
870
871     /* Videogames Codecs */
872
873     /* Interplay MVE */
874     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
875         A("imve"),
876         A("INPV"),
877
878     /* Id Quake II CIN */
879     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
880         A("IDCI"),
881
882     /* 4X Technologies */
883     B(VLC_CODEC_4XM, "4X Technologies Video"),
884         A("4XMV"),
885         A("4xmv"),
886
887     /* Id RoQ */
888     B(VLC_CODEC_ROQ, "Id RoQ Video"),
889         A("RoQv"),
890
891     /* Sony Playstation MDEC */
892     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
893         A("MDEC"),
894
895     /* Sierra VMD */
896     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
897         A("VMDV"),
898         A("vmdv"),
899
900     B(VLC_CODEC_DIRAC, "Dirac" ),
901         A("drac"),
902
903     /* Image */
904     B(VLC_CODEC_PNG, "PNG Image"),
905         A("png "),
906
907     B(VLC_CODEC_PPM, "PPM Image"),
908         A("ppm "),
909
910     B(VLC_CODEC_PGM, "PGM Image"),
911         A("pgm "),
912
913     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
914         A("pgmy"),
915
916     B(VLC_CODEC_PAM, "PAM Image"),
917         A("pam "),
918
919     B(VLC_CODEC_JPEGLS, "JPEG-LS"),
920         A("MJLS"),
921
922     B(VLC_CODEC_JPEG, "JPEG"),
923         A("jpeg"),
924         A("JPEG"),
925
926     B(VLC_CODEC_BMP, "BMP Image"),
927         A("bmp "),
928
929     B(VLC_CODEC_TIFF, "TIFF Image"),
930         A("tiff"),
931
932     B(VLC_CODEC_GIF, "GIF Image"),
933         A("gif "),
934
935
936     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
937         A("tga "),
938         A("mtga"),
939         A("MTGA"),
940
941     B(VLC_CODEC_SGI, "SGI Image"),
942         A("sgi "),
943
944     B(VLC_CODEC_PNM, "Portable Anymap Image"),
945         A("pnm "),
946
947     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
948         A("pcx "),
949
950     B(VLC_CODEC_XWD, "X Window system raster image"),
951
952     B(VLC_CODEC_JPEG2000, "JPEG 2000 Image"),
953         A("JP2K"),
954         A("mjp2"),
955         A("MJP2"),
956         A("MJ2C"),
957         A("LJ2C"),
958         A("LJ2K"),
959
960     B(VLC_CODEC_LAGARITH, "Lagarith Lossless"),
961         A("LAGS"),
962
963     B(VLC_CODEC_MXPEG, "Mxpeg"),
964         A("MXPG"),
965
966     B(VLC_CODEC_CDXL, "Commodore CDXL video format"),
967         A("CDXL"),
968
969     B(VLC_CODEC_BMVVIDEO, "Discworld II BMV video"),
970         A("BMVV"),
971
972     B(VLC_CODEC_UTVIDEO, "Ut Video"),
973         A("ULRA"),
974         A("ULRG"),
975         A("ULY0"),
976         A("ULY2"),
977
978     B(VLC_CODEC_VBLE, "VBLE Lossless"),
979         A("VBLE"),
980
981     B(VLC_CODEC_DXTORY, "Dxtory capture format"),
982         A("xtor"),
983
984     B(VLC_CODEC_MSS1, "Windows Media Video 7 Screen"),
985         A("MSS1"),
986         A("mss1"),
987
988     B(VLC_CODEC_MSS2, "Windows Media Video 9 Screen"),
989         A("MSS2"),
990         A("mss2"),
991
992     B(VLC_CODEC_MSA1, "Microsoft Application Screen Decoder 1"),
993         A("MSA1"),
994
995     B(VLC_CODEC_TSC2, "TechSmith Screen Codec 2"),
996         A("MSA1"),
997         A("tsc2"),
998
999     B(VLC_CODEC_MTS2, "Microsoft Expression Encoder Screen"),
1000         A("MTS2"),
1001
1002     B(VLC_CODEC_XAN_WC4, "Wing Commander IV Xan video"),
1003         A("Xxan"),
1004
1005     B(VLC_CODEC_LCL_MSZH, "Loss-Less Codec Library AVImszh"),
1006         A("MSZH"),
1007
1008     B(VLC_CODEC_LCL_ZLIB, "Loss-Less Codec Library AVIzlib"),
1009         A("ZLIB"),
1010
1011     B(VLC_CODEC_THP, "GameCube THP video"),
1012
1013     B(VLC_CODEC_TXD, "RenderWare TXD"),
1014
1015     B(VLC_CODEC_ESCAPE124, "Escape 124 video"),
1016
1017     B(VLC_CODEC_KGV1, "Kega Game Video (KGV1)"),
1018         A("KGV1"),
1019
1020     B(VLC_CODEC_CLLC, "Canopus Lossless"),
1021         A("CLLC"),
1022
1023     B(VLC_CODEC_AURA, "Auravision Aura"),
1024         A("AURA"),
1025
1026     B(0, "")
1027 };
1028 static const staticentry_t p_list_audio[] = {
1029
1030     /* Windows Media Audio 1 */
1031     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
1032         A("WMA1"),
1033         A("wma1"),
1034
1035     /* Windows Media Audio 2 */
1036     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
1037         A("WMA2"),
1038         A("wma2"),
1039         A("wma "),
1040
1041     /* Windows Media Audio Professional */
1042     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
1043         A("WMAP"),
1044         A("wmap"),
1045
1046     /* Windows Media Audio Lossless */
1047     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
1048         A("WMAL"),
1049         A("wmal"),
1050
1051     /* Windows Media Audio Speech */
1052     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
1053         A("WMAS"),
1054         A("wmas"),
1055
1056     /* DV Audio */
1057     B(VLC_CODEC_DVAUDIO, "DV Audio"),
1058         A("dvau"),
1059         A("vdva"),
1060         A("dvca"),
1061         A("RADV"),
1062
1063     /* MACE-3 Audio */
1064     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
1065         A("MAC3"),
1066
1067     /* MACE-6 Audio */
1068     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
1069         A("MAC6"),
1070
1071     /* MUSEPACK7 Audio */
1072     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
1073         A("MPC "),
1074
1075     /* MUSEPACK8 Audio */
1076     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
1077         A("MPCK"),
1078         A("MPC8"),
1079
1080     /* RealAudio 1.0 */
1081     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
1082         A("14_4"),
1083         A("lpcJ"),
1084
1085     /* RealAudio 2.0 */
1086     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
1087         A("28_8"),
1088
1089     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
1090         A("sipr"),
1091
1092     /* MPEG Audio layer 1/2 */
1093     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2"),
1094         A("mpga"),
1095         A("mp2a"),
1096         A(".mp1"),
1097         A(".mp2"),
1098         A("LAME"),
1099         A("ms\x00\x50"),
1100         A("ms\x00\x55"),
1101
1102     /* MPEG Audio layer 3 */
1103     B(VLC_CODEC_MP3, "MPEG Audio layer 3"),
1104         A("mp3 "),
1105         A(".mp3"),
1106         A("MP3 "),
1107
1108     /* A52 Audio (aka AC3) */
1109     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
1110         A("a52 "),
1111         A("a52b"),
1112         A("ac-3"),
1113         A("sac3"),
1114         A("ms\x20\x00"),
1115
1116     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
1117         A("eac3"),
1118
1119     /* DTS Audio */
1120     B(VLC_CODEC_DTS, "DTS Audio"),
1121         A("dts "),
1122         A("DTS "),
1123         A("dtsb"),
1124         A("dtsc"),
1125         E("dtse", "DTS Express"),
1126         E("dtsh", "DTS-HD High Resolution Audio"),
1127         E("dtsl", "DTS-HD Lossless"),
1128         A("ms\x20\x01"),
1129
1130     /* AAC audio */
1131     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
1132         A("mp4a"),
1133         A("aac "),
1134         A("AACL"),
1135         A("AACH"),
1136
1137     /* ALS audio */
1138     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
1139         A("als "),
1140
1141     /* 4X Technologies */
1142     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
1143         A("4xma"),
1144
1145     /* EA ADPCM */
1146     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
1147         A("ADEA"),
1148
1149     /* Interplay DPCM */
1150     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
1151         A("idpc"),
1152
1153     /* Id RoQ */
1154     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
1155         A("RoQa"),
1156
1157     /* DCIN Audio */
1158     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
1159         A("DCIA"),
1160
1161     /* Sony Playstation XA ADPCM */
1162     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
1163         A("xa  "),
1164
1165     /* ADX ADPCM */
1166     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
1167         A("adx "),
1168
1169     /* Westwood ADPCM */
1170     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
1171         A("AIWS"),
1172
1173     /* MS ADPCM */
1174     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
1175         A("ms\x00\x02"),
1176
1177     /* Sierra VMD */
1178     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
1179         A("vmda"),
1180
1181     /* G.726 ADPCM */
1182     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
1183         A("g726"),
1184
1185     /* G.722 ADPCM */
1186     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
1187         A("g722"),
1188
1189     /* Flash ADPCM */
1190     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
1191         A("SWFa"),
1192
1193     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
1194         A("ms\x00\x11"),
1195
1196     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
1197         A("imav"),
1198
1199     B(VLC_CODEC_ADPCM_IMA_QT, "IMA QT ADPCM Audio"),
1200         A("ima4"),
1201
1202     B(VLC_CODEC_ADPCM_YAMAHA, "Yamaha ADPCM Audio" ),
1203         A("ms\x00\x20"),
1204
1205     B(VLC_CODEC_ADPCM_DK3, "Duck DK3 ADPCM"),
1206         A("ms\x00\x62"),
1207
1208     B(VLC_CODEC_ADPCM_DK4, "Duck DK4 ADPCM"),
1209         A("ms\x00\x61"),
1210
1211     B(VLC_CODEC_ADPCM_THP, "GameCube THP ADPCM"),
1212
1213     /* AMR */
1214     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1215         A("samr"),
1216
1217     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1218         A("sawb"),
1219
1220     /* FLAC */
1221     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1222         A("flac"),
1223
1224     /* ALAC */
1225     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1226         A("alac"),
1227
1228     /* QDM2 */
1229     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1230         A("QDM2"),
1231
1232     /* COOK */
1233     B(VLC_CODEC_COOK, "Cook Audio"),
1234         A("cook"),
1235
1236     /* TTA: The Lossless True Audio */
1237     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1238         A("TTA1"),
1239
1240     /* Shorten */
1241     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1242         A("shn "),
1243         A("shrn"),
1244
1245     B(VLC_CODEC_WAVPACK, "WavPack"),
1246         A("WVPK"),
1247         A("wvpk"),
1248
1249     B(VLC_CODEC_GSM, "GSM Audio"),
1250         A("gsm "),
1251
1252     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1253         A("agsm"),
1254
1255     B(VLC_CODEC_ATRAC1, "atrac 1"),
1256         A("atr1"),
1257
1258     B(VLC_CODEC_ATRAC3, "atrac 3"),
1259         A("atrc"),
1260         A("\x70\x02\x00\x00"),
1261
1262     B(VLC_CODEC_ATRAC3P, "atrac 3+"),
1263         A("atrp"),
1264
1265     B(VLC_CODEC_IMC, "IMC" ),
1266         A("\x01\x04\x00\x00"),
1267
1268     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1269         A("\x22\x00\x00\x00"),
1270
1271     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1272         A("NELL"),
1273         A("nmos"),
1274
1275     B(VLC_CODEC_APE, "Monkey's Audio"),
1276         A("APE "),
1277
1278     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1279         A("mlp "),
1280
1281     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1282         A("trhd"),
1283
1284     B(VLC_CODEC_QCELP, "QCELP Audio"),
1285         A("Qclp"),
1286         A("Qclq"),
1287         A("sqcp"),
1288
1289     B(VLC_CODEC_SPEEX, "Speex Audio"),
1290         A("spx "),
1291         A("spxr"),
1292
1293     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1294         A("vorb"),
1295         A("vor1"),
1296
1297     B(VLC_CODEC_OPUS, "Opus Audio"),
1298         A("Opus"),
1299
1300     B(VLC_CODEC_302M, "302M Audio"),
1301         A("302m"),
1302
1303     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1304         A("lpcm"),
1305
1306     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1307         A("apcm"),
1308
1309     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1310         A("bpcm"),
1311
1312     B(VLC_CODEC_SDDS, "SDDS Audio"),
1313         A("sdds"),
1314         A("sddb"),
1315
1316     B(VLC_CODEC_MIDI, "MIDI Audio"),
1317         A("MIDI"),
1318
1319     B(VLC_CODEC_RALF, "RealAudio Lossless"),
1320         A("LSD:"),
1321
1322     /* G.723.1 */
1323     B(VLC_CODEC_G723_1, "G.723.1 Audio"),
1324         A("g72\x31"),
1325
1326     /* PCM */
1327     B(VLC_CODEC_S8, "PCM S8"),
1328         A("s8  "),
1329
1330     B(VLC_CODEC_U8, "PCM U8"),
1331         A("u8  "),
1332
1333     B(VLC_CODEC_S16L, "PCM S16 LE"),
1334         A("s16l"),
1335
1336     B(VLC_CODEC_S16B, "PCM S16 BE"),
1337         A("s16b"),
1338
1339     B(VLC_CODEC_U16L, "PCM U16 LE"),
1340         A("u16l"),
1341
1342     B(VLC_CODEC_U16B, "PCM U16 BE"),
1343         A("u16b"),
1344
1345     B(VLC_CODEC_S20B, "PCM S20 BE"),
1346
1347     B(VLC_CODEC_S24L, "PCM S24 LE"),
1348         A("s24l"),
1349         A("42ni"),  /* Quicktime */
1350
1351     B(VLC_CODEC_S24B, "PCM S24 BE"),
1352         A("s24b"),
1353         A("in24"),  /* Quicktime */
1354
1355     B(VLC_CODEC_U24L, "PCM U24 LE"),
1356         A("u24l"),
1357
1358     B(VLC_CODEC_U24B, "PCM U24 BE"),
1359         A("u24b"),
1360
1361     B(VLC_CODEC_S24L32, "PCM S24 in 32 LE"),
1362
1363     B(VLC_CODEC_S24B32, "PCM S24 in 32 BE"),
1364
1365     B(VLC_CODEC_S32L, "PCM S32 LE"),
1366         A("s32l"),
1367         A("23ni"),  /* Quicktime */
1368
1369     B(VLC_CODEC_S32B, "PCM S32 BE"),
1370         A("s32b"),
1371         A("in32"),  /* Quicktime */
1372
1373     B(VLC_CODEC_U32L, "PCM U32 LE"),
1374         A("u32l"),
1375
1376     B(VLC_CODEC_U32B, "PCM U32 BE"),
1377         A("u32b"),
1378
1379     B(VLC_CODEC_ALAW, "PCM ALAW"),
1380         A("alaw"),
1381
1382     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1383         A("mlaw"),
1384         A("ulaw"),
1385
1386     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1387
1388     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1389         A("daud"),
1390
1391     B(VLC_CODEC_F32L, "32 bits float LE"),
1392         A("f32l"),
1393         A("fl32"),
1394
1395     B(VLC_CODEC_F32B, "32 bits float BE"),
1396         A("f32b"),
1397
1398     B(VLC_CODEC_F64L, "64 bits float LE"),
1399         A("f64l"),
1400
1401     B(VLC_CODEC_F64L, "64 bits float BE"),
1402         A("f64b"),
1403
1404     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1405         A("TWIN"),
1406
1407     B(VLC_CODEC_BMVAUDIO, "Discworld II BMV audio"),
1408         A("BMVA"),
1409
1410     B(VLC_CODEC_ULEAD_DV_AUDIO_NTSC, "Ulead DV audio NTSC"),
1411         A("ms\x02\x15"),
1412     B(VLC_CODEC_ULEAD_DV_AUDIO_PAL, "Ulead DV audio PAL"),
1413         A("ms\x02\x16"),
1414
1415     B(VLC_CODEC_INDEO_AUDIO, "Indeo Audio Coder"),
1416         A("ms\x04\x02"),
1417
1418     B(0, "")
1419 };
1420 static const staticentry_t p_list_spu[] = {
1421
1422     B(VLC_CODEC_SPU, "DVD Subtitles"),
1423         A("spu "),
1424         A("spub"),
1425
1426     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1427         A("dvbs"),
1428
1429     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1430         A("subt"),
1431
1432     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1433         A("XSUB"),
1434         A("xsub"),
1435         A("DXSB"),
1436
1437     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1438         A("ssa "),
1439
1440     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1441         A("TEXT"),
1442
1443     B(VLC_CODEC_TELETEXT, "Teletext"),
1444         A("telx"),
1445
1446     B(VLC_CODEC_KATE, "Kate subtitles"),
1447         A("kate"),
1448
1449     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1450         A("cmml"),
1451
1452     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1453         A("t140"),
1454
1455     B(VLC_CODEC_USF, "USF subtitles"),
1456         A("usf "),
1457
1458     B(VLC_CODEC_OGT, "OGT subtitles"),
1459         A("ogt "),
1460
1461     B(VLC_CODEC_CVD, "CVD subtitles"),
1462         A("cvd "),
1463
1464     B(VLC_CODEC_BD_PG, "BD subtitles"),
1465         A("bdpg"),
1466
1467     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1468         A("STL "),
1469
1470     B(VLC_CODEC_SCTE_27, "SCTE-27 subtitles"),
1471         A("SC27"),
1472
1473     B(0, "")
1474 };
1475
1476 /* Create a fourcc from a string.
1477  * XXX it assumes that the string is at least four bytes */
1478 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1479 {
1480     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1481                        psz_fourcc[2], psz_fourcc[3] );
1482 }
1483
1484 /* */
1485 static entry_t Lookup( const staticentry_t p_list[], vlc_fourcc_t i_fourcc )
1486 {
1487     const char *p_class = NULL;
1488     const char *psz_description = NULL;
1489
1490     entry_t e = B(0, "");
1491
1492     for( int i = 0; ; i++ )
1493     {
1494         const staticentry_t *p = &p_list[i];
1495         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1496         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1497
1498         if( i_entry_fourcc == 0 )
1499             break;
1500
1501         if( i_entry_class != 0 )
1502         {
1503             p_class = p->p_class;
1504             psz_description = p->psz_description;
1505         }
1506
1507         if( i_entry_fourcc == i_fourcc )
1508         {
1509             assert( p_class != NULL );
1510
1511             memcpy( e.p_class, p_class, 4 );
1512             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1513             e.psz_description = p->psz_description[0] != '\0' ?
1514                                 p->psz_description : psz_description;
1515             break;
1516         }
1517     }
1518     return e;
1519 }
1520
1521 /* */
1522 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1523 {
1524     entry_t e;
1525
1526     switch( i_cat )
1527     {
1528     case VIDEO_ES:
1529         return Lookup( p_list_video, i_fourcc );
1530     case AUDIO_ES:
1531         return Lookup( p_list_audio, i_fourcc );
1532     case SPU_ES:
1533         return Lookup( p_list_spu, i_fourcc );
1534
1535     default:
1536         e = Find( VIDEO_ES, i_fourcc );
1537         if( CreateFourcc( e.p_class ) == 0 )
1538             e = Find( AUDIO_ES, i_fourcc );
1539         if( CreateFourcc( e.p_class ) == 0 )
1540             e = Find( SPU_ES, i_fourcc );
1541         return e;
1542     }
1543 }
1544
1545 /* */
1546 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1547 {
1548     entry_t e = Find( i_cat, i_fourcc );
1549
1550     if( CreateFourcc( e.p_class ) == 0 )
1551         return i_fourcc;
1552     return CreateFourcc( e.p_class );
1553 }
1554
1555 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1556 {
1557     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1558         return 0;
1559     return vlc_fourcc_GetCodec( i_cat,
1560                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1561                                             psz_fourcc[2], psz_fourcc[3] ) );
1562 }
1563
1564 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1565 {
1566     const int i_bytes = ( i_bits + 7 ) / 8;
1567
1568     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1569     {
1570         switch( i_bytes )
1571         {
1572         case 4:
1573             return VLC_CODEC_FL32;
1574         case 8:
1575             return VLC_CODEC_FL64;
1576         default:
1577             return 0;
1578         }
1579     }
1580     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
1581     {
1582         switch( i_bytes )
1583         {
1584         case 1:
1585             return VLC_CODEC_U8;
1586         case 2:
1587             return VLC_CODEC_S16L;
1588         case 3:
1589             return VLC_CODEC_S24L;
1590             break;
1591         case 4:
1592             return VLC_CODEC_S32L;
1593         default:
1594             return 0;
1595         }
1596     }
1597     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1598     {
1599         switch( i_bytes )
1600         {
1601         case 1:
1602             return VLC_CODEC_S8;
1603         case 2:
1604             return VLC_CODEC_S16B;
1605         case 3:
1606             return VLC_CODEC_S24B;
1607         case 4:
1608             return VLC_CODEC_S32B;
1609         default:
1610             return 0;
1611         }
1612     }
1613     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1614     {
1615         switch( i_bytes )
1616         {
1617         case 1:
1618             return VLC_CODEC_S8;
1619         case 2:
1620             return VLC_CODEC_S16L;
1621         case 3:
1622             return VLC_CODEC_S24L;
1623         case 4:
1624             return VLC_CODEC_S32L;
1625         default:
1626             return 0;
1627         }
1628     }
1629     else
1630     {
1631         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1632     }
1633 }
1634
1635 /* */
1636 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1637 {
1638     entry_t e = Find( i_cat, i_fourcc );
1639
1640     return e.psz_description;
1641 }
1642
1643
1644 /* */
1645 #define VLC_CODEC_YUV_PLANAR_410 \
1646     VLC_CODEC_I410, VLC_CODEC_YV9
1647
1648 #define VLC_CODEC_YUV_PLANAR_420 \
1649     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1650
1651 #define VLC_CODEC_YUV_SEMIPLANAR_420 \
1652     VLC_CODEC_NV12, VLC_CODEC_NV21
1653
1654 #define VLC_CODEC_YUV_PLANAR_420_16 \
1655     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1656
1657 #define VLC_CODEC_YUV_PLANAR_422 \
1658     VLC_CODEC_I422, VLC_CODEC_J422
1659
1660 #define VLC_CODEC_YUV_SEMIPLANAR_422 \
1661     VLC_CODEC_NV16, VLC_CODEC_NV61
1662
1663 #define VLC_CODEC_YUV_PLANAR_422_16 \
1664     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1665
1666 #define VLC_CODEC_YUV_PLANAR_440 \
1667     VLC_CODEC_I440, VLC_CODEC_J440
1668
1669 #define VLC_CODEC_YUV_PLANAR_444 \
1670     VLC_CODEC_I444, VLC_CODEC_J444
1671
1672 #define VLC_CODEC_YUV_SEMIPLANAR_444 \
1673     VLC_CODEC_NV24, VLC_CODEC_NV42
1674
1675 #define VLC_CODEC_YUV_PLANAR_444_16 \
1676     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1677
1678 #define VLC_CODEC_YUV_PACKED \
1679     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1680     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1681
1682 #define VLC_CODEC_FALLBACK_420 \
1683     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1684     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1685     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1686
1687 static const vlc_fourcc_t p_I420_fallback[] = {
1688     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1689 };
1690 static const vlc_fourcc_t p_J420_fallback[] = {
1691     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1692 };
1693 static const vlc_fourcc_t p_YV12_fallback[] = {
1694     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1695 };
1696
1697 #define VLC_CODEC_FALLBACK_420_16 \
1698     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1699
1700 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1701     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1702 };
1703 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1704     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1705 };
1706 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1707     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1708 };
1709 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1710     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1711 };
1712
1713 #define VLC_CODEC_FALLBACK_422 \
1714     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1715     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1716     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1717
1718 static const vlc_fourcc_t p_I422_fallback[] = {
1719     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1720 };
1721 static const vlc_fourcc_t p_J422_fallback[] = {
1722     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1723 };
1724
1725 #define VLC_CODEC_FALLBACK_422_16 \
1726     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1727
1728 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1729     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1730 };
1731 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1732     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1733 };
1734 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1735     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1736 };
1737 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1738     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1739 };
1740
1741 #define VLC_CODEC_FALLBACK_444 \
1742     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1743     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1744     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1745
1746 static const vlc_fourcc_t p_I444_fallback[] = {
1747     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1748 };
1749 static const vlc_fourcc_t p_J444_fallback[] = {
1750     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1751 };
1752
1753 #define VLC_CODEC_FALLBACK_444_16 \
1754     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1755
1756 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1757     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1758 };
1759 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1760     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1761 };
1762 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1763     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1764 };
1765 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1766     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1767 };
1768
1769 static const vlc_fourcc_t p_I440_fallback[] = {
1770     VLC_CODEC_I440,
1771     VLC_CODEC_YUV_PLANAR_420,
1772     VLC_CODEC_YUV_PLANAR_422,
1773     VLC_CODEC_YUV_PLANAR_444,
1774     VLC_CODEC_YUV_PACKED,
1775     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1776 };
1777
1778 #define VLC_CODEC_FALLBACK_PACKED \
1779     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1780     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1781     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1782
1783 static const vlc_fourcc_t p_YUYV_fallback[] = {
1784     VLC_CODEC_YUYV,
1785     VLC_CODEC_YVYU,
1786     VLC_CODEC_UYVY,
1787     VLC_CODEC_VYUY,
1788     VLC_CODEC_FALLBACK_PACKED, 0
1789 };
1790 static const vlc_fourcc_t p_YVYU_fallback[] = {
1791     VLC_CODEC_YVYU,
1792     VLC_CODEC_YUYV,
1793     VLC_CODEC_UYVY,
1794     VLC_CODEC_VYUY,
1795     VLC_CODEC_FALLBACK_PACKED, 0
1796 };
1797 static const vlc_fourcc_t p_UYVY_fallback[] = {
1798     VLC_CODEC_UYVY,
1799     VLC_CODEC_VYUY,
1800     VLC_CODEC_YUYV,
1801     VLC_CODEC_YVYU,
1802     VLC_CODEC_FALLBACK_PACKED, 0
1803 };
1804 static const vlc_fourcc_t p_VYUY_fallback[] = {
1805     VLC_CODEC_VYUY,
1806     VLC_CODEC_UYVY,
1807     VLC_CODEC_YUYV,
1808     VLC_CODEC_YVYU,
1809     VLC_CODEC_FALLBACK_PACKED, 0
1810 };
1811
1812 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1813     p_YV12_fallback,
1814     p_I420_fallback,
1815     p_I420_9L_fallback,
1816     p_I420_9B_fallback,
1817     p_I420_10L_fallback,
1818     p_I420_10B_fallback,
1819     p_J420_fallback,
1820     p_I422_fallback,
1821     p_I422_9L_fallback,
1822     p_I422_9B_fallback,
1823     p_I422_10L_fallback,
1824     p_I422_10B_fallback,
1825     p_J422_fallback,
1826     p_I444_fallback,
1827     p_J444_fallback,
1828     p_I444_9L_fallback,
1829     p_I444_9B_fallback,
1830     p_I444_10L_fallback,
1831     p_I444_10B_fallback,
1832     p_I440_fallback,
1833     p_YUYV_fallback,
1834     p_YVYU_fallback,
1835     p_UYVY_fallback,
1836     p_VYUY_fallback,
1837
1838
1839     NULL,
1840 };
1841
1842 static const vlc_fourcc_t p_list_YUV[] = {
1843     VLC_CODEC_YUV_PLANAR_420,
1844     VLC_CODEC_YUV_SEMIPLANAR_420,
1845     VLC_CODEC_YUV_PLANAR_422,
1846     VLC_CODEC_YUV_SEMIPLANAR_422,
1847     VLC_CODEC_YUV_PLANAR_440,
1848     VLC_CODEC_YUV_PLANAR_444,
1849     VLC_CODEC_YUV_SEMIPLANAR_444,
1850     VLC_CODEC_YUV_PACKED,
1851     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1852     VLC_CODEC_YUV_PLANAR_420_16,
1853     VLC_CODEC_YUV_PLANAR_422_16,
1854     VLC_CODEC_YUV_PLANAR_444_16,
1855     VLC_CODEC_VDPAU_VIDEO_420,
1856     VLC_CODEC_VDPAU_VIDEO_422,
1857     VLC_CODEC_VDPAU_VIDEO_444,
1858     0,
1859 };
1860
1861 /* */
1862 static const vlc_fourcc_t p_RGB32_fallback[] = {
1863     VLC_CODEC_RGB32,
1864     VLC_CODEC_RGB24,
1865     VLC_CODEC_RGB16,
1866     VLC_CODEC_RGB15,
1867     VLC_CODEC_RGB8,
1868     0,
1869 };
1870 static const vlc_fourcc_t p_RGB24_fallback[] = {
1871     VLC_CODEC_RGB24,
1872     VLC_CODEC_RGB32,
1873     VLC_CODEC_RGB16,
1874     VLC_CODEC_RGB15,
1875     VLC_CODEC_RGB8,
1876     0,
1877 };
1878 static const vlc_fourcc_t p_RGB16_fallback[] = {
1879     VLC_CODEC_RGB16,
1880     VLC_CODEC_RGB24,
1881     VLC_CODEC_RGB32,
1882     VLC_CODEC_RGB15,
1883     VLC_CODEC_RGB8,
1884     0,
1885 };
1886 static const vlc_fourcc_t p_RGB15_fallback[] = {
1887     VLC_CODEC_RGB15,
1888     VLC_CODEC_RGB16,
1889     VLC_CODEC_RGB24,
1890     VLC_CODEC_RGB32,
1891     VLC_CODEC_RGB8,
1892     0,
1893 };
1894 static const vlc_fourcc_t p_RGB8_fallback[] = {
1895     VLC_CODEC_RGB8,
1896     VLC_CODEC_RGB15,
1897     VLC_CODEC_RGB16,
1898     VLC_CODEC_RGB24,
1899     VLC_CODEC_RGB32,
1900     0,
1901 };
1902 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1903     p_RGB32_fallback,
1904     p_RGB24_fallback,
1905     p_RGB16_fallback,
1906     p_RGB15_fallback,
1907     p_RGB8_fallback,
1908     NULL,
1909 };
1910
1911
1912 /* */
1913 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1914                                         const vlc_fourcc_t *pp_fallback[],
1915                                         const vlc_fourcc_t p_list[] )
1916 {
1917     for( unsigned i = 0; pp_fallback[i]; i++ )
1918     {
1919         if( pp_fallback[i][0] == i_fourcc )
1920             return pp_fallback[i];
1921     }
1922     return p_list;
1923 }
1924
1925 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1926 {
1927     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1928 }
1929 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1930 {
1931     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1932 }
1933
1934 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1935 {
1936     static const vlc_fourcc_t pp_swapped[][4] = {
1937         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1938         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1939         { 0 }
1940     };
1941
1942     for( int i = 0; pp_swapped[i][0]; i++ )
1943     {
1944         if( pp_swapped[i][0] == b )
1945         {
1946             vlc_fourcc_t t = a;
1947             a = b;
1948             b = t;
1949         }
1950         if( pp_swapped[i][0] != a )
1951             continue;
1952         for( int j = 1; pp_swapped[i][j]; j++ )
1953         {
1954             if( pp_swapped[i][j] == b )
1955                 return true;
1956         }
1957     }
1958     return false;
1959 }
1960
1961 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1962 {
1963     for( unsigned i = 0; p_list_YUV[i]; i++ )
1964     {
1965         if( p_list_YUV[i] == fcc )
1966             return true;
1967     }
1968     return false;
1969 }
1970
1971 #define PLANAR(n, w_den, h_den, size, bits) \
1972     { .plane_count = n, \
1973       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1974              {.w = {1,w_den}, .h = {1,h_den}}, \
1975              {.w = {1,w_den}, .h = {1,h_den}}, \
1976              {.w = {1,    1}, .h = {1,    1}} }, \
1977       .pixel_size = size, \
1978       .pixel_bits = bits }
1979
1980 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
1981 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
1982
1983 #define PACKED_FMT(size, bits) \
1984     { .plane_count = 1, \
1985       .p = { {.w = {1,1}, .h = {1,1}} }, \
1986       .pixel_size = size, \
1987       .pixel_bits = bits }
1988
1989 /* Zero planes for hardware picture handles. Cannot be manipulated directly. */
1990 #define FAKE_FMT() \
1991     { .plane_count = 0, \
1992       .p = { {.w = {1,1}, .h = {1,1}} }, \
1993       .pixel_size = 0, \
1994       .pixel_bits = 0 }
1995
1996 static const struct
1997 {
1998     vlc_fourcc_t             p_fourcc[6];
1999     vlc_chroma_description_t description;
2000 } p_list_chroma_description[] = {
2001     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
2002     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
2003     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
2004     { { VLC_CODEC_NV12, VLC_CODEC_NV21, 0 },   PLANAR_8(2, 1, 2) },
2005     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
2006     { { VLC_CODEC_NV16, VLC_CODEC_NV61, 0 },   PLANAR_8(2, 1, 1) },
2007     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
2008     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
2009     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
2010     { { VLC_CODEC_YUV420A, 0 },                PLANAR_8(4, 2, 2) },
2011     { { VLC_CODEC_YUV422A, 0 },                PLANAR_8(4, 2, 1) },
2012
2013     { { VLC_CODEC_I420_10L,
2014         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2, 10) },
2015     { { VLC_CODEC_I420_9L,
2016         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2,  9) },
2017     { { VLC_CODEC_I422_10L,
2018         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1, 10) },
2019     { { VLC_CODEC_I422_9L,
2020         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1,  9) },
2021     { { VLC_CODEC_I444_10L,
2022         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1, 10) },
2023     { { VLC_CODEC_I444_9L,
2024         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1,  9) },
2025
2026     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2, 16) },
2027     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
2028         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1, 8) },
2029
2030     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
2031     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
2032     { { VLC_CODEC_RGB16, VLC_CODEC_RGBT,
2033         VLC_CODEC_RGBA16, 0 },                 PACKED_FMT(2, 16) },
2034     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
2035     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
2036     { { VLC_CODEC_RGBA, VLC_CODEC_ARGB, 0 },   PACKED_FMT(4, 32) },
2037
2038     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
2039     { { VLC_CODEC_XYZ12,  0 },                 PACKED_FMT(6, 48) },
2040
2041     { { VLC_CODEC_VDPAU_VIDEO_420, VLC_CODEC_VDPAU_VIDEO_422,
2042         VLC_CODEC_VDPAU_VIDEO_444,
2043         VLC_CODEC_VDPAU_OUTPUT,
2044         VLC_CODEC_ANDROID_OPAQUE, 0 },            FAKE_FMT() },
2045
2046     { {0}, { 0, { 0 }, 0, 0 } }
2047 };
2048
2049 #undef PACKED_FMT
2050 #undef PLANAR_16
2051 #undef PLANAR_8
2052 #undef PLANAR
2053
2054 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
2055 {
2056     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
2057     {
2058         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
2059         for( unsigned j = 0; p_fourcc[j]; j++ )
2060         {
2061             if( p_fourcc[j] == i_fourcc )
2062                 return &p_list_chroma_description[i].description;
2063         }
2064     }
2065     return NULL;
2066 }