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