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