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