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