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