]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
avcodec: map HNM4
[vlc] / src / misc / fourcc.c
1 /*****************************************************************************
2  * fourcc.c: fourcc helpers functions
3  *****************************************************************************
4  * Copyright © 2009-2011 Laurent Aimar
5  *
6  * Authors: Laurent Aimar <fenrir@videolan.org>
7  *          Jean-Baptiste Kempf <jb@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_common.h>
32 #include <vlc_fourcc.h>
33 #include <vlc_es.h>
34 #include <assert.h>
35
36
37 typedef struct
38 {
39     char p_class[4];
40     char p_fourcc[4];
41     char psz_description[56];
42 } staticentry_t;
43
44 typedef struct
45 {
46     char p_class[4];
47     char p_fourcc[4];
48     const char *psz_description;
49 } entry_t;
50
51 #define NULL4 "\x00\x00\x00\x00"
52
53 /* XXX You don't want to see the preprocessor generated code ;) */
54 #ifdef WORDS_BIGENDIAN
55 #   define FCC2STR(f) { ((f)>>24)&0xff, ((f)>>16)&0xff, ((f)>>8)&0xff, ((f)>>0)&0xff }
56 #else
57 #   define FCC2STR(f) { ((f)>>0)&0xff, ((f)>>8)&0xff, ((f)>>16)&0xff, ((f)>>24)&0xff }
58 #endif
59 /* Begin a new class */
60 #define B(a, c) { .p_class = FCC2STR(a), .p_fourcc = FCC2STR(a), .psz_description = c }
61 /* Create a sub-class entry with description */
62 #define E(b, c) { .p_class = NULL4, .p_fourcc = b, .psz_description = c }
63 /* Create a sub-class entry without description (alias) */
64 #define A(b) E(b, NULL4)
65
66
67 /* */
68 static const staticentry_t p_list_video[] = {
69
70     B(VLC_CODEC_MP1V, "MPEG-1 Video"),
71         A("mp1v"),
72         A("mpg1"),
73         A("BW10"),
74         E("XMPG", "Xing MPEG-1 Intra"),
75
76     B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
77     B(VLC_CODEC_MP2V, "MPEG-2 Video"),
78         A("mpgv"),
79         A("mpeg"),
80         A("mp2v"),
81         A("MPEG"),
82         A("mpg2"),
83         A("MPG2"),
84         A("H262"),
85
86         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
87
88         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
89         E("hdv2", "Sony HDV 1080i60 (MPEG-2 Video)"),
90         E("hdv3", "FCP HDV 1080i50 (MPEG-2 Video)"),
91         E("hdv4", "HDV 720p24 (MPEG-2 Video)"),
92         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
93         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
94         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
95         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
96         E("hdv9", "HDV 720p60 JVC (MPEG-2 Video)"),
97         E("hdva", "HDV 720p50 (MPEG-2 Video)"),
98
99         E("mx5n", "MPEG2 IMX NTSC 525/60 50Mb/s (FCP)"),
100         E("mx5p", "MPEG2 IMX PAL 625/60 50Mb/s (FCP)"),
101         E("mx4n", "MPEG2 IMX NTSC 525/60 40Mb/s (FCP)"),
102         E("mx4p", "MPEG2 IMX PAL 625/50 40Mb/s (FCP)"),
103         E("mx3n", "MPEG2 IMX NTSC 525/60 30Mb/s (FCP)"),
104         E("mx3p", "MPEG2 IMX NTSC 625/50 30Mb/s (FCP)"),
105
106         E("xdv1", "XDCAM HD 720p30 35Mb/s"),
107         E("xdv2", "XDCAM HD 1080i60 35Mb/s"),
108         E("xdv3", "XDCAM HD 1080i50 35Mb/s"),
109         E("xdv4", "XDCAM HD 720p24 35Mb/s"),
110         E("xdv5", "XDCAM HD 720p25 35Mb/s"),
111         E("xdv6", "XDCAM HD 1080p24 35Mb/s"),
112         E("xdv7", "XDCAM HD 1080p25 35Mb/s"),
113         E("xdv8", "XDCAM HD 1080p30 35Mb/s"),
114         E("xdv9", "XDCAM HD 720p60 35Mb/s"),
115         E("xdva", "XDCAM HD 720p50 35Mb/s"),
116
117         E("xdvb", "XDCAM EX 1080i60 50Mb/s CBR"),
118         E("xdvc", "XDCAM EX 1080i50 50Mb/s CBR"),
119         E("xdvd", "XDCAM EX 1080p24 50Mb/s CBR"),
120         E("xdve", "XDCAM EX 1080p25 50Mb/s CBR"),
121         E("xdvf", "XDCAM EX 1080p30 50Mb/s CBR"),
122
123         E("xd51", "XDCAM HD422 720p30 50Mb/s CBR"),
124         E("xd54", "XDCAM HD422 720p24 50Mb/s CBR"),
125         E("xd55", "XDCAM HD422 720p25 50Mb/s CBR"),
126         E("xd59", "XDCAM HD422 720p60 50Mb/s CBR"),
127         E("xd5a", "XDCAM HD422 720p50 50Mb/s CBR"),
128         E("xd5b", "XDCAM HD422 1080i60 50Mb/s CBR"),
129         E("xd5c", "XDCAM HD422 1080i50 50Mb/s CBR"),
130         E("xd5d", "XDCAM HD422 1080p24 50Mb/s CBR"),
131         E("xd5e", "XDCAM HD422 1080p25 50Mb/s CBR"),
132         E("xd5f", "XDCAM HD422 1080p30 50Mb/s CBR"),
133
134         E("xdhd", "XDCAM HD 540p"),
135         E("xdh2", "XDCAM HD422 540p"),
136
137         E("AVmp", "AVID IMX PAL"),
138         E("MMES", "Matrox MPEG-2"),
139         E("mmes", "Matrox MPEG-2"),
140         E("PIM2", "Pinnacle MPEG-2"),
141         E("LMP2", "Lead MPEG-2"),
142
143         E("VCR2", "ATI VCR-2"),
144
145     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
146         A("mp4v"),
147         A("DIVX"),
148         A("divx"),
149         A("MP4S"),
150         A("mp4s"),
151         A("M4S2"),
152         A("m4s2"),
153         A("MP4V"),
154         A("\x04\x00\x00\x00"),
155         A("m4cc"),
156         A("M4CC"),
157         A("FMP4"),
158         A("fmp4"),
159         A("DCOD"),
160         A("MVXM"),
161         A("PM4V"),
162         A("M4T3"),
163         A("GEOX"),
164         A("GEOV"),
165         A("DMK2"),
166         A("WV1F"),
167         A("DIGI"),
168         A("INMC"),
169         A("SN40"),
170         A("EPHV"),
171         A("DM4V"),
172         A("SM4V"),
173         A("DYM4"),
174         /* XVID flavours */
175         E("xvid", "Xvid MPEG-4 Video"),
176         E("XVID", "Xvid MPEG-4 Video"),
177         E("XviD", "Xvid MPEG-4 Video"),
178         E("XVIX", "Xvid MPEG-4 Video"),
179         E("xvix", "Xvid MPEG-4 Video"),
180         /* DX50 */
181         E("DX50", "DivX MPEG-4 Video"),
182         E("dx50", "DivX MPEG-4 Video"),
183         E("BLZ0", "Blizzard MPEG-4 Video"),
184         E("DXGM", "Electronic Arts Game MPEG-4 Video"),
185         E("DreX", "DreX Mpeg-4"),
186         /* 3ivx delta 4 */
187         E("3IV2", "3ivx MPEG-4 Video"),
188         E("3iv2", "3ivx MPEG-4 Video"),
189         /* Various */
190         E("UMP4", "UB MPEG-4 Video"),
191         E("SEDG", "Samsung MPEG-4 Video"),
192         E("RMP4", "REALmagic MPEG-4 Video"),
193         E("LMP4", "Lead MPEG-4 Video"),
194         E("HDX4", "Jomigo HDX4 (MPEG-4 Video)"),
195         E("hdx4", "Jomigo HDX4 (MPEG-4 Video)"),
196         E("SMP4", "Samsung SMP4 (MPEG-4 Video)"),
197         E("smp4", "Samsung SMP4 (MPEG-4 Video)"),
198         E("fvfw", "libavcodec MPEG-4"),
199         E("FVFW", "libavcodec MPEG-4"),
200         E("FFDS", "FFDShow MPEG-4"),
201         E("VIDM", "vidm 4.01 codec"),
202         E("DP02", "DynaPel MPEG-4 codec"),
203         E("PLV1", "Pelco DVR MPEG-4"),
204         E("QMP4", "QNAP Systems MPEG-4"),
205         /* 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(VLC_CODEC_TMV, "8088flex TMV"),
1061
1062     B(VLC_CODEC_XAN_WC3, "Wing Commander III video"),
1063
1064     B(VLC_CODEC_WS_VQA, "Westwood Studios VQA"),
1065
1066     B(VLC_CODEC_MMVIDEO, "American Laser Games MM Video"),
1067
1068     B(VLC_CODEC_AVS, "Creature Shock AVS"),
1069
1070     B(VLC_CODEC_DSICINVIDEO, "Delphine CIN video"),
1071
1072     B(VLC_CODEC_TIERTEXSEQVIDEO, "Tiertex Limited SEQ video"),
1073
1074     B(VLC_CODEC_DXA, "Feeble Files/ScummVM DXA"),
1075
1076     B(VLC_CODEC_C93, "Interplay C93"),
1077
1078     B(VLC_CODEC_BETHSOFTVID, "Bethesda VID"),
1079
1080     B(VLC_CODEC_VB, "Beam Software VB"),
1081
1082     B(VLC_CODEC_RL2, "RL2 video"),
1083
1084     B(VLC_CODEC_BFI, "Brute Force & Ignorance (BFI) video"),
1085
1086     B(VLC_CODEC_CMV, "Electronic Arts CMV"),
1087
1088     B(VLC_CODEC_MOTIONPIXELS, "Sirius Publishing Motion Pixels"),
1089
1090     B(VLC_CODEC_TGV, "Electronic Arts TGV"),
1091
1092     B(VLC_CODEC_TGQ, "Electronic Arts TGQ"),
1093
1094     B(VLC_CODEC_TQI, "Electronic Arts TQI"),
1095
1096     B(VLC_CODEC_MAD, "Electronic Arts MAD"),
1097
1098     B(VLC_CODEC_ANM, "DeluxePaint animation"),
1099
1100     B(VLC_CODEC_YOP, "Psygnosis YOP"),
1101
1102     B(VLC_CODEC_JV, "Bitmap Brothers JV"),
1103
1104     B(VLC_CODEC_DFA, "Chronomaster DFA"),
1105
1106     B(VLC_CODEC_HNM4_VIDEO, "Cryo Interactive Entertainment HNM4"),
1107
1108     B(0, "")
1109 };
1110 static const staticentry_t p_list_audio[] = {
1111
1112     /* Windows Media Audio 1 */
1113     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
1114         A("WMA1"),
1115         A("wma1"),
1116
1117     /* Windows Media Audio 2 */
1118     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
1119         A("WMA2"),
1120         A("wma2"),
1121         A("wma "),
1122
1123     /* Windows Media Audio Professional */
1124     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
1125         A("WMAP"),
1126         A("wmap"),
1127
1128     /* Windows Media Audio Lossless */
1129     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
1130         A("WMAL"),
1131         A("wmal"),
1132
1133     /* Windows Media Audio Speech */
1134     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
1135         A("WMAS"),
1136         A("wmas"),
1137
1138     /* DV Audio */
1139     B(VLC_CODEC_DVAUDIO, "DV Audio"),
1140         A("dvau"),
1141         A("vdva"),
1142         A("dvca"),
1143         A("RADV"),
1144
1145     /* MACE-3 Audio */
1146     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
1147         A("MAC3"),
1148
1149     /* MACE-6 Audio */
1150     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
1151         A("MAC6"),
1152
1153     /* MUSEPACK7 Audio */
1154     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
1155         A("MPC "),
1156
1157     /* MUSEPACK8 Audio */
1158     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
1159         A("MPCK"),
1160         A("MPC8"),
1161
1162     /* RealAudio 1.0 */
1163     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
1164         A("14_4"),
1165         A("lpcJ"),
1166
1167     /* RealAudio 2.0 */
1168     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
1169         A("28_8"),
1170
1171     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
1172         A("sipr"),
1173
1174     /* MPEG Audio layer 1/2 */
1175     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2"),
1176         A("mpga"),
1177         A("mp2a"),
1178         A(".mp1"),
1179         A(".mp2"),
1180         A("LAME"),
1181         A("ms\x00\x50"),
1182         A("ms\x00\x55"),
1183
1184     /* MPEG Audio layer 3 */
1185     B(VLC_CODEC_MP3, "MPEG Audio layer 3"),
1186         A("mp3 "),
1187         A(".mp3"),
1188         A("MP3 "),
1189
1190     /* A52 Audio (aka AC3) */
1191     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
1192         A("a52 "),
1193         A("a52b"),
1194         A("ac-3"),
1195         A("sac3"),
1196         A("ms\x20\x00"),
1197
1198     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
1199         A("eac3"),
1200
1201     /* DTS Audio */
1202     B(VLC_CODEC_DTS, "DTS Audio"),
1203         A("dts "),
1204         A("DTS "),
1205         A("dtsb"),
1206         A("dtsc"),
1207         E("dtse", "DTS Express"),
1208         E("dtsh", "DTS-HD High Resolution Audio"),
1209         E("dtsl", "DTS-HD Lossless"),
1210         A("ms\x20\x01"),
1211
1212     /* AAC audio */
1213     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
1214         A("mp4a"),
1215         A("aac "),
1216         A("AACL"),
1217         A("AACH"),
1218
1219     /* ALS audio */
1220     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
1221         A("als "),
1222
1223     /* 4X Technologies */
1224     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
1225         A("4xma"),
1226
1227     /* EA ADPCM */
1228     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
1229         A("ADEA"),
1230
1231     /* Interplay DPCM */
1232     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
1233         A("idpc"),
1234
1235     /* Id RoQ */
1236     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
1237         A("RoQa"),
1238
1239     /* DCIN Audio */
1240     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
1241         A("DCIA"),
1242
1243     /* Sony Playstation XA ADPCM */
1244     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
1245         A("xa  "),
1246
1247     /* ADX ADPCM */
1248     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
1249         A("adx "),
1250
1251     /* Westwood ADPCM */
1252     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
1253         A("AIWS"),
1254
1255     /* MS ADPCM */
1256     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
1257         A("ms\x00\x02"),
1258
1259     /* Sierra VMD */
1260     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
1261         A("vmda"),
1262
1263     /* G.726 ADPCM */
1264     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
1265         A("g726"),
1266
1267     /* G.722 ADPCM */
1268     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
1269         A("g722"),
1270
1271     /* Flash ADPCM */
1272     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
1273         A("SWFa"),
1274
1275     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
1276         A("ms\x00\x11"),
1277
1278     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
1279         A("imav"),
1280
1281     B(VLC_CODEC_ADPCM_IMA_QT, "IMA QT ADPCM Audio"),
1282         A("ima4"),
1283
1284     B(VLC_CODEC_ADPCM_YAMAHA, "Yamaha ADPCM Audio" ),
1285         A("ms\x00\x20"),
1286
1287     B(VLC_CODEC_ADPCM_DK3, "Duck DK3 ADPCM"),
1288         A("ms\x00\x62"),
1289
1290     B(VLC_CODEC_ADPCM_DK4, "Duck DK4 ADPCM"),
1291         A("ms\x00\x61"),
1292
1293     B(VLC_CODEC_ADPCM_THP, "GameCube THP ADPCM"),
1294
1295     /* AMR */
1296     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1297         A("samr"),
1298
1299     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1300         A("sawb"),
1301
1302     /* FLAC */
1303     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1304         A("flac"),
1305
1306     /* ALAC */
1307     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1308         A("alac"),
1309
1310     /* QDM2 */
1311     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1312         A("QDM2"),
1313
1314     /* COOK */
1315     B(VLC_CODEC_COOK, "Cook Audio"),
1316         A("cook"),
1317
1318     /* TTA: The Lossless True Audio */
1319     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1320         A("TTA1"),
1321
1322     /* Shorten */
1323     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1324         A("shn "),
1325         A("shrn"),
1326
1327     B(VLC_CODEC_WAVPACK, "WavPack"),
1328         A("WVPK"),
1329         A("wvpk"),
1330
1331     B(VLC_CODEC_GSM, "GSM Audio"),
1332         A("gsm "),
1333
1334     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1335         A("agsm"),
1336
1337     B(VLC_CODEC_ATRAC1, "atrac 1"),
1338         A("atr1"),
1339
1340     B(VLC_CODEC_ATRAC3, "atrac 3"),
1341         A("atrc"),
1342         A("\x70\x02\x00\x00"),
1343
1344     B(VLC_CODEC_ATRAC3P, "atrac 3+"),
1345         A("atrp"),
1346
1347     B(VLC_CODEC_IMC, "IMC" ),
1348         A("\x01\x04\x00\x00"),
1349
1350     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1351         A("\x22\x00\x00\x00"),
1352
1353     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1354         A("NELL"),
1355         A("nmos"),
1356
1357     B(VLC_CODEC_APE, "Monkey's Audio"),
1358         A("APE "),
1359
1360     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1361         A("mlp "),
1362
1363     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1364         A("trhd"),
1365
1366     B(VLC_CODEC_QCELP, "QCELP Audio"),
1367         A("Qclp"),
1368         A("Qclq"),
1369         A("sqcp"),
1370
1371     B(VLC_CODEC_SPEEX, "Speex Audio"),
1372         A("spx "),
1373         A("spxr"),
1374
1375     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1376         A("vorb"),
1377         A("vor1"),
1378
1379     B(VLC_CODEC_OPUS, "Opus Audio"),
1380         A("Opus"),
1381         A("opus"),
1382
1383     B(VLC_CODEC_302M, "302M Audio"),
1384         A("302m"),
1385
1386     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1387         A("lpcm"),
1388
1389     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1390         A("apcm"),
1391
1392     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1393         A("bpcm"),
1394
1395     B(VLC_CODEC_SDDS, "SDDS Audio"),
1396         A("sdds"),
1397         A("sddb"),
1398
1399     B(VLC_CODEC_MIDI, "MIDI Audio"),
1400         A("MIDI"),
1401
1402     B(VLC_CODEC_RALF, "RealAudio Lossless"),
1403         A("LSD:"),
1404
1405     /* G.723.1 */
1406     B(VLC_CODEC_G723_1, "G.723.1 Audio"),
1407         A("g72\x31"),
1408
1409     /* PCM */
1410     B(VLC_CODEC_S8, "PCM S8"),
1411         A("s8  "),
1412
1413     B(VLC_CODEC_U8, "PCM U8"),
1414         A("u8  "),
1415
1416     B(VLC_CODEC_S16L, "PCM S16 LE"),
1417         A("s16l"),
1418
1419     B(VLC_CODEC_S16L_PLANAR, "PCM S16 LE planar"),
1420
1421     B(VLC_CODEC_S16B, "PCM S16 BE"),
1422         A("s16b"),
1423
1424     B(VLC_CODEC_U16L, "PCM U16 LE"),
1425         A("u16l"),
1426
1427     B(VLC_CODEC_U16B, "PCM U16 BE"),
1428         A("u16b"),
1429
1430     B(VLC_CODEC_S20B, "PCM S20 BE"),
1431
1432     B(VLC_CODEC_S24L, "PCM S24 LE"),
1433         A("s24l"),
1434         A("42ni"),  /* Quicktime */
1435
1436     B(VLC_CODEC_S24B, "PCM S24 BE"),
1437         A("s24b"),
1438         A("in24"),  /* Quicktime */
1439
1440     B(VLC_CODEC_U24L, "PCM U24 LE"),
1441         A("u24l"),
1442
1443     B(VLC_CODEC_U24B, "PCM U24 BE"),
1444         A("u24b"),
1445
1446     B(VLC_CODEC_S24L32, "PCM S24 in 32 LE"),
1447
1448     B(VLC_CODEC_S24B32, "PCM S24 in 32 BE"),
1449
1450     B(VLC_CODEC_S32L, "PCM S32 LE"),
1451         A("s32l"),
1452         A("23ni"),  /* Quicktime */
1453
1454     B(VLC_CODEC_S32B, "PCM S32 BE"),
1455         A("s32b"),
1456         A("in32"),  /* Quicktime */
1457
1458     B(VLC_CODEC_U32L, "PCM U32 LE"),
1459         A("u32l"),
1460
1461     B(VLC_CODEC_U32B, "PCM U32 BE"),
1462         A("u32b"),
1463
1464     B(VLC_CODEC_ALAW, "PCM ALAW"),
1465         A("alaw"),
1466
1467     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1468         A("mlaw"),
1469         A("ulaw"),
1470
1471     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1472
1473     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1474         A("daud"),
1475
1476     B(VLC_CODEC_F32L, "32 bits float LE"),
1477         A("f32l"),
1478         A("fl32"),
1479
1480     B(VLC_CODEC_F32B, "32 bits float BE"),
1481         A("f32b"),
1482
1483     B(VLC_CODEC_F64L, "64 bits float LE"),
1484         A("f64l"),
1485
1486     B(VLC_CODEC_F64L, "64 bits float BE"),
1487         A("f64b"),
1488
1489     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1490         A("TWIN"),
1491
1492     B(VLC_CODEC_BMVAUDIO, "Discworld II BMV audio"),
1493         A("BMVA"),
1494
1495     B(VLC_CODEC_ULEAD_DV_AUDIO_NTSC, "Ulead DV audio NTSC"),
1496         A("ms\x02\x15"),
1497     B(VLC_CODEC_ULEAD_DV_AUDIO_PAL, "Ulead DV audio PAL"),
1498         A("ms\x02\x16"),
1499
1500     B(VLC_CODEC_INDEO_AUDIO, "Indeo Audio Coder"),
1501         A("ms\x04\x02"),
1502
1503     B(VLC_CODEC_TAK, "TAK (Tom's lossless Audio Kompressor)"),
1504
1505     B(VLC_CODEC_SMACKAUDIO, "Smacker audio"),
1506
1507     B(VLC_CODEC_ADPCM_IMA_EA_SEAD, "ADPCM IMA Electronic Arts SEAD"),
1508
1509     B(VLC_CODEC_ADPCM_EA_R1, "ADPCM Electronic Arts R1"),
1510
1511     B(VLC_CODEC_ADPCM_IMA_APC, "ADPCM APC"),
1512
1513     B(0, "")
1514 };
1515 static const staticentry_t p_list_spu[] = {
1516
1517     B(VLC_CODEC_SPU, "DVD Subtitles"),
1518         A("spu "),
1519         A("spub"),
1520
1521     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1522         A("dvbs"),
1523
1524     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1525         A("subt"),
1526
1527     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1528         A("XSUB"),
1529         A("xsub"),
1530         A("DXSB"),
1531
1532     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1533         A("ssa "),
1534
1535     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1536         A("TEXT"),
1537
1538     B(VLC_CODEC_TELETEXT, "Teletext"),
1539         A("telx"),
1540
1541     B(VLC_CODEC_KATE, "Kate subtitles"),
1542         A("kate"),
1543
1544     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1545         A("cmml"),
1546
1547     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1548         A("t140"),
1549
1550     B(VLC_CODEC_USF, "USF subtitles"),
1551         A("usf "),
1552
1553     B(VLC_CODEC_OGT, "OGT subtitles"),
1554         A("ogt "),
1555
1556     B(VLC_CODEC_CVD, "CVD subtitles"),
1557         A("cvd "),
1558
1559     B(VLC_CODEC_BD_PG, "BD subtitles"),
1560         A("bdpg"),
1561
1562     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1563         A("STL "),
1564
1565     B(VLC_CODEC_SCTE_27, "SCTE-27 subtitles"),
1566         A("SC27"),
1567
1568     B(0, "")
1569 };
1570
1571 /* Create a fourcc from a string.
1572  * XXX it assumes that the string is at least four bytes */
1573 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1574 {
1575     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1576                        psz_fourcc[2], psz_fourcc[3] );
1577 }
1578
1579 /* */
1580 static entry_t Lookup( const staticentry_t p_list[], vlc_fourcc_t i_fourcc )
1581 {
1582     const char *p_class = NULL;
1583     const char *psz_description = NULL;
1584
1585     entry_t e = B(0, "");
1586
1587     for( int i = 0; ; i++ )
1588     {
1589         const staticentry_t *p = &p_list[i];
1590         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1591         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1592
1593         if( i_entry_fourcc == 0 )
1594             break;
1595
1596         if( i_entry_class != 0 )
1597         {
1598             p_class = p->p_class;
1599             psz_description = p->psz_description;
1600         }
1601
1602         if( i_entry_fourcc == i_fourcc )
1603         {
1604             assert( p_class != NULL );
1605
1606             memcpy( e.p_class, p_class, 4 );
1607             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1608             e.psz_description = p->psz_description[0] != '\0' ?
1609                                 p->psz_description : psz_description;
1610             break;
1611         }
1612     }
1613     return e;
1614 }
1615
1616 /* */
1617 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1618 {
1619     entry_t e;
1620
1621     switch( i_cat )
1622     {
1623     case VIDEO_ES:
1624         return Lookup( p_list_video, i_fourcc );
1625     case AUDIO_ES:
1626         return Lookup( p_list_audio, i_fourcc );
1627     case SPU_ES:
1628         return Lookup( p_list_spu, i_fourcc );
1629
1630     default:
1631         e = Find( VIDEO_ES, i_fourcc );
1632         if( CreateFourcc( e.p_class ) == 0 )
1633             e = Find( AUDIO_ES, i_fourcc );
1634         if( CreateFourcc( e.p_class ) == 0 )
1635             e = Find( SPU_ES, i_fourcc );
1636         return e;
1637     }
1638 }
1639
1640 /* */
1641 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1642 {
1643     entry_t e = Find( i_cat, i_fourcc );
1644
1645     if( CreateFourcc( e.p_class ) == 0 )
1646         return i_fourcc;
1647     return CreateFourcc( e.p_class );
1648 }
1649
1650 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1651 {
1652     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1653         return 0;
1654     return vlc_fourcc_GetCodec( i_cat,
1655                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1656                                             psz_fourcc[2], psz_fourcc[3] ) );
1657 }
1658
1659 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1660 {
1661     const int i_bytes = ( i_bits + 7 ) / 8;
1662
1663     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1664     {
1665         switch( i_bytes )
1666         {
1667         case 4:
1668             return VLC_CODEC_FL32;
1669         case 8:
1670             return VLC_CODEC_FL64;
1671         default:
1672             return 0;
1673         }
1674     }
1675     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
1676     {
1677         switch( i_bytes )
1678         {
1679         case 1:
1680             return VLC_CODEC_U8;
1681         case 2:
1682             return VLC_CODEC_S16L;
1683         case 3:
1684             return VLC_CODEC_S24L;
1685             break;
1686         case 4:
1687             return VLC_CODEC_S32L;
1688         default:
1689             return 0;
1690         }
1691     }
1692     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1693     {
1694         switch( i_bytes )
1695         {
1696         case 1:
1697             return VLC_CODEC_S8;
1698         case 2:
1699             return VLC_CODEC_S16B;
1700         case 3:
1701             return VLC_CODEC_S24B;
1702         case 4:
1703             return VLC_CODEC_S32B;
1704         default:
1705             return 0;
1706         }
1707     }
1708     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1709     {
1710         switch( i_bytes )
1711         {
1712         case 1:
1713             return VLC_CODEC_S8;
1714         case 2:
1715             return VLC_CODEC_S16L;
1716         case 3:
1717             return VLC_CODEC_S24L;
1718         case 4:
1719             return VLC_CODEC_S32L;
1720         default:
1721             return 0;
1722         }
1723     }
1724     else
1725     {
1726         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1727     }
1728 }
1729
1730 /* */
1731 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1732 {
1733     entry_t e = Find( i_cat, i_fourcc );
1734
1735     return e.psz_description;
1736 }
1737
1738
1739 /* */
1740 #define VLC_CODEC_YUV_PLANAR_410 \
1741     VLC_CODEC_I410, VLC_CODEC_YV9
1742
1743 #define VLC_CODEC_YUV_PLANAR_420 \
1744     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1745
1746 #define VLC_CODEC_YUV_SEMIPLANAR_420 \
1747     VLC_CODEC_NV12, VLC_CODEC_NV21
1748
1749 #define VLC_CODEC_YUV_PLANAR_420_16 \
1750     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1751
1752 #define VLC_CODEC_YUV_PLANAR_422 \
1753     VLC_CODEC_I422, VLC_CODEC_J422
1754
1755 #define VLC_CODEC_YUV_SEMIPLANAR_422 \
1756     VLC_CODEC_NV16, VLC_CODEC_NV61
1757
1758 #define VLC_CODEC_YUV_PLANAR_422_16 \
1759     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1760
1761 #define VLC_CODEC_YUV_PLANAR_440 \
1762     VLC_CODEC_I440, VLC_CODEC_J440
1763
1764 #define VLC_CODEC_YUV_PLANAR_444 \
1765     VLC_CODEC_I444, VLC_CODEC_J444
1766
1767 #define VLC_CODEC_YUV_SEMIPLANAR_444 \
1768     VLC_CODEC_NV24, VLC_CODEC_NV42
1769
1770 #define VLC_CODEC_YUV_PLANAR_444_16 \
1771     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, \
1772     VLC_CODEC_I444_16L, VLC_CODEC_I444_16B
1773
1774 #define VLC_CODEC_YUV_PACKED \
1775     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1776     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1777
1778 #define VLC_CODEC_FALLBACK_420 \
1779     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1780     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1781     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1782
1783 static const vlc_fourcc_t p_I420_fallback[] = {
1784     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1785 };
1786 static const vlc_fourcc_t p_J420_fallback[] = {
1787     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1788 };
1789 static const vlc_fourcc_t p_YV12_fallback[] = {
1790     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1791 };
1792
1793 #define VLC_CODEC_FALLBACK_420_16 \
1794     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1795
1796 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1797     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1798 };
1799 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1800     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1801 };
1802 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1803     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1804 };
1805 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1806     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1807 };
1808
1809 #define VLC_CODEC_FALLBACK_422 \
1810     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1811     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1812     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1813
1814 static const vlc_fourcc_t p_I422_fallback[] = {
1815     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1816 };
1817 static const vlc_fourcc_t p_J422_fallback[] = {
1818     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1819 };
1820
1821 #define VLC_CODEC_FALLBACK_422_16 \
1822     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1823
1824 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1825     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1826 };
1827 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1828     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1829 };
1830 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1831     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1832 };
1833 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1834     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1835 };
1836
1837 #define VLC_CODEC_FALLBACK_444 \
1838     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1839     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1840     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1841
1842 static const vlc_fourcc_t p_I444_fallback[] = {
1843     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1844 };
1845 static const vlc_fourcc_t p_J444_fallback[] = {
1846     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1847 };
1848
1849 #define VLC_CODEC_FALLBACK_444_16 \
1850     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1851
1852 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1853     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1854 };
1855 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1856     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1857 };
1858 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1859     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1860 };
1861 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1862     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1863 };
1864 static const vlc_fourcc_t p_I444_16L_fallback[] = {
1865     VLC_CODEC_I444_16L, VLC_CODEC_I444_16B, VLC_CODEC_FALLBACK_444_16, 0
1866 };
1867 static const vlc_fourcc_t p_I444_16B_fallback[] = {
1868     VLC_CODEC_I444_16B, VLC_CODEC_I444_16L, VLC_CODEC_FALLBACK_444_16, 0
1869 };
1870
1871
1872 static const vlc_fourcc_t p_I440_fallback[] = {
1873     VLC_CODEC_I440,
1874     VLC_CODEC_YUV_PLANAR_420,
1875     VLC_CODEC_YUV_PLANAR_422,
1876     VLC_CODEC_YUV_PLANAR_444,
1877     VLC_CODEC_YUV_PACKED,
1878     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1879 };
1880
1881 #define VLC_CODEC_FALLBACK_PACKED \
1882     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1883     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1884     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1885
1886 static const vlc_fourcc_t p_YUYV_fallback[] = {
1887     VLC_CODEC_YUYV,
1888     VLC_CODEC_YVYU,
1889     VLC_CODEC_UYVY,
1890     VLC_CODEC_VYUY,
1891     VLC_CODEC_FALLBACK_PACKED, 0
1892 };
1893 static const vlc_fourcc_t p_YVYU_fallback[] = {
1894     VLC_CODEC_YVYU,
1895     VLC_CODEC_YUYV,
1896     VLC_CODEC_UYVY,
1897     VLC_CODEC_VYUY,
1898     VLC_CODEC_FALLBACK_PACKED, 0
1899 };
1900 static const vlc_fourcc_t p_UYVY_fallback[] = {
1901     VLC_CODEC_UYVY,
1902     VLC_CODEC_VYUY,
1903     VLC_CODEC_YUYV,
1904     VLC_CODEC_YVYU,
1905     VLC_CODEC_FALLBACK_PACKED, 0
1906 };
1907 static const vlc_fourcc_t p_VYUY_fallback[] = {
1908     VLC_CODEC_VYUY,
1909     VLC_CODEC_UYVY,
1910     VLC_CODEC_YUYV,
1911     VLC_CODEC_YVYU,
1912     VLC_CODEC_FALLBACK_PACKED, 0
1913 };
1914
1915 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1916     p_YV12_fallback,
1917     p_I420_fallback,
1918     p_I420_9L_fallback,
1919     p_I420_9B_fallback,
1920     p_I420_10L_fallback,
1921     p_I420_10B_fallback,
1922     p_J420_fallback,
1923     p_I422_fallback,
1924     p_I422_9L_fallback,
1925     p_I422_9B_fallback,
1926     p_I422_10L_fallback,
1927     p_I422_10B_fallback,
1928     p_J422_fallback,
1929     p_I444_fallback,
1930     p_J444_fallback,
1931     p_I444_9L_fallback,
1932     p_I444_9B_fallback,
1933     p_I444_10L_fallback,
1934     p_I444_10B_fallback,
1935     p_I444_16L_fallback,
1936     p_I444_16B_fallback,
1937     p_I440_fallback,
1938     p_YUYV_fallback,
1939     p_YVYU_fallback,
1940     p_UYVY_fallback,
1941     p_VYUY_fallback,
1942
1943
1944     NULL,
1945 };
1946
1947 static const vlc_fourcc_t p_list_YUV[] = {
1948     VLC_CODEC_YUV_PLANAR_420,
1949     VLC_CODEC_YUV_SEMIPLANAR_420,
1950     VLC_CODEC_YUV_PLANAR_422,
1951     VLC_CODEC_YUV_SEMIPLANAR_422,
1952     VLC_CODEC_YUV_PLANAR_440,
1953     VLC_CODEC_YUV_PLANAR_444,
1954     VLC_CODEC_YUV_SEMIPLANAR_444,
1955     VLC_CODEC_YUV_PACKED,
1956     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1957     VLC_CODEC_YUV_PLANAR_420_16,
1958     VLC_CODEC_YUV_PLANAR_422_16,
1959     VLC_CODEC_YUV_PLANAR_444_16,
1960     VLC_CODEC_VDPAU_VIDEO_420,
1961     VLC_CODEC_VDPAU_VIDEO_422,
1962     VLC_CODEC_VDPAU_VIDEO_444,
1963     0,
1964 };
1965
1966 /* */
1967 static const vlc_fourcc_t p_RGB32_fallback[] = {
1968     VLC_CODEC_RGB32,
1969     VLC_CODEC_RGB24,
1970     VLC_CODEC_RGB16,
1971     VLC_CODEC_RGB15,
1972     VLC_CODEC_RGB8,
1973     0,
1974 };
1975 static const vlc_fourcc_t p_RGB24_fallback[] = {
1976     VLC_CODEC_RGB24,
1977     VLC_CODEC_RGB32,
1978     VLC_CODEC_RGB16,
1979     VLC_CODEC_RGB15,
1980     VLC_CODEC_RGB8,
1981     0,
1982 };
1983 static const vlc_fourcc_t p_RGB16_fallback[] = {
1984     VLC_CODEC_RGB16,
1985     VLC_CODEC_RGB24,
1986     VLC_CODEC_RGB32,
1987     VLC_CODEC_RGB15,
1988     VLC_CODEC_RGB8,
1989     0,
1990 };
1991 static const vlc_fourcc_t p_RGB15_fallback[] = {
1992     VLC_CODEC_RGB15,
1993     VLC_CODEC_RGB16,
1994     VLC_CODEC_RGB24,
1995     VLC_CODEC_RGB32,
1996     VLC_CODEC_RGB8,
1997     0,
1998 };
1999 static const vlc_fourcc_t p_RGB8_fallback[] = {
2000     VLC_CODEC_RGB8,
2001     VLC_CODEC_RGB15,
2002     VLC_CODEC_RGB16,
2003     VLC_CODEC_RGB24,
2004     VLC_CODEC_RGB32,
2005     0,
2006 };
2007 static const vlc_fourcc_t *pp_RGB_fallback[] = {
2008     p_RGB32_fallback,
2009     p_RGB24_fallback,
2010     p_RGB16_fallback,
2011     p_RGB15_fallback,
2012     p_RGB8_fallback,
2013     NULL,
2014 };
2015
2016
2017 /* */
2018 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
2019                                         const vlc_fourcc_t *pp_fallback[],
2020                                         const vlc_fourcc_t p_list[] )
2021 {
2022     for( unsigned i = 0; pp_fallback[i]; i++ )
2023     {
2024         if( pp_fallback[i][0] == i_fourcc )
2025             return pp_fallback[i];
2026     }
2027     return p_list;
2028 }
2029
2030 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
2031 {
2032     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
2033 }
2034 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
2035 {
2036     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
2037 }
2038
2039 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
2040 {
2041     static const vlc_fourcc_t pp_swapped[][4] = {
2042         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
2043         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
2044         { 0 }
2045     };
2046
2047     for( int i = 0; pp_swapped[i][0]; i++ )
2048     {
2049         if( pp_swapped[i][0] == b )
2050         {
2051             vlc_fourcc_t t = a;
2052             a = b;
2053             b = t;
2054         }
2055         if( pp_swapped[i][0] != a )
2056             continue;
2057         for( int j = 1; pp_swapped[i][j]; j++ )
2058         {
2059             if( pp_swapped[i][j] == b )
2060                 return true;
2061         }
2062     }
2063     return false;
2064 }
2065
2066 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
2067 {
2068     for( unsigned i = 0; p_list_YUV[i]; i++ )
2069     {
2070         if( p_list_YUV[i] == fcc )
2071             return true;
2072     }
2073     return false;
2074 }
2075
2076 #define PLANAR(n, w_den, h_den, size, bits) \
2077     { .plane_count = n, \
2078       .p = { {.w = {1,    1}, .h = {1,    1}}, \
2079              {.w = {1,w_den}, .h = {1,h_den}}, \
2080              {.w = {1,w_den}, .h = {1,h_den}}, \
2081              {.w = {1,    1}, .h = {1,    1}} }, \
2082       .pixel_size = size, \
2083       .pixel_bits = bits }
2084
2085 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
2086 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
2087
2088 #define PACKED_FMT(size, bits) \
2089     { .plane_count = 1, \
2090       .p = { {.w = {1,1}, .h = {1,1}} }, \
2091       .pixel_size = size, \
2092       .pixel_bits = bits }
2093
2094 /* Zero planes for hardware picture handles. Cannot be manipulated directly. */
2095 #define FAKE_FMT() \
2096     { .plane_count = 0, \
2097       .p = { {.w = {1,1}, .h = {1,1}} }, \
2098       .pixel_size = 0, \
2099       .pixel_bits = 0 }
2100
2101 static const struct
2102 {
2103     vlc_fourcc_t             p_fourcc[4];
2104     vlc_chroma_description_t description;
2105 } p_list_chroma_description[] = {
2106     { { VLC_CODEC_I411 },                      PLANAR_8(3, 4, 1) },
2107     { { VLC_CODEC_YUV_PLANAR_410 },            PLANAR_8(3, 4, 4) },
2108     { { VLC_CODEC_YUV_PLANAR_420 },            PLANAR_8(3, 2, 2) },
2109     { { VLC_CODEC_NV12, VLC_CODEC_NV21 },      PLANAR_8(2, 1, 2) },
2110     { { VLC_CODEC_YUV_PLANAR_422 },            PLANAR_8(3, 2, 1) },
2111     { { VLC_CODEC_NV16, VLC_CODEC_NV61 },      PLANAR_8(2, 1, 1) },
2112     { { VLC_CODEC_YUV_PLANAR_440 },            PLANAR_8(3, 1, 2) },
2113     { { VLC_CODEC_YUV_PLANAR_444 },            PLANAR_8(3, 1, 1) },
2114     { { VLC_CODEC_YUVA },                      PLANAR_8(4, 1, 1) },
2115     { { VLC_CODEC_YUV420A },                   PLANAR_8(4, 2, 2) },
2116     { { VLC_CODEC_YUV422A },                   PLANAR_8(4, 2, 1) },
2117
2118     { { VLC_CODEC_GBR_PLANAR },                PLANAR_8(3, 1, 1) },
2119
2120     { { VLC_CODEC_I420_10L,
2121         VLC_CODEC_I420_10B },                  PLANAR_16(3, 2, 2, 10) },
2122     { { VLC_CODEC_I420_9L,
2123         VLC_CODEC_I420_9B },                   PLANAR_16(3, 2, 2,  9) },
2124     { { VLC_CODEC_I422_10L,
2125         VLC_CODEC_I422_10B },                  PLANAR_16(3, 2, 1, 10) },
2126     { { VLC_CODEC_I422_9L,
2127         VLC_CODEC_I422_9B },                   PLANAR_16(3, 2, 1,  9) },
2128     { { VLC_CODEC_I444_10L,
2129         VLC_CODEC_I444_10B },                  PLANAR_16(3, 1, 1, 10) },
2130     { { VLC_CODEC_I444_9L,
2131         VLC_CODEC_I444_9B },                   PLANAR_16(3, 1, 1,  9) },
2132     { { VLC_CODEC_I444_16L,
2133         VLC_CODEC_I444_16B },                  PLANAR_16(3, 1, 1, 16) },
2134
2135     { { VLC_CODEC_YUV_PACKED },                PACKED_FMT(2, 16) },
2136     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
2137         VLC_CODEC_YUVP, VLC_CODEC_RGBP },      PACKED_FMT(1, 8) },
2138
2139     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
2140     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
2141     { { VLC_CODEC_RGB16, 0 },                  PACKED_FMT(2, 16) },
2142     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
2143     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
2144     { { VLC_CODEC_RGBA, VLC_CODEC_ARGB,
2145         VLC_CODEC_BGRA, },                     PACKED_FMT(4, 32) },
2146
2147     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
2148     { { VLC_CODEC_XYZ12,  0 },                 PACKED_FMT(6, 48) },
2149
2150     { { VLC_CODEC_VDPAU_VIDEO_420, VLC_CODEC_VDPAU_VIDEO_422,
2151         VLC_CODEC_VDPAU_VIDEO_444, VLC_CODEC_VDPAU_OUTPUT },
2152                                                FAKE_FMT() },
2153     { { VLC_CODEC_ANDROID_OPAQUE, VLC_CODEC_MMAL_OPAQUE, },
2154                                                FAKE_FMT() },
2155
2156     { { 0 },                                   FAKE_FMT() }
2157 };
2158
2159 #undef PACKED_FMT
2160 #undef PLANAR_16
2161 #undef PLANAR_8
2162 #undef PLANAR
2163
2164 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
2165 {
2166     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
2167     {
2168         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
2169         for( unsigned j = 0; j < 4 && p_fourcc[j] != 0; j++ )
2170         {
2171             if( p_fourcc[j] == i_fourcc )
2172                 return &p_list_chroma_description[i].description;
2173         }
2174     }
2175     return NULL;
2176 }