]> git.sesse.net Git - vlc/blob - src/misc/fourcc.c
Support of Mxpeg codec
[vlc] / src / misc / fourcc.c
1 /*****************************************************************************
2  * fourcc.c: fourcc helpers functions
3  *****************************************************************************
4  * Copyright © 2009-2011 Laurent Aimar
5  *
6  * Authors: Laurent Aimar <fenrir@videolan.org>
7  *          Jean-Baptiste Kempf <jb@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_common.h>
32 #include <vlc_fourcc.h>
33 #include <vlc_es.h>
34 #include <assert.h>
35
36 typedef struct
37 {
38     char p_class[4];
39     char p_fourcc[4];
40     const char *psz_description;
41 } entry_t;
42
43 #define NULL4 "\x00\x00\x00\x00"
44
45 /* XXX You don't want to see the preprocessor generated code ;) */
46 #ifdef WORDS_BIGENDIAN
47 #   define FCC2STR(f) { ((f)>>24)&0xff, ((f)>>16)&0xff, ((f)>>8)&0xff, ((f)>>0)&0xff }
48 #else
49 #   define FCC2STR(f) { ((f)>>0)&0xff, ((f)>>8)&0xff, ((f)>>16)&0xff, ((f)>>24)&0xff }
50 #endif
51 /* Begin a new class */
52 #define B(a, c) { .p_class = FCC2STR(a), .p_fourcc = FCC2STR(a), .psz_description = c }
53 /* Create a sub-class entry with description */
54 #define E(b, c) { .p_class = NULL4, .p_fourcc = b, .psz_description = c }
55 /* Create a sub-class entry without description (alias) */
56 #define A(b) E(b, NULL4)
57
58
59 /* */
60 static const entry_t p_list_video[] = {
61
62     B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
63         A("mpgv"),
64         A("mp1v"),
65         A("mpeg"),
66         A("mpg1"),
67         A("mp2v"),
68         A("MPEG"),
69         A("mpg2"),
70         A("MPG2"),
71         A("H262"),
72
73         E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
74
75         E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
76         E("hdv2", "Sony HDV 1080i60 (MPEG-2 Video)"),
77         E("hdv3", "FCP HDV 1080i50 (MPEG-2 Video)"),
78         E("hdv4", "HDV 720p24 (MPEG-2 Video)"),
79         E("hdv5", "HDV 720p25 (MPEG-2 Video)"),
80         E("hdv6", "HDV 1080p24 (MPEG-2 Video)"),
81         E("hdv7", "HDV 1080p25 (MPEG-2 Video)"),
82         E("hdv8", "HDV 1080p30 (MPEG-2 Video)"),
83         E("hdv9", "HDV 720p60 JVC (MPEG-2 Video)"),
84         E("hdva", "HDV 720p50 (MPEG-2 Video)"),
85
86         E("mx5n", "MPEG2 IMX NTSC 525/60 50Mb/s (FCP)"),
87         E("mx5p", "MPEG2 IMX PAL 625/60 50Mb/s (FCP)"),
88         E("mx4n", "MPEG2 IMX NTSC 525/60 40Mb/s (FCP)"),
89         E("mx4p", "MPEG2 IMX PAL 625/50 40Mb/s (FCP)"),
90         E("mx3n", "MPEG2 IMX NTSC 525/60 30Mb/s (FCP)"),
91         E("mx3p", "MPEG2 IMX NTSC 625/50 30Mb/s (FCP)"),
92
93         E("xdv1", "XDCAM HD 720p30 35Mb/s"),
94         E("xdv2", "XDCAM HD 1080i60 35Mb/s"),
95         E("xdv3", "XDCAM HD 1080i50 35Mb/s"),
96         E("xdv4", "XDCAM HD 720p24 35Mb/s"),
97         E("xdv5", "XDCAM HD 720p25 35Mb/s"),
98         E("xdv6", "XDCAM HD 1080p24 35Mb/s"),
99         E("xdv7", "XDCAM HD 1080p25 35Mb/s"),
100         E("xdv8", "XDCAM HD 1080p30 35Mb/s"),
101         E("xdv9", "XDCAM HD 720p60 35Mb/s"),
102         E("xdva", "XDCAM HD 720p50 35Mb/s"),
103
104         E("xdvb", "XDCAM EX 1080i60 50Mb/s CBR"),
105         E("xdvc", "XDCAM EX 1080i50 50Mb/s CBR"),
106         E("xdvd", "XDCAM EX 1080p24 50Mb/s CBR"),
107         E("xdve", "XDCAM EX 1080p25 50Mb/s CBR"),
108         E("xdvf", "XDCAM EX 1080p30 50Mb/s CBR"),
109
110         E("xd54", "XDCAM HD422 720p24 50Mb/s CBR"),
111         E("xd55", "XDCAM HD422 720p25 50Mb/s CBR"),
112         E("xd59", "XDCAM HD422 720p60 50Mb/s CBR"),
113         E("xd5a", "XDCAM HD422 720p50 50Mb/s CBR"),
114         E("xd5b", "XDCAM HD422 1080i60 50Mb/s CBR"),
115         E("xd5c", "XDCAM HD422 1080i50 50Mb/s CBR"),
116         E("xd5d", "XDCAM HD422 1080p24 50Mb/s CBR"),
117         E("xd5e", "XDCAM HD422 1080p25 50Mb/s CBR"),
118         E("xd5f", "XDCAM HD422 1080p30 50Mb/s CBR"),
119
120         E("xdhd", "XDCAM HD 540p"),
121         E("xdh2", "XDCAM HD422 540p"),
122
123         E("AVmp", "AVID IMX PAL"),
124         E("MMES", "Matrox MPEG-2"),
125         E("mmes", "Matrox MPEG-2"),
126         E("PIM2", "Pinnacle MPEG-2"),
127         E("LMP2", "Lead MPEG-2"),
128
129         E("VCR2", "ATI VCR-2"),
130
131     B(VLC_CODEC_MP4V, "MPEG-4 Video"),
132         A("mp4v"),
133         A("DIVX"),
134         A("divx"),
135         A("MP4S"),
136         A("mp4s"),
137         A("M4S2"),
138         A("m4s2"),
139         A("MP4V"),
140         A("\x04\x00\x00\x00"),
141         A("m4cc"),
142         A("M4CC"),
143         A("FMP4"),
144         A("fmp4"),
145         A("DCOD"),
146         A("MVXM"),
147         A("PM4V"),
148         A("M4T3"),
149         A("GEOX"),
150         A("GEOV"),
151         A("DMK2"),
152         A("WV1F"),
153         A("DIGI"),
154         A("INMC"),
155         A("SN40"),
156         A("EPHV"),
157         A("DM4V"),
158         /* 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_I444, "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(0, "")
908 };
909 static const entry_t p_list_audio[] = {
910
911     /* Windows Media Audio 1 */
912     B(VLC_CODEC_WMA1, "Windows Media Audio 1"),
913         A("WMA1"),
914         A("wma1"),
915
916     /* Windows Media Audio 2 */
917     B(VLC_CODEC_WMA2, "Windows Media Audio 2"),
918         A("WMA2"),
919         A("wma2"),
920         A("wma "),
921
922     /* Windows Media Audio Professional */
923     B(VLC_CODEC_WMAP, "Windows Media Audio Professional"),
924         A("WMAP"),
925         A("wmap"),
926
927     /* Windows Media Audio Lossless */
928     B(VLC_CODEC_WMAL, "Windows Media Audio Lossless"),
929         A("WMAL"),
930         A("wmal"),
931
932     /* Windows Media Audio Speech */
933     B(VLC_CODEC_WMAS, "Windows Media Audio Voice (Speech)"),
934         A("WMAS"),
935         A("wmas"),
936
937     /* DV Audio */
938     B(VLC_CODEC_DVAUDIO, "DV Audio"),
939         A("dvau"),
940         A("vdva"),
941         A("dvca"),
942         A("RADV"),
943
944     /* MACE-3 Audio */
945     B(VLC_CODEC_MACE3, "MACE-3 Audio"),
946         A("MAC3"),
947
948     /* MACE-6 Audio */
949     B(VLC_CODEC_MACE6, "MACE-6 Audio"),
950         A("MAC6"),
951
952     /* MUSEPACK7 Audio */
953     B(VLC_CODEC_MUSEPACK7, "MUSEPACK7 Audio"),
954         A("MPC "),
955
956     /* MUSEPACK8 Audio */
957     B(VLC_CODEC_MUSEPACK8, "MUSEPACK8 Audio"),
958         A("MPCK"),
959         A("MPC8"),
960
961     /* RealAudio 1.0 */
962     B(VLC_CODEC_RA_144, "RealAudio 1.0"),
963         A("14_4"),
964         A("lpcJ"),
965
966     /* RealAudio 2.0 */
967     B(VLC_CODEC_RA_288, "RealAudio 2.0"),
968         A("28_8"),
969
970     B(VLC_CODEC_SIPR, "RealAudio Sipr"),
971         A("sipr"),
972
973     /* MPEG Audio layer 1/2/3 */
974     B(VLC_CODEC_MPGA, "MPEG Audio layer 1/2/3"),
975         A("mpga"),
976         A(".mp1"),
977         A(".mp2"),
978         A("mp3 "),
979         A(".mp3"),
980         A("MP3 "),
981         A("LAME"),
982         A("ms\x00\x50"),
983         A("ms\x00\x55"),
984
985     /* A52 Audio (aka AC3) */
986     B(VLC_CODEC_A52, "A52 Audio (aka AC3)"),
987         A("a52 "),
988         A("a52b"),
989         A("ac-3"),
990         A("sac3"),
991         A("ms\x20\x00"),
992
993     B(VLC_CODEC_EAC3, "A/52 B Audio (aka E-AC3)"),
994         A("eac3"),
995
996     /* DTS Audio */
997     B(VLC_CODEC_DTS, "DTS Audio"),
998         A("dts "),
999         A("DTS "),
1000         A("dtsb"),
1001         A("dtsc"),
1002         A("ms\x20\x01"),
1003
1004     /* AAC audio */
1005     B(VLC_CODEC_MP4A, "MPEG AAC Audio"),
1006         A("mp4a"),
1007         A("aac "),
1008
1009     /* ALS audio */
1010     B(VLC_CODEC_ALS, "MPEG-4 Audio Lossless (ALS)"),
1011         A("als "),
1012
1013     /* 4X Technologies */
1014     B(VLC_CODEC_ADPCM_4XM, "4X Technologies Audio"),
1015         A("4xma"),
1016
1017     /* EA ADPCM */
1018     B(VLC_CODEC_ADPCM_EA, "EA ADPCM Audio"),
1019         A("ADEA"),
1020
1021     /* Interplay DPCM */
1022     B(VLC_CODEC_INTERPLAY_DPCM, "Interplay DPCM Audio"),
1023         A("idpc"),
1024
1025     /* Id RoQ */
1026     B(VLC_CODEC_ROQ_DPCM, "Id RoQ DPCM Audio"),
1027         A("RoQa"),
1028
1029     /* DCIN Audio */
1030     B(VLC_CODEC_DSICINAUDIO, "Delphine CIN Audio"),
1031         A("DCIA"),
1032
1033     /* Sony Playstation XA ADPCM */
1034     B(VLC_CODEC_ADPCM_XA, "PSX XA ADPCM Audio"),
1035         A("xa  "),
1036
1037     /* ADX ADPCM */
1038     B(VLC_CODEC_ADPCM_ADX, "ADX ADPCM Audio"),
1039         A("adx "),
1040
1041     /* Westwood ADPCM */
1042     B(VLC_CODEC_ADPCM_IMA_WS, "Westwood IMA ADPCM audio"),
1043         A("AIWS"),
1044
1045     /* MS ADPCM */
1046     B(VLC_CODEC_ADPCM_MS, "MS ADPCM audio"),
1047         A("ms\x00\x02"),
1048
1049     /* Sierra VMD */
1050     B(VLC_CODEC_VMDAUDIO, "Sierra VMD Audio"),
1051         A("vmda"),
1052
1053     /* G.726 ADPCM */
1054     B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
1055         A("g726"),
1056
1057     /* G.722 ADPCM */
1058     B(VLC_CODEC_ADPCM_G722, "G.722 ADPCM Audio"),
1059         A("g722"),
1060
1061     /* Flash ADPCM */
1062     B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
1063         A("SWFa"),
1064
1065     B(VLC_CODEC_ADPCM_IMA_WAV, "IMA WAV ADPCM Audio"),
1066         A("ms\x00\x11"),
1067
1068     B(VLC_CODEC_ADPCM_IMA_AMV, "IMA AMV ADPCM Audio"),
1069         A("imav"),
1070
1071     /* AMR */
1072     B(VLC_CODEC_AMR_NB, "AMR narrow band"),
1073         A("samr"),
1074
1075     B(VLC_CODEC_AMR_WB, "AMR wide band"),
1076         A("sawb"),
1077
1078     /* FLAC */
1079     B(VLC_CODEC_FLAC, "FLAC (Free Lossless Audio Codec)"),
1080         A("flac"),
1081
1082     /* ALAC */
1083     B(VLC_CODEC_ALAC, "Apple Lossless Audio Codec"),
1084         A("alac"),
1085
1086     /* QDM2 */
1087     B(VLC_CODEC_QDM2, "QDM2 Audio"),
1088         A("QDM2"),
1089
1090     /* COOK */
1091     B(VLC_CODEC_COOK, "Cook Audio"),
1092         A("cook"),
1093
1094     /* TTA: The Lossless True Audio */
1095     B(VLC_CODEC_TTA, "The Lossless True Audio"),
1096         A("TTA1"),
1097
1098     /* Shorten */
1099     B(VLC_CODEC_SHORTEN, "Shorten Lossless Audio"),
1100         A("shn "),
1101         A("shrn"),
1102
1103     B(VLC_CODEC_WAVPACK, "WavPack"),
1104         A("WVPK"),
1105         A("wvpk"),
1106
1107     B(VLC_CODEC_GSM, "GSM Audio"),
1108         A("gsm "),
1109
1110     B(VLC_CODEC_GSM_MS, "Microsoft GSM Audio"),
1111         A("agsm"),
1112
1113     B(VLC_CODEC_ATRAC1, "atrac 1"),
1114         A("atr1"),
1115
1116     B(VLC_CODEC_ATRAC3, "atrac 3"),
1117         A("atrc"),
1118         A("\x70\x02\x00\x00"),
1119
1120     B(VLC_CODEC_SONIC, "Sonic"),
1121         A("SONC"),
1122
1123     B(VLC_CODEC_IMC, "IMC" ),
1124         A("\x01\x04\x00\x00"),
1125
1126     B(VLC_CODEC_TRUESPEECH,"TrueSpeech"),
1127         A("\x22\x00\x00\x00"),
1128
1129     B(VLC_CODEC_NELLYMOSER, "NellyMoser ASAO"),
1130         A("NELL"),
1131         A("nmos"),
1132
1133     B(VLC_CODEC_APE, "Monkey's Audio"),
1134         A("APE "),
1135
1136     B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
1137         A("mlp "),
1138
1139     B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
1140         A("trhd"),
1141
1142     B(VLC_CODEC_QCELP, "QCELP Audio"),
1143         A("Qclp"),
1144         A("Qclq"),
1145         A("sqcp"),
1146
1147     B(VLC_CODEC_SPEEX, "Speex Audio"),
1148         A("spx "),
1149         A("spxr"),
1150
1151     B(VLC_CODEC_VORBIS, "Vorbis Audio"),
1152         A("vorb"),
1153
1154     B(VLC_CODEC_302M, "302M Audio"),
1155         A("302m"),
1156
1157     B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
1158         A("lpcm"),
1159
1160     B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
1161         A("apcm"),
1162
1163     B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
1164         A("bpcm"),
1165
1166     B(VLC_CODEC_SDDS, "SDDS Audio"),
1167         A("sdds"),
1168         A("sddb"),
1169
1170     B(VLC_CODEC_MIDI, "MIDI Audio"),
1171         A("MIDI"),
1172
1173     /* PCM */
1174     B(VLC_CODEC_S8, "PCM S8"),
1175         A("s8  "),
1176
1177     B(VLC_CODEC_U8, "PCM U8"),
1178         A("u8  "),
1179
1180     B(VLC_CODEC_S16L, "PCM S16 LE"),
1181         A("s16l"),
1182
1183     B(VLC_CODEC_S16B, "PCM S16 BE"),
1184         A("s16b"),
1185
1186     B(VLC_CODEC_U16L, "PCM U16 LE"),
1187         A("u16l"),
1188
1189     B(VLC_CODEC_U16B, "PCM U16 BE"),
1190         A("u16b"),
1191
1192     B(VLC_CODEC_S20B, "PCM S20 BE"),
1193
1194     B(VLC_CODEC_S24L, "PCM S24 LE"),
1195         A("s24l"),
1196         A("42ni"),  /* Quicktime */
1197
1198     B(VLC_CODEC_S24B, "PCM S24 BE"),
1199         A("s24b"),
1200         A("in24"),  /* Quicktime */
1201
1202     B(VLC_CODEC_U24L, "PCM U24 LE"),
1203         A("u24l"),
1204
1205     B(VLC_CODEC_U24B, "PCM U24 BE"),
1206         A("u24b"),
1207
1208     B(VLC_CODEC_S32L, "PCM S32 LE"),
1209         A("s32l"),
1210         A("23ni"),  /* Quicktime */
1211
1212     B(VLC_CODEC_S32B, "PCM S32 BE"),
1213         A("s32b"),
1214         A("in32"),  /* Quicktime */
1215
1216     B(VLC_CODEC_U32L, "PCM U32 LE"),
1217         A("u32l"),
1218
1219     B(VLC_CODEC_U32B, "PCM U32 BE"),
1220         A("u32b"),
1221
1222     B(VLC_CODEC_ALAW, "PCM ALAW"),
1223         A("alaw"),
1224
1225     B(VLC_CODEC_MULAW, "PCM MU-LAW"),
1226         A("mlaw"),
1227         A("ulaw"),
1228
1229     B(VLC_CODEC_DAT12, "12 bits DAT audio"),
1230
1231     B(VLC_CODEC_S24DAUD, "PCM DAUD"),
1232         A("daud"),
1233
1234     B(VLC_CODEC_FI32, "32 bits fixed float"),
1235         A("fi32"),
1236
1237     B(VLC_CODEC_F32L, "32 bits float LE"),
1238         A("f32l"),
1239         A("fl32"),
1240
1241     B(VLC_CODEC_F32B, "32 bits float BE"),
1242         A("f32b"),
1243
1244     B(VLC_CODEC_F64L, "64 bits float LE"),
1245         A("f64l"),
1246
1247     B(VLC_CODEC_F64L, "64 bits float BE"),
1248         A("f64b"),
1249
1250     B(VLC_CODEC_TWINVQ, "TwinVQ"),
1251         A("TWIN"),
1252
1253     B(0, "")
1254 };
1255 static const entry_t p_list_spu[] = {
1256
1257     B(VLC_CODEC_SPU, "DVD Subtitles"),
1258         A("spu "),
1259         A("spub"),
1260
1261     B(VLC_CODEC_DVBS, "DVB Subtitles"),
1262         A("dvbs"),
1263
1264     B(VLC_CODEC_SUBT, "Text subtitles with various tags"),
1265         A("subt"),
1266
1267     B(VLC_CODEC_XSUB, "DivX XSUB subtitles"),
1268         A("XSUB"),
1269         A("xsub"),
1270         A("DXSB"),
1271
1272     B(VLC_CODEC_SSA, "SubStation Alpha subtitles"),
1273         A("ssa "),
1274
1275     B(VLC_CODEC_TEXT, "Plain text subtitles"),
1276         A("TEXT"),
1277
1278     B(VLC_CODEC_TELETEXT, "Teletext"),
1279         A("telx"),
1280
1281     B(VLC_CODEC_KATE, "Kate subtitles"),
1282         A("kate"),
1283
1284     B(VLC_CODEC_CMML, "CMML annotations/metadata"),
1285         A("cmml"),
1286
1287     B(VLC_CODEC_ITU_T140, "ITU T.140 subtitles"),
1288         A("t140"),
1289
1290     B(VLC_CODEC_USF, "USF subtitles"),
1291         A("usf "),
1292
1293     B(VLC_CODEC_OGT, "OGT subtitles"),
1294         A("ogt "),
1295
1296     B(VLC_CODEC_CVD, "CVD subtitles"),
1297         A("cvd "),
1298
1299     B(VLC_CODEC_BD_PG, "BD subtitles"),
1300         A("bdpg"),
1301
1302     B(VLC_CODEC_EBU_STL, "EBU STL subtitles"),
1303         A("STL "),
1304
1305     B(0, "")
1306 };
1307
1308 /* Create a fourcc from a string.
1309  * XXX it assumes that the string is at least four bytes */
1310 static inline vlc_fourcc_t CreateFourcc( const char *psz_fourcc )
1311 {
1312     return VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1313                        psz_fourcc[2], psz_fourcc[3] );
1314 }
1315
1316 /* */
1317 static entry_t Lookup( const entry_t p_list[], vlc_fourcc_t i_fourcc )
1318 {
1319     const char *p_class = NULL;
1320     const char *psz_description = NULL;
1321
1322     entry_t e = B(0, "");
1323
1324     for( int i = 0; ; i++ )
1325     {
1326         const entry_t *p = &p_list[i];
1327         const vlc_fourcc_t i_entry_fourcc = CreateFourcc( p->p_fourcc );
1328         const vlc_fourcc_t i_entry_class = CreateFourcc( p->p_class );
1329
1330         if( i_entry_fourcc == 0 )
1331             break;
1332
1333         if( i_entry_class != 0 )
1334         {
1335             p_class = p->p_class;
1336             psz_description = p->psz_description;
1337         }
1338
1339         if( i_entry_fourcc == i_fourcc )
1340         {
1341             assert( p_class != NULL );
1342
1343             memcpy( e.p_class, p_class, 4 );
1344             memcpy( e.p_fourcc, p->p_fourcc, 4 );
1345             e.psz_description = p->psz_description ?
1346                                 p->psz_description : psz_description;
1347             break;
1348         }
1349     }
1350     return e;
1351 }
1352
1353 /* */
1354 static entry_t Find( int i_cat, vlc_fourcc_t i_fourcc )
1355 {
1356     entry_t e;
1357
1358     switch( i_cat )
1359     {
1360     case VIDEO_ES:
1361         return Lookup( p_list_video, i_fourcc );
1362     case AUDIO_ES:
1363         return Lookup( p_list_audio, i_fourcc );
1364     case SPU_ES:
1365         return Lookup( p_list_spu, i_fourcc );
1366
1367     default:
1368         e = Find( VIDEO_ES, i_fourcc );
1369         if( CreateFourcc( e.p_class ) == 0 )
1370             e = Find( AUDIO_ES, i_fourcc );
1371         if( CreateFourcc( e.p_class ) == 0 )
1372             e = Find( SPU_ES, i_fourcc );
1373         return e;
1374     }
1375 }
1376
1377 /* */
1378 vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc )
1379 {
1380     entry_t e = Find( i_cat, i_fourcc );
1381
1382     if( CreateFourcc( e.p_class ) == 0 )
1383         return i_fourcc;
1384     return CreateFourcc( e.p_class );
1385 }
1386
1387 vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
1388 {
1389     if( !psz_fourcc || strlen(psz_fourcc) != 4 )
1390         return 0;
1391     return vlc_fourcc_GetCodec( i_cat,
1392                                 VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
1393                                             psz_fourcc[2], psz_fourcc[3] ) );
1394 }
1395
1396 vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
1397 {
1398     const int i_bytes = ( i_bits + 7 ) / 8;
1399
1400     if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
1401     {
1402         switch( i_bytes )
1403         {
1404         case 4:
1405             return VLC_CODEC_FL32;
1406         case 8:
1407             return VLC_CODEC_FL64;
1408         default:
1409             return 0;
1410         }
1411     }
1412     else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
1413              i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
1414     {
1415         switch( i_bytes )
1416         {
1417         case 1:
1418             return VLC_CODEC_U8;
1419         case 2:
1420             return VLC_CODEC_S16L;
1421         case 3:
1422             return VLC_CODEC_S24L;
1423             break;
1424         case 4:
1425             return VLC_CODEC_S32L;
1426         default:
1427             return 0;
1428         }
1429     }
1430     else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
1431     {
1432         switch( i_bytes )
1433         {
1434         case 1:
1435             return VLC_CODEC_S8;
1436         case 2:
1437             return VLC_CODEC_S16B;
1438         case 3:
1439             return VLC_CODEC_S24B;
1440         case 4:
1441             return VLC_CODEC_S32B;
1442         default:
1443             return 0;
1444         }
1445     }
1446     else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
1447     {
1448         switch( i_bytes )
1449         {
1450         case 1:
1451             return VLC_CODEC_S8;
1452         case 2:
1453             return VLC_CODEC_S16L;
1454         case 3:
1455             return VLC_CODEC_S24L;
1456         case 4:
1457             return VLC_CODEC_S32L;
1458         default:
1459             return 0;
1460         }
1461     }
1462     else
1463     {
1464         return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
1465     }
1466 }
1467
1468 /* */
1469 const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
1470 {
1471     entry_t e = Find( i_cat, i_fourcc );
1472
1473     return e.psz_description;
1474 }
1475
1476
1477 /* */
1478 #define VLC_CODEC_YUV_PLANAR_410 \
1479     VLC_CODEC_I410, VLC_CODEC_YV9
1480
1481 #define VLC_CODEC_YUV_PLANAR_420 \
1482     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
1483
1484 #define VLC_CODEC_YUV_PLANAR_420_16 \
1485     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
1486
1487 #define VLC_CODEC_YUV_PLANAR_422 \
1488     VLC_CODEC_I422, VLC_CODEC_J422
1489
1490 #define VLC_CODEC_YUV_PLANAR_422_16 \
1491     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
1492
1493 #define VLC_CODEC_YUV_PLANAR_440 \
1494     VLC_CODEC_I440, VLC_CODEC_J440
1495
1496 #define VLC_CODEC_YUV_PLANAR_444 \
1497     VLC_CODEC_I444, VLC_CODEC_J444
1498
1499 #define VLC_CODEC_YUV_PLANAR_444_16 \
1500     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B
1501
1502 #define VLC_CODEC_YUV_PACKED \
1503     VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
1504     VLC_CODEC_UYVY, VLC_CODEC_VYUY
1505
1506 #define VLC_CODEC_FALLBACK_420 \
1507     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1508     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1509     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1510
1511 static const vlc_fourcc_t p_I420_fallback[] = {
1512     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1513 };
1514 static const vlc_fourcc_t p_J420_fallback[] = {
1515     VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
1516 };
1517 static const vlc_fourcc_t p_YV12_fallback[] = {
1518     VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
1519 };
1520
1521 #define VLC_CODEC_FALLBACK_420_16 \
1522     VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
1523
1524 static const vlc_fourcc_t p_I420_9L_fallback[] = {
1525     VLC_CODEC_I420_9L, VLC_CODEC_I420_9B, VLC_CODEC_FALLBACK_420_16, 0
1526 };
1527 static const vlc_fourcc_t p_I420_9B_fallback[] = {
1528     VLC_CODEC_I420_9B, VLC_CODEC_I420_9L, VLC_CODEC_FALLBACK_420_16, 0
1529 };
1530 static const vlc_fourcc_t p_I420_10L_fallback[] = {
1531     VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_FALLBACK_420_16, 0
1532 };
1533 static const vlc_fourcc_t p_I420_10B_fallback[] = {
1534     VLC_CODEC_I420_10B, VLC_CODEC_I420_10L, VLC_CODEC_FALLBACK_420_16, 0
1535 };
1536
1537 #define VLC_CODEC_FALLBACK_422 \
1538     VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
1539     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1540     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1541
1542 static const vlc_fourcc_t p_I422_fallback[] = {
1543     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
1544 };
1545 static const vlc_fourcc_t p_J422_fallback[] = {
1546     VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
1547 };
1548
1549 #define VLC_CODEC_FALLBACK_422_16 \
1550     VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
1551
1552 static const vlc_fourcc_t p_I422_9L_fallback[] = {
1553     VLC_CODEC_I422_9L, VLC_CODEC_I422_9B, VLC_CODEC_FALLBACK_422_16, 0
1554 };
1555 static const vlc_fourcc_t p_I422_9B_fallback[] = {
1556     VLC_CODEC_I422_9B, VLC_CODEC_I422_9L, VLC_CODEC_FALLBACK_422_16, 0
1557 };
1558 static const vlc_fourcc_t p_I422_10L_fallback[] = {
1559     VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_FALLBACK_422_16, 0
1560 };
1561 static const vlc_fourcc_t p_I422_10B_fallback[] = {
1562     VLC_CODEC_I422_10B, VLC_CODEC_I422_10L, VLC_CODEC_FALLBACK_422_16, 0
1563 };
1564
1565 #define VLC_CODEC_FALLBACK_444 \
1566     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
1567     VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
1568     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1569
1570 static const vlc_fourcc_t p_I444_fallback[] = {
1571     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
1572 };
1573 static const vlc_fourcc_t p_J444_fallback[] = {
1574     VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
1575 };
1576
1577 #define VLC_CODEC_FALLBACK_444_16 \
1578     VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
1579
1580 static const vlc_fourcc_t p_I444_9L_fallback[] = {
1581     VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, VLC_CODEC_FALLBACK_444_16, 0
1582 };
1583 static const vlc_fourcc_t p_I444_9B_fallback[] = {
1584     VLC_CODEC_I444_9B, VLC_CODEC_I444_9L, VLC_CODEC_FALLBACK_444_16, 0
1585 };
1586 static const vlc_fourcc_t p_I444_10L_fallback[] = {
1587     VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_FALLBACK_444_16, 0
1588 };
1589 static const vlc_fourcc_t p_I444_10B_fallback[] = {
1590     VLC_CODEC_I444_10B, VLC_CODEC_I444_10L, VLC_CODEC_FALLBACK_444_16, 0
1591 };
1592
1593 static const vlc_fourcc_t p_I440_fallback[] = {
1594     VLC_CODEC_I440,
1595     VLC_CODEC_YUV_PLANAR_420,
1596     VLC_CODEC_YUV_PLANAR_422,
1597     VLC_CODEC_YUV_PLANAR_444,
1598     VLC_CODEC_YUV_PACKED,
1599     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211, 0
1600 };
1601
1602 #define VLC_CODEC_FALLBACK_PACKED \
1603     VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
1604     VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
1605     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
1606
1607 static const vlc_fourcc_t p_YUYV_fallback[] = {
1608     VLC_CODEC_YUYV,
1609     VLC_CODEC_YVYU,
1610     VLC_CODEC_UYVY,
1611     VLC_CODEC_VYUY,
1612     VLC_CODEC_FALLBACK_PACKED, 0
1613 };
1614 static const vlc_fourcc_t p_YVYU_fallback[] = {
1615     VLC_CODEC_YVYU,
1616     VLC_CODEC_YUYV,
1617     VLC_CODEC_UYVY,
1618     VLC_CODEC_VYUY,
1619     VLC_CODEC_FALLBACK_PACKED, 0
1620 };
1621 static const vlc_fourcc_t p_UYVY_fallback[] = {
1622     VLC_CODEC_UYVY,
1623     VLC_CODEC_VYUY,
1624     VLC_CODEC_YUYV,
1625     VLC_CODEC_YVYU,
1626     VLC_CODEC_FALLBACK_PACKED, 0
1627 };
1628 static const vlc_fourcc_t p_VYUY_fallback[] = {
1629     VLC_CODEC_VYUY,
1630     VLC_CODEC_UYVY,
1631     VLC_CODEC_YUYV,
1632     VLC_CODEC_YVYU,
1633     VLC_CODEC_FALLBACK_PACKED, 0
1634 };
1635
1636 static const vlc_fourcc_t *pp_YUV_fallback[] = {
1637     p_YV12_fallback,
1638     p_I420_fallback,
1639     p_I420_9L_fallback,
1640     p_I420_9B_fallback,
1641     p_I420_10L_fallback,
1642     p_I420_10B_fallback,
1643     p_J420_fallback,
1644     p_I422_fallback,
1645     p_I422_9L_fallback,
1646     p_I422_9B_fallback,
1647     p_I422_10L_fallback,
1648     p_I422_10B_fallback,
1649     p_J422_fallback,
1650     p_I444_fallback,
1651     p_J444_fallback,
1652     p_I444_9L_fallback,
1653     p_I444_9B_fallback,
1654     p_I444_10L_fallback,
1655     p_I444_10B_fallback,
1656     p_I440_fallback,
1657     p_YUYV_fallback,
1658     p_YVYU_fallback,
1659     p_UYVY_fallback,
1660     p_VYUY_fallback,
1661
1662
1663     NULL,
1664 };
1665
1666 static const vlc_fourcc_t p_list_YUV[] = {
1667     VLC_CODEC_YUV_PLANAR_420,
1668     VLC_CODEC_YUV_PLANAR_422,
1669     VLC_CODEC_YUV_PLANAR_440,
1670     VLC_CODEC_YUV_PLANAR_444,
1671     VLC_CODEC_YUV_PACKED,
1672     VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211,
1673     VLC_CODEC_YUV_PLANAR_420_16,
1674     VLC_CODEC_YUV_PLANAR_422_16,
1675     VLC_CODEC_YUV_PLANAR_444_16,
1676     0,
1677 };
1678
1679 /* */
1680 static const vlc_fourcc_t p_RGB32_fallback[] = {
1681     VLC_CODEC_RGB32,
1682     VLC_CODEC_RGB24,
1683     VLC_CODEC_RGB16,
1684     VLC_CODEC_RGB15,
1685     VLC_CODEC_RGB8,
1686     0,
1687 };
1688 static const vlc_fourcc_t p_RGB24_fallback[] = {
1689     VLC_CODEC_RGB24,
1690     VLC_CODEC_RGB32,
1691     VLC_CODEC_RGB16,
1692     VLC_CODEC_RGB15,
1693     VLC_CODEC_RGB8,
1694     0,
1695 };
1696 static const vlc_fourcc_t p_RGB16_fallback[] = {
1697     VLC_CODEC_RGB16,
1698     VLC_CODEC_RGB24,
1699     VLC_CODEC_RGB32,
1700     VLC_CODEC_RGB15,
1701     VLC_CODEC_RGB8,
1702     0,
1703 };
1704 static const vlc_fourcc_t p_RGB15_fallback[] = {
1705     VLC_CODEC_RGB15,
1706     VLC_CODEC_RGB16,
1707     VLC_CODEC_RGB24,
1708     VLC_CODEC_RGB32,
1709     VLC_CODEC_RGB8,
1710     0,
1711 };
1712 static const vlc_fourcc_t p_RGB8_fallback[] = {
1713     VLC_CODEC_RGB8,
1714     VLC_CODEC_RGB15,
1715     VLC_CODEC_RGB16,
1716     VLC_CODEC_RGB24,
1717     VLC_CODEC_RGB32,
1718     0,
1719 };
1720 static const vlc_fourcc_t *pp_RGB_fallback[] = {
1721     p_RGB32_fallback,
1722     p_RGB24_fallback,
1723     p_RGB16_fallback,
1724     p_RGB15_fallback,
1725     p_RGB8_fallback,
1726     NULL,
1727 };
1728
1729
1730 /* */
1731 static const vlc_fourcc_t *GetFallback( vlc_fourcc_t i_fourcc,
1732                                         const vlc_fourcc_t *pp_fallback[],
1733                                         const vlc_fourcc_t p_list[] )
1734 {
1735     for( unsigned i = 0; pp_fallback[i]; i++ )
1736     {
1737         if( pp_fallback[i][0] == i_fourcc )
1738             return pp_fallback[i];
1739     }
1740     return p_list;
1741 }
1742
1743 const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
1744 {
1745     return GetFallback( i_fourcc, pp_YUV_fallback, p_list_YUV );
1746 }
1747 const vlc_fourcc_t *vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc )
1748 {
1749     return GetFallback( i_fourcc, pp_RGB_fallback, p_RGB32_fallback );
1750 }
1751
1752 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
1753 {
1754     static const vlc_fourcc_t pp_swapped[][4] = {
1755         { VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, 0 },
1756         { VLC_CODEC_YV9,  VLC_CODEC_I410, 0 },
1757         { 0 }
1758     };
1759
1760     for( int i = 0; pp_swapped[i][0]; i++ )
1761     {
1762         if( pp_swapped[i][0] == b )
1763         {
1764             vlc_fourcc_t t = a;
1765             a = b;
1766             b = t;
1767         }
1768         if( pp_swapped[i][0] != a )
1769             continue;
1770         for( int j = 1; pp_swapped[i][j]; j++ )
1771         {
1772             if( pp_swapped[i][j] == b )
1773                 return true;
1774         }
1775     }
1776     return false;
1777 }
1778
1779 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
1780 {
1781     for( unsigned i = 0; p_list_YUV[i]; i++ )
1782     {
1783         if( p_list_YUV[i] == fcc )
1784             return true;
1785     }
1786     return false;
1787 }
1788
1789 #define PLANAR(n, w_den, h_den, size, bits) \
1790     { .plane_count = n, \
1791       .p = { {.w = {1,    1}, .h = {1,    1}}, \
1792              {.w = {1,w_den}, .h = {1,h_den}}, \
1793              {.w = {1,w_den}, .h = {1,h_den}}, \
1794              {.w = {1,    1}, .h = {1,    1}} }, \
1795       .pixel_size = size, \
1796       .pixel_bits = bits }
1797
1798 #define PLANAR_8(n, w_den, h_den)        PLANAR(n, w_den, h_den, 1, 8)
1799 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
1800
1801 #define PACKED_FMT(size, bits) \
1802     { .plane_count = 1, \
1803       .p = { {.w = {1,1}, .h = {1,1}} }, \
1804       .pixel_size = size, \
1805       .pixel_bits = bits }
1806
1807 static const struct
1808 {
1809     vlc_fourcc_t             p_fourcc[6];
1810     vlc_chroma_description_t description;
1811 } p_list_chroma_description[] = {
1812     { { VLC_CODEC_I411, 0 },                   PLANAR_8(3, 4, 1) },
1813     { { VLC_CODEC_YUV_PLANAR_410, 0 },         PLANAR_8(3, 4, 4) },
1814     { { VLC_CODEC_YUV_PLANAR_420, 0 },         PLANAR_8(3, 2, 2) },
1815     { { VLC_CODEC_NV12, VLC_CODEC_NV21, 0 },   PLANAR_8(2, 1, 2) },
1816     { { VLC_CODEC_YUV_PLANAR_422, 0 },         PLANAR_8(3, 2, 1) },
1817     { { VLC_CODEC_YUV_PLANAR_440, 0 },         PLANAR_8(3, 1, 2) },
1818     { { VLC_CODEC_YUV_PLANAR_444, 0 },         PLANAR_8(3, 1, 1) },
1819     { { VLC_CODEC_YUVA, 0 },                   PLANAR_8(4, 1, 1) },
1820
1821     { { VLC_CODEC_I420_10L,
1822         VLC_CODEC_I420_10B, 0 },               PLANAR_16(3, 2, 2, 10) },
1823     { { VLC_CODEC_I420_9L,
1824         VLC_CODEC_I420_9B, 0 },                PLANAR_16(3, 2, 2,  9) },
1825     { { VLC_CODEC_I422_10L,
1826         VLC_CODEC_I422_10B, 0 },               PLANAR_16(3, 2, 1, 10) },
1827     { { VLC_CODEC_I422_9L,
1828         VLC_CODEC_I422_9B, 0 },                PLANAR_16(3, 2, 1,  9) },
1829     { { VLC_CODEC_I444_10L,
1830         VLC_CODEC_I444_10B, 0 },               PLANAR_16(3, 1, 1, 10) },
1831     { { VLC_CODEC_I444_9L,
1832         VLC_CODEC_I444_9B, 0 },                PLANAR_16(3, 1, 1,  9) },
1833
1834     { { VLC_CODEC_YUV_PACKED, 0 },             PACKED_FMT(2, 16) },
1835     { { VLC_CODEC_RGB8, VLC_CODEC_GREY,
1836         VLC_CODEC_YUVP, VLC_CODEC_RGBP, 0 },   PACKED_FMT(1, 8) },
1837
1838     { { VLC_CODEC_RGB15, 0 },                  PACKED_FMT(2, 15) },
1839     { { VLC_CODEC_RGB12, 0 },                  PACKED_FMT(2, 12) },
1840     { { VLC_CODEC_RGB16, VLC_CODEC_RGBT,
1841         VLC_CODEC_RGBA16, 0 },                 PACKED_FMT(2, 16) },
1842     { { VLC_CODEC_RGB24, 0 },                  PACKED_FMT(3, 24) },
1843     { { VLC_CODEC_RGB32, 0 },                  PACKED_FMT(4, 24) },
1844     { { VLC_CODEC_RGBA,  0 },                  PACKED_FMT(4, 32) },
1845
1846     { { VLC_CODEC_Y211, 0 },                   { 1, { {{1,4}, {1,1}} }, 4, 32 } },
1847
1848     { {0}, { 0, {}, 0, 0 } }
1849 };
1850
1851 #undef PACKED_FMT
1852 #undef PLANAR_16
1853 #undef PLANAR_8
1854 #undef PLANAR
1855
1856 const vlc_chroma_description_t *vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc )
1857 {
1858     for( unsigned i = 0; p_list_chroma_description[i].p_fourcc[0]; i++ )
1859     {
1860         const vlc_fourcc_t *p_fourcc = p_list_chroma_description[i].p_fourcc;
1861         for( unsigned j = 0; p_fourcc[j]; j++ )
1862         {
1863             if( p_fourcc[j] == i_fourcc )
1864                 return &p_list_chroma_description[i].description;
1865         }
1866     }
1867     return NULL;
1868 }