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