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