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