]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Added planar I420 9/10-bit VLC_CODEC_* definitions and fallbacks.
[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(0, "")
839 };
840 static const entry_t p_list_audio[] = {
841
842     /* Windows Media Audio 1 */
843     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
844         A("WMA1"),
845         A("wma1"),
846
847     /* Windows Media Audio 2 */
848     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
849         A("WMA2"),
850         A("wma2"),
851         A("wma "),
852
853     /* Windows Media Audio Professional */
854     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
855         A("WMAP"),
856         A("wmap"),
857
858     /* Windows Media Audio Lossless */
859     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
860         A("WMAL"),
861         A("wmal"),
862
863     /* Windows Media Audio Speech */
864     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
865         A("WMAS"),
866         A("wmas"),
867
868     /* DV Audio */
869     B(VLC_CODEC_DVAUDIO, "DV Audio"),
870         A("dvau"),
871         A("vdva"),
872         A("dvca"),
873         A("RADV"),
874
875     /* MACE-3 Audio */
876     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
877         A("MAC3"),
878
879     /* MACE-6 Audio */
880     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
881         A("MAC6"),
882
883     /* MUSEPACK7 Audio */
884     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
885         A("MPC "),
886
887     /* MUSEPACK8 Audio */
888     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
889         A("MPCK"),
890         A("MPC8"),
891
892     /* RealAudio 1.0 */
893     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
894         A("14_4"),
895         A("lpcJ"),
896
897     /* RealAudio 2.0 */
898     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
899         A("28_8"),
900
901     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
902         A("sipr"),
903
904     /* MPEG Audio layer 1/2/3 */
905     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
906         A("mpga"),
907         A("mp3 "),
908         A(".mp3"),
909         A("MP3 "),
910         A("LAME"),
911         A("ms\x00\x50"),
912         A("ms\x00\x55"),
913
914     /* A52 Audio (aka AC3) */
915     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
916         A("a52 "),
917         A("a52b"),
918         A("ac-3"),
919         A("ms\x20\x00"),
920
921     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
922         A("eac3"),
923
924     /* DTS Audio */
925     B(VLC_CODEC_DTS, "DTS Audio"),
926         A("dts "),
927         A("DTS "),
928         A("dtsb"),
929         A("ms\x20\x01"),
930
931     /* AAC audio */
932     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
933         A("mp4a"),
934         A("aac "),
935
936     /* ALS audio */
937     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
938         A("als "),
939
940     /* 4X Technologies */
941     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
942         A("4xma"),
943
944     /* EA ADPCM */
945     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
946         A("ADEA"),
947
948     /* Interplay DPCM */
949     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
950         A("idpc"),
951
952     /* Id RoQ */
953     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
954         A("RoQa"),
955
956     /* DCIN Audio */
957     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
958         A("DCIA"),
959
960     /* Sony Playstation XA ADPCM */
961     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
962         A("xa  "),
963
964     /* ADX ADPCM */
965     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
966         A("adx "),
967
968     /* Westwood ADPCM */
969     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
970         A("AIWS"),
971
972     /* MS ADPCM */
973     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
974         A("ms\x00\x02"),
975
976     /* Sierra VMD */
977     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
978         A("vmda"),
979
980     /* G.726 ADPCM */
981     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
982         A("g726"),
983
984     /* G.722 ADPCM */
985     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
986         A("g722"),
987
988     /* Flash ADPCM */
989     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
990         A("SWFa"),
991
992     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
993         A("ms\x00\x11"),
994
995     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
996         A("imav"),
997
998     /* AMR */
999     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1000         A("samr"),
1001
1002     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1003         A("sawb"),
1004
1005     /* FLAC */
1006     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1007         A("flac"),
1008
1009     /* ALAC */
1010     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1011         A("alac"),
1012
1013     /* QDM2 */
1014     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1015         A("QDM2"),
1016
1017     /* COOK */
1018     B(VLC_CODEC_COOK, "Cook Audio"),
1019         A("cook"),
1020
1021     /* TTA: The Lossless True Audio */
1022     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1023         A("TTA1"),
1024
1025     /* Shorten */
1026     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1027         A("shn "),
1028         A("shrn"),
1029
1030     B(VLC_CODEC_WAVPACK, "WavPack"),
1031         A("WVPK"),
1032         A("wvpk"),
1033
1034     B(VLC_CODEC_GSM, "GSM Audio"),
1035         A("gsm "),
1036
1037     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1038         A("agsm"),
1039
1040     B(VLC_CODEC_ATRAC1, "atrac 1"),
1041         A("atr1"),
1042
1043     B(VLC_CODEC_ATRAC3, "atrac 3"),
1044         A("atrc"),
1045         A("\x70\x02\x00\x00"),
1046
1047     B(VLC_CODEC_SONIC, "Sonic"),
1048         A("SONC"),
1049
1050     B(VLC_CODEC_IMC, "IMC" ),
1051         A("\x01\x04\x00\x00"),
1052
1053     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1054         A("\x22\x00\x00\x00"),
1055
1056     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1057         A("NELL"),
1058
1059     B(VLC_CODEC_APE, "Monkey's Audio"),
1060         A("APE "),
1061
1062     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1063         A("mlp "),
1064
1065     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1066         A("trhd"),
1067
1068     B(VLC_CODEC_QCELP, "QCELP Audio"),
1069         A("Qclp"),
1070
1071     B(VLC_CODEC_SPEEX, "Speex Audio"),
1072         A("spx "),
1073         A("spxr"),
1074
1075     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1076         A("vorb"),
1077
1078     B(VLC_CODEC_302M, "302M Audio"),
1079         A("302m"),
1080
1081     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1082         A("lpcm"),
1083
1084     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1085         A("apcm"),
1086
1087     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1088         A("bpcm"),
1089
1090     B(VLC_CODEC_SDDS, "SDDS Audio"),
1091         A("sdds"),
1092         A("sddb"),
1093
1094     B(VLC_CODEC_MIDI, "MIDI Audio"),
1095         A("MIDI"),
1096
1097     /* PCM */
1098     B(VLC_CODEC_S8, "PCM S8"),
1099         A("s8  "),
1100
1101     B(VLC_CODEC_U8, "PCM U8"),
1102         A("u8  "),
1103
1104     B(VLC_CODEC_S16L, "PCM S16 LE"),
1105         A("s16l"),
1106
1107     B(VLC_CODEC_S16B, "PCM S16 BE"),
1108         A("s16b"),
1109
1110     B(VLC_CODEC_U16L, "PCM U16 LE"),
1111         A("u16l"),
1112
1113     B(VLC_CODEC_U16B, "PCM U16 BE"),
1114         A("u16b"),
1115
1116     B(VLC_CODEC_S20B, "PCM S20 BE"),
1117
1118     B(VLC_CODEC_S24L, "PCM S24 LE"),
1119         A("s24l"),
1120         A("42ni"),  /* Quicktime */
1121
1122     B(VLC_CODEC_S24B, "PCM S24 BE"),
1123         A("s24b"),
1124         A("in24"),  /* Quicktime */
1125
1126     B(VLC_CODEC_U24L, "PCM U24 LE"),
1127         A("u24l"),
1128
1129     B(VLC_CODEC_U24B, "PCM U24 BE"),
1130         A("u24b"),
1131
1132     B(VLC_CODEC_S32L, "PCM S32 LE"),
1133         A("s32l"),
1134         A("23ni"),  /* Quicktime */
1135
1136     B(VLC_CODEC_S32B, "PCM S32 BE"),
1137         A("s32b"),
1138         A("in32"),  /* Quicktime */
1139
1140     B(VLC_CODEC_U32L, "PCM U32 LE"),
1141         A("u32l"),
1142
1143     B(VLC_CODEC_U32B, "PCM U32 BE"),
1144         A("u32b"),
1145
1146     B(VLC_CODEC_ALAW, "PCM ALAW"),
1147         A("alaw"),
1148
1149     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1150         A("mlaw"),
1151         A("ulaw"),
1152
1153     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1154
1155     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1156         A("daud"),
1157
1158     B(VLC_CODEC_FI32, "32 bits fixed float"),
1159         A("fi32"),
1160
1161     B(VLC_CODEC_F32L, "32 bits float LE"),
1162         A("f32l"),
1163         A("fl32"),
1164
1165     B(VLC_CODEC_F32B, "32 bits float BE"),
1166         A("f32b"),
1167
1168     B(VLC_CODEC_F64L, "64 bits float LE"),
1169         A("f64l"),
1170
1171     B(VLC_CODEC_F64L, "64 bits float BE"),
1172         A("f64b"),
1173
1174     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1175         A("TWIN"),
1176
1177     B(0, "")
1178 };
1179 static const entry_t p_list_spu[] = {
1180
1181     B(VLC_CODEC_SPU, "DVD Subtitles"),
1182         A("spu "),
1183         A("spub"),
1184
1185     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1186         A("dvbs"),
1187
1188     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1189         A("subt"),
1190
1191     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1192         A("XSUB"),
1193         A("xsub"),
1194         A("DXSB"),
1195
1196     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1197         A("ssa "),
1198
1199     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1200         A("TEXT"),
1201
1202     B(VLC_CODEC_TELETEXT, "Teletext"),
1203         A("telx"),
1204
1205     B(VLC_CODEC_KATE, "Kate subtitles"),
1206         A("kate"),
1207
1208     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1209         A("cmml"),
1210
1211     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1212         A("t140"),
1213
1214     B(VLC_CODEC_USF, "USF subtitles"),
1215         A("usf "),
1216
1217     B(VLC_CODEC_OGT, "OGT subtitles"),
1218         A("ogt "),
1219
1220     B(VLC_CODEC_CVD, "CVD subtitles"),
1221         A("cvd "),
1222
1223     B(VLC_CODEC_BD_PG, "BD subtitles"),
1224         A("bdpg"),
1225
1226     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1227         A("STL "),
1228
1229     B(0, "")
1230 };
1231
1232 /* Create a fourcc from a string.
1233  * XXX it assumes that the string is at least four bytes */
1234 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1235 {
1236     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1237                        psz_fourcc[2], psz_fourcc[3] );
1238 }
1239
1240 /* */
1241 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1242 {
1243     const char *p_class = NULL;
1244     const char *psz_description = NULL;
1245
1246     entry_t e = B(0, "");
1247
1248     for( int i = 0; ; i++ )
1249     {
1250         const entry_t *p = &p_list[i];
1251         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1252         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1253
1254         if( i_entry_fourcc == 0 )
1255             break;
1256
1257         if( i_entry_class != 0 )
1258         {
1259             p_class = p->p_class;
1260             psz_description = p->psz_description;
1261         }
1262
1263         if( i_entry_fourcc == i_fourcc )
1264         {
1265             assert( p_class != NULL );
1266
1267             memcpy( e.p_class, p_class, 4 );
1268             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1269             e.psz_description = p->psz_description ?
1270                                 p->psz_description : psz_description;
1271             break;
1272         }
1273     }
1274     return e;
1275 }
1276
1277 /* */
1278 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1279 {
1280     entry_t e;
1281
1282     switch( i_cat )
1283     {
1284     case VIDEO_ES:
1285         return Lookup( p_list_video, i_fourcc );
1286     case AUDIO_ES:
1287         return Lookup( p_list_audio, i_fourcc );
1288     case SPU_ES:
1289         return Lookup( p_list_spu, i_fourcc );
1290
1291     default:
1292         e = Find( VIDEO_ES, i_fourcc );
1293         if( CreateFourcc( e.p_class ) == 0 )
1294             e = Find( AUDIO_ES, i_fourcc );
1295         if( CreateFourcc( e.p_class ) == 0 )
1296             e = Find( SPU_ES, i_fourcc );
1297         return e;
1298     }
1299 }
1300
1301 /* */
1302 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1303 {
1304     entry_t e = Find( i_cat, i_fourcc );
1305
1306     if( CreateFourcc( e.p_class ) == 0 )
1307         return i_fourcc;
1308     return CreateFourcc( e.p_class );
1309 }
1310
1311 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1312 {
1313     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1314         return 0;
1315     return vlc_fourcc_GetCodec( i_cat,
1316                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1317                                             psz_fourcc[2], psz_fourcc[3] ) );
1318 }
1319
1320 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1321 {
1322     const int i_bytes = ( i_bits + 7 ) / 8;
1323
1324     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1325     {
1326         switch( i_bytes )
1327         {
1328         case 4:
1329             return VLC_CODEC_FL32;
1330         case 8:
1331             return VLC_CODEC_FL64;
1332         default:
1333             return 0;
1334         }
1335     }
1336     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1337              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1338     {
1339         switch( i_bytes )
1340         {
1341         case 1:
1342             return VLC_CODEC_U8;
1343         case 2:
1344             return VLC_CODEC_S16L;
1345         case 3:
1346             return VLC_CODEC_S24L;
1347             break;
1348         case 4:
1349             return VLC_CODEC_S32L;
1350         default:
1351             return 0;
1352         }
1353     }
1354     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1355     {
1356         switch( i_bytes )
1357         {
1358         case 1:
1359             return VLC_CODEC_S8;
1360         case 2:
1361             return VLC_CODEC_S16B;
1362         case 3:
1363             return VLC_CODEC_S24B;
1364         case 4:
1365             return VLC_CODEC_S32B;
1366         default:
1367             return 0;
1368         }
1369     }
1370     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1371     {
1372         switch( i_bytes )
1373         {
1374         case 1:
1375             return VLC_CODEC_S8;
1376         case 2:
1377             return VLC_CODEC_S16L;
1378         case 3:
1379             return VLC_CODEC_S24L;
1380         case 4:
1381             return VLC_CODEC_S32L;
1382         default:
1383             return 0;
1384         }
1385     }
1386     else
1387     {
1388         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1389     }
1390 }
1391
1392 /* */
1393 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1394 {
1395     entry_t e = Find( i_cat, i_fourcc );
1396
1397     return e.psz_description;
1398 }
1399
1400
1401 /* */
1402 #define VLC_CODEC_YUV_PLANAR_410 \
1403     VLC_CODEC_I410, VLC_CODEC_YV9
1404
1405 #define VLC_CODEC_YUV_PLANAR_420 \
1406     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1407
1408 #define VLC_CODEC_YUV_PLANAR_420_16 \
1409     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1410
1411 #define VLC_CODEC_YUV_PLANAR_422 \
1412     VLC_CODEC_I422, VLC_CODEC_J422
1413
1414 #define VLC_CODEC_YUV_PLANAR_422_16 \
1415     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1416
1417 #define VLC_CODEC_YUV_PLANAR_440 \
1418     VLC_CODEC_I440, VLC_CODEC_J440
1419
1420 #define VLC_CODEC_YUV_PLANAR_444 \
1421     VLC_CODEC_I444, VLC_CODEC_J444
1422
1423 #define VLC_CODEC_YUV_PLANAR_444_16 \
1424     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1425
1426 #define VLC_CODEC_YUV_PACKED \
1427     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1428     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1429
1430 #define VLC_CODEC_FALLBACK_420 \
1431     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1432     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1433     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1434
1435 static const vlc_fourcc_t p_I420_fallback[] = {
1436     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1437 };
1438 static const vlc_fourcc_t p_J420_fallback[] = {
1439     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1440 };
1441 static const vlc_fourcc_t p_YV12_fallback[] = {
1442     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1443 };
1444
1445 #define VLC_CODEC_FALLBACK_420_16 \
1446     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1447
1448 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1449     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1450 };
1451 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1452     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1453 };
1454 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1455     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1456 };
1457 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1458     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1459 };
1460
1461 #define VLC_CODEC_FALLBACK_422 \
1462     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1463     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1464     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1465
1466 static const vlc_fourcc_t p_I422_fallback[] = {
1467     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1468 };
1469 static const vlc_fourcc_t p_J422_fallback[] = {
1470     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1471 };
1472
1473 #define VLC_CODEC_FALLBACK_422_16 \
1474     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1475
1476 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1477     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1478 };
1479 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1480     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1481 };
1482 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1483     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1484 };
1485 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1486     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1487 };
1488
1489 #define VLC_CODEC_FALLBACK_444 \
1490     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1491     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1492     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1493
1494 static const vlc_fourcc_t p_I444_fallback[] = {
1495     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1496 };
1497 static const vlc_fourcc_t p_J444_fallback[] = {
1498     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1499 };
1500
1501 #define VLC_CODEC_FALLBACK_444_16 \
1502     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1503
1504 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1505     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1506 };
1507 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1508     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1509 };
1510 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1511     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1512 };
1513 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1514     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1515 };
1516
1517 static const vlc_fourcc_t p_I440_fallback[] = {
1518     VLC_CODEC_I440,
1519     VLC_CODEC_YUV_PLANAR_420,
1520     VLC_CODEC_YUV_PLANAR_422,
1521     VLC_CODEC_YUV_PLANAR_444,
1522     VLC_CODEC_YUV_PACKED,
1523     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1524 };
1525
1526 #define VLC_CODEC_FALLBACK_PACKED \
1527     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1528     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1529     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1530
1531 static const vlc_fourcc_t p_YUYV_fallback[] = {
1532     VLC_CODEC_YUYV,
1533     VLC_CODEC_YVYU,
1534     VLC_CODEC_UYVY,
1535     VLC_CODEC_VYUY,
1536     VLC_CODEC_FALLBACK_PACKED, 0
1537 };
1538 static const vlc_fourcc_t p_YVYU_fallback[] = {
1539     VLC_CODEC_YVYU,
1540     VLC_CODEC_YUYV,
1541     VLC_CODEC_UYVY,
1542     VLC_CODEC_VYUY,
1543     VLC_CODEC_FALLBACK_PACKED, 0
1544 };
1545 static const vlc_fourcc_t p_UYVY_fallback[] = {
1546     VLC_CODEC_UYVY,
1547     VLC_CODEC_VYUY,
1548     VLC_CODEC_YUYV,
1549     VLC_CODEC_YVYU,
1550     VLC_CODEC_FALLBACK_PACKED, 0
1551 };
1552 static const vlc_fourcc_t p_VYUY_fallback[] = {
1553     VLC_CODEC_VYUY,
1554     VLC_CODEC_UYVY,
1555     VLC_CODEC_YUYV,
1556     VLC_CODEC_YVYU,
1557     VLC_CODEC_FALLBACK_PACKED, 0
1558 };
1559
1560 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1561     p_YV12_fallback,
1562     p_I420_fallback,
1563     p_I420_9L_fallback,
1564     p_I420_9B_fallback,
1565     p_I420_10L_fallback,
1566     p_I420_10B_fallback,
1567     p_J420_fallback,
1568     p_I422_fallback,
1569     p_I422_9L_fallback,
1570     p_I422_9B_fallback,
1571     p_I422_10L_fallback,
1572     p_I422_10B_fallback,
1573     p_J422_fallback,
1574     p_I444_fallback,
1575     p_J444_fallback,
1576     p_I444_9L_fallback,
1577     p_I444_9B_fallback,
1578     p_I444_10L_fallback,
1579     p_I444_10B_fallback,
1580     p_I440_fallback,
1581     p_YUYV_fallback,
1582     p_YVYU_fallback,
1583     p_UYVY_fallback,
1584     p_VYUY_fallback,
1585
1586
1587     NULL,
1588 };
1589
1590 static const vlc_fourcc_t p_list_YUV[] = {
1591     VLC_CODEC_YUV_PLANAR_420,
1592     VLC_CODEC_YUV_PLANAR_422,
1593     VLC_CODEC_YUV_PLANAR_440,
1594     VLC_CODEC_YUV_PLANAR_444,
1595     VLC_CODEC_YUV_PACKED,
1596     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1597     VLC_CODEC_YUV_PLANAR_420_16,
1598     VLC_CODEC_YUV_PLANAR_422_16,
1599     VLC_CODEC_YUV_PLANAR_444_16,
1600     0,
1601 };
1602
1603 /* */
1604 static const vlc_fourcc_t p_RGB32_fallback[] = {
1605     VLC_CODEC_RGB32,
1606     VLC_CODEC_RGB24,
1607     VLC_CODEC_RGB16,
1608     VLC_CODEC_RGB15,
1609     VLC_CODEC_RGB8,
1610     0,
1611 };
1612 static const vlc_fourcc_t p_RGB24_fallback[] = {
1613     VLC_CODEC_RGB24,
1614     VLC_CODEC_RGB32,
1615     VLC_CODEC_RGB16,
1616     VLC_CODEC_RGB15,
1617     VLC_CODEC_RGB8,
1618     0,
1619 };
1620 static const vlc_fourcc_t p_RGB16_fallback[] = {
1621     VLC_CODEC_RGB16,
1622     VLC_CODEC_RGB24,
1623     VLC_CODEC_RGB32,
1624     VLC_CODEC_RGB15,
1625     VLC_CODEC_RGB8,
1626     0,
1627 };
1628 static const vlc_fourcc_t p_RGB15_fallback[] = {
1629     VLC_CODEC_RGB15,
1630     VLC_CODEC_RGB16,
1631     VLC_CODEC_RGB24,
1632     VLC_CODEC_RGB32,
1633     VLC_CODEC_RGB8,
1634     0,
1635 };
1636 static const vlc_fourcc_t p_RGB8_fallback[] = {
1637     VLC_CODEC_RGB8,
1638     VLC_CODEC_RGB15,
1639     VLC_CODEC_RGB16,
1640     VLC_CODEC_RGB24,
1641     VLC_CODEC_RGB32,
1642     0,
1643 };
1644 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1645     p_RGB32_fallback,
1646     p_RGB24_fallback,
1647     p_RGB16_fallback,
1648     p_RGB15_fallback,
1649     p_RGB8_fallback,
1650     NULL,
1651 };
1652
1653
1654 /* */
1655 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1656                                         const vlc_fourcc_t *pp_fallback[],
1657                                         const vlc_fourcc_t p_list[] )
1658 {
1659     for( unsigned i = 0; pp_fallback[i]; i++ )
1660     {
1661         if( pp_fallback[i][0] == i_fourcc )
1662             return pp_fallback[i];
1663     }
1664     return p_list;
1665 }
1666
1667 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1668 {
1669     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1670 }
1671 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1672 {
1673     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1674 }
1675
1676 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1677 {
1678     static const vlc_fourcc_t pp_swapped[][4] = {
1679         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1680         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1681         { 0 }
1682     };
1683
1684     for( int i = 0; pp_swapped[i][0]; i++ )
1685     {
1686         if( pp_swapped[i][0] == b )
1687         {
1688             vlc_fourcc_t t = a;
1689             a = b;
1690             b = t;
1691         }
1692         if( pp_swapped[i][0] != a )
1693             continue;
1694         for( int j = 1; pp_swapped[i][j]; j++ )
1695         {
1696             if( pp_swapped[i][j] == b )
1697                 return true;
1698         }
1699     }
1700     return false;
1701 }
1702
1703 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1704 {
1705     for( unsigned i = 0; p_list_YUV[i]; i++ )
1706     {
1707         if( p_list_YUV[i] == fcc )
1708             return true;
1709     }
1710     return false;
1711 }
1712
1713 #define PLANAR(n, w_den, h_den, size) \
1714     { .plane_count = n, \
1715       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1716              {.w = {1,w_den}, .h = {1,h_den}}, \
1717              {.w = {1,w_den}, .h = {1,h_den}}, \
1718              {.w = {1,    1}, .h = {1,    1}} }, \
1719       .pixel_size = size }
1720
1721 #define PLANAR_8(n, w_den, h_den)  PLANAR(n, w_den, h_den, 1)
1722 #define PLANAR_16(n, w_den, h_den) PLANAR(n, w_den, h_den, 2)
1723
1724 #define PACKED_FMT(size) \
1725     { .plane_count = 1, \
1726       .p = { {.w = {1,1}, .h = {1,1}} }, \
1727       .pixel_size = size }
1728
1729 static const struct
1730 {
1731     vlc_fourcc_t             p_fourcc[6];
1732     vlc_chroma_description_t description;
1733 } p_list_chroma_description[] = {
1734     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
1735     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
1736     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
1737     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
1738     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
1739     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
1740     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
1741
1742     { { VLC_CODEC_I420_10L,
1743         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2) },
1744     { { VLC_CODEC_I420_9L,
1745         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2) },
1746     { { VLC_CODEC_I422_10L,
1747         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1) },
1748     { { VLC_CODEC_I422_9L,
1749         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1) },
1750     { { VLC_CODEC_I444_10L,
1751         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1) },
1752     { { VLC_CODEC_I444_9L,
1753         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1) },
1754
1755     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2) },
1756     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1757         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1) },
1758     { { VLC_CODEC_RGB16, VLC_CODEC_RGB15, VLC_CODEC_RGBT,
1759         VLC_CODEC_RGB12, VLC_CODEC_RGBA16, 0 },PACKED_FMT(2) },
1760     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3) },
1761     { { VLC_CODEC_RGB32, VLC_CODEC_RGBA, 0 },  PACKED_FMT(4) },
1762
1763     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4 } },
1764
1765     { {0}, { 0, {}, 0 } }
1766 };
1767
1768 #undef PACKED_FMT
1769 #undef PLANAR_16
1770 #undef PLANAR_8
1771 #undef PLANAR
1772
1773 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1774 {
1775     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1776     {
1777         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1778         for( unsigned j = 0; p_fourcc[j]; j++ )
1779         {
1780             if( p_fourcc[j] == i_fourcc )
1781                 return &p_list_chroma_description[i].description;
1782         }
1783     }
1784     return NULL;
1785 }