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