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