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