]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Support of Lagarith
[vlc] / 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         A("MPG2"),
69
70         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
71
72         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
73         E("hdv2", "Sony HDV 1080i60 (MPEG-2 Video)"),
74         E("hdv3", "FCP HDV 1080i50 (MPEG-2 Video)"),
75         E("hdv4", "HDV 720p24 (MPEG-2 Video)"),
76         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
77         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
78         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
79         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
80         E("hdv9", "JVC HDV (MPEG-2 Video)"),
81
82         E("mx5n", "MPEG2 IMX NTSC 525/60 50mb/s (FCP)"),
83         E("mx5p", "MPEG2 IMX PAL 625/60 50mb/s (FCP)"),
84         E("mx4n", "MPEG2 IMX NTSC 525/60 40mb/s (FCP)"),
85         E("mx4p", "MPEG2 IMX PAL 625/50 40mb/s (FCP)"),
86         E("mx3n", "MPEG2 IMX NTSC 525/60 30mb/s (FCP)"),
87         E("mx3p", "MPEG2 IMX NTSC 625/50 30mb/s (FCP)"),
88
89         E("xdv1", "XDCAM HD"),
90         E("xdv2", "XDCAM HD 1080i60 35mb/s"),
91         E("xdv3", "XDCAM HD 1080i50 35mb/s"),
92         E("xdv4", "XDCAM HD"),
93         E("xdv5", "XDCAM HD"),
94         E("xdv6", "XDCAM HD 1080p24 35mb/s"),
95         E("xdv7", "XDCAM HD 1080p25 35mb/s"),
96         E("xdv8", "XDCAM HD 1080p30 35mb/s"),
97         E("xdv9", "XDCAM HD"),
98
99         E("xdva", "XDCAM"),
100         E("xdvb", "XDCAM"),
101         E("xdvc", "XDCAM"),
102         E("xdvd", "XDCAM"),
103         E("xdve", "XDCAM"),
104         E("xdvf", "XDCAM"),
105
106         E("xd54", "XDCAM HD422 720p24 CBR"),
107         E("xd55", "XDCAM HD422 720p25 CBR"),
108         E("xd59", "XDCAM HD422 720p60 CBR"),
109         E("xd5a", "XDCAM HD422 720p50 CBR"),
110         E("xd5b", "XDCAM HD422 1080i60 CBR"),
111         E("xd5c", "XDCAM"),
112         E("xd5d", "XDCAM"),
113         E("xd5e", "XDCAM"),
114         E("xd5f", "XDCAM"),
115         E("xd59", "XDCAM"),
116
117         E("AVmp", "AVID IMX PAL"),
118         E("MMES", "Matrox MPEG-2"),
119         E("mmes", "Matrox MPEG-2"),
120         E("PIM2", "Pinnacle MPEG-2"),
121         E("LMP2", "Lead MPEG-2"),
122
123         E("VCR2", "ATI VCR-2"),
124
125     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
126         A("mp4v"),
127         A("DIVX"),
128         A("divx"),
129         A("MP4S"),
130         A("mp4s"),
131         A("M4S2"),
132         A("m4s2"),
133         A("MP4V"),
134         A("\x04\x00\x00\x00"),
135         A("m4cc"),
136         A("M4CC"),
137         A("FMP4"),
138         A("fmp4"),
139         A("DCOD"),
140         A("MVXM"),
141         A("PM4V"),
142         A("M4T3"),
143         A("GEOX"),
144         A("GEOV"),
145         A("DMK2"),
146         A("WV1F"),
147         A("DIGI"),
148         A("INMC"),
149         A("SN40"),
150         A("EPHV"),
151         /* XVID flavours */
152         E("xvid", "Xvid MPEG-4 Video"),
153         E("XVID", "Xvid MPEG-4 Video"),
154         E("XviD", "Xvid MPEG-4 Video"),
155         E("XVIX", "Xvid MPEG-4 Video"),
156         E("xvix", "Xvid MPEG-4 Video"),
157         /* DX50 */
158         E("DX50", "DivX MPEG-4 Video"),
159         E("dx50", "DivX MPEG-4 Video"),
160         E("BLZ0", "Blizzard MPEG-4 Video"),
161         E("DXGM", "Electronic Arts Game MPEG-4 Video"),
162         /* 3ivx delta 4 */
163         E("3IV2", "3ivx MPEG-4 Video"),
164         E("3iv2", "3ivx MPEG-4 Video"),
165         /* Various */
166         E("UMP4", "UB MPEG-4 Video"),
167         E("SEDG", "Samsung MPEG-4 Video"),
168         E("RMP4", "REALmagic MPEG-4 Video"),
169         E("HDX4", "Jomigo HDX4 (MPEG-4 Video)"),
170         E("hdx4", "Jomigo HDX4 (MPEG-4 Video)"),
171         E("SMP4", "Samsung SMP4 (MPEG-4 Video)"),
172         E("smp4", "Samsung SMP4 (MPEG-4 Video)"),
173         E("fvfw", "FFmpeg MPEG-4"),
174         E("FVFW", "FFmpeg MPEG-4"),
175         E("FFDS", "FFDShow MPEG-4"),
176         E("VIDM", "vidm 4.01 codec"),
177         /* 3ivx delta 3.5 Unsupported
178          * putting it here gives extreme distorted images */
179         //E("3IV1", "3ivx delta 3.5 MPEG-4 Video"),
180         //E("3iv1", "3ivx delta 3.5 MPEG-4 Video"),
181
182     /* MSMPEG4 v1 */
183     B(VLC_CODEC_DIV1, "MS MPEG-4 Video v1"),
184         A("DIV1"),
185         A("div1"),
186         A("MPG4"),
187         A("mpg4"),
188         A("mp41"),
189
190     /* MSMPEG4 v2 */
191     B(VLC_CODEC_DIV2, "MS MPEG-4 Video v2"),
192         A("DIV2"),
193         A("div2"),
194         A("MP42"),
195         A("mp42"),
196
197     /* MSMPEG4 v3 / M$ mpeg4 v3 */
198     B(VLC_CODEC_DIV3, "MS MPEG-4 Video v3"),
199         A("DIV3"),
200         A("MPG3"),
201         A("mpg3"),
202         A("div3"),
203         A("MP43"),
204         A("mp43"),
205         /* DivX 3.20 */
206         A("DIV4"),
207         A("div4"),
208         A("DIV5"),
209         A("div5"),
210         A("DIV6"),
211         A("div6"),
212         E("divf", "DivX 4.12"),
213         E("DIVF", "DivX 4.12"),
214         /* Cool Codec */
215         A("COL1"),
216         A("col1"),
217         A("COL0"),
218         A("col0"),
219         /* AngelPotion stuff */
220         A("AP41"),
221         /* 3ivx doctered divx files */
222         A("3IVD"),
223         A("3ivd"),
224         /* who knows? */
225         A("3VID"),
226         A("3vid"),
227         A("DVX3"),
228
229     /* Sorenson v1 */
230     B(VLC_CODEC_SVQ1, "SVQ-1 (Sorenson Video v1)"),
231         A("SVQ1"),
232         A("svq1"),
233         A("svqi"),
234
235     /* Sorenson v3 */
236     B(VLC_CODEC_SVQ3, "SVQ-3 (Sorenson Video v3)"),
237         A("SVQ3"),
238
239     /* h264 */
240     B(VLC_CODEC_H264, "H264 - MPEG-4 AVC (part 10)"),
241         A("H264"),
242         A("h264"),
243         A("x264"),
244         A("X264"),
245         /* avc1: special case h264 */
246         A("avc1"),
247         A("AVC1"),
248         E("VSSH", "Vanguard VSS H264"),
249         E("VSSW", "Vanguard VSS H264"),
250         E("vssh", "Vanguard VSS H264"),
251         E("DAVC", "Dicas MPEGable H.264/MPEG-4 AVC"),
252         E("davc", "Dicas MPEGable H.264/MPEG-4 AVC"),
253
254     /* H263 and H263i */
255     /* H263(+) is also known as Real Video 1.0 */
256
257     /* H263 */
258     B(VLC_CODEC_H263, "H263"),
259         A("H263"),
260         A("h263"),
261         A("VX1K"),
262         A("s263"),
263         A("S263"),
264         A("U263"),
265         A("u263"),
266         E("D263", "DEC H263"),
267         E("L263", "LEAD H263"),
268         E("M263", "Microsoft H263"),
269         E("X263", "Xirlink H263"),
270         /* Zygo (partial) */
271         E("ZyGo", "ITU H263+"),
272
273     /* H263i */
274     B(VLC_CODEC_H263I, "I263.I"),
275         A("I263"),
276         A("i263"),
277
278     /* H263P */
279     B(VLC_CODEC_H263P, "ITU H263+"),
280         E("ILVR", "ITU H263+"),
281         E("viv1", "H263+"),
282         E("vivO", "H263+"),
283         E("viv2", "H263+"),
284         E("U263", "UB H263+"),
285
286     /* Flash (H263) variant */
287     B(VLC_CODEC_FLV1, "Flash Video"),
288         A("FLV1"),
289         A("flv "),
290
291     /* H261 */
292     B(VLC_CODEC_H261, "H.261"),
293         A("H261"),
294         A("h261"),
295
296     B(VLC_CODEC_FLIC, "Flic Video"),
297         A("FLIC"),
298
299     /* MJPEG */
300     B(VLC_CODEC_MJPG, "Motion JPEG Video"),
301         A("MJPG"),
302         A("mjpg"),
303         A("mjpa"),
304         A("jpeg"),
305         A("JPEG"),
306         A("JFIF"),
307         A("JPGL"),
308         A("AVDJ"),
309         A("MMJP"),
310         A("QIVG"),
311         /* AVID MJPEG */
312         E("AVRn", "Avid Motion JPEG"),
313         E("AVDJ", "Avid Motion JPEG"),
314         E("ADJV", "Avid Motion JPEG"),
315         E("dmb1", "Motion JPEG OpenDML Video"),
316         E("ijpg", "Intergraph JPEG Video"),
317         E("IJPG", "Intergraph JPEG Video"),
318         E("ACDV", "ACD Systems Digital"),
319         E("SLMJ", "SL M-JPEG"),
320
321     B(VLC_CODEC_MJPGB, "Motion JPEG B Video"),
322         A("mjpb"),
323
324     B(VLC_CODEC_LJPG, "Lead Motion JPEG Video"),
325         A("LJPG"),
326
327     // ? from avcodec/fourcc.c but makes not sense.
328     //{ VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_MJPEG,       VIDEO_ES, "Lead Motion JPEG Video" },
329
330     /* SP5x */
331     B(VLC_CODEC_SP5X, "Sunplus Motion JPEG Video"),
332         A("SP5X"),
333         A("SP53"),
334         A("SP54"),
335         A("SP55"),
336         A("SP56"),
337         A("SP57"),
338         A("SP58"),
339
340     /* DV */
341     B(VLC_CODEC_DV, "DV Video"),
342         A("dv  "),
343         A("dvsl"),
344         A("DVSD"),
345         A("dvsd"),
346         A("DVCS"),
347         A("dvcs"),
348         A("dvhd"),
349         A("dvhp"),
350         A("dvhq"),
351         A("dvh3"),
352         A("dvh5"),
353         A("dvh6"),
354         A("dv1n"),
355         A("dv1p"),
356         A("dvc "),
357         A("dv25"),
358         A("dvh1"),
359         A("dvs1"),
360         E("dvcp", "DV Video PAL"),
361         E("dvp ", "DV Video Pro"),
362         E("dvpp", "DV Video Pro PAL"),
363         E("dv50", "DV Video C Pro 50"),
364         E("dv5p", "DV Video C Pro 50 PAL"),
365         E("dv5n", "DV Video C Pro 50 NTSC"),
366         E("AVdv", "AVID DV"),
367         E("AVd1", "AVID DV"),
368         E("CDVC", "Canopus DV Video"),
369         E("cdvc", "Canopus DV Video"),
370         E("CDVH", "Canopus DV Video"),
371         E("cdvh", "Canopus DV Video"),
372         E("CDV5", "Canopus DV Video"),
373
374     /* Windows Media Video */
375     B(VLC_CODEC_WMV1, "Windows Media Video 7"),
376         A("WMV1"),
377         A("wmv1"),
378
379     B(VLC_CODEC_WMV2, "Windows Media Video 8"),
380         A("WMV2"),
381         A("wmv2"),
382
383     B(VLC_CODEC_WMV3, "Windows Media Video 9"),
384         A("WMV3"),
385         A("wmv3"),
386
387     /* WMVA is the VC-1 codec before the standardization proces,
388      * it is not bitstream compatible and deprecated  */
389     B(VLC_CODEC_WMVA, "Windows Media Video Advanced Profile"),
390         A("WMVA"),
391         A("wmva"),
392         A("WVP2"),
393         A("wvp2"),
394
395     B(VLC_CODEC_VC1, "Windows Media Video VC1"),
396         A("WVC1"),
397         A("wvc1"),
398         A("vc-1"),
399         A("VC-1"),
400
401     B(VLC_CODEC_WMVP, "Windows Media Video Presentation"),
402         A("WMVP"),
403         A("wmvp"),
404
405     /* Microsoft Video 1 */
406     B(VLC_CODEC_MSVIDEO1, "Microsoft Video 1"),
407         A("MSVC"),
408         A("msvc"),
409         A("CRAM"),
410         A("cram"),
411         A("WHAM"),
412         A("wham"),
413
414     /* Microsoft RLE */
415     B(VLC_CODEC_MSRLE, "Microsoft RLE Video"),
416         A("mrle"),
417         A("WRLE"),
418         A("\x01\x00\x00\x00"),
419         A("\x02\x00\x00\x00"),
420
421     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
422     B(VLC_CODEC_INDEO3, "Indeo Video v3"),
423         A("IV31"),
424         A("iv31"),
425         A("IV32"),
426         A("iv32"),
427
428     /* Huff YUV */
429     B(VLC_CODEC_HUFFYUV, "Huff YUV Video"),
430         A("HFYU"),
431
432     B(VLC_CODEC_FFVHUFF, "Huff YUV Video"),
433         A("FFVH"),
434
435     /* On2 VP3 Video Codecs */
436     B(VLC_CODEC_VP3, "On2's VP3 Video"),
437         A("VP3 "),
438         A("VP30"),
439         A("vp30"),
440         A("VP31"),
441         A("vp31"),
442
443     /* On2  VP5, VP6 codecs */
444     B(VLC_CODEC_VP5, "On2's VP5 Video"),
445         A("VP5 "),
446         A("VP50"),
447
448     B(VLC_CODEC_VP6, "On2's VP6.2 Video"),
449         A("VP62"),
450         A("vp62"),
451         E("VP60", "On2's VP6.0 Video"),
452         E("VP61", "On2's VP6.1 Video"),
453
454     B(VLC_CODEC_VP6F, "On2's VP6.2 Video (Flash)"),
455         A("VP6F"),
456         A("FLV4"),
457
458     B(VLC_CODEC_VP6A, "On2's VP6 A Video"),
459         A("VP6A"),
460
461     B(VLC_CODEC_VP8, "Google/On2's VP8 Video"),
462         A("VP80"),
463
464
465     /* Xiph.org theora */
466     B(VLC_CODEC_THEORA, "Xiph.org's Theora Video"),
467         A("theo"),
468         A("Thra"),
469
470     /* Xiph.org tarkin */
471     B(VLC_CODEC_TARKIN, "Xiph.org's Tarkin Video"),
472         A("tark"),
473
474     /* Asus Video (Another thing that doesn't work on PPC) */
475     B(VLC_CODEC_ASV1, "Asus V1 Video"),
476         A("ASV1"),
477     B(VLC_CODEC_ASV2, "Asus V2 Video"),
478         A("ASV2"),
479
480     /* FFMPEG Video 1 (lossless codec) */
481     B(VLC_CODEC_FFV1, "FFMpeg Video 1"),
482         A("FFV1"),
483
484     /* ATI VCR1 */
485     B(VLC_CODEC_VCR1, "ATI VCR1 Video"),
486         A("VCR1"),
487
488     /* Cirrus Logic AccuPak */
489     B(VLC_CODEC_CLJR, "Creative Logic AccuPak"),
490         A("CLJR"),
491
492     /* Real Video */
493     B(VLC_CODEC_RV10, "Real Video 1.0"),
494         A("RV10"),
495         A("rv10"),
496
497     B(VLC_CODEC_RV13, "Real Video 1.3"),
498         A("RV13"),
499         A("rv13"),
500
501     B(VLC_CODEC_RV20, "Real Video 2.0"),
502         A("RV20"),
503         A("rv20"),
504
505     B(VLC_CODEC_RV30, "Real Video 3.0"),
506         A("RV30"),
507         A("rv30"),
508
509     B(VLC_CODEC_RV40, "Real Video 4.0"),
510         A("RV40"),
511         A("rv40"),
512
513     /* Apple Video */
514     B(VLC_CODEC_RPZA, "Apple Video"),
515         A("rpza"),
516         A("azpr"),
517         A("RPZA"),
518         A("AZPR"),
519
520     B(VLC_CODEC_SMC, "Apple graphics"),
521         A("smc "),
522
523     B(VLC_CODEC_CINEPAK, "Cinepak Video"),
524         A("CVID"),
525         A("cvid"),
526
527     /* Screen Capture Video Codecs */
528     B(VLC_CODEC_TSCC, "TechSmith Camtasia Screen Capture"),
529         A("TSCC"),
530         A("tscc"),
531
532     B(VLC_CODEC_CSCD, "CamStudio Screen Codec"),
533         A("CSCD"),
534         A("cscd"),
535
536     B(VLC_CODEC_ZMBV, "DosBox Capture Codec"),
537         A("ZMBV"),
538
539     B(VLC_CODEC_VMNC, "VMware Video"),
540         A("VMnc"),
541     B(VLC_CODEC_FRAPS, "FRAPS: Realtime Video Capture"),
542         A("FPS1"),
543         A("fps1"),
544
545     /* Duck TrueMotion */
546     B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
547         A("DUCK"),
548         A("PVEZ"),
549     B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
550         A("TM20"),
551
552     /* FFMPEG's SNOW wavelet codec */
553     B(VLC_CODEC_SNOW, "FFMpeg SNOW wavelet Video"),
554         A("SNOW"),
555         A("snow"),
556
557     B(VLC_CODEC_QTRLE, "Apple QuickTime RLE Video"),
558         A("rle "),
559
560     B(VLC_CODEC_QDRAW, "Apple QuickDraw Video"),
561         A("qdrw"),
562
563     B(VLC_CODEC_QPEG, "QPEG Video"),
564         A("QPEG"),
565         A("Q1.0"),
566         A("Q1.1"),
567
568     B(VLC_CODEC_ULTI, "IBM Ultimotion Video"),
569         A("ULTI"),
570
571     B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
572         A("VIXL"),
573         A("XIXL"),
574         E("PIXL", "Pinnacle VideoXL Video"),
575
576     B(VLC_CODEC_LOCO, "LOCO Video"),
577         A("LOCO"),
578
579     B(VLC_CODEC_WNV1, "Winnov WNV1 Video"),
580         A("WNV1"),
581
582     B(VLC_CODEC_AASC, "Autodesc RLE Video"),
583         A("AASC"),
584
585     B(VLC_CODEC_INDEO2, "Indeo Video v2"),
586         A("IV20"),
587         A("RT21"),
588
589         /* Flash Screen Video */
590     B(VLC_CODEC_FLASHSV, "Flash Screen Video"),
591         A("FSV1"),
592     B(VLC_CODEC_KMVC, "Karl Morton's Video Codec (Worms)"),
593         A("KMVC"),
594
595     B(VLC_CODEC_NUV, "Nuppel Video"),
596         A("RJPG"),
597         A("NUV1"),
598
599     /* CODEC_ID_SMACKVIDEO */
600     B(VLC_CODEC_SMACKVIDEO, "Smacker Video"),
601         A("SMK2"),
602         A("SMK4"),
603
604     /* Chinese AVS - Untested */
605     B(VLC_CODEC_CAVS, "Chinese AVS"),
606         A("CAVS"),
607         A("AVs2"),
608         A("avs2"),
609
610     B(VLC_CODEC_AMV, "AMV"),
611
612     /* */
613     B(VLC_CODEC_DNXHD, "DNxHD"),
614         A("AVdn"),
615     B(VLC_CODEC_8BPS, "8BPS"),
616         A("8BPS"),
617     B(VLC_CODEC_MIMIC, "Mimic"),
618         A("ML2O"),
619
620     B(VLC_CODEC_CDG, "CD-G Video"),
621         A("CDG "),
622
623     B(VLC_CODEC_FRWU, "Forward Uncompressed" ),
624         A("FRWU"),
625
626     B(VLC_CODEC_INDEO5, "Indeo Video v5"),
627         A("IV50"),
628         A("iv50"),
629
630
631     /* */
632     B(VLC_CODEC_YV12, "Planar 4:2:0 YVU"),
633         A("YV12"),
634         A("yv12"),
635     B(VLC_CODEC_YV9,  "Planar 4:1:0 YVU"),
636         A("YVU9"),
637     B(VLC_CODEC_I410, "Planar 4:1:0 YUV"),
638         A("I410"),
639     B(VLC_CODEC_I411, "Planar 4:1:1 YUV"),
640         A("I411"),
641     B(VLC_CODEC_I420, "Planar 4:2:0 YUV"),
642         A("I420"),
643         A("IYUV"),
644     B(VLC_CODEC_I422, "Planar 4:2:2 YUV"),
645         A("I422"),
646     B(VLC_CODEC_I444, "Planar 4:4:0 YUV"),
647         A("I440"),
648     B(VLC_CODEC_I444, "Planar 4:4:4 YUV"),
649         A("I444"),
650
651     B(VLC_CODEC_J420, "Planar 4:2:0 YUV full scale"),
652         A("J420"),
653     B(VLC_CODEC_J422, "Planar 4:2:2 YUV full scale"),
654         A("J422"),
655     B(VLC_CODEC_J440, "Planar 4:4:0 YUV full scale"),
656         A("J440"),
657     B(VLC_CODEC_J444, "Planar 4:4:4 YUV full scale"),
658         A("J444"),
659
660     B(VLC_CODEC_YUVP, "Palettized YUV with palette element Y:U:V:A"),
661         A("YUVP"),
662
663     B(VLC_CODEC_YUVA, "Planar YUV 4:4:4 Y:U:V:A"),
664         A("YUVA"),
665
666     B(VLC_CODEC_RGBP, "Palettized RGB with palette element R:G:B"),
667         A("RGBP"),
668
669     B(VLC_CODEC_RGB8, "8 bits RGB"),
670         A("RGB2"),
671     B(VLC_CODEC_RGB12, "12 bits RGB"),
672         A("RV12"),
673     B(VLC_CODEC_RGBA16, "16 bits RGBA"),
674         A("AV16"),
675     B(VLC_CODEC_RGB15, "15 bits RGB"),
676         A("RV15"),
677     B(VLC_CODEC_RGBT, "16 bits RGBT"),
678         A("RGBT"),
679     B(VLC_CODEC_RGB16, "16 bits RGB"),
680         A("RV16"),
681     B(VLC_CODEC_RGB24, "24 bits RGB"),
682         A("RV24"),
683     B(VLC_CODEC_RGB32, "32 bits RGB"),
684         A("RV32"),
685     B(VLC_CODEC_RGBA, "32 bits RGBA"),
686         A("RGBA"),
687         A("AV32"),
688
689     B(VLC_CODEC_GREY, "8 bits greyscale"),
690         A("GREY"),
691         A("Y800"),
692         A("Y8  "),
693
694     B(VLC_CODEC_UYVY, "Packed YUV 4:2:2, U:Y:V:Y"),
695         A("UYVY"),
696         A("UYNV"),
697         A("UYNY"),
698         A("Y422"),
699         A("HDYC"),
700         A("AVUI"),
701         A("uyv1"),
702         A("2vuy"),
703         A("2Vuy"),
704         A("2Vu1"),
705     B(VLC_CODEC_VYUY, "Packed YUV 4:2:2, V:Y:U:Y"),
706         A("VYUY"),
707     B(VLC_CODEC_YUYV, "Packed YUV 4:2:2, Y:U:Y:V"),
708         A("YUY2"),
709         A("YUYV"),
710         A("YUNV"),
711         A("V422"),
712     B(VLC_CODEC_YVYU, "Packed YUV 4:2:2, Y:V:Y:U"),
713         A("YVYU"),
714
715     B(VLC_CODEC_Y211, "Packed YUV 2:1:1, Y:U:Y:V "),
716         A("Y211"),
717     B(VLC_CODEC_CYUV, "Creative Packed YUV 4:2:2, U:Y:V:Y, reverted"),
718         A("cyuv"),
719         A("CYUV"),
720
721     B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
722         A("v210"),
723
724     B(VLC_CODEC_NV12, "Planar  Y, Packet UV (420)"),
725         A("NV12"),
726
727     B(VLC_CODEC_I420_9L, "Planar 4:2:0 YUV 9-bit LE"),
728         A("I09L"),
729     B(VLC_CODEC_I420_9B, "Planar 4:2:0 YUV 9-bit BE"),
730         A("I09B"),
731     B(VLC_CODEC_I422_9L, "Planar 4:2:2 YUV 9-bit LE"),
732         A("I29L"),
733     B(VLC_CODEC_I422_9B, "Planar 4:2:2 YUV 9-bit BE"),
734         A("I29B"),
735     B(VLC_CODEC_I444_9L, "Planar 4:4:4 YUV 9-bit LE"),
736         A("I49L"),
737     B(VLC_CODEC_I444_9B, "Planar 4:4:4 YUV 9-bit BE"),
738         A("I49B"),
739
740     B(VLC_CODEC_I420_10L, "Planar 4:2:0 YUV 10-bit LE"),
741         A("I0AL"),
742     B(VLC_CODEC_I420_10B, "Planar 4:2:0 YUV 10-bit BE"),
743         A("I0AB"),
744     B(VLC_CODEC_I422_10L, "Planar 4:2:2 YUV 10-bit LE"),
745         A("I2AL"),
746     B(VLC_CODEC_I422_10B, "Planar 4:2:2 YUV 10-bit BE"),
747         A("I2AB"),
748     B(VLC_CODEC_I444_10L, "Planar 4:4:4 YUV 10-bit LE"),
749         A("I4AL"),
750     B(VLC_CODEC_I444_10B, "Planar 4:4:4 YUV 10-bit BE"),
751         A("I4AB"),
752
753     /* Videogames Codecs */
754
755     /* Interplay MVE */
756     B(VLC_CODEC_INTERPLAY, "Interplay MVE Video"),
757         A("imve"),
758         A("INPV"),
759
760     /* Id Quake II CIN */
761     B(VLC_CODEC_IDCIN, "Id Quake II CIN Video"),
762         A("IDCI"),
763
764     /* 4X Technologies */
765     B(VLC_CODEC_4XM, "4X Technologies Video"),
766         A("4XMV"),
767         A("4xmv"),
768
769     /* Id RoQ */
770     B(VLC_CODEC_ROQ, "Id RoQ Video"),
771         A("RoQv"),
772
773     /* Sony Playstation MDEC */
774     B(VLC_CODEC_MDEC, "PSX MDEC Video"),
775         A("MDEC"),
776
777     /* Sierra VMD */
778     B(VLC_CODEC_VMDVIDEO, "Sierra VMD Video"),
779         A("VMDV"),
780         A("vmdv"),
781
782     B(VLC_CODEC_DIRAC, "Dirac" ),
783         A("drac"),
784
785     /* Image */
786     B(VLC_CODEC_PNG, "PNG Image"),
787         A("png "),
788
789     B(VLC_CODEC_PPM, "PPM Image"),
790         A("ppm "),
791
792     B(VLC_CODEC_PGM, "PGM Image"),
793         A("pgm "),
794
795     B(VLC_CODEC_PGMYUV, "PGM YUV Image"),
796         A("pgmy"),
797
798     B(VLC_CODEC_PAM, "PAM Image"),
799         A("pam "),
800
801     B(VLC_CODEC_JPEGLS, "Lossless JPEG"),
802         A("MJLS"),
803
804     B(VLC_CODEC_JPEG, "JPEG"),
805         A("jpeg"),
806         A("JPEG"),
807
808     B(VLC_CODEC_BMP, "BMP Image"),
809         A("bmp "),
810
811     B(VLC_CODEC_TIFF, "TIFF Image"),
812         A("tiff"),
813
814     B(VLC_CODEC_GIF, "GIF Image"),
815         A("gif "),
816
817
818     B(VLC_CODEC_TARGA, "Truevision Targa Image"),
819         A("tga "),
820         A("mtga"),
821         A("MTGA"),
822
823     B(VLC_CODEC_SGI, "SGI Image"),
824         A("sgi "),
825
826     B(VLC_CODEC_PNM, "Portable Anymap Image"),
827         A("pnm "),
828
829     B(VLC_CODEC_PCX, "Personal Computer Exchange Image"),
830         A("pcx "),
831
832     B(VLC_CODEC_JPEG2000, "JPEG 2000 Image"),
833         A("JP2K"),
834         A("mjp2"),
835         A("MJP2"),
836         A("MJ2C"),
837
838     B(VLC_CODEC_LAGARITH, "Lagarith Lossless"),
839         A("LAGS"),
840
841     B(0, "")
842 };
843 static const entry_t p_list_audio[] = {
844
845     /* Windows Media Audio 1 */
846     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
847         A("WMA1"),
848         A("wma1"),
849
850     /* Windows Media Audio 2 */
851     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
852         A("WMA2"),
853         A("wma2"),
854         A("wma "),
855
856     /* Windows Media Audio Professional */
857     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
858         A("WMAP"),
859         A("wmap"),
860
861     /* Windows Media Audio Lossless */
862     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
863         A("WMAL"),
864         A("wmal"),
865
866     /* Windows Media Audio Speech */
867     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
868         A("WMAS"),
869         A("wmas"),
870
871     /* DV Audio */
872     B(VLC_CODEC_DVAUDIO, "DV Audio"),
873         A("dvau"),
874         A("vdva"),
875         A("dvca"),
876         A("RADV"),
877
878     /* MACE-3 Audio */
879     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
880         A("MAC3"),
881
882     /* MACE-6 Audio */
883     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
884         A("MAC6"),
885
886     /* MUSEPACK7 Audio */
887     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
888         A("MPC "),
889
890     /* MUSEPACK8 Audio */
891     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
892         A("MPCK"),
893         A("MPC8"),
894
895     /* RealAudio 1.0 */
896     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
897         A("14_4"),
898         A("lpcJ"),
899
900     /* RealAudio 2.0 */
901     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
902         A("28_8"),
903
904     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
905         A("sipr"),
906
907     /* MPEG Audio layer 1/2/3 */
908     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
909         A("mpga"),
910         A("mp3 "),
911         A(".mp3"),
912         A("MP3 "),
913         A("LAME"),
914         A("ms\x00\x50"),
915         A("ms\x00\x55"),
916
917     /* A52 Audio (aka AC3) */
918     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
919         A("a52 "),
920         A("a52b"),
921         A("ac-3"),
922         A("ms\x20\x00"),
923
924     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
925         A("eac3"),
926
927     /* DTS Audio */
928     B(VLC_CODEC_DTS, "DTS Audio"),
929         A("dts "),
930         A("DTS "),
931         A("dtsb"),
932         A("ms\x20\x01"),
933
934     /* AAC audio */
935     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
936         A("mp4a"),
937         A("aac "),
938
939     /* ALS audio */
940     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
941         A("als "),
942
943     /* 4X Technologies */
944     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
945         A("4xma"),
946
947     /* EA ADPCM */
948     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
949         A("ADEA"),
950
951     /* Interplay DPCM */
952     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
953         A("idpc"),
954
955     /* Id RoQ */
956     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
957         A("RoQa"),
958
959     /* DCIN Audio */
960     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
961         A("DCIA"),
962
963     /* Sony Playstation XA ADPCM */
964     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
965         A("xa  "),
966
967     /* ADX ADPCM */
968     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
969         A("adx "),
970
971     /* Westwood ADPCM */
972     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
973         A("AIWS"),
974
975     /* MS ADPCM */
976     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
977         A("ms\x00\x02"),
978
979     /* Sierra VMD */
980     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
981         A("vmda"),
982
983     /* G.726 ADPCM */
984     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
985         A("g726"),
986
987     /* G.722 ADPCM */
988     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
989         A("g722"),
990
991     /* Flash ADPCM */
992     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
993         A("SWFa"),
994
995     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
996         A("ms\x00\x11"),
997
998     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
999         A("imav"),
1000
1001     /* AMR */
1002     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1003         A("samr"),
1004
1005     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1006         A("sawb"),
1007
1008     /* FLAC */
1009     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1010         A("flac"),
1011
1012     /* ALAC */
1013     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1014         A("alac"),
1015
1016     /* QDM2 */
1017     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1018         A("QDM2"),
1019
1020     /* COOK */
1021     B(VLC_CODEC_COOK, "Cook Audio"),
1022         A("cook"),
1023
1024     /* TTA: The Lossless True Audio */
1025     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1026         A("TTA1"),
1027
1028     /* Shorten */
1029     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1030         A("shn "),
1031         A("shrn"),
1032
1033     B(VLC_CODEC_WAVPACK, "WavPack"),
1034         A("WVPK"),
1035         A("wvpk"),
1036
1037     B(VLC_CODEC_GSM, "GSM Audio"),
1038         A("gsm "),
1039
1040     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1041         A("agsm"),
1042
1043     B(VLC_CODEC_ATRAC1, "atrac 1"),
1044         A("atr1"),
1045
1046     B(VLC_CODEC_ATRAC3, "atrac 3"),
1047         A("atrc"),
1048         A("\x70\x02\x00\x00"),
1049
1050     B(VLC_CODEC_SONIC, "Sonic"),
1051         A("SONC"),
1052
1053     B(VLC_CODEC_IMC, "IMC" ),
1054         A("\x01\x04\x00\x00"),
1055
1056     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1057         A("\x22\x00\x00\x00"),
1058
1059     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1060         A("NELL"),
1061
1062     B(VLC_CODEC_APE, "Monkey's Audio"),
1063         A("APE "),
1064
1065     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1066         A("mlp "),
1067
1068     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1069         A("trhd"),
1070
1071     B(VLC_CODEC_QCELP, "QCELP Audio"),
1072         A("Qclp"),
1073
1074     B(VLC_CODEC_SPEEX, "Speex Audio"),
1075         A("spx "),
1076         A("spxr"),
1077
1078     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1079         A("vorb"),
1080
1081     B(VLC_CODEC_302M, "302M Audio"),
1082         A("302m"),
1083
1084     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1085         A("lpcm"),
1086
1087     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1088         A("apcm"),
1089
1090     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1091         A("bpcm"),
1092
1093     B(VLC_CODEC_SDDS, "SDDS Audio"),
1094         A("sdds"),
1095         A("sddb"),
1096
1097     B(VLC_CODEC_MIDI, "MIDI Audio"),
1098         A("MIDI"),
1099
1100     /* PCM */
1101     B(VLC_CODEC_S8, "PCM S8"),
1102         A("s8  "),
1103
1104     B(VLC_CODEC_U8, "PCM U8"),
1105         A("u8  "),
1106
1107     B(VLC_CODEC_S16L, "PCM S16 LE"),
1108         A("s16l"),
1109
1110     B(VLC_CODEC_S16B, "PCM S16 BE"),
1111         A("s16b"),
1112
1113     B(VLC_CODEC_U16L, "PCM U16 LE"),
1114         A("u16l"),
1115
1116     B(VLC_CODEC_U16B, "PCM U16 BE"),
1117         A("u16b"),
1118
1119     B(VLC_CODEC_S20B, "PCM S20 BE"),
1120
1121     B(VLC_CODEC_S24L, "PCM S24 LE"),
1122         A("s24l"),
1123         A("42ni"),  /* Quicktime */
1124
1125     B(VLC_CODEC_S24B, "PCM S24 BE"),
1126         A("s24b"),
1127         A("in24"),  /* Quicktime */
1128
1129     B(VLC_CODEC_U24L, "PCM U24 LE"),
1130         A("u24l"),
1131
1132     B(VLC_CODEC_U24B, "PCM U24 BE"),
1133         A("u24b"),
1134
1135     B(VLC_CODEC_S32L, "PCM S32 LE"),
1136         A("s32l"),
1137         A("23ni"),  /* Quicktime */
1138
1139     B(VLC_CODEC_S32B, "PCM S32 BE"),
1140         A("s32b"),
1141         A("in32"),  /* Quicktime */
1142
1143     B(VLC_CODEC_U32L, "PCM U32 LE"),
1144         A("u32l"),
1145
1146     B(VLC_CODEC_U32B, "PCM U32 BE"),
1147         A("u32b"),
1148
1149     B(VLC_CODEC_ALAW, "PCM ALAW"),
1150         A("alaw"),
1151
1152     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1153         A("mlaw"),
1154         A("ulaw"),
1155
1156     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1157
1158     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1159         A("daud"),
1160
1161     B(VLC_CODEC_FI32, "32 bits fixed float"),
1162         A("fi32"),
1163
1164     B(VLC_CODEC_F32L, "32 bits float LE"),
1165         A("f32l"),
1166         A("fl32"),
1167
1168     B(VLC_CODEC_F32B, "32 bits float BE"),
1169         A("f32b"),
1170
1171     B(VLC_CODEC_F64L, "64 bits float LE"),
1172         A("f64l"),
1173
1174     B(VLC_CODEC_F64L, "64 bits float BE"),
1175         A("f64b"),
1176
1177     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1178         A("TWIN"),
1179
1180     B(0, "")
1181 };
1182 static const entry_t p_list_spu[] = {
1183
1184     B(VLC_CODEC_SPU, "DVD Subtitles"),
1185         A("spu "),
1186         A("spub"),
1187
1188     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1189         A("dvbs"),
1190
1191     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1192         A("subt"),
1193
1194     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1195         A("XSUB"),
1196         A("xsub"),
1197         A("DXSB"),
1198
1199     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1200         A("ssa "),
1201
1202     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1203         A("TEXT"),
1204
1205     B(VLC_CODEC_TELETEXT, "Teletext"),
1206         A("telx"),
1207
1208     B(VLC_CODEC_KATE, "Kate subtitles"),
1209         A("kate"),
1210
1211     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1212         A("cmml"),
1213
1214     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1215         A("t140"),
1216
1217     B(VLC_CODEC_USF, "USF subtitles"),
1218         A("usf "),
1219
1220     B(VLC_CODEC_OGT, "OGT subtitles"),
1221         A("ogt "),
1222
1223     B(VLC_CODEC_CVD, "CVD subtitles"),
1224         A("cvd "),
1225
1226     B(VLC_CODEC_BD_PG, "BD subtitles"),
1227         A("bdpg"),
1228
1229     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1230         A("STL "),
1231
1232     B(0, "")
1233 };
1234
1235 /* Create a fourcc from a string.
1236  * XXX it assumes that the string is at least four bytes */
1237 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1238 {
1239     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1240                        psz_fourcc[2], psz_fourcc[3] );
1241 }
1242
1243 /* */
1244 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1245 {
1246     const char *p_class = NULL;
1247     const char *psz_description = NULL;
1248
1249     entry_t e = B(0, "");
1250
1251     for( int i = 0; ; i++ )
1252     {
1253         const entry_t *p = &p_list[i];
1254         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1255         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1256
1257         if( i_entry_fourcc == 0 )
1258             break;
1259
1260         if( i_entry_class != 0 )
1261         {
1262             p_class = p->p_class;
1263             psz_description = p->psz_description;
1264         }
1265
1266         if( i_entry_fourcc == i_fourcc )
1267         {
1268             assert( p_class != NULL );
1269
1270             memcpy( e.p_class, p_class, 4 );
1271             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1272             e.psz_description = p->psz_description ?
1273                                 p->psz_description : psz_description;
1274             break;
1275         }
1276     }
1277     return e;
1278 }
1279
1280 /* */
1281 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1282 {
1283     entry_t e;
1284
1285     switch( i_cat )
1286     {
1287     case VIDEO_ES:
1288         return Lookup( p_list_video, i_fourcc );
1289     case AUDIO_ES:
1290         return Lookup( p_list_audio, i_fourcc );
1291     case SPU_ES:
1292         return Lookup( p_list_spu, i_fourcc );
1293
1294     default:
1295         e = Find( VIDEO_ES, i_fourcc );
1296         if( CreateFourcc( e.p_class ) == 0 )
1297             e = Find( AUDIO_ES, i_fourcc );
1298         if( CreateFourcc( e.p_class ) == 0 )
1299             e = Find( SPU_ES, i_fourcc );
1300         return e;
1301     }
1302 }
1303
1304 /* */
1305 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1306 {
1307     entry_t e = Find( i_cat, i_fourcc );
1308
1309     if( CreateFourcc( e.p_class ) == 0 )
1310         return i_fourcc;
1311     return CreateFourcc( e.p_class );
1312 }
1313
1314 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1315 {
1316     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1317         return 0;
1318     return vlc_fourcc_GetCodec( i_cat,
1319                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1320                                             psz_fourcc[2], psz_fourcc[3] ) );
1321 }
1322
1323 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1324 {
1325     const int i_bytes = ( i_bits + 7 ) / 8;
1326
1327     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1328     {
1329         switch( i_bytes )
1330         {
1331         case 4:
1332             return VLC_CODEC_FL32;
1333         case 8:
1334             return VLC_CODEC_FL64;
1335         default:
1336             return 0;
1337         }
1338     }
1339     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1340              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1341     {
1342         switch( i_bytes )
1343         {
1344         case 1:
1345             return VLC_CODEC_U8;
1346         case 2:
1347             return VLC_CODEC_S16L;
1348         case 3:
1349             return VLC_CODEC_S24L;
1350             break;
1351         case 4:
1352             return VLC_CODEC_S32L;
1353         default:
1354             return 0;
1355         }
1356     }
1357     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1358     {
1359         switch( i_bytes )
1360         {
1361         case 1:
1362             return VLC_CODEC_S8;
1363         case 2:
1364             return VLC_CODEC_S16B;
1365         case 3:
1366             return VLC_CODEC_S24B;
1367         case 4:
1368             return VLC_CODEC_S32B;
1369         default:
1370             return 0;
1371         }
1372     }
1373     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1374     {
1375         switch( i_bytes )
1376         {
1377         case 1:
1378             return VLC_CODEC_S8;
1379         case 2:
1380             return VLC_CODEC_S16L;
1381         case 3:
1382             return VLC_CODEC_S24L;
1383         case 4:
1384             return VLC_CODEC_S32L;
1385         default:
1386             return 0;
1387         }
1388     }
1389     else
1390     {
1391         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1392     }
1393 }
1394
1395 /* */
1396 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1397 {
1398     entry_t e = Find( i_cat, i_fourcc );
1399
1400     return e.psz_description;
1401 }
1402
1403
1404 /* */
1405 #define VLC_CODEC_YUV_PLANAR_410 \
1406     VLC_CODEC_I410, VLC_CODEC_YV9
1407
1408 #define VLC_CODEC_YUV_PLANAR_420 \
1409     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1410
1411 #define VLC_CODEC_YUV_PLANAR_420_16 \
1412     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1413
1414 #define VLC_CODEC_YUV_PLANAR_422 \
1415     VLC_CODEC_I422, VLC_CODEC_J422
1416
1417 #define VLC_CODEC_YUV_PLANAR_422_16 \
1418     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1419
1420 #define VLC_CODEC_YUV_PLANAR_440 \
1421     VLC_CODEC_I440, VLC_CODEC_J440
1422
1423 #define VLC_CODEC_YUV_PLANAR_444 \
1424     VLC_CODEC_I444, VLC_CODEC_J444
1425
1426 #define VLC_CODEC_YUV_PLANAR_444_16 \
1427     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1428
1429 #define VLC_CODEC_YUV_PACKED \
1430     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1431     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1432
1433 #define VLC_CODEC_FALLBACK_420 \
1434     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1435     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1436     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1437
1438 static const vlc_fourcc_t p_I420_fallback[] = {
1439     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1440 };
1441 static const vlc_fourcc_t p_J420_fallback[] = {
1442     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1443 };
1444 static const vlc_fourcc_t p_YV12_fallback[] = {
1445     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1446 };
1447
1448 #define VLC_CODEC_FALLBACK_420_16 \
1449     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1450
1451 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1452     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1453 };
1454 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1455     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1456 };
1457 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1458     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1459 };
1460 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1461     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1462 };
1463
1464 #define VLC_CODEC_FALLBACK_422 \
1465     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1466     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1467     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1468
1469 static const vlc_fourcc_t p_I422_fallback[] = {
1470     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1471 };
1472 static const vlc_fourcc_t p_J422_fallback[] = {
1473     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1474 };
1475
1476 #define VLC_CODEC_FALLBACK_422_16 \
1477     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1478
1479 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1480     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1481 };
1482 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1483     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1484 };
1485 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1486     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1487 };
1488 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1489     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1490 };
1491
1492 #define VLC_CODEC_FALLBACK_444 \
1493     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1494     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1495     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1496
1497 static const vlc_fourcc_t p_I444_fallback[] = {
1498     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1499 };
1500 static const vlc_fourcc_t p_J444_fallback[] = {
1501     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1502 };
1503
1504 #define VLC_CODEC_FALLBACK_444_16 \
1505     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1506
1507 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1508     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1509 };
1510 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1511     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1512 };
1513 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1514     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1515 };
1516 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1517     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1518 };
1519
1520 static const vlc_fourcc_t p_I440_fallback[] = {
1521     VLC_CODEC_I440,
1522     VLC_CODEC_YUV_PLANAR_420,
1523     VLC_CODEC_YUV_PLANAR_422,
1524     VLC_CODEC_YUV_PLANAR_444,
1525     VLC_CODEC_YUV_PACKED,
1526     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1527 };
1528
1529 #define VLC_CODEC_FALLBACK_PACKED \
1530     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1531     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1532     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1533
1534 static const vlc_fourcc_t p_YUYV_fallback[] = {
1535     VLC_CODEC_YUYV,
1536     VLC_CODEC_YVYU,
1537     VLC_CODEC_UYVY,
1538     VLC_CODEC_VYUY,
1539     VLC_CODEC_FALLBACK_PACKED, 0
1540 };
1541 static const vlc_fourcc_t p_YVYU_fallback[] = {
1542     VLC_CODEC_YVYU,
1543     VLC_CODEC_YUYV,
1544     VLC_CODEC_UYVY,
1545     VLC_CODEC_VYUY,
1546     VLC_CODEC_FALLBACK_PACKED, 0
1547 };
1548 static const vlc_fourcc_t p_UYVY_fallback[] = {
1549     VLC_CODEC_UYVY,
1550     VLC_CODEC_VYUY,
1551     VLC_CODEC_YUYV,
1552     VLC_CODEC_YVYU,
1553     VLC_CODEC_FALLBACK_PACKED, 0
1554 };
1555 static const vlc_fourcc_t p_VYUY_fallback[] = {
1556     VLC_CODEC_VYUY,
1557     VLC_CODEC_UYVY,
1558     VLC_CODEC_YUYV,
1559     VLC_CODEC_YVYU,
1560     VLC_CODEC_FALLBACK_PACKED, 0
1561 };
1562
1563 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1564     p_YV12_fallback,
1565     p_I420_fallback,
1566     p_I420_9L_fallback,
1567     p_I420_9B_fallback,
1568     p_I420_10L_fallback,
1569     p_I420_10B_fallback,
1570     p_J420_fallback,
1571     p_I422_fallback,
1572     p_I422_9L_fallback,
1573     p_I422_9B_fallback,
1574     p_I422_10L_fallback,
1575     p_I422_10B_fallback,
1576     p_J422_fallback,
1577     p_I444_fallback,
1578     p_J444_fallback,
1579     p_I444_9L_fallback,
1580     p_I444_9B_fallback,
1581     p_I444_10L_fallback,
1582     p_I444_10B_fallback,
1583     p_I440_fallback,
1584     p_YUYV_fallback,
1585     p_YVYU_fallback,
1586     p_UYVY_fallback,
1587     p_VYUY_fallback,
1588
1589
1590     NULL,
1591 };
1592
1593 static const vlc_fourcc_t p_list_YUV[] = {
1594     VLC_CODEC_YUV_PLANAR_420,
1595     VLC_CODEC_YUV_PLANAR_422,
1596     VLC_CODEC_YUV_PLANAR_440,
1597     VLC_CODEC_YUV_PLANAR_444,
1598     VLC_CODEC_YUV_PACKED,
1599     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1600     VLC_CODEC_YUV_PLANAR_420_16,
1601     VLC_CODEC_YUV_PLANAR_422_16,
1602     VLC_CODEC_YUV_PLANAR_444_16,
1603     0,
1604 };
1605
1606 /* */
1607 static const vlc_fourcc_t p_RGB32_fallback[] = {
1608     VLC_CODEC_RGB32,
1609     VLC_CODEC_RGB24,
1610     VLC_CODEC_RGB16,
1611     VLC_CODEC_RGB15,
1612     VLC_CODEC_RGB8,
1613     0,
1614 };
1615 static const vlc_fourcc_t p_RGB24_fallback[] = {
1616     VLC_CODEC_RGB24,
1617     VLC_CODEC_RGB32,
1618     VLC_CODEC_RGB16,
1619     VLC_CODEC_RGB15,
1620     VLC_CODEC_RGB8,
1621     0,
1622 };
1623 static const vlc_fourcc_t p_RGB16_fallback[] = {
1624     VLC_CODEC_RGB16,
1625     VLC_CODEC_RGB24,
1626     VLC_CODEC_RGB32,
1627     VLC_CODEC_RGB15,
1628     VLC_CODEC_RGB8,
1629     0,
1630 };
1631 static const vlc_fourcc_t p_RGB15_fallback[] = {
1632     VLC_CODEC_RGB15,
1633     VLC_CODEC_RGB16,
1634     VLC_CODEC_RGB24,
1635     VLC_CODEC_RGB32,
1636     VLC_CODEC_RGB8,
1637     0,
1638 };
1639 static const vlc_fourcc_t p_RGB8_fallback[] = {
1640     VLC_CODEC_RGB8,
1641     VLC_CODEC_RGB15,
1642     VLC_CODEC_RGB16,
1643     VLC_CODEC_RGB24,
1644     VLC_CODEC_RGB32,
1645     0,
1646 };
1647 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1648     p_RGB32_fallback,
1649     p_RGB24_fallback,
1650     p_RGB16_fallback,
1651     p_RGB15_fallback,
1652     p_RGB8_fallback,
1653     NULL,
1654 };
1655
1656
1657 /* */
1658 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1659                                         const vlc_fourcc_t *pp_fallback[],
1660                                         const vlc_fourcc_t p_list[] )
1661 {
1662     for( unsigned i = 0; pp_fallback[i]; i++ )
1663     {
1664         if( pp_fallback[i][0] == i_fourcc )
1665             return pp_fallback[i];
1666     }
1667     return p_list;
1668 }
1669
1670 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1671 {
1672     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1673 }
1674 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1675 {
1676     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1677 }
1678
1679 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1680 {
1681     static const vlc_fourcc_t pp_swapped[][4] = {
1682         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1683         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1684         { 0 }
1685     };
1686
1687     for( int i = 0; pp_swapped[i][0]; i++ )
1688     {
1689         if( pp_swapped[i][0] == b )
1690         {
1691             vlc_fourcc_t t = a;
1692             a = b;
1693             b = t;
1694         }
1695         if( pp_swapped[i][0] != a )
1696             continue;
1697         for( int j = 1; pp_swapped[i][j]; j++ )
1698         {
1699             if( pp_swapped[i][j] == b )
1700                 return true;
1701         }
1702     }
1703     return false;
1704 }
1705
1706 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1707 {
1708     for( unsigned i = 0; p_list_YUV[i]; i++ )
1709     {
1710         if( p_list_YUV[i] == fcc )
1711             return true;
1712     }
1713     return false;
1714 }
1715
1716 #define PLANAR(n, w_den, h_den, size, bits) \
1717     { .plane_count = n, \
1718       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1719              {.w = {1,w_den}, .h = {1,h_den}}, \
1720              {.w = {1,w_den}, .h = {1,h_den}}, \
1721              {.w = {1,    1}, .h = {1,    1}} }, \
1722       .pixel_size = size, \
1723       .pixel_bits = bits }
1724
1725 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
1726 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
1727
1728 #define PACKED_FMT(size, bits) \
1729     { .plane_count = 1, \
1730       .p = { {.w = {1,1}, .h = {1,1}} }, \
1731       .pixel_size = size, \
1732       .pixel_bits = bits }
1733
1734 static const struct
1735 {
1736     vlc_fourcc_t             p_fourcc[6];
1737     vlc_chroma_description_t description;
1738 } p_list_chroma_description[] = {
1739     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
1740     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
1741     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
1742     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
1743     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
1744     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
1745     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
1746
1747     { { VLC_CODEC_I420_10L,
1748         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2, 10) },
1749     { { VLC_CODEC_I420_9L,
1750         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2,  9) },
1751     { { VLC_CODEC_I422_10L,
1752         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1, 10) },
1753     { { VLC_CODEC_I422_9L,
1754         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1,  9) },
1755     { { VLC_CODEC_I444_10L,
1756         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1, 10) },
1757     { { VLC_CODEC_I444_9L,
1758         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1,  9) },
1759
1760     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2, 16) },
1761     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1762         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1, 8) },
1763
1764     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
1765     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
1766     { { VLC_CODEC_RGB16, VLC_CODEC_RGBT,
1767         VLC_CODEC_RGBA16, 0 },                 PACKED_FMT(2, 16) },
1768     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
1769     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
1770     { { VLC_CODEC_RGBA,  0 },                  PACKED_FMT(4, 32) },
1771
1772     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
1773
1774     { {0}, { 0, {}, 0, 0 } }
1775 };
1776
1777 #undef PACKED_FMT
1778 #undef PLANAR_16
1779 #undef PLANAR_8
1780 #undef PLANAR
1781
1782 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1783 {
1784     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1785     {
1786         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1787         for( unsigned j = 0; p_fourcc[j]; j++ )
1788         {
1789             if( p_fourcc[j] == i_fourcc )
1790                 return &p_list_chroma_description[i].description;
1791         }
1792     }
1793     return NULL;
1794 }