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