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