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