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