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