]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
picture: merge p_data_orig into gc.p_sys
[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(0, "")
1395 };
1396
1397 /* Create a fourcc from a string.
1398  * XXX it assumes that the string is at least four bytes */
1399 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1400 {
1401     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1402                        psz_fourcc[2], psz_fourcc[3] );
1403 }
1404
1405 /* */
1406 static entry_t Lookup( const staticentry_t p_list[], vlc_fourcc_t i_fourcc )
1407 {
1408     const char *p_class = NULL;
1409     const char *psz_description = NULL;
1410
1411     entry_t e = B(0, "");
1412
1413     for( int i = 0; ; i++ )
1414     {
1415         const staticentry_t *p = &p_list[i];
1416         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1417         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1418
1419         if( i_entry_fourcc == 0 )
1420             break;
1421
1422         if( i_entry_class != 0 )
1423         {
1424             p_class = p->p_class;
1425             psz_description = p->psz_description;
1426         }
1427
1428         if( i_entry_fourcc == i_fourcc )
1429         {
1430             assert( p_class != NULL );
1431
1432             memcpy( e.p_class, p_class, 4 );
1433             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1434             e.psz_description = p->psz_description ?
1435                                 p->psz_description : psz_description;
1436             break;
1437         }
1438     }
1439     return e;
1440 }
1441
1442 /* */
1443 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1444 {
1445     entry_t e;
1446
1447     switch( i_cat )
1448     {
1449     case VIDEO_ES:
1450         return Lookup( p_list_video, i_fourcc );
1451     case AUDIO_ES:
1452         return Lookup( p_list_audio, i_fourcc );
1453     case SPU_ES:
1454         return Lookup( p_list_spu, i_fourcc );
1455
1456     default:
1457         e = Find( VIDEO_ES, i_fourcc );
1458         if( CreateFourcc( e.p_class ) == 0 )
1459             e = Find( AUDIO_ES, i_fourcc );
1460         if( CreateFourcc( e.p_class ) == 0 )
1461             e = Find( SPU_ES, i_fourcc );
1462         return e;
1463     }
1464 }
1465
1466 /* */
1467 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1468 {
1469     entry_t e = Find( i_cat, i_fourcc );
1470
1471     if( CreateFourcc( e.p_class ) == 0 )
1472         return i_fourcc;
1473     return CreateFourcc( e.p_class );
1474 }
1475
1476 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1477 {
1478     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1479         return 0;
1480     return vlc_fourcc_GetCodec( i_cat,
1481                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1482                                             psz_fourcc[2], psz_fourcc[3] ) );
1483 }
1484
1485 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1486 {
1487     const int i_bytes = ( i_bits + 7 ) / 8;
1488
1489     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1490     {
1491         switch( i_bytes )
1492         {
1493         case 4:
1494             return VLC_CODEC_FL32;
1495         case 8:
1496             return VLC_CODEC_FL64;
1497         default:
1498             return 0;
1499         }
1500     }
1501     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1502              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1503     {
1504         switch( i_bytes )
1505         {
1506         case 1:
1507             return VLC_CODEC_U8;
1508         case 2:
1509             return VLC_CODEC_S16L;
1510         case 3:
1511             return VLC_CODEC_S24L;
1512             break;
1513         case 4:
1514             return VLC_CODEC_S32L;
1515         default:
1516             return 0;
1517         }
1518     }
1519     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1520     {
1521         switch( i_bytes )
1522         {
1523         case 1:
1524             return VLC_CODEC_S8;
1525         case 2:
1526             return VLC_CODEC_S16B;
1527         case 3:
1528             return VLC_CODEC_S24B;
1529         case 4:
1530             return VLC_CODEC_S32B;
1531         default:
1532             return 0;
1533         }
1534     }
1535     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1536     {
1537         switch( i_bytes )
1538         {
1539         case 1:
1540             return VLC_CODEC_S8;
1541         case 2:
1542             return VLC_CODEC_S16L;
1543         case 3:
1544             return VLC_CODEC_S24L;
1545         case 4:
1546             return VLC_CODEC_S32L;
1547         default:
1548             return 0;
1549         }
1550     }
1551     else
1552     {
1553         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1554     }
1555 }
1556
1557 /* */
1558 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1559 {
1560     entry_t e = Find( i_cat, i_fourcc );
1561
1562     return e.psz_description;
1563 }
1564
1565
1566 /* */
1567 #define VLC_CODEC_YUV_PLANAR_410 \
1568     VLC_CODEC_I410, VLC_CODEC_YV9
1569
1570 #define VLC_CODEC_YUV_PLANAR_420 \
1571     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1572
1573 #define VLC_CODEC_YUV_PLANAR_420_16 \
1574     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1575
1576 #define VLC_CODEC_YUV_PLANAR_422 \
1577     VLC_CODEC_I422, VLC_CODEC_J422
1578
1579 #define VLC_CODEC_YUV_PLANAR_422_16 \
1580     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1581
1582 #define VLC_CODEC_YUV_PLANAR_440 \
1583     VLC_CODEC_I440, VLC_CODEC_J440
1584
1585 #define VLC_CODEC_YUV_PLANAR_444 \
1586     VLC_CODEC_I444, VLC_CODEC_J444
1587
1588 #define VLC_CODEC_YUV_PLANAR_444_16 \
1589     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1590
1591 #define VLC_CODEC_YUV_PACKED \
1592     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1593     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1594
1595 #define VLC_CODEC_FALLBACK_420 \
1596     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1597     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1598     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1599
1600 static const vlc_fourcc_t p_I420_fallback[] = {
1601     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1602 };
1603 static const vlc_fourcc_t p_J420_fallback[] = {
1604     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1605 };
1606 static const vlc_fourcc_t p_YV12_fallback[] = {
1607     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1608 };
1609
1610 #define VLC_CODEC_FALLBACK_420_16 \
1611     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1612
1613 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1614     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1615 };
1616 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1617     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1618 };
1619 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1620     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1621 };
1622 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1623     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1624 };
1625
1626 #define VLC_CODEC_FALLBACK_422 \
1627     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1628     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1629     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1630
1631 static const vlc_fourcc_t p_I422_fallback[] = {
1632     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1633 };
1634 static const vlc_fourcc_t p_J422_fallback[] = {
1635     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1636 };
1637
1638 #define VLC_CODEC_FALLBACK_422_16 \
1639     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1640
1641 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1642     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1643 };
1644 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1645     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1646 };
1647 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1648     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1649 };
1650 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1651     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1652 };
1653
1654 #define VLC_CODEC_FALLBACK_444 \
1655     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1656     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1657     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1658
1659 static const vlc_fourcc_t p_I444_fallback[] = {
1660     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1661 };
1662 static const vlc_fourcc_t p_J444_fallback[] = {
1663     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1664 };
1665
1666 #define VLC_CODEC_FALLBACK_444_16 \
1667     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1668
1669 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1670     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1671 };
1672 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1673     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1674 };
1675 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1676     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1677 };
1678 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1679     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1680 };
1681
1682 static const vlc_fourcc_t p_I440_fallback[] = {
1683     VLC_CODEC_I440,
1684     VLC_CODEC_YUV_PLANAR_420,
1685     VLC_CODEC_YUV_PLANAR_422,
1686     VLC_CODEC_YUV_PLANAR_444,
1687     VLC_CODEC_YUV_PACKED,
1688     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1689 };
1690
1691 #define VLC_CODEC_FALLBACK_PACKED \
1692     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1693     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1694     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1695
1696 static const vlc_fourcc_t p_YUYV_fallback[] = {
1697     VLC_CODEC_YUYV,
1698     VLC_CODEC_YVYU,
1699     VLC_CODEC_UYVY,
1700     VLC_CODEC_VYUY,
1701     VLC_CODEC_FALLBACK_PACKED, 0
1702 };
1703 static const vlc_fourcc_t p_YVYU_fallback[] = {
1704     VLC_CODEC_YVYU,
1705     VLC_CODEC_YUYV,
1706     VLC_CODEC_UYVY,
1707     VLC_CODEC_VYUY,
1708     VLC_CODEC_FALLBACK_PACKED, 0
1709 };
1710 static const vlc_fourcc_t p_UYVY_fallback[] = {
1711     VLC_CODEC_UYVY,
1712     VLC_CODEC_VYUY,
1713     VLC_CODEC_YUYV,
1714     VLC_CODEC_YVYU,
1715     VLC_CODEC_FALLBACK_PACKED, 0
1716 };
1717 static const vlc_fourcc_t p_VYUY_fallback[] = {
1718     VLC_CODEC_VYUY,
1719     VLC_CODEC_UYVY,
1720     VLC_CODEC_YUYV,
1721     VLC_CODEC_YVYU,
1722     VLC_CODEC_FALLBACK_PACKED, 0
1723 };
1724
1725 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1726     p_YV12_fallback,
1727     p_I420_fallback,
1728     p_I420_9L_fallback,
1729     p_I420_9B_fallback,
1730     p_I420_10L_fallback,
1731     p_I420_10B_fallback,
1732     p_J420_fallback,
1733     p_I422_fallback,
1734     p_I422_9L_fallback,
1735     p_I422_9B_fallback,
1736     p_I422_10L_fallback,
1737     p_I422_10B_fallback,
1738     p_J422_fallback,
1739     p_I444_fallback,
1740     p_J444_fallback,
1741     p_I444_9L_fallback,
1742     p_I444_9B_fallback,
1743     p_I444_10L_fallback,
1744     p_I444_10B_fallback,
1745     p_I440_fallback,
1746     p_YUYV_fallback,
1747     p_YVYU_fallback,
1748     p_UYVY_fallback,
1749     p_VYUY_fallback,
1750
1751
1752     NULL,
1753 };
1754
1755 static const vlc_fourcc_t p_list_YUV[] = {
1756     VLC_CODEC_YUV_PLANAR_420,
1757     VLC_CODEC_YUV_PLANAR_422,
1758     VLC_CODEC_YUV_PLANAR_440,
1759     VLC_CODEC_YUV_PLANAR_444,
1760     VLC_CODEC_YUV_PACKED,
1761     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1762     VLC_CODEC_YUV_PLANAR_420_16,
1763     VLC_CODEC_YUV_PLANAR_422_16,
1764     VLC_CODEC_YUV_PLANAR_444_16,
1765     0,
1766 };
1767
1768 /* */
1769 static const vlc_fourcc_t p_RGB32_fallback[] = {
1770     VLC_CODEC_RGB32,
1771     VLC_CODEC_RGB24,
1772     VLC_CODEC_RGB16,
1773     VLC_CODEC_RGB15,
1774     VLC_CODEC_RGB8,
1775     0,
1776 };
1777 static const vlc_fourcc_t p_RGB24_fallback[] = {
1778     VLC_CODEC_RGB24,
1779     VLC_CODEC_RGB32,
1780     VLC_CODEC_RGB16,
1781     VLC_CODEC_RGB15,
1782     VLC_CODEC_RGB8,
1783     0,
1784 };
1785 static const vlc_fourcc_t p_RGB16_fallback[] = {
1786     VLC_CODEC_RGB16,
1787     VLC_CODEC_RGB24,
1788     VLC_CODEC_RGB32,
1789     VLC_CODEC_RGB15,
1790     VLC_CODEC_RGB8,
1791     0,
1792 };
1793 static const vlc_fourcc_t p_RGB15_fallback[] = {
1794     VLC_CODEC_RGB15,
1795     VLC_CODEC_RGB16,
1796     VLC_CODEC_RGB24,
1797     VLC_CODEC_RGB32,
1798     VLC_CODEC_RGB8,
1799     0,
1800 };
1801 static const vlc_fourcc_t p_RGB8_fallback[] = {
1802     VLC_CODEC_RGB8,
1803     VLC_CODEC_RGB15,
1804     VLC_CODEC_RGB16,
1805     VLC_CODEC_RGB24,
1806     VLC_CODEC_RGB32,
1807     0,
1808 };
1809 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1810     p_RGB32_fallback,
1811     p_RGB24_fallback,
1812     p_RGB16_fallback,
1813     p_RGB15_fallback,
1814     p_RGB8_fallback,
1815     NULL,
1816 };
1817
1818
1819 /* */
1820 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1821                                         const vlc_fourcc_t *pp_fallback[],
1822                                         const vlc_fourcc_t p_list[] )
1823 {
1824     for( unsigned i = 0; pp_fallback[i]; i++ )
1825     {
1826         if( pp_fallback[i][0] == i_fourcc )
1827             return pp_fallback[i];
1828     }
1829     return p_list;
1830 }
1831
1832 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1833 {
1834     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1835 }
1836 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1837 {
1838     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1839 }
1840
1841 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1842 {
1843     static const vlc_fourcc_t pp_swapped[][4] = {
1844         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1845         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1846         { 0 }
1847     };
1848
1849     for( int i = 0; pp_swapped[i][0]; i++ )
1850     {
1851         if( pp_swapped[i][0] == b )
1852         {
1853             vlc_fourcc_t t = a;
1854             a = b;
1855             b = t;
1856         }
1857         if( pp_swapped[i][0] != a )
1858             continue;
1859         for( int j = 1; pp_swapped[i][j]; j++ )
1860         {
1861             if( pp_swapped[i][j] == b )
1862                 return true;
1863         }
1864     }
1865     return false;
1866 }
1867
1868 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1869 {
1870     for( unsigned i = 0; p_list_YUV[i]; i++ )
1871     {
1872         if( p_list_YUV[i] == fcc )
1873             return true;
1874     }
1875     return false;
1876 }
1877
1878 #define PLANAR(n, w_den, h_den, size, bits) \
1879     { .plane_count = n, \
1880       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1881              {.w = {1,w_den}, .h = {1,h_den}}, \
1882              {.w = {1,w_den}, .h = {1,h_den}}, \
1883              {.w = {1,    1}, .h = {1,    1}} }, \
1884       .pixel_size = size, \
1885       .pixel_bits = bits }
1886
1887 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
1888 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
1889
1890 #define PACKED_FMT(size, bits) \
1891     { .plane_count = 1, \
1892       .p = { {.w = {1,1}, .h = {1,1}} }, \
1893       .pixel_size = size, \
1894       .pixel_bits = bits }
1895
1896 static const struct
1897 {
1898     vlc_fourcc_t             p_fourcc[6];
1899     vlc_chroma_description_t description;
1900 } p_list_chroma_description[] = {
1901     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
1902     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
1903     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
1904     { { VLC_CODEC_NV12, VLC_CODEC_NV21, 0 },   PLANAR_8(2, 1, 2) },
1905     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
1906     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
1907     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
1908     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
1909
1910     { { VLC_CODEC_I420_10L,
1911         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2, 10) },
1912     { { VLC_CODEC_I420_9L,
1913         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2,  9) },
1914     { { VLC_CODEC_I422_10L,
1915         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1, 10) },
1916     { { VLC_CODEC_I422_9L,
1917         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1,  9) },
1918     { { VLC_CODEC_I444_10L,
1919         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1, 10) },
1920     { { VLC_CODEC_I444_9L,
1921         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1,  9) },
1922
1923     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2, 16) },
1924     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1925         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1, 8) },
1926
1927     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
1928     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
1929     { { VLC_CODEC_RGB16, VLC_CODEC_RGBT,
1930         VLC_CODEC_RGBA16, 0 },                 PACKED_FMT(2, 16) },
1931     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
1932     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
1933     { { VLC_CODEC_RGBA,  0 },                  PACKED_FMT(4, 32) },
1934
1935     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
1936
1937     { {0}, { 0, {}, 0, 0 } }
1938 };
1939
1940 #undef PACKED_FMT
1941 #undef PLANAR_16
1942 #undef PLANAR_8
1943 #undef PLANAR
1944
1945 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1946 {
1947     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1948     {
1949         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1950         for( unsigned j = 0; p_fourcc[j]; j++ )
1951         {
1952             if( p_fourcc[j] == i_fourcc )
1953                 return &p_list_chroma_description[i].description;
1954         }
1955     }
1956     return NULL;
1957 }