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