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