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