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