Merged mp1v/mp2v codecs.
[vlc.git] / src / misc / fourcc.c
1 /*****************************************************************************
2  * fourcc.c: fourcc helpers functions
3  *****************************************************************************
4  * Copyright (C) 2009 Laurent Aimar
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 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 General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, 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_fourcc.h>
32 #include <assert.h>
33
34 typedef struct
35 {
36     char p_class[4];
37     char p_fourcc[4];
38     const char *psz_description;
39 } entry_t;
40
41 #define NULL4 "\x00\x00\x00\x00"
42
43 /* XXX You don't want to see the preprocessor generated code ;) */
44 #ifdef WORDS_BIGENDIAN
45 #   define FCC2STR(f) { ((f)>>24)&0xff, ((f)>>16)&0xff, ((f)>>8)&0xff, ((f)>>0)&0xff }
46 #else
47 #   define FCC2STR(f) { ((f)>>0)&0xff, ((f)>>8)&0xff, ((f)>>16)&0xff, ((f)>>24)&0xff }
48 #endif
49 /* Begin a new class */
50 #define B(a, c) { .p_class = FCC2STR(a), .p_fourcc = FCC2STR(a), .psz_description = c }
51 /* Create a sub-class entry with description */
52 #define E(b, c) { .p_class = NULL4, .p_fourcc = b, .psz_description = c }
53 /* Create a sub-class entry without description (alias) */
54 #define A(b) E(b, NULL4)
55
56
57 /* */
58 static const entry_t p_list_video[] = {
59
60     B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
61         A("mpgv"),
62         A("mp1v"),
63         A("mpeg"),
64         A("mpg1"),
65         A("mp2v"),
66         A("MPEG"),
67         A("mpg2"),
68
69         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
70
71         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
72         E("hdv2", "Sony HDV (MPEG-2 Video)"),
73         E("hdv3", "FCP HDV (MPEG-2 Video)"),
74         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
75         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
76         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
77         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
78
79         E("mx5n", "MPEG2 IMX NTSC 525/60 50mb/s (FCP)"),
80         E("mx5p", "MPEG2 IMX PAL 625/60 50mb/s (FCP)"),
81         E("mx4n", "MPEG2 IMX NTSC 525/60 40mb/s (FCP)"),
82         E("mx4p", "MPEG2 IMX PAL 625/50 40mb/s (FCP)"),
83         E("mx3n", "MPEG2 IMX NTSC 525/60 30mb/s (FCP)"),
84         E("mx3p", "MPEG2 IMX NTSC 625/50 30mb/s (FCP)"),
85         E("xdv2", "XDCAM HD 1080i60"),
86         E("AVmp", "AVID IMX PAL"),
87
88     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
89         A("mp4v"),
90         A("DIVX"),
91         A("divx"),
92         A("MP4S"),
93         A("mp4s"),
94         A("M4S2"),
95         A("m4s2"),
96         A("mp4v"),
97         A("MP4V"),
98         A("\x04\x00\x00\x00"),
99         A("m4cc"),
100         A("M4CC"),
101         A("FMP4"),
102         A("fmp4"),
103         A("DCOD"),
104         A("fmp4"),
105         A("MVXM"),
106         A("PM4V"),
107         A("fmp4"),
108         A("M4T3"),
109         A("GEOX"),
110         A("DMK2"),
111         A("WV1F"),
112         A("DIGI"),
113         A("INMC"),
114         A("SN40"),
115         A("EPHV"),
116         /* XVID flavours */
117         E("xvid", "Xvid MPEG-4 Video"),
118         E("XVID", "Xvid MPEG-4 Video"),
119         E("XviD", "Xvid MPEG-4 Video"),
120         E("XVIX", "Xvid MPEG-4 Video"),
121         E("xvix", "Xvid MPEG-4 Video"),
122         /* DX50 */
123         E("DX50", "DivX MPEG-4 Video"),
124         E("dx50", "DivX MPEG-4 Video"),
125         E("BLZ0", "Blizzard MPEG-4 Video"),
126         E("DXGM", "Electronic Arts Game MPEG-4 Video"),
127         /* 3ivx delta 4 */
128         E("3IV2", "3ivx MPEG-4 Video"),
129         E("3iv2", "3ivx MPEG-4 Video"),
130         /* Various */
131         E("UMP4", "UB MPEG-4 Video"),
132         E("SEDG", "Samsung MPEG-4 Video"),
133         E("RMP4", "REALmagic MPEG-4 Video"),
134         E("HDX4", "Jomigo HDX4 (MPEG-4 Video)"),
135         E("hdx4", "Jomigo HDX4 (MPEG-4 Video)"),
136         E("SMP4", "Samsung SMP4 (MPEG-4 Video)"),
137         E("smp4", "Samsung SMP4 (MPEG-4 Video)"),
138         E("fvfw", "FFmpeg MPEG-4"),
139         E("FVFW", "FFmpeg MPEG-4"),
140         E("FFDS", "FFDShow MPEG-4"),
141         E("VIDM", "vidm 4.01 codec"),
142         /* 3ivx delta 3.5 Unsupported
143          * putting it here gives extreme distorted images */
144         //E("3IV1", "3ivx delta 3.5 MPEG-4 Video"),
145         //E("3iv1", "3ivx delta 3.5 MPEG-4 Video"),
146
147     /* MSMPEG4 v1 */
148     B(VLC_CODEC_DIV1, "MS MPEG-4 Video v1"),
149         A("DIV1"),
150         A("div1"),
151         A("MPG4"),
152         A("mpg4"),
153         A("mp41"),
154
155     /* MSMPEG4 v2 */
156     B(VLC_CODEC_DIV2, "MS MPEG-4 Video v2"),
157         A("DIV2"),
158         A("div2"),
159         A("MP42"),
160         A("mp42"),
161
162     /* MSMPEG4 v3 / M$ mpeg4 v3 */
163     B(VLC_CODEC_DIV3, "MS MPEG-4 Video v3"),
164         A("DIV3"),
165         A("MPG3"),
166         A("mpg3"),
167         A("div3"),
168         A("MP43"),
169         A("mp43"),
170         /* DivX 3.20 */
171         A("DIV4"),
172         A("div4"),
173         A("DIV5"),
174         A("div5"),
175         A("DIV6"),
176         A("div6"),
177         /* Cool Codec */
178         A("COL1"),
179         A("col1"),
180         A("COL0"),
181         A("col0"),
182         /* AngelPotion stuff */
183         A("AP41"),
184         /* 3ivx doctered divx files */
185         A("3IVD"),
186         A("3ivd"),
187         /* who knows? */
188         A("3VID"),
189         A("3vid"),
190
191     /* Sorenson v1 */
192     B(VLC_CODEC_SVQ1, "SVQ-1 (Sorenson Video v1)"),
193         A("SVQ1"),
194         A("svq1"),
195         A("svqi"),
196
197     /* Sorenson v3 */
198     B(VLC_CODEC_SVQ3, "SVQ-3 (Sorenson Video v3)"),
199         A("SVQ3"),
200
201     /* h264 */
202     B(VLC_CODEC_H264, "H264 - MPEG-4 AVC (part 10)"),
203         A("H264"),
204         A("h264"),
205         A("x264"),
206         A("X264"),
207         /* avc1: special case h264 */
208         A("avc1"),
209         A("AVC1"),
210         E("VSSH", "Vanguard VSS H264"),
211         E("VSSW", "Vanguard VSS H264"),
212         E("vssh", "Vanguard VSS H264"),
213         E("DAVC", "Dicas MPEGable H.264/MPEG-4 AVC"),
214         E("davc", "Dicas MPEGable H.264/MPEG-4 AVC"),
215
216     /* H263 and H263i */
217     /* H263(+) is also known as Real Video 1.0 */
218
219     /* H263 */
220     B(VLC_CODEC_H263, "H263"),
221         A("H263"),
222         A("h263"),
223         A("VX1K"),
224         A("s263"),
225         A("S263"),
226         A("U263"),
227         A("u263"),
228         E("D263", "DEC H263"),
229         E("L263", "LEAD H263"),
230         E("M263", "Microsoft H263"),
231         E("X263", "Xirlink H263"),
232         /* Zygo (partial) */
233         E("ZyGo", "ITU H263+"),
234
235     /* H263i */
236     B(VLC_CODEC_H263I, "I263.I"),
237         A("I263"),
238         A("i263"),
239
240     /* H263P */
241     B(VLC_CODEC_H263P, "ITU H263+"),
242         E("ILVR", "ITU H263+"),
243         E("viv1", "H263+"),
244         E("vivO", "H263+"),
245         E("viv2", "H263+"),
246         E("U263", "UB H263+"),
247
248     /* Flash (H263) variant */
249     B(VLC_CODEC_FLV1, "Flash Video"),
250         A("FLV1"),
251
252     /* H261 */
253     B(VLC_CODEC_H261, "H.261"),
254         A("H261"),
255         A("h261"),
256
257     B(VLC_CODEC_FLIC, "Flic Video"),
258         A("FLIC"),
259
260     /* MJPEG */
261     B(VLC_CODEC_MJPG, "Motion JPEG Video"),
262         A("MJPG"),
263         A("mjpg"),
264         A("mjpa"),
265         A("jpeg"),
266         A("JPEG"),
267         A("JFIF"),
268         A("JPGL"),
269         A("AVDJ"),
270         /* AVID MJPEG */
271         E("AVRn", "Avid Motion JPEG"),
272         E("ADJV", "Avid Motion JPEG"),
273         E("dmb1", "Motion JPEG OpenDML Video"),
274         E("IJPG", "Intergraph JPEG Video"),
275         E("ACDV", "ACD Systems Digital"),
276
277     B(VLC_CODEC_MJPGB, "Motion JPEG B Video"),
278         A("mjpb"),
279
280     B(VLC_CODEC_LJPG, "Lead Motion JPEG Video"),
281         A("LJPG"),
282
283     // ? from avcodec/fourcc.c but makes not sense.
284     //{ VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_MJPEG,       VIDEO_ES, "Lead Motion JPEG Video" },
285
286     /* SP5x */
287     B(VLC_CODEC_SP5X, "Sunplus Motion JPEG Video"),
288         A("SP5X"),
289         A("SP53"),
290         A("SP54"),
291         A("SP55"),
292         A("SP56"),
293         A("SP57"),
294         A("SP58"),
295
296     /* DV */
297     B(VLC_CODEC_DV, "DV Video"),
298         A("dv  "),
299         A("dvsd"),
300         A("dvsl"),
301         A("DVSD"),
302         A("dvhd"),
303         A("dvhp"),
304         A("dvhq"),
305         A("dvh3"),
306         A("dvh5"),
307         A("dvh6"),
308         A("dv1n"),
309         A("dv1p"),
310         A("dvc "),
311         A("dv25"),
312         A("dvh1"),
313         E("dvcp", "DV Video PAL"),
314         E("dvp ", "DV Video Pro"),
315         E("dvpp", "DV Video Pro PAL"),
316         E("dv5p", "DV Video C Pro 50 PAL"),
317         E("dv5n", "DV Video C Pro 50 NTSC"),
318         E("AVdv", "AVID DV"),
319         E("AVd1", "AVID DV"),
320         E("CDVC", "Canopus DV Video"),
321         E("cdvc", "Canopus DV Video"),
322         E("CDVH", "Canopus DV Video"),
323
324     /* Windows Media Video */
325     B(VLC_CODEC_WMV1, "Windows Media Video 7"),
326         A("WMV1"),
327         A("wmv1"),
328
329     B(VLC_CODEC_WMV2, "Windows Media Video 8"),
330         A("WMV2"),
331         A("wmv2"),
332
333     B(VLC_CODEC_WMV3, "Windows Media Video 9"),
334         A("WMV3"),
335         A("wmv3"),
336
337     B(VLC_CODEC_WMVA, "Windows Media Video Advanced"),
338         A("WMVA"),
339         A("wmva"),
340         A("WVP2"),
341         A("wvp2"),
342
343     B(VLC_CODEC_VC1, "Windows Media Video VC1"),
344         A("WVC1"),
345         A("wvc1"),
346         A("vc-1"),
347         A("VC-1"),
348         /* WMVA is the VC-1 codec before the standardization proces,
349          * it is not bitstream compatible and deprecated  */
350         E("WMVA", "Windows Media Video Advanced Profile"),
351
352     /* Microsoft Video 1 */
353     B(VLC_CODEC_MSVIDEO1, "Microsoft Video 1"),
354         A("MSVC"),
355         A("msvc"),
356         A("CRAM"),
357         A("cram"),
358         A("WHAM"),
359         A("wham"),
360
361     /* Microsoft RLE */
362     B(VLC_CODEC_MSRLE, "Microsoft RLE Video"),
363         A("mrle"),
364         A("WRLE"),
365         A("\x01\x00\x00\x00"),
366         A("\x02\x00\x00\x00"),
367
368     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
369     B(VLC_CODEC_INDEO3, "Indeo Video v3"),
370         A("IV31"),
371         A("iv31"),
372         A("IV32"),
373         A("iv32"),
374
375     /* Huff YUV */
376     B(VLC_CODEC_HUFFYUV, "Huff YUV Video"),
377         A("HFYU"),
378
379     B(VLC_CODEC_FFVHUFF, "Huff YUV Video"),
380         A("FFVH"),
381
382     /* On2 VP3 Video Codecs */
383     B(VLC_CODEC_VP3, "On2's VP3 Video"),
384         A("VP3 "),
385         A("VP30"),
386         A("VP31"),
387         A("vp31"),
388
389     /* On2  VP5, VP6 codecs */
390     B(VLC_CODEC_VP5, "On2's VP5 Video"),
391         A("VP5 "),
392         A("VP50"),
393
394     B(VLC_CODEC_VP6, "On2's VP6.2 Video"),
395         A("VP62"),
396         A("vp62"),
397         E("VP60", "On2's VP6.0 Video"),
398         E("VP61", "On2's VP6.1 Video"),
399
400     B(VLC_CODEC_VP6F, "On2's VP6.2 Video (Flash)"),
401         A("VP6F"),
402
403     B(VLC_CODEC_VP6A, "On2's VP6 A Video"),
404         A("VP6A"),
405
406     /* Xiph.org theora */
407     B(VLC_CODEC_THEORA, "Xiph.org's Theora Video"),
408         A("theo"),
409         A("Thra"),
410
411     /* Xiph.org tarkin */
412     B(VLC_CODEC_TARKIN, "Xiph.org's Tarkin Video"),
413         A("tark"),
414
415     /* Asus Video (Another thing that doesn't work on PPC) */
416     B(VLC_CODEC_ASV1, "Asus V1 Video"),
417         A("ASV1"),
418     B(VLC_CODEC_ASV2, "Asus V2 Video"),
419         A("ASV2"),
420
421     /* FFMPEG Video 1 (lossless codec) */
422     B(VLC_CODEC_FFV1, "FFMpeg Video 1"),
423         A("FFV1"),
424
425     /* ATI VCR1 */
426     B(VLC_CODEC_VCR1, "ATI VCR1 Video"),
427         A("VCR1"),
428
429     /* Cirrus Logic AccuPak */
430     B(VLC_CODEC_CLJR, "Creative Logic AccuPak"),
431         A("CLJR"),
432
433     /* Real Video */
434     B(VLC_CODEC_RV10, "Real Video 1.0"),
435         A("RV10"),
436         A("rv10"),
437
438     B(VLC_CODEC_RV13, "Real Video 1.3"),
439         A("RV13"),
440         A("rv13"),
441
442     B(VLC_CODEC_RV20, "Real Video 2.0"),
443         A("RV20"),
444         A("rv20"),
445
446     B(VLC_CODEC_RV30, "Real Video 3.0"),
447         A("RV30"),
448         A("rv30"),
449
450     B(VLC_CODEC_RV40, "Real Video 4.0"),
451         A("RV40"),
452         A("rv40"),
453
454     /* Apple Video */
455     B(VLC_CODEC_RPZA, "Apple Video"),
456         A("rpza"),
457         A("azpr"),
458
459     B(VLC_CODEC_SMC, "Apple graphics"),
460         A("smc "),
461
462     B(VLC_CODEC_CINEPAK, "Cinepak Video"),
463         A("CVID"),
464         A("cvid"),
465
466     /* Screen Capture Video Codecs */
467     B(VLC_CODEC_TSCC, "TechSmith Camtasia Screen Capture"),
468         A("TSCC"),
469         A("tscc"),
470
471     B(VLC_CODEC_CSCD, "CamStudio Screen Codec"),
472         A("CSCD"),
473         A("cscd"),
474
475     B(VLC_CODEC_ZMBV, "DosBox Capture Codec"),
476         A("ZMBV"),
477
478     B(VLC_CODEC_VMNC, "VMware Video"),
479         A("VMnc"),
480     B(VLC_CODEC_FRAPS, "FRAPS: Realtime Video Capture"),
481         A("FPS1"),
482         A("fps1"),
483
484     /* Duck TrueMotion */
485     B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
486         A("DUCK"),
487     B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
488         A("TM20"),
489
490     /* FFMPEG's SNOW wavelet codec */
491     B(VLC_CODEC_SNOW, "FFMpeg SNOW wavelet Video"),
492         A("SNOW"),
493         A("snow"),
494
495     B(VLC_CODEC_QTRLE, "Apple QuickTime RLE Video"),
496         A("rle "),
497
498     B(VLC_CODEC_QDRAW, "Apple QuickDraw Video"),
499         A("qdrw"),
500
501     B(VLC_CODEC_QPEG, "QPEG Video"),
502         A("QPEG"),
503         A("Q1.0"),
504         A("Q1.1"),
505
506     B(VLC_CODEC_ULTI, "IBM Ultimotion Video"),
507         A("ULTI"),
508
509     B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
510         A("VIXL"),
511         E("PIXL", "Pinnacle VideoXL Video"),
512
513     B(VLC_CODEC_LOCO, "LOCO Video"),
514         A("LOCO"),
515
516     B(VLC_CODEC_WNV1, "Winnov WNV1 Video"),
517         A("WNV1"),
518
519     B(VLC_CODEC_AASC, "Autodesc RLE Video"),
520         A("AASC"),
521
522     B(VLC_CODEC_INDEO2, "Indeo Video v2"),
523         A("IV20"),
524         A("RT21"),
525
526         /* Flash Screen Video */
527     B(VLC_CODEC_FLASHSV, "Flash Screen Video"),
528         A("FSV1"),
529     B(VLC_CODEC_KMVC, "Karl Morton's Video Codec (Worms)"),
530         A("KMVC"),
531
532     B(VLC_CODEC_NUV, "Nuppel Video"),
533         A("RJPG"),
534         A("NUV1"),
535
536     /* CODEC_ID_SMACKVIDEO */
537     B(VLC_CODEC_SMACKVIDEO, "Smacker Video"),
538         A("SMK2"),
539         A("SMK4"),
540
541     /* Chinese AVS - Untested */
542     B(VLC_CODEC_CAVS, "Chinese AVS"),
543         A("CAVS"),
544         A("AVs2"),
545
546     /* */
547     B(VLC_CODEC_DNXHD, "DNxHD"),
548         A("AVdn"),
549     B(VLC_CODEC_8BPS, "8BPS"),
550         A("8BPS"),
551     B(VLC_CODEC_MIMIC, "Mimic"),
552         A("ML2O"),
553
554     B(VLC_CODEC_CDG, "CD-G Video"),
555         A("CDG "),
556
557     /* */
558     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
559         A("YV12"),
560         A("yv12"),
561     B(VLC_CODEC_I420, "Planar 4:1:0 YUV"),
562         A("I410"),
563         A("YVU9"),
564     B(VLC_CODEC_I420, "Planar 4:1:1 YUV"),
565         A("I411"),
566     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
567         A("I420"),
568         A("IYUV"),
569     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
570         A("I422"),
571     B(VLC_CODEC_I444, "Planar 4:4:0 YUV"),
572         A("I440"),
573     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
574         A("I444"),
575
576     B(VLC_CODEC_I420, "Planar 4:1:0 YUV full scale"),
577         A("J410"),
578     B(VLC_CODEC_I420, "Planar 4:1:1 YUV full scale"),
579         A("J411"),
580     B(VLC_CODEC_I420, "Planar 4:2:0 YUV full scale"),
581         A("J420"),
582     B(VLC_CODEC_I422, "Planar 4:2:2 YUV full scale"),
583         A("J422"),
584     B(VLC_CODEC_I444, "Planar 4:4:0 YUV full scale"),
585         A("J440"),
586     B(VLC_CODEC_I444, "Planar 4:4:4 YUV full scale"),
587         A("J444"),
588
589     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
590         A("YUVP"),
591
592     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
593         A("YUVA"),
594
595     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
596         A("RGBP"),
597
598     B(VLC_CODEC_RGB8, "8 bits RGB"),
599         A("RGB2"),
600     B(VLC_CODEC_RGB15, "15 bits RGB"),
601         A("RV15"),
602     B(VLC_CODEC_RGB16, "16 bits RGB"),
603         A("RV16"),
604     B(VLC_CODEC_RGB24, "24 bits RGB"),
605         A("RV24"),
606     B(VLC_CODEC_RGB32, "32 bits RGB"),
607         A("RV32"),
608     B(VLC_CODEC_RGBA, "32 bits RGBA"),
609         A("RGBA"),
610
611     B(VLC_CODEC_GREY, "8 bits greyscale"),
612         A("GREY"),
613         A("Y800"),
614         A("Y8  "),
615
616     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
617         A("UYVY"),
618         A("UYNV"),
619         A("Y422"),
620         A("2vuy"),
621         A("2Vuy"),
622         A("AVUI"),
623     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
624         A("VYUY"),
625     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
626         A("YUY2"),
627         A("YUYV"),
628         A("YUNV"),
629     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
630         A("YVYU"),
631
632     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
633         A("Y211"),
634     B(VLC_CODEC_YMGA, "Planar Y, packed UV, from Matrox"),
635         A("YMGA"),
636     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
637         A("cyuv"),
638         A("CYUV"),
639
640     /* Videogames Codecs */
641
642     /* Interplay MVE */
643     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
644         A("imve"),
645         A("INPV"),
646
647     /* Id Quake II CIN */
648     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
649         A("IDCI"),
650
651     /* 4X Technologies */
652     B(VLC_CODEC_4XM, "4X Technologies Video"),
653         A("4XMV"),
654         A("4xmv"),
655
656     /* Id RoQ */
657     B(VLC_CODEC_ROQ, "Id RoQ Video"),
658         A("RoQv"),
659
660     /* Sony Playstation MDEC */
661     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
662         A("MDEC"),
663
664     /* Sierra VMD */
665     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
666         A("VMDV"),
667         A("vmdv"),
668
669     B(VLC_CODEC_DIRAC, "Dirac" ),
670         A("drac"),
671
672     /* Image */
673     B(VLC_CODEC_PNG, "PNG Image"),
674         A("png "),
675
676     B(VLC_CODEC_PPM, "PPM Image"),
677         A("ppm "),
678
679     B(VLC_CODEC_PGM, "PGM Image"),
680         A("pgm "),
681
682     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
683         A("pgmy"),
684
685     B(VLC_CODEC_PAM, "PAM Image"),
686         A("pam "),
687
688     B(VLC_CODEC_JPEGLS, "Lossless JPEG"),
689         A("MJLS"),
690
691     B(VLC_CODEC_JPEG, "JPEG"),
692         A("jpeg"),
693         A("JPEG"),
694
695     B(VLC_CODEC_BMP, "BMP Image"),
696         A("bmp "),
697
698     B(VLC_CODEC_TIFF, "TIFF Image"),
699         A("tiff"),
700
701     B(VLC_CODEC_GIF, "GIF Image"),
702         A("gif "),
703
704
705     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
706         A("tga "),
707         A("mtga"),
708         A("MTGA"),
709
710     B(VLC_CODEC_SGI, "SGI Image"),
711         A("sgi "),
712
713     B(VLC_CODEC_PNM, "Portable Anymap Image"),
714         A("pnm "),
715
716     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
717         A("pcx "),
718
719     B(0, "")
720 };
721 static const entry_t p_list_audio[] = {
722
723     /* Windows Media Audio 1 */
724     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
725         A("WMA1"),
726         A("wma1"),
727
728     /* Windows Media Audio 2 */
729     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
730         A("WMA2"),
731         A("wma2"),
732         A("wma "),
733
734     /* Windows Media Audio Professional */
735     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
736         A("WMAP"),
737         A("wmap"),
738
739     /* Windows Media Audio Lossless */
740     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
741         A("WMAL"),
742         A("wmal"),
743
744     /* Windows Media Audio Speech */
745     B(VLC_CODEC_WMAS, "Windows Media Audio Speech"),
746         A("WMAS"),
747         A("wmas"),
748
749     /* DV Audio */
750     B(VLC_CODEC_DVAUDIO, "DV Audio"),
751         A("dvau"),
752         A("vdva"),
753         A("dvca"),
754         A("RADV"),
755
756     /* MACE-3 Audio */
757     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
758         A("MAC3"),
759
760     /* MACE-6 Audio */
761     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
762         A("MAC6"),
763
764     /* MUSEPACK7 Audio */
765     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
766         A("MPC "),
767
768     /* MUSEPACK8 Audio */
769     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
770         A("MPCK"),
771         A("MPC8"),
772
773     /* RealAudio 1.0 */
774     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
775         A("14_4"),
776         A("lpcJ"),
777
778     /* RealAudio 2.0 */
779     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
780         A("28_8"),
781
782     /* MPEG Audio layer 1/2/3 */
783     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
784         A("mpga"),
785         A("mp3 "),
786         A(".mp3"),
787         A("MP3 "),
788         A("LAME"),
789         A("ms\x00\x50"),
790         A("ms\x00\x55"),
791
792     /* A52 Audio (aka AC3) */
793     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
794         A("a52 "),
795         A("a52b"),
796         A("ac-3"),
797         A("ms\x20\x00"),
798
799     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
800         A("eac3"),
801
802     /* DTS Audio */
803     B(VLC_CODEC_DTS, "DTS Audio"),
804         A("dts "),
805         A("dtsb"),
806         A("ms\x20\x01"),
807
808     /* AAC audio */
809     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
810         A("mp4a"),
811         A("aac "),
812
813     /* 4X Technologies */
814     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
815         A("4xma"),
816
817     /* EA ADPCM */
818     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
819         A("ADEA"),
820
821     /* Interplay DPCM */
822     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
823         A("idpc"),
824
825     /* Id RoQ */
826     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
827         A("RoQa"),
828
829     /* DCIN Audio */
830     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
831         A("DCIA"),
832
833     /* Sony Playstation XA ADPCM */
834     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
835         A("xa  "),
836
837     /* ADX ADPCM */
838     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
839         A("adx "),
840
841     /* Westwood ADPCM */
842     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
843         A("AIWS"),
844
845     /* Sierra VMD */
846     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
847         A("vmda"),
848
849     /* G.726 ADPCM */
850     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
851         A("g726"),
852
853     /* AMR */
854     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
855         A("samr"),
856
857     B(VLC_CODEC_AMR_WB, "AMR wide band"),
858         A("sawb"),
859
860     /* FLAC */
861     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
862         A("flac"),
863
864     /* ALAC */
865     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
866         A("alac"),
867
868     /* QDM2 */
869     B(VLC_CODEC_QDM2, "QDM2 Audio"),
870         A("QDM2"),
871
872     /* COOK */
873     B(VLC_CODEC_COOK, "Cook Audio"),
874         A("cook"),
875
876     /* TTA: The Lossless True Audio */
877     B(VLC_CODEC_TTA, "The Lossless True Audio"),
878         A("TTA1"),
879
880     /* Shorten */
881     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
882         A("shn "),
883         A("shrn"),
884
885     B(VLC_CODEC_WAVPACK, "WavPack"),
886         A("WVPK"),
887         A("wvpk"),
888
889     B(VLC_CODEC_GSM, "GSM Audio"),
890         A("gsm "),
891
892     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
893         A("agsm"),
894
895     B(VLC_CODEC_ATRAC3, "atrac 3"),
896         A("atrc"),
897         A("\x70\x02\x00\x00"),
898
899     B(VLC_CODEC_SONIC, "Sonic"),
900         A("SONC"),
901
902     B(VLC_CODEC_IMC, "IMC" ),
903         A("\x01\x04\x00\x00"),
904
905     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
906         A("\x22\x00\x00\x00"),
907
908     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
909         A("NELL"),
910
911     B(VLC_CODEC_APE, "Monkey's Audio"),
912         A("APE "),
913
914     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
915         A("mlp "),
916
917     B(VLC_CODEC_QCELP, "QCELP Audio"),
918         A("Qclp"),
919
920     B(VLC_CODEC_SPEEX, "Speex Audio"),
921         A("spx "),
922         A("spxr"),
923
924     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
925         A("vorb"),
926
927     B(VLC_CODEC_302M, "302M Audio"),
928         A("302m"),
929
930     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
931         A("lpcm"),
932
933     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
934         A("bpcm"),
935
936     B(VLC_CODEC_SDDS, "SDDS Audio"),
937         A("sdds"),
938         A("sddb"),
939
940     B(VLC_CODEC_MIDI, "MIDI Audio"),
941         A("MIDI"),
942
943     /* PCM */
944     B(VLC_CODEC_S8, "PCM S8"),
945         A("s8  "),
946
947     B(VLC_CODEC_U8, "PCM U8"),
948         A("u8  "),
949
950     B(VLC_CODEC_S16L, "PCM S16 LE"),
951         A("s16l"),
952
953     B(VLC_CODEC_S16B, "PCM S16 BE"),
954         A("s16b"),
955
956     B(VLC_CODEC_U16L, "PCM U16 LE"),
957         A("u16l"),
958
959     B(VLC_CODEC_U16B, "PCM U16 BE"),
960         A("u16b"),
961
962     B(VLC_CODEC_S24L, "PCM S24 LE"),
963         A("s24l"),
964         A("42ni"),  /* Quicktime */
965
966     B(VLC_CODEC_S24B, "PCM S24 BE"),
967         A("s24b"),
968         A("in24"),  /* Quicktime */
969
970     B(VLC_CODEC_U24L, "PCM U24 LE"),
971         A("u24l"),
972
973     B(VLC_CODEC_U24B, "PCM U24 BE"),
974         A("u24b"),
975
976     B(VLC_CODEC_S32L, "PCM S32 LE"),
977         A("s32l"),
978         A("23ni"),  /* Quicktime */
979
980     B(VLC_CODEC_S32B, "PCM S32 BE"),
981         A("s32b"),
982         A("in32"),  /* Quicktime */
983
984     B(VLC_CODEC_U32L, "PCM U32 LE"),
985         A("u32l"),
986
987     B(VLC_CODEC_U32B, "PCM U32 BE"),
988         A("u32b"),
989
990     B(VLC_CODEC_ALAW, "PCM ALAW"),
991         A("alaw"),
992
993     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
994         A("mlaw"),
995         A("ulaw"),
996
997     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
998         A("daud"),
999
1000     B(VLC_CODEC_FI32, "32 bits fixed float"),
1001         A("fi32"),
1002
1003     B(VLC_CODEC_FL32, "32 bits float"),
1004         A("fl32"),
1005
1006     B(VLC_CODEC_FL32, "64 bits float"),
1007         A("fl64"),
1008
1009     B(0, "")
1010 };
1011 static const entry_t p_list_spu[] = {
1012
1013     B(VLC_CODEC_SPU, "DVD Subtitles"),
1014         A("spu "),
1015         A("spub"),
1016
1017     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1018         A("dvbs"),
1019
1020     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1021         A("subt"),
1022
1023     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1024         A("XSUB"),
1025         A("xsub"),
1026
1027     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1028         A("ssa "),
1029
1030     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1031         A("TEXT"),
1032
1033     B(VLC_CODEC_TELETEXT, "Teletext"),
1034         A("telx"),
1035
1036     B(VLC_CODEC_TELETEXT, "Kate subtiles"),
1037         A("kate"),
1038
1039     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1040         A("cmml"),
1041
1042     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1043         A("t140"),
1044
1045     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1046         A("t140"),
1047
1048     B(VLC_CODEC_USF, "USF subtitles"),
1049         A("usf "),
1050
1051     B(VLC_CODEC_OGT, "OGT subtitles"),
1052         A("ogt "),
1053
1054     B(VLC_CODEC_CVD, "CVD subtitles"),
1055         A("cvd "),
1056
1057     B(0, "")
1058 };
1059
1060 /* Create a fourcc from a string.
1061  * XXX it assumes that the string is at least four bytes */
1062 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1063 {
1064     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1065                        psz_fourcc[2], psz_fourcc[3] );
1066 }
1067
1068 /* */
1069 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1070 {
1071     const char *p_class = NULL;
1072     const char *psz_description = NULL;
1073
1074     entry_t e = B(0, "");
1075
1076     for( int i = 0; ; i++ )
1077     {
1078         const entry_t *p = &p_list[i];
1079         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1080         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1081
1082         if( i_entry_fourcc == 0 )
1083             break;
1084
1085         if( i_entry_class != 0 )
1086         {
1087             p_class = p->p_class;
1088             psz_description = p->psz_description;
1089         }
1090
1091         if( i_entry_fourcc == i_fourcc )
1092         {
1093             assert( p_class != NULL );
1094
1095             memcpy( e.p_class, p_class, 4 );
1096             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1097             e.psz_description = p->psz_description ?: psz_description;
1098             break;
1099         }
1100     }
1101     return e;
1102 }
1103
1104 /* */
1105 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1106 {
1107     entry_t e;
1108
1109     switch( i_cat )
1110     {
1111     case VIDEO_ES:
1112         return Lookup( p_list_video, i_fourcc );
1113     case AUDIO_ES:
1114         return Lookup( p_list_audio, i_fourcc );
1115     case SPU_ES:
1116         return Lookup( p_list_spu, i_fourcc );
1117
1118     default:
1119         e = Find( VIDEO_ES, i_fourcc );
1120         if( CreateFourcc( e.p_class ) == 0 )
1121             e = Find( AUDIO_ES, i_fourcc );
1122         if( CreateFourcc( e.p_class ) == 0 )
1123             e = Find( SPU_ES, i_fourcc );
1124         return e;
1125     }
1126 }
1127
1128 /* */
1129 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1130 {
1131     entry_t e = Find( i_cat, i_fourcc );
1132
1133     if( CreateFourcc( e.p_class ) == 0 )
1134         return i_fourcc;
1135     return CreateFourcc( e.p_class );
1136 }
1137
1138 /* */
1139 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1140 {
1141     entry_t e = Find( i_cat, i_fourcc );
1142
1143     return e.psz_description;
1144 }
1145