]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
3576a74ff441d428a18f3f6ab38c42843e9e2ca7
[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(0, "")
1063 };
1064 static const staticentry_t p_list_audio[] = {
1065
1066     /* Windows Media Audio 1 */
1067     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
1068         A("WMA1"),
1069         A("wma1"),
1070
1071     /* Windows Media Audio 2 */
1072     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
1073         A("WMA2"),
1074         A("wma2"),
1075         A("wma "),
1076
1077     /* Windows Media Audio Professional */
1078     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
1079         A("WMAP"),
1080         A("wmap"),
1081
1082     /* Windows Media Audio Lossless */
1083     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
1084         A("WMAL"),
1085         A("wmal"),
1086
1087     /* Windows Media Audio Speech */
1088     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
1089         A("WMAS"),
1090         A("wmas"),
1091
1092     /* DV Audio */
1093     B(VLC_CODEC_DVAUDIO, "DV Audio"),
1094         A("dvau"),
1095         A("vdva"),
1096         A("dvca"),
1097         A("RADV"),
1098
1099     /* MACE-3 Audio */
1100     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
1101         A("MAC3"),
1102
1103     /* MACE-6 Audio */
1104     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
1105         A("MAC6"),
1106
1107     /* MUSEPACK7 Audio */
1108     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
1109         A("MPC "),
1110
1111     /* MUSEPACK8 Audio */
1112     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
1113         A("MPCK"),
1114         A("MPC8"),
1115
1116     /* RealAudio 1.0 */
1117     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
1118         A("14_4"),
1119         A("lpcJ"),
1120
1121     /* RealAudio 2.0 */
1122     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
1123         A("28_8"),
1124
1125     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
1126         A("sipr"),
1127
1128     /* MPEG Audio layer 1/2 */
1129     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2"),
1130         A("mpga"),
1131         A("mp2a"),
1132         A(".mp1"),
1133         A(".mp2"),
1134         A("LAME"),
1135         A("ms\x00\x50"),
1136         A("ms\x00\x55"),
1137
1138     /* MPEG Audio layer 3 */
1139     B(VLC_CODEC_MP3, "MPEG Audio layer 3"),
1140         A("mp3 "),
1141         A(".mp3"),
1142         A("MP3 "),
1143
1144     /* A52 Audio (aka AC3) */
1145     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
1146         A("a52 "),
1147         A("a52b"),
1148         A("ac-3"),
1149         A("sac3"),
1150         A("ms\x20\x00"),
1151
1152     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
1153         A("eac3"),
1154
1155     /* DTS Audio */
1156     B(VLC_CODEC_DTS, "DTS Audio"),
1157         A("dts "),
1158         A("DTS "),
1159         A("dtsb"),
1160         A("dtsc"),
1161         E("dtse", "DTS Express"),
1162         E("dtsh", "DTS-HD High Resolution Audio"),
1163         E("dtsl", "DTS-HD Lossless"),
1164         A("ms\x20\x01"),
1165
1166     /* AAC audio */
1167     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
1168         A("mp4a"),
1169         A("aac "),
1170         A("AACL"),
1171         A("AACH"),
1172
1173     /* ALS audio */
1174     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
1175         A("als "),
1176
1177     /* 4X Technologies */
1178     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
1179         A("4xma"),
1180
1181     /* EA ADPCM */
1182     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
1183         A("ADEA"),
1184
1185     /* Interplay DPCM */
1186     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
1187         A("idpc"),
1188
1189     /* Id RoQ */
1190     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
1191         A("RoQa"),
1192
1193     /* DCIN Audio */
1194     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
1195         A("DCIA"),
1196
1197     /* Sony Playstation XA ADPCM */
1198     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
1199         A("xa  "),
1200
1201     /* ADX ADPCM */
1202     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
1203         A("adx "),
1204
1205     /* Westwood ADPCM */
1206     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
1207         A("AIWS"),
1208
1209     /* MS ADPCM */
1210     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
1211         A("ms\x00\x02"),
1212
1213     /* Sierra VMD */
1214     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
1215         A("vmda"),
1216
1217     /* G.726 ADPCM */
1218     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
1219         A("g726"),
1220
1221     /* G.722 ADPCM */
1222     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
1223         A("g722"),
1224
1225     /* Flash ADPCM */
1226     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
1227         A("SWFa"),
1228
1229     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
1230         A("ms\x00\x11"),
1231
1232     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
1233         A("imav"),
1234
1235     B(VLC_CODEC_ADPCM_IMA_QT, "IMA QT ADPCM Audio"),
1236         A("ima4"),
1237
1238     B(VLC_CODEC_ADPCM_YAMAHA, "Yamaha ADPCM Audio" ),
1239         A("ms\x00\x20"),
1240
1241     B(VLC_CODEC_ADPCM_DK3, "Duck DK3 ADPCM"),
1242         A("ms\x00\x62"),
1243
1244     B(VLC_CODEC_ADPCM_DK4, "Duck DK4 ADPCM"),
1245         A("ms\x00\x61"),
1246
1247     B(VLC_CODEC_ADPCM_THP, "GameCube THP ADPCM"),
1248
1249     /* AMR */
1250     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1251         A("samr"),
1252
1253     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1254         A("sawb"),
1255
1256     /* FLAC */
1257     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1258         A("flac"),
1259
1260     /* ALAC */
1261     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1262         A("alac"),
1263
1264     /* QDM2 */
1265     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1266         A("QDM2"),
1267
1268     /* COOK */
1269     B(VLC_CODEC_COOK, "Cook Audio"),
1270         A("cook"),
1271
1272     /* TTA: The Lossless True Audio */
1273     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1274         A("TTA1"),
1275
1276     /* Shorten */
1277     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1278         A("shn "),
1279         A("shrn"),
1280
1281     B(VLC_CODEC_WAVPACK, "WavPack"),
1282         A("WVPK"),
1283         A("wvpk"),
1284
1285     B(VLC_CODEC_GSM, "GSM Audio"),
1286         A("gsm "),
1287
1288     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1289         A("agsm"),
1290
1291     B(VLC_CODEC_ATRAC1, "atrac 1"),
1292         A("atr1"),
1293
1294     B(VLC_CODEC_ATRAC3, "atrac 3"),
1295         A("atrc"),
1296         A("\x70\x02\x00\x00"),
1297
1298     B(VLC_CODEC_ATRAC3P, "atrac 3+"),
1299         A("atrp"),
1300
1301     B(VLC_CODEC_IMC, "IMC" ),
1302         A("\x01\x04\x00\x00"),
1303
1304     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1305         A("\x22\x00\x00\x00"),
1306
1307     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1308         A("NELL"),
1309         A("nmos"),
1310
1311     B(VLC_CODEC_APE, "Monkey's Audio"),
1312         A("APE "),
1313
1314     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1315         A("mlp "),
1316
1317     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1318         A("trhd"),
1319
1320     B(VLC_CODEC_QCELP, "QCELP Audio"),
1321         A("Qclp"),
1322         A("Qclq"),
1323         A("sqcp"),
1324
1325     B(VLC_CODEC_SPEEX, "Speex Audio"),
1326         A("spx "),
1327         A("spxr"),
1328
1329     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1330         A("vorb"),
1331         A("vor1"),
1332
1333     B(VLC_CODEC_OPUS, "Opus Audio"),
1334         A("Opus"),
1335         A("opus"),
1336
1337     B(VLC_CODEC_302M, "302M Audio"),
1338         A("302m"),
1339
1340     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1341         A("lpcm"),
1342
1343     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1344         A("apcm"),
1345
1346     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1347         A("bpcm"),
1348
1349     B(VLC_CODEC_SDDS, "SDDS Audio"),
1350         A("sdds"),
1351         A("sddb"),
1352
1353     B(VLC_CODEC_MIDI, "MIDI Audio"),
1354         A("MIDI"),
1355
1356     B(VLC_CODEC_RALF, "RealAudio Lossless"),
1357         A("LSD:"),
1358
1359     /* G.723.1 */
1360     B(VLC_CODEC_G723_1, "G.723.1 Audio"),
1361         A("g72\x31"),
1362
1363     /* PCM */
1364     B(VLC_CODEC_S8, "PCM S8"),
1365         A("s8  "),
1366
1367     B(VLC_CODEC_U8, "PCM U8"),
1368         A("u8  "),
1369
1370     B(VLC_CODEC_S16L, "PCM S16 LE"),
1371         A("s16l"),
1372
1373     B(VLC_CODEC_S16B, "PCM S16 BE"),
1374         A("s16b"),
1375
1376     B(VLC_CODEC_U16L, "PCM U16 LE"),
1377         A("u16l"),
1378
1379     B(VLC_CODEC_U16B, "PCM U16 BE"),
1380         A("u16b"),
1381
1382     B(VLC_CODEC_S20B, "PCM S20 BE"),
1383
1384     B(VLC_CODEC_S24L, "PCM S24 LE"),
1385         A("s24l"),
1386         A("42ni"),  /* Quicktime */
1387
1388     B(VLC_CODEC_S24B, "PCM S24 BE"),
1389         A("s24b"),
1390         A("in24"),  /* Quicktime */
1391
1392     B(VLC_CODEC_U24L, "PCM U24 LE"),
1393         A("u24l"),
1394
1395     B(VLC_CODEC_U24B, "PCM U24 BE"),
1396         A("u24b"),
1397
1398     B(VLC_CODEC_S24L32, "PCM S24 in 32 LE"),
1399
1400     B(VLC_CODEC_S24B32, "PCM S24 in 32 BE"),
1401
1402     B(VLC_CODEC_S32L, "PCM S32 LE"),
1403         A("s32l"),
1404         A("23ni"),  /* Quicktime */
1405
1406     B(VLC_CODEC_S32B, "PCM S32 BE"),
1407         A("s32b"),
1408         A("in32"),  /* Quicktime */
1409
1410     B(VLC_CODEC_U32L, "PCM U32 LE"),
1411         A("u32l"),
1412
1413     B(VLC_CODEC_U32B, "PCM U32 BE"),
1414         A("u32b"),
1415
1416     B(VLC_CODEC_ALAW, "PCM ALAW"),
1417         A("alaw"),
1418
1419     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1420         A("mlaw"),
1421         A("ulaw"),
1422
1423     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1424
1425     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1426         A("daud"),
1427
1428     B(VLC_CODEC_F32L, "32 bits float LE"),
1429         A("f32l"),
1430         A("fl32"),
1431
1432     B(VLC_CODEC_F32B, "32 bits float BE"),
1433         A("f32b"),
1434
1435     B(VLC_CODEC_F64L, "64 bits float LE"),
1436         A("f64l"),
1437
1438     B(VLC_CODEC_F64L, "64 bits float BE"),
1439         A("f64b"),
1440
1441     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1442         A("TWIN"),
1443
1444     B(VLC_CODEC_BMVAUDIO, "Discworld II BMV audio"),
1445         A("BMVA"),
1446
1447     B(VLC_CODEC_ULEAD_DV_AUDIO_NTSC, "Ulead DV audio NTSC"),
1448         A("ms\x02\x15"),
1449     B(VLC_CODEC_ULEAD_DV_AUDIO_PAL, "Ulead DV audio PAL"),
1450         A("ms\x02\x16"),
1451
1452     B(VLC_CODEC_INDEO_AUDIO, "Indeo Audio Coder"),
1453         A("ms\x04\x02"),
1454
1455     B(VLC_CODEC_TAK, "TAK (Tom's lossless Audio Kompressor)"),
1456
1457     B(VLC_CODEC_SMACKAUDIO, "Smacker audio"),
1458
1459     B(0, "")
1460 };
1461 static const staticentry_t p_list_spu[] = {
1462
1463     B(VLC_CODEC_SPU, "DVD Subtitles"),
1464         A("spu "),
1465         A("spub"),
1466
1467     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1468         A("dvbs"),
1469
1470     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1471         A("subt"),
1472
1473     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1474         A("XSUB"),
1475         A("xsub"),
1476         A("DXSB"),
1477
1478     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1479         A("ssa "),
1480
1481     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1482         A("TEXT"),
1483
1484     B(VLC_CODEC_TELETEXT, "Teletext"),
1485         A("telx"),
1486
1487     B(VLC_CODEC_KATE, "Kate subtitles"),
1488         A("kate"),
1489
1490     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1491         A("cmml"),
1492
1493     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1494         A("t140"),
1495
1496     B(VLC_CODEC_USF, "USF subtitles"),
1497         A("usf "),
1498
1499     B(VLC_CODEC_OGT, "OGT subtitles"),
1500         A("ogt "),
1501
1502     B(VLC_CODEC_CVD, "CVD subtitles"),
1503         A("cvd "),
1504
1505     B(VLC_CODEC_BD_PG, "BD subtitles"),
1506         A("bdpg"),
1507
1508     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1509         A("STL "),
1510
1511     B(VLC_CODEC_SCTE_27, "SCTE-27 subtitles"),
1512         A("SC27"),
1513
1514     B(0, "")
1515 };
1516
1517 /* Create a fourcc from a string.
1518  * XXX it assumes that the string is at least four bytes */
1519 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1520 {
1521     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1522                        psz_fourcc[2], psz_fourcc[3] );
1523 }
1524
1525 /* */
1526 static entry_t Lookup( const staticentry_t p_list[], vlc_fourcc_t i_fourcc )
1527 {
1528     const char *p_class = NULL;
1529     const char *psz_description = NULL;
1530
1531     entry_t e = B(0, "");
1532
1533     for( int i = 0; ; i++ )
1534     {
1535         const staticentry_t *p = &p_list[i];
1536         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1537         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1538
1539         if( i_entry_fourcc == 0 )
1540             break;
1541
1542         if( i_entry_class != 0 )
1543         {
1544             p_class = p->p_class;
1545             psz_description = p->psz_description;
1546         }
1547
1548         if( i_entry_fourcc == i_fourcc )
1549         {
1550             assert( p_class != NULL );
1551
1552             memcpy( e.p_class, p_class, 4 );
1553             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1554             e.psz_description = p->psz_description[0] != '\0' ?
1555                                 p->psz_description : psz_description;
1556             break;
1557         }
1558     }
1559     return e;
1560 }
1561
1562 /* */
1563 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1564 {
1565     entry_t e;
1566
1567     switch( i_cat )
1568     {
1569     case VIDEO_ES:
1570         return Lookup( p_list_video, i_fourcc );
1571     case AUDIO_ES:
1572         return Lookup( p_list_audio, i_fourcc );
1573     case SPU_ES:
1574         return Lookup( p_list_spu, i_fourcc );
1575
1576     default:
1577         e = Find( VIDEO_ES, i_fourcc );
1578         if( CreateFourcc( e.p_class ) == 0 )
1579             e = Find( AUDIO_ES, i_fourcc );
1580         if( CreateFourcc( e.p_class ) == 0 )
1581             e = Find( SPU_ES, i_fourcc );
1582         return e;
1583     }
1584 }
1585
1586 /* */
1587 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1588 {
1589     entry_t e = Find( i_cat, i_fourcc );
1590
1591     if( CreateFourcc( e.p_class ) == 0 )
1592         return i_fourcc;
1593     return CreateFourcc( e.p_class );
1594 }
1595
1596 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1597 {
1598     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1599         return 0;
1600     return vlc_fourcc_GetCodec( i_cat,
1601                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1602                                             psz_fourcc[2], psz_fourcc[3] ) );
1603 }
1604
1605 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1606 {
1607     const int i_bytes = ( i_bits + 7 ) / 8;
1608
1609     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1610     {
1611         switch( i_bytes )
1612         {
1613         case 4:
1614             return VLC_CODEC_FL32;
1615         case 8:
1616             return VLC_CODEC_FL64;
1617         default:
1618             return 0;
1619         }
1620     }
1621     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
1622     {
1623         switch( i_bytes )
1624         {
1625         case 1:
1626             return VLC_CODEC_U8;
1627         case 2:
1628             return VLC_CODEC_S16L;
1629         case 3:
1630             return VLC_CODEC_S24L;
1631             break;
1632         case 4:
1633             return VLC_CODEC_S32L;
1634         default:
1635             return 0;
1636         }
1637     }
1638     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1639     {
1640         switch( i_bytes )
1641         {
1642         case 1:
1643             return VLC_CODEC_S8;
1644         case 2:
1645             return VLC_CODEC_S16B;
1646         case 3:
1647             return VLC_CODEC_S24B;
1648         case 4:
1649             return VLC_CODEC_S32B;
1650         default:
1651             return 0;
1652         }
1653     }
1654     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1655     {
1656         switch( i_bytes )
1657         {
1658         case 1:
1659             return VLC_CODEC_S8;
1660         case 2:
1661             return VLC_CODEC_S16L;
1662         case 3:
1663             return VLC_CODEC_S24L;
1664         case 4:
1665             return VLC_CODEC_S32L;
1666         default:
1667             return 0;
1668         }
1669     }
1670     else
1671     {
1672         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1673     }
1674 }
1675
1676 /* */
1677 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1678 {
1679     entry_t e = Find( i_cat, i_fourcc );
1680
1681     return e.psz_description;
1682 }
1683
1684
1685 /* */
1686 #define VLC_CODEC_YUV_PLANAR_410 \
1687     VLC_CODEC_I410, VLC_CODEC_YV9
1688
1689 #define VLC_CODEC_YUV_PLANAR_420 \
1690     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1691
1692 #define VLC_CODEC_YUV_SEMIPLANAR_420 \
1693     VLC_CODEC_NV12, VLC_CODEC_NV21
1694
1695 #define VLC_CODEC_YUV_PLANAR_420_16 \
1696     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1697
1698 #define VLC_CODEC_YUV_PLANAR_422 \
1699     VLC_CODEC_I422, VLC_CODEC_J422
1700
1701 #define VLC_CODEC_YUV_SEMIPLANAR_422 \
1702     VLC_CODEC_NV16, VLC_CODEC_NV61
1703
1704 #define VLC_CODEC_YUV_PLANAR_422_16 \
1705     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1706
1707 #define VLC_CODEC_YUV_PLANAR_440 \
1708     VLC_CODEC_I440, VLC_CODEC_J440
1709
1710 #define VLC_CODEC_YUV_PLANAR_444 \
1711     VLC_CODEC_I444, VLC_CODEC_J444
1712
1713 #define VLC_CODEC_YUV_SEMIPLANAR_444 \
1714     VLC_CODEC_NV24, VLC_CODEC_NV42
1715
1716 #define VLC_CODEC_YUV_PLANAR_444_16 \
1717     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, \
1718     VLC_CODEC_I444_16L, VLC_CODEC_I444_16B
1719
1720 #define VLC_CODEC_YUV_PACKED \
1721     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1722     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1723
1724 #define VLC_CODEC_FALLBACK_420 \
1725     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1726     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1727     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1728
1729 static const vlc_fourcc_t p_I420_fallback[] = {
1730     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1731 };
1732 static const vlc_fourcc_t p_J420_fallback[] = {
1733     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1734 };
1735 static const vlc_fourcc_t p_YV12_fallback[] = {
1736     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1737 };
1738
1739 #define VLC_CODEC_FALLBACK_420_16 \
1740     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1741
1742 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1743     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1744 };
1745 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1746     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1747 };
1748 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1749     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1750 };
1751 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1752     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1753 };
1754
1755 #define VLC_CODEC_FALLBACK_422 \
1756     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1757     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1758     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1759
1760 static const vlc_fourcc_t p_I422_fallback[] = {
1761     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1762 };
1763 static const vlc_fourcc_t p_J422_fallback[] = {
1764     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1765 };
1766
1767 #define VLC_CODEC_FALLBACK_422_16 \
1768     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1769
1770 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1771     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1772 };
1773 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1774     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1775 };
1776 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1777     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1778 };
1779 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1780     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1781 };
1782
1783 #define VLC_CODEC_FALLBACK_444 \
1784     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1785     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1786     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1787
1788 static const vlc_fourcc_t p_I444_fallback[] = {
1789     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1790 };
1791 static const vlc_fourcc_t p_J444_fallback[] = {
1792     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1793 };
1794
1795 #define VLC_CODEC_FALLBACK_444_16 \
1796     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1797
1798 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1799     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1800 };
1801 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1802     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1803 };
1804 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1805     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1806 };
1807 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1808     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1809 };
1810 static const vlc_fourcc_t p_I444_16L_fallback[] = {
1811     VLC_CODEC_I444_16L, VLC_CODEC_I444_16B, VLC_CODEC_FALLBACK_444_16, 0
1812 };
1813 static const vlc_fourcc_t p_I444_16B_fallback[] = {
1814     VLC_CODEC_I444_16B, VLC_CODEC_I444_16L, VLC_CODEC_FALLBACK_444_16, 0
1815 };
1816
1817
1818 static const vlc_fourcc_t p_I440_fallback[] = {
1819     VLC_CODEC_I440,
1820     VLC_CODEC_YUV_PLANAR_420,
1821     VLC_CODEC_YUV_PLANAR_422,
1822     VLC_CODEC_YUV_PLANAR_444,
1823     VLC_CODEC_YUV_PACKED,
1824     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1825 };
1826
1827 #define VLC_CODEC_FALLBACK_PACKED \
1828     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1829     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1830     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1831
1832 static const vlc_fourcc_t p_YUYV_fallback[] = {
1833     VLC_CODEC_YUYV,
1834     VLC_CODEC_YVYU,
1835     VLC_CODEC_UYVY,
1836     VLC_CODEC_VYUY,
1837     VLC_CODEC_FALLBACK_PACKED, 0
1838 };
1839 static const vlc_fourcc_t p_YVYU_fallback[] = {
1840     VLC_CODEC_YVYU,
1841     VLC_CODEC_YUYV,
1842     VLC_CODEC_UYVY,
1843     VLC_CODEC_VYUY,
1844     VLC_CODEC_FALLBACK_PACKED, 0
1845 };
1846 static const vlc_fourcc_t p_UYVY_fallback[] = {
1847     VLC_CODEC_UYVY,
1848     VLC_CODEC_VYUY,
1849     VLC_CODEC_YUYV,
1850     VLC_CODEC_YVYU,
1851     VLC_CODEC_FALLBACK_PACKED, 0
1852 };
1853 static const vlc_fourcc_t p_VYUY_fallback[] = {
1854     VLC_CODEC_VYUY,
1855     VLC_CODEC_UYVY,
1856     VLC_CODEC_YUYV,
1857     VLC_CODEC_YVYU,
1858     VLC_CODEC_FALLBACK_PACKED, 0
1859 };
1860
1861 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1862     p_YV12_fallback,
1863     p_I420_fallback,
1864     p_I420_9L_fallback,
1865     p_I420_9B_fallback,
1866     p_I420_10L_fallback,
1867     p_I420_10B_fallback,
1868     p_J420_fallback,
1869     p_I422_fallback,
1870     p_I422_9L_fallback,
1871     p_I422_9B_fallback,
1872     p_I422_10L_fallback,
1873     p_I422_10B_fallback,
1874     p_J422_fallback,
1875     p_I444_fallback,
1876     p_J444_fallback,
1877     p_I444_9L_fallback,
1878     p_I444_9B_fallback,
1879     p_I444_10L_fallback,
1880     p_I444_10B_fallback,
1881     p_I444_16L_fallback,
1882     p_I444_16B_fallback,
1883     p_I440_fallback,
1884     p_YUYV_fallback,
1885     p_YVYU_fallback,
1886     p_UYVY_fallback,
1887     p_VYUY_fallback,
1888
1889
1890     NULL,
1891 };
1892
1893 static const vlc_fourcc_t p_list_YUV[] = {
1894     VLC_CODEC_YUV_PLANAR_420,
1895     VLC_CODEC_YUV_SEMIPLANAR_420,
1896     VLC_CODEC_YUV_PLANAR_422,
1897     VLC_CODEC_YUV_SEMIPLANAR_422,
1898     VLC_CODEC_YUV_PLANAR_440,
1899     VLC_CODEC_YUV_PLANAR_444,
1900     VLC_CODEC_YUV_SEMIPLANAR_444,
1901     VLC_CODEC_YUV_PACKED,
1902     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1903     VLC_CODEC_YUV_PLANAR_420_16,
1904     VLC_CODEC_YUV_PLANAR_422_16,
1905     VLC_CODEC_YUV_PLANAR_444_16,
1906     VLC_CODEC_VDPAU_VIDEO_420,
1907     VLC_CODEC_VDPAU_VIDEO_422,
1908     VLC_CODEC_VDPAU_VIDEO_444,
1909     0,
1910 };
1911
1912 /* */
1913 static const vlc_fourcc_t p_RGB32_fallback[] = {
1914     VLC_CODEC_RGB32,
1915     VLC_CODEC_RGB24,
1916     VLC_CODEC_RGB16,
1917     VLC_CODEC_RGB15,
1918     VLC_CODEC_RGB8,
1919     0,
1920 };
1921 static const vlc_fourcc_t p_RGB24_fallback[] = {
1922     VLC_CODEC_RGB24,
1923     VLC_CODEC_RGB32,
1924     VLC_CODEC_RGB16,
1925     VLC_CODEC_RGB15,
1926     VLC_CODEC_RGB8,
1927     0,
1928 };
1929 static const vlc_fourcc_t p_RGB16_fallback[] = {
1930     VLC_CODEC_RGB16,
1931     VLC_CODEC_RGB24,
1932     VLC_CODEC_RGB32,
1933     VLC_CODEC_RGB15,
1934     VLC_CODEC_RGB8,
1935     0,
1936 };
1937 static const vlc_fourcc_t p_RGB15_fallback[] = {
1938     VLC_CODEC_RGB15,
1939     VLC_CODEC_RGB16,
1940     VLC_CODEC_RGB24,
1941     VLC_CODEC_RGB32,
1942     VLC_CODEC_RGB8,
1943     0,
1944 };
1945 static const vlc_fourcc_t p_RGB8_fallback[] = {
1946     VLC_CODEC_RGB8,
1947     VLC_CODEC_RGB15,
1948     VLC_CODEC_RGB16,
1949     VLC_CODEC_RGB24,
1950     VLC_CODEC_RGB32,
1951     0,
1952 };
1953 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1954     p_RGB32_fallback,
1955     p_RGB24_fallback,
1956     p_RGB16_fallback,
1957     p_RGB15_fallback,
1958     p_RGB8_fallback,
1959     NULL,
1960 };
1961
1962
1963 /* */
1964 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1965                                         const vlc_fourcc_t *pp_fallback[],
1966                                         const vlc_fourcc_t p_list[] )
1967 {
1968     for( unsigned i = 0; pp_fallback[i]; i++ )
1969     {
1970         if( pp_fallback[i][0] == i_fourcc )
1971             return pp_fallback[i];
1972     }
1973     return p_list;
1974 }
1975
1976 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1977 {
1978     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1979 }
1980 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1981 {
1982     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1983 }
1984
1985 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1986 {
1987     static const vlc_fourcc_t pp_swapped[][4] = {
1988         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1989         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1990         { 0 }
1991     };
1992
1993     for( int i = 0; pp_swapped[i][0]; i++ )
1994     {
1995         if( pp_swapped[i][0] == b )
1996         {
1997             vlc_fourcc_t t = a;
1998             a = b;
1999             b = t;
2000         }
2001         if( pp_swapped[i][0] != a )
2002             continue;
2003         for( int j = 1; pp_swapped[i][j]; j++ )
2004         {
2005             if( pp_swapped[i][j] == b )
2006                 return true;
2007         }
2008     }
2009     return false;
2010 }
2011
2012 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
2013 {
2014     for( unsigned i = 0; p_list_YUV[i]; i++ )
2015     {
2016         if( p_list_YUV[i] == fcc )
2017             return true;
2018     }
2019     return false;
2020 }
2021
2022 #define PLANAR(n, w_den, h_den, size, bits) \
2023     { .plane_count = n, \
2024       .p = { {.w = {1,    1}, .h = {1,    1}}, \
2025              {.w = {1,w_den}, .h = {1,h_den}}, \
2026              {.w = {1,w_den}, .h = {1,h_den}}, \
2027              {.w = {1,    1}, .h = {1,    1}} }, \
2028       .pixel_size = size, \
2029       .pixel_bits = bits }
2030
2031 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
2032 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
2033
2034 #define PACKED_FMT(size, bits) \
2035     { .plane_count = 1, \
2036       .p = { {.w = {1,1}, .h = {1,1}} }, \
2037       .pixel_size = size, \
2038       .pixel_bits = bits }
2039
2040 /* Zero planes for hardware picture handles. Cannot be manipulated directly. */
2041 #define FAKE_FMT() \
2042     { .plane_count = 0, \
2043       .p = { {.w = {1,1}, .h = {1,1}} }, \
2044       .pixel_size = 0, \
2045       .pixel_bits = 0 }
2046
2047 static const struct
2048 {
2049     vlc_fourcc_t             p_fourcc[4];
2050     vlc_chroma_description_t description;
2051 } p_list_chroma_description[] = {
2052     { { VLC_CODEC_I411 },                      PLANAR_8(3, 4, 1) },
2053     { { VLC_CODEC_YUV_PLANAR_410 },            PLANAR_8(3, 4, 4) },
2054     { { VLC_CODEC_YUV_PLANAR_420 },            PLANAR_8(3, 2, 2) },
2055     { { VLC_CODEC_NV12, VLC_CODEC_NV21 },      PLANAR_8(2, 1, 2) },
2056     { { VLC_CODEC_YUV_PLANAR_422 },            PLANAR_8(3, 2, 1) },
2057     { { VLC_CODEC_NV16, VLC_CODEC_NV61 },      PLANAR_8(2, 1, 1) },
2058     { { VLC_CODEC_YUV_PLANAR_440 },            PLANAR_8(3, 1, 2) },
2059     { { VLC_CODEC_YUV_PLANAR_444 },            PLANAR_8(3, 1, 1) },
2060     { { VLC_CODEC_YUVA },                      PLANAR_8(4, 1, 1) },
2061     { { VLC_CODEC_YUV420A },                   PLANAR_8(4, 2, 2) },
2062     { { VLC_CODEC_YUV422A },                   PLANAR_8(4, 2, 1) },
2063
2064     { { VLC_CODEC_GBR_PLANAR },                PLANAR_8(3, 1, 1) },
2065
2066     { { VLC_CODEC_I420_10L,
2067         VLC_CODEC_I420_10B },                  PLANAR_16(3, 2, 2, 10) },
2068     { { VLC_CODEC_I420_9L,
2069         VLC_CODEC_I420_9B },                   PLANAR_16(3, 2, 2,  9) },
2070     { { VLC_CODEC_I422_10L,
2071         VLC_CODEC_I422_10B },                  PLANAR_16(3, 2, 1, 10) },
2072     { { VLC_CODEC_I422_9L,
2073         VLC_CODEC_I422_9B },                   PLANAR_16(3, 2, 1,  9) },
2074     { { VLC_CODEC_I444_10L,
2075         VLC_CODEC_I444_10B },                  PLANAR_16(3, 1, 1, 10) },
2076     { { VLC_CODEC_I444_9L,
2077         VLC_CODEC_I444_9B },                   PLANAR_16(3, 1, 1,  9) },
2078     { { VLC_CODEC_I444_16L,
2079         VLC_CODEC_I444_16B },                  PLANAR_16(3, 1, 1, 16) },
2080
2081     { { VLC_CODEC_YUV_PACKED },                PACKED_FMT(2, 16) },
2082     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
2083         VLC_CODEC_YUVP, VLC_CODEC_RGBP },      PACKED_FMT(1, 8) },
2084
2085     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
2086     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
2087     { { VLC_CODEC_RGB16, 0 },                  PACKED_FMT(2, 16) },
2088     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
2089     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
2090     { { VLC_CODEC_RGBA, VLC_CODEC_ARGB,
2091         VLC_CODEC_BGRA, },                     PACKED_FMT(4, 32) },
2092
2093     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
2094     { { VLC_CODEC_XYZ12,  0 },                 PACKED_FMT(6, 48) },
2095
2096     { { VLC_CODEC_VDPAU_VIDEO_420, VLC_CODEC_VDPAU_VIDEO_422,
2097         VLC_CODEC_VDPAU_VIDEO_444, VLC_CODEC_VDPAU_OUTPUT },
2098                                                FAKE_FMT() },
2099     { { VLC_CODEC_ANDROID_OPAQUE, VLC_CODEC_MMAL_OPAQUE, },
2100                                                FAKE_FMT() },
2101
2102     { { 0 },                                   FAKE_FMT() }
2103 };
2104
2105 #undef PACKED_FMT
2106 #undef PLANAR_16
2107 #undef PLANAR_8
2108 #undef PLANAR
2109
2110 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
2111 {
2112     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
2113     {
2114         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
2115         for( unsigned j = 0; j < 4 && p_fourcc[j] != 0; j++ )
2116         {
2117             if( p_fourcc[j] == i_fourcc )
2118                 return &p_list_chroma_description[i].description;
2119         }
2120     }
2121     return NULL;
2122 }