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