]> git.sesse.net Git - vlc/blob - modules/codec/ffmpeg/ffmpeg.c
A lot of missing const in options lists
[vlc] / modules / codec / ffmpeg / ffmpeg.c
1 /*****************************************************************************
2  * ffmpeg.c: video decoder using ffmpeg library
3  *****************************************************************************
4  * Copyright (C) 1999-2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Gildas Bazin <gbazin@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <vlc/vlc.h>
33 #include <vlc_plugin.h>
34 #include <vlc_codec.h>
35
36 /* ffmpeg header */
37 #define HAVE_MMX 1
38 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
39 #   include <libavcodec/avcodec.h>
40 #elif defined(HAVE_FFMPEG_AVCODEC_H)
41 #   include <ffmpeg/avcodec.h>
42 #else
43 #   include <avcodec.h>
44 #endif
45
46 #if LIBAVCODEC_BUILD < 5000
47 #   error You must have a libavcodec >= 5000 (get CVS)
48 #endif
49
50 #include "ffmpeg.h"
51
52 #ifdef HAVE_POSTPROC_POSTPROCESS_H
53 #    include <postproc/postprocess.h>
54 #else
55 #    include <libpostproc/postprocess.h>
56 #endif
57
58 /*****************************************************************************
59  * decoder_sys_t: decoder descriptor
60  *****************************************************************************/
61 struct decoder_sys_t
62 {
63     /* Common part between video and audio decoder */
64     FFMPEG_COMMON_MEMBERS
65 };
66
67 /****************************************************************************
68  * Local prototypes
69  ****************************************************************************/
70 static int OpenDecoder( vlc_object_t * );
71 static void CloseDecoder( vlc_object_t * );
72
73 static const int  nloopf_list[] = { 0, 1, 2, 3, 4 };
74 static const char *const nloopf_list_text[] =
75   { N_("None"), N_("Non-ref"), N_("Bidir"), N_("Non-key"), N_("All") };
76
77 #ifdef ENABLE_SOUT
78 static const char *const enc_hq_list[] = { "rd", "bits", "simple" };
79 static const char *const enc_hq_list_text[] = {
80     N_("rd"), N_("bits"), N_("simple") };
81 #endif
82
83 #if defined(HAVE_LIBSWSCALE_SWSCALE_H)  || defined(HAVE_FFMPEG_SWSCALE_H)
84 static const int pi_mode_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 };
85 static const char *const ppsz_mode_descriptions[] =
86 { N_("Fast bilinear"), N_("Bilinear"), N_("Bicubic (good quality)"),
87   N_("Experimental"), N_("Nearest neighbour (bad quality)"),
88   N_("Area"), N_("Luma bicubic / chroma bilinear"), N_("Gauss"),
89   N_("SincR"), N_("Lanczos"), N_("Bicubic spline") };
90 #endif
91
92 /*****************************************************************************
93  * Module descriptor
94  *****************************************************************************/
95 #define MODULE_DESCRIPTION N_( "Various audio and video decoders/encoders" \
96         "delivered by the FFmpeg library. This includes (MS)MPEG4, DivX, SV1,"\
97         "H261, H263, H264, WMV, WMA, AAC, AMR, DV, MJPEG and other codecs")
98
99 vlc_module_begin();
100     set_shortname( "FFmpeg");
101     set_category( CAT_INPUT );
102     set_subcategory( SUBCAT_INPUT_SCODEC );
103     /* decoder main module */
104 #if defined(MODULE_NAME_is_ffmpegaltivec) \
105      || (defined(CAN_COMPILE_ALTIVEC) && !defined(NO_ALTIVEC_IN_FFMPEG))
106     set_description( N_("AltiVec FFmpeg audio/video decoder/encoder ((MS)MPEG4,SVQ1,H263,WMV,WMA)") );
107     /*add_requirement( ALTIVEC );*/
108     set_capability( "decoder", 71 );
109 #else
110     set_description( N_("FFmpeg audio/video decoders/encoders") );
111     set_help( MODULE_DESCRIPTION );
112     set_capability( "decoder", 70 );
113 #endif
114     set_section( N_("Decoding") , NULL );
115     set_callbacks( OpenDecoder, CloseDecoder );
116
117
118     add_bool( "ffmpeg-dr", 1, NULL, DR_TEXT, DR_TEXT, true );
119     add_integer ( "ffmpeg-error-resilience", 1, NULL, ERROR_TEXT,
120         ERROR_LONGTEXT, true );
121     add_integer ( "ffmpeg-workaround-bugs", 1, NULL, BUGS_TEXT, BUGS_LONGTEXT,
122         false );
123     add_bool( "ffmpeg-hurry-up", 1, NULL, HURRYUP_TEXT, HURRYUP_LONGTEXT,
124         false );
125     add_integer( "ffmpeg-skip-frame", 0, NULL, SKIP_FRAME_TEXT,
126         SKIP_FRAME_LONGTEXT, true );
127         change_integer_range( -1, 4 );
128     add_integer( "ffmpeg-skip-idct", 0, NULL, SKIP_IDCT_TEXT,
129         SKIP_IDCT_LONGTEXT, true );
130         change_integer_range( -1, 4 );
131     add_integer ( "ffmpeg-vismv", 0, NULL, VISMV_TEXT, VISMV_LONGTEXT,
132         true );
133     add_integer ( "ffmpeg-lowres", 0, NULL, LOWRES_TEXT, LOWRES_LONGTEXT,
134         true );
135         change_integer_range( 0, 2 );
136     add_integer ( "ffmpeg-skiploopfilter", 0, NULL, SKIPLOOPF_TEXT,
137                   SKIPLOOPF_LONGTEXT, true );
138         change_integer_list( nloopf_list, nloopf_list_text, 0 );
139
140     add_integer( "ffmpeg-pp-q", 0, NULL, PP_Q_TEXT, PP_Q_LONGTEXT, false );
141     add_string( "ffmpeg-pp-name", "default", NULL, LIBAVCODEC_PP_TEXT,
142         LIBAVCODEC_PP_LONGTEXT, true );
143     add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
144                  true );
145
146 #ifdef ENABLE_SOUT
147     /* encoder submodule */
148     add_submodule();
149     set_section( N_("Encoding") , NULL );
150     set_description( N_("FFmpeg audio/video encoder") );
151     set_capability( "encoder", 100 );
152     set_callbacks( OpenEncoder, CloseEncoder );
153
154     add_string( ENC_CFG_PREFIX "hq", "simple", NULL, ENC_HQ_TEXT,
155                 ENC_HQ_LONGTEXT, false );
156         change_string_list( enc_hq_list, enc_hq_list_text, 0 );
157     add_integer( ENC_CFG_PREFIX "keyint", 0, NULL, ENC_KEYINT_TEXT,
158                  ENC_KEYINT_LONGTEXT, false );
159     add_integer( ENC_CFG_PREFIX "bframes", 0, NULL, ENC_BFRAMES_TEXT,
160                  ENC_BFRAMES_LONGTEXT, false );
161     add_bool( ENC_CFG_PREFIX "hurry-up", 0, NULL, ENC_HURRYUP_TEXT,
162               ENC_HURRYUP_LONGTEXT, false );
163     add_bool( ENC_CFG_PREFIX "interlace", 0, NULL, ENC_INTERLACE_TEXT,
164               ENC_INTERLACE_LONGTEXT, true );
165     add_bool( ENC_CFG_PREFIX "interlace-me", 1, NULL, ENC_INTERLACE_ME_TEXT,
166               ENC_INTERLACE_ME_LONGTEXT, true );
167     add_integer( ENC_CFG_PREFIX "vt", 0, NULL, ENC_VT_TEXT,
168                  ENC_VT_LONGTEXT, true );
169     add_bool( ENC_CFG_PREFIX "pre-me", 0, NULL, ENC_PRE_ME_TEXT,
170               ENC_PRE_ME_LONGTEXT, true );
171     add_bool( ENC_CFG_PREFIX "strict-rc", 0, NULL, ENC_RC_STRICT_TEXT,
172               ENC_RC_STRICT_LONGTEXT, true );
173     add_integer( ENC_CFG_PREFIX "rc-buffer-size", 224*1024*8, NULL,
174                  ENC_RC_BUF_TEXT, ENC_RC_BUF_LONGTEXT, true );
175     add_float( ENC_CFG_PREFIX "rc-buffer-aggressivity", 1.0, NULL,
176                ENC_RC_BUF_AGGR_TEXT, ENC_RC_BUF_AGGR_LONGTEXT, true );
177     add_float( ENC_CFG_PREFIX "i-quant-factor", 0, NULL,
178                ENC_IQUANT_FACTOR_TEXT, ENC_IQUANT_FACTOR_LONGTEXT, true );
179     add_integer( ENC_CFG_PREFIX "noise-reduction", 0, NULL,
180                  ENC_NOISE_RED_TEXT, ENC_NOISE_RED_LONGTEXT, true );
181     add_bool( ENC_CFG_PREFIX "mpeg4-matrix", 0, NULL,
182               ENC_MPEG4_MATRIX_TEXT, ENC_MPEG4_MATRIX_LONGTEXT, true );
183     add_integer( ENC_CFG_PREFIX "qmin", 0, NULL,
184                  ENC_QMIN_TEXT, ENC_QMIN_LONGTEXT, true );
185     add_integer( ENC_CFG_PREFIX "qmax", 0, NULL,
186                  ENC_QMAX_TEXT, ENC_QMAX_LONGTEXT, true );
187     add_bool( ENC_CFG_PREFIX "trellis", 0, NULL,
188               ENC_TRELLIS_TEXT, ENC_TRELLIS_LONGTEXT, true );
189     add_float( ENC_CFG_PREFIX "qscale", 0, NULL,
190                ENC_QSCALE_TEXT, ENC_QSCALE_LONGTEXT, true );
191     add_integer( ENC_CFG_PREFIX "strict", 0, NULL,
192                  ENC_STRICT_TEXT, ENC_STRICT_LONGTEXT, true );
193     add_float( ENC_CFG_PREFIX "lumi-masking", 0.0, NULL,
194                ENC_LUMI_MASKING_TEXT, ENC_LUMI_MASKING_LONGTEXT, true );
195     add_float( ENC_CFG_PREFIX "dark-masking", 0.0, NULL,
196                ENC_DARK_MASKING_TEXT, ENC_DARK_MASKING_LONGTEXT, true );
197     add_float( ENC_CFG_PREFIX "p-masking", 0.0, NULL,
198                ENC_P_MASKING_TEXT, ENC_P_MASKING_LONGTEXT, true );
199     add_float( ENC_CFG_PREFIX "border-masking", 0.0, NULL,
200                ENC_BORDER_MASKING_TEXT, ENC_BORDER_MASKING_LONGTEXT, true );
201     add_integer( ENC_CFG_PREFIX "luma-elim-threshold", 0, NULL,
202                  ENC_LUMA_ELIM_TEXT, ENC_LUMA_ELIM_LONGTEXT, true );
203     add_integer( ENC_CFG_PREFIX "chroma-elim-threshold", 0, NULL,
204                  ENC_CHROMA_ELIM_TEXT, ENC_CHROMA_ELIM_LONGTEXT, true );
205
206 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
207     /* Audio AAC encoder profile */
208     add_string( ENC_CFG_PREFIX "aac-profile", "main", NULL,
209                 ENC_PROFILE_TEXT, ENC_PROFILE_LONGTEXT, true );
210 #endif
211 #endif /* ENABLE_SOUT */
212
213 #if defined(HAVE_LIBAVFORMAT_AVFORMAT_H) || defined(HAVE_FFMPEG_AVFORMAT_H)
214
215     /* demux submodule */
216     add_submodule();
217     set_description( N_("FFmpeg demuxer" ) );
218     set_capability( "demux", 2 );
219     set_callbacks( OpenDemux, CloseDemux );
220
221 #ifdef ENABLE_SOUT
222     /* mux submodule */
223     add_submodule();
224     set_description( N_("FFmpeg muxer" ) );
225     set_capability( "sout mux", 2 );
226     add_string( "ffmpeg-mux", NULL, NULL, MUX_TEXT,
227                 MUX_LONGTEXT, true );
228     set_callbacks( OpenMux, CloseMux );
229 #endif
230 #endif
231
232 #if defined(HAVE_LIBSWSCALE_SWSCALE_H)  || defined(HAVE_FFMPEG_SWSCALE_H)
233     /* video filter submodule */
234     add_submodule();
235     set_description( N_("Video scaling filter") );
236     set_capability( "video filter2", 1000 );
237     set_category( CAT_VIDEO );
238     set_subcategory( SUBCAT_VIDEO_VFILTER );
239     set_callbacks( OpenScaler, CloseScaler );
240     add_integer( "swscale-mode", 0, NULL, SCALEMODE_TEXT, SCALEMODE_LONGTEXT, true );
241         change_integer_list( pi_mode_values, ppsz_mode_descriptions, 0 );
242
243 #else
244     /* video filter submodule */
245     add_submodule();
246     set_capability( "video filter2", 50 );
247     set_callbacks( OpenFilter, CloseFilter );
248     set_description( N_("FFmpeg video filter") );
249
250     /* crop/padd submodule */
251     add_submodule();
252     set_capability( "crop padd", 10 );
253     set_callbacks( OpenCropPadd, CloseFilter );
254     set_description( N_("FFmpeg crop padd filter") );
255 #endif
256
257     /* chroma conversion submodule */
258     add_submodule();
259     set_capability( "chroma", 50 );
260     set_callbacks( OpenChroma, CloseChroma );
261     set_description( N_("FFmpeg chroma conversion") );
262
263     /* video filter submodule */
264     add_submodule();
265     set_capability( "video filter2", 0 );
266     set_callbacks( OpenDeinterlace, CloseDeinterlace );
267     set_description( N_("FFmpeg deinterlace video filter") );
268     add_shortcut( "ffmpeg-deinterlace" );
269
270 vlc_module_end();
271
272 /*****************************************************************************
273  * OpenDecoder: probe the decoder and return score
274  *****************************************************************************/
275 static int OpenDecoder( vlc_object_t *p_this )
276 {
277     decoder_t *p_dec = (decoder_t*) p_this;
278     int i_cat, i_codec_id, i_result;
279     const char *psz_namecodec;
280
281     AVCodecContext *p_context = NULL;
282     AVCodec        *p_codec = NULL;
283
284     /* *** determine codec type *** */
285     if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id,
286                              &psz_namecodec ) )
287     {
288         return VLC_EGENERIC;
289     }
290
291     /* Bail out if buggy decoder */
292     if( i_codec_id == CODEC_ID_AAC )
293     {
294         msg_Dbg( p_dec, "refusing to use ffmpeg's (%s) decoder which is buggy",
295                  psz_namecodec );
296         return VLC_EGENERIC;
297     }
298
299     /* Initialization must be done before avcodec_find_decoder() */
300     InitLibavcodec(p_this);
301
302     /* *** ask ffmpeg for a decoder *** */
303     p_codec = avcodec_find_decoder( i_codec_id );
304     if( !p_codec )
305     {
306         msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec );
307         return VLC_EGENERIC;
308     }
309
310     /* *** get a p_context *** */
311     p_context = avcodec_alloc_context();
312     if( !p_context )
313         return VLC_ENOMEM;
314     p_context->debug = config_GetInt( p_dec, "ffmpeg-debug" );
315     p_context->opaque = (void *)p_this;
316
317     /* Set CPU capabilities */
318     unsigned i_cpu = vlc_CPU();
319     p_context->dsp_mask = 0;
320     if( !(i_cpu & CPU_CAPABILITY_MMX) )
321     {
322         p_context->dsp_mask |= FF_MM_MMX;
323     }
324     if( !(i_cpu & CPU_CAPABILITY_MMXEXT) )
325     {
326         p_context->dsp_mask |= FF_MM_MMXEXT;
327     }
328     if( !(i_cpu & CPU_CAPABILITY_3DNOW) )
329     {
330         p_context->dsp_mask |= FF_MM_3DNOW;
331     }
332     if( !(i_cpu & CPU_CAPABILITY_SSE) )
333     {
334         p_context->dsp_mask |= FF_MM_SSE;
335     }
336     if( !(i_cpu & CPU_CAPABILITY_SSE2) )
337     {
338         p_context->dsp_mask |= FF_MM_SSE2;
339     }
340
341     p_dec->b_need_packetized = true;
342     switch( i_cat )
343     {
344     case VIDEO_ES:
345         p_dec->pf_decode_video = DecodeVideo;
346         i_result =  InitVideoDec ( p_dec, p_context, p_codec,
347                                        i_codec_id, psz_namecodec );
348         break;
349     case AUDIO_ES:
350         p_dec->pf_decode_audio = DecodeAudio;
351         i_result =  InitAudioDec ( p_dec, p_context, p_codec,
352                                        i_codec_id, psz_namecodec );
353         break;
354     default:
355         i_result = VLC_EGENERIC;
356     }
357
358     if( i_result == VLC_SUCCESS ) p_dec->p_sys->i_cat = i_cat;
359
360     return i_result;
361 }
362
363 /*****************************************************************************
364  * CloseDecoder: decoder destruction
365  *****************************************************************************/
366 static void CloseDecoder( vlc_object_t *p_this )
367 {
368     decoder_t *p_dec = (decoder_t *)p_this;
369     decoder_sys_t *p_sys = p_dec->p_sys;
370
371     switch( p_sys->i_cat )
372     {
373     case AUDIO_ES:
374          EndAudioDec ( p_dec );
375         break;
376     case VIDEO_ES:
377          EndVideoDec ( p_dec );
378         break;
379     }
380
381     if( p_sys->p_context )
382     {
383         vlc_mutex_t *lock;
384
385         if( p_sys->p_context->extradata )
386             free( p_sys->p_context->extradata );
387         p_sys->p_context->extradata = NULL;
388
389         lock = var_AcquireMutex( "avcodec" );
390         avcodec_close( p_sys->p_context );
391         vlc_mutex_unlock( lock );
392         msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec );
393         av_free( p_sys->p_context );
394     }
395
396     free( p_sys );
397 }
398
399 /*****************************************************************************
400  *
401  *****************************************************************************/
402 void LibavcodecCallback( void *p_opaque, int i_level,
403                              const char *psz_format, va_list va )
404 {
405     int i_vlc_level;
406     AVCodecContext *p_avctx = (AVCodecContext *)p_opaque;
407     AVClass *p_avc;
408     vlc_object_t *p_this;
409     char *psz_new_format;
410     const char *psz_item_name;
411
412     p_avc = p_avctx ? p_avctx->av_class : 0;
413
414 #define cln p_avc->class_name
415     /* Make sure we can get p_this back */
416     if( !p_avctx || !p_avc || !cln ||
417         cln[0]!='A' || cln[1]!='V' || cln[2]!='C' || cln[3]!='o' ||
418         cln[4]!='d' || cln[5]!='e' || cln[6]!='c' )
419     {
420         if( i_level == AV_LOG_ERROR ) vfprintf( stderr, psz_format, va );
421         return;
422     }
423 #undef cln
424
425     p_this = (vlc_object_t *)p_avctx->opaque;
426
427     switch( i_level )
428     {
429     case AV_LOG_QUIET:
430         i_vlc_level = VLC_MSG_ERR;
431         break;
432     case AV_LOG_ERROR:
433         i_vlc_level = VLC_MSG_WARN;
434         break;
435     case AV_LOG_INFO:
436         i_vlc_level = VLC_MSG_DBG;
437         break;
438     case AV_LOG_DEBUG:
439         /* Print debug messages if they were requested */
440         if( p_avctx->debug ) vfprintf( stderr, psz_format, va );
441         return;
442     default:
443         return;
444     }
445
446     psz_item_name = p_avc->item_name(p_opaque);
447     psz_new_format = malloc( strlen(psz_format) + strlen(psz_item_name)
448                               + 18 + 5 );
449     snprintf( psz_new_format, strlen(psz_format) + strlen(psz_item_name)
450               + 18 + 5, "%s (%s@%p)", psz_format, p_avc->item_name(p_opaque), p_opaque );
451     msg_GenericVa( p_this, i_vlc_level,
452                     MODULE_STRING, psz_new_format, va );
453     free( psz_new_format );
454 }
455
456 void InitLibavcodec( vlc_object_t *p_object )
457 {
458     static int b_ffmpeginit = 0;
459     vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
460
461     /* *** init ffmpeg library (libavcodec) *** */
462     if( !b_ffmpeginit )
463     {
464         avcodec_init();
465         avcodec_register_all();
466         av_log_set_callback( LibavcodecCallback );
467         b_ffmpeginit = 1;
468
469         msg_Dbg( p_object, "libavcodec initialized (interface %d )",
470                  LIBAVCODEC_VERSION_INT );
471     }
472     else
473     {
474         msg_Dbg( p_object, "libavcodec already initialized" );
475     }
476
477     vlc_mutex_unlock( lock );
478 }
479
480 /*****************************************************************************
481  * Chroma fourcc -> ffmpeg_id mapping
482  *****************************************************************************/
483 static struct
484 {
485     vlc_fourcc_t  i_chroma;
486     int  i_chroma_id;
487
488 } chroma_table[] =
489 {
490     /* Planar YUV formats */
491     { VLC_FOURCC('Y','U','V','A'), PIX_FMT_YUV444P }, /* Hack */
492     { VLC_FOURCC('I','4','4','4'), PIX_FMT_YUV444P },
493     { VLC_FOURCC('J','4','4','4'), PIX_FMT_YUVJ444P },
494     { VLC_FOURCC('I','4','2','2'), PIX_FMT_YUV422P },
495     { VLC_FOURCC('J','4','2','2'), PIX_FMT_YUVJ422P },
496     { VLC_FOURCC('I','4','2','0'), PIX_FMT_YUV420P },
497     { VLC_FOURCC('Y','V','1','2'), PIX_FMT_YUV420P },
498     { VLC_FOURCC('I','Y','U','V'), PIX_FMT_YUV420P },
499     { VLC_FOURCC('J','4','2','0'), PIX_FMT_YUVJ420P },
500     { VLC_FOURCC('I','4','1','1'), PIX_FMT_YUV411P },
501     { VLC_FOURCC('I','4','1','0'), PIX_FMT_YUV410P },
502     { VLC_FOURCC('Y','V','U','9'), PIX_FMT_YUV410P },
503
504     /* Packed YUV formats */
505     { VLC_FOURCC('Y','U','Y','2'), PIX_FMT_YUV422 },
506     { VLC_FOURCC('Y','U','Y','V'), PIX_FMT_YUV422 },
507     { VLC_FOURCC('U','Y','V','Y'), PIX_FMT_UYVY422 },
508
509     /* Packed RGB formats */
510 #if defined(WORDS_BIGENDIAN)
511     { VLC_FOURCC('R','G','B','8'), PIX_FMT_BGR8 },
512     { VLC_FOURCC('R','V','1','5'), PIX_FMT_BGR555 },
513     { VLC_FOURCC('R','V','1','6'), PIX_FMT_BGR565 },
514     { VLC_FOURCC('R','V','2','4'), PIX_FMT_BGR24 },
515 #else
516 #if defined(PIX_FMT_RGB8)
517     { VLC_FOURCC('R','G','B','8'), PIX_FMT_RGB8 },
518 #endif
519     { VLC_FOURCC('R','V','1','5'), PIX_FMT_RGB555 },
520     { VLC_FOURCC('R','V','1','6'), PIX_FMT_RGB565 },
521     { VLC_FOURCC('R','V','2','4'), PIX_FMT_RGB24 },
522 #endif
523     { VLC_FOURCC('R','V','3','2'), PIX_FMT_RGBA32 },
524 #if defined(PIX_FMT_RGBA)
525     { VLC_FOURCC('R','G','B','A'), PIX_FMT_RGBA },
526 #endif
527     { VLC_FOURCC('G','R','E','Y'), PIX_FMT_GRAY8 },
528
529     { 0, 0 }
530 };
531
532 int GetFfmpegChroma( vlc_fourcc_t i_chroma )
533 {
534     int i;
535
536     for( i = 0; chroma_table[i].i_chroma != 0; i++ )
537     {
538         if( chroma_table[i].i_chroma == i_chroma )
539             return chroma_table[i].i_chroma_id;
540     }
541     return -1;
542 }
543
544 vlc_fourcc_t GetVlcChroma( int i_ffmpeg_chroma )
545 {
546     int i;
547
548     for( i = 0; chroma_table[i].i_chroma != 0; i++ )
549     {
550         if( chroma_table[i].i_chroma_id == i_ffmpeg_chroma )
551             return chroma_table[i].i_chroma;
552     }
553     return 0;
554 }
555
556 /*****************************************************************************
557  * Codec fourcc -> ffmpeg_id mapping
558  *****************************************************************************/
559 static struct
560 {
561     vlc_fourcc_t  i_fourcc;
562     int  i_codec;
563     int  i_cat;
564     const char *psz_name;
565
566 } codecs_table[] =
567 {
568     /*
569      * Video Codecs
570      */
571
572     /* MPEG-1 Video */
573     { VLC_FOURCC('m','p','1','v'), CODEC_ID_MPEG1VIDEO,
574       VIDEO_ES, "MPEG-1 Video" },
575     { VLC_FOURCC('m','p','e','g'), CODEC_ID_MPEG1VIDEO,
576       VIDEO_ES, "MPEG-1 Video" },
577     { VLC_FOURCC('m','p','g','1'), CODEC_ID_MPEG1VIDEO,
578       VIDEO_ES, "MPEG-1 Video" },
579     { VLC_FOURCC('P','I','M','1'), CODEC_ID_MPEG1VIDEO,
580       VIDEO_ES, "Pinnacle DC1000 (MPEG-1 Video)" },
581
582     /* MPEG-2 Video */
583     { VLC_FOURCC('m','p','2','v'), CODEC_ID_MPEG2VIDEO,
584       VIDEO_ES, "MPEG-2 Video" },
585     { VLC_FOURCC('M','P','E','G'), CODEC_ID_MPEG2VIDEO,
586       VIDEO_ES, "MPEG-2 Video" },
587     { VLC_FOURCC('m','p','g','v'), CODEC_ID_MPEG2VIDEO,
588       VIDEO_ES, "MPEG-2 Video" },
589     { VLC_FOURCC('m','p','g','2'), CODEC_ID_MPEG2VIDEO,
590       VIDEO_ES, "MPEG-2 Video" },
591     { VLC_FOURCC('h','d','v','1'), CODEC_ID_MPEG2VIDEO,
592       VIDEO_ES, "HDV 720p30 (MPEG-2 Video)" },
593     { VLC_FOURCC('h','d','v','2'), CODEC_ID_MPEG2VIDEO,
594       VIDEO_ES, "Sony HDV (MPEG-2 Video)" },
595     { VLC_FOURCC('h','d','v','3'), CODEC_ID_MPEG2VIDEO,
596       VIDEO_ES, "FCP HDV (MPEG-2 Video)" },
597     { VLC_FOURCC('h','d','v','5'), CODEC_ID_MPEG2VIDEO,
598       VIDEO_ES, "HDV 720p25 (MPEG-2 Video)" },
599     { VLC_FOURCC('m','x','5','n'), CODEC_ID_MPEG2VIDEO,
600       VIDEO_ES, "MPEG2 IMX NTSC 525/60 50mb/s (FCP)" },
601     { VLC_FOURCC('m','x','5','p'), CODEC_ID_MPEG2VIDEO,
602       VIDEO_ES, "MPEG2 IMX PAL 625/60 50mb/s (FCP)" },
603     { VLC_FOURCC('m','x','4','n'), CODEC_ID_MPEG2VIDEO,
604       VIDEO_ES, "MPEG2 IMX NTSC 525/60 40mb/s (FCP)" },
605     { VLC_FOURCC('m','x','4','p'), CODEC_ID_MPEG2VIDEO,
606       VIDEO_ES, "MPEG2 IMX PAL 625/50 40mb/s (FCP)" },
607      { VLC_FOURCC('m','x','3','n'), CODEC_ID_MPEG2VIDEO,
608       VIDEO_ES, "MPEG2 IMX NTSC 525/60 30mb/s (FCP)" },
609     { VLC_FOURCC('m','x','3','p'), CODEC_ID_MPEG2VIDEO,
610       VIDEO_ES, "MPEG2 IMX NTSC 625/50 30mb/s (FCP)" },
611     { VLC_FOURCC('x','d','v','2'), CODEC_ID_MPEG2VIDEO,
612       VIDEO_ES, "XDCAM HD 1080i60" },
613     { VLC_FOURCC('A','V','m','p'), CODEC_ID_MPEG2VIDEO,
614       VIDEO_ES, "AVID IMX PAL" },
615     /* ATI VCR2 */
616     { VLC_FOURCC('V','C','R','2'), CODEC_ID_MPEG2VIDEO,
617       VIDEO_ES, "ATI VCR2 Video" },
618     { VLC_FOURCC('M','M','E','S'), CODEC_ID_MPEG2VIDEO,
619       VIDEO_ES, "Matrox MPEG-2" },
620     { VLC_FOURCC('m','m','e','s'), CODEC_ID_MPEG2VIDEO,
621       VIDEO_ES, "Matrox MPEG-2" },
622
623     /* MPEG-4 Video */
624     { VLC_FOURCC('D','I','V','X'), CODEC_ID_MPEG4,
625       VIDEO_ES, "MPEG-4 Video" },
626     { VLC_FOURCC('d','i','v','x'), CODEC_ID_MPEG4,
627       VIDEO_ES, "MPEG-4 Video" },
628     { VLC_FOURCC('M','P','4','S'), CODEC_ID_MPEG4,
629       VIDEO_ES, "MPEG-4 Video" },
630     { VLC_FOURCC('m','p','4','s'), CODEC_ID_MPEG4,
631       VIDEO_ES, "MPEG-4 Video" },
632     { VLC_FOURCC('M','4','S','2'), CODEC_ID_MPEG4,
633       VIDEO_ES, "MPEG-4 Video" },
634     { VLC_FOURCC('m','4','s','2'), CODEC_ID_MPEG4,
635       VIDEO_ES, "MPEG-4 Video" },
636     /* XVID flavours */
637     { VLC_FOURCC('x','v','i','d'), CODEC_ID_MPEG4,
638       VIDEO_ES, "MPEG-4 Video" },
639     { VLC_FOURCC('X','V','I','D'), CODEC_ID_MPEG4,
640       VIDEO_ES, "MPEG-4 Video" },
641     { VLC_FOURCC('X','v','i','D'), CODEC_ID_MPEG4,
642       VIDEO_ES, "MPEG-4 Video" },
643     { VLC_FOURCC('X','V','I','X'), CODEC_ID_MPEG4,
644       VIDEO_ES, "MPEG-4 Video" },
645     { VLC_FOURCC('x','v','i','x'), CODEC_ID_MPEG4,
646       VIDEO_ES, "MPEG-4 Video" },
647     /* DX50 */
648     { VLC_FOURCC('D','X','5','0'), CODEC_ID_MPEG4,
649       VIDEO_ES, "MPEG-4 Video" },
650     { VLC_FOURCC('d','x','5','0'), CODEC_ID_MPEG4,
651       VIDEO_ES, "MPEG-4 Video" },
652     { VLC_FOURCC('B','L','Z','0'), CODEC_ID_MPEG4,
653       VIDEO_ES, "Blizzard MPEG-4 Video" },
654     { VLC_FOURCC('D','X','G','M'), CODEC_ID_MPEG4,
655       VIDEO_ES, "Electronic Arts Game MPEG-4 Video" },
656     { VLC_FOURCC('m','p','4','v'), CODEC_ID_MPEG4,
657       VIDEO_ES, "MPEG-4 Video" },
658     { VLC_FOURCC('M','P','4','V'), CODEC_ID_MPEG4,
659       VIDEO_ES, "MPEG-4 Video" },
660     { VLC_FOURCC( 4,  0,  0,  0 ), CODEC_ID_MPEG4,
661       VIDEO_ES, "MPEG-4 Video" },
662     { VLC_FOURCC('m','4','c','c'), CODEC_ID_MPEG4,
663       VIDEO_ES, "MPEG-4 Video" },
664     { VLC_FOURCC('M','4','C','C'), CODEC_ID_MPEG4,
665       VIDEO_ES, "MPEG-4 Video" },
666     { VLC_FOURCC('F','M','P','4'), CODEC_ID_MPEG4,
667       VIDEO_ES, "MPEG-4 Video" },
668     { VLC_FOURCC('f','m','p','4'), CODEC_ID_MPEG4,
669       VIDEO_ES, "MPEG-4 Video" },
670     /* 3ivx delta 3.5 Unsupported
671      * putting it here gives extreme distorted images
672     { VLC_FOURCC('3','I','V','1'), CODEC_ID_MPEG4,
673       VIDEO_ES, "MPEG-4 Video" },
674     { VLC_FOURCC('3','i','v','1'), CODEC_ID_MPEG4,
675       VIDEO_ES, "MPEG-4 Video" }, */
676     /* 3ivx delta 4 */
677     { VLC_FOURCC('3','I','V','2'), CODEC_ID_MPEG4,
678       VIDEO_ES, "MPEG-4 Video" },
679     { VLC_FOURCC('3','i','v','2'), CODEC_ID_MPEG4,
680       VIDEO_ES, "MPEG-4 Video" },
681     { VLC_FOURCC('U','M','P','4'), CODEC_ID_MPEG4,
682       VIDEO_ES, "UB MPEG-4 Video" },
683     { VLC_FOURCC('W','V','1','F'), CODEC_ID_MPEG4,
684       VIDEO_ES, "MPEG-4 Video" },
685     { VLC_FOURCC('S','E','D','G'), CODEC_ID_MPEG4,
686       VIDEO_ES, "Samsung MPEG-4 Video" },
687     { VLC_FOURCC('R','M','P','4'), CODEC_ID_MPEG4,
688       VIDEO_ES, "REALmagic MPEG-4 Video" },
689     { VLC_FOURCC('H','D','X','4'), CODEC_ID_MPEG4,
690       VIDEO_ES, "Jomigo HDX4 (MPEG-4 Video)" },
691     { VLC_FOURCC('h','d','x','4'), CODEC_ID_MPEG4,
692       VIDEO_ES, "Jomigo HDX4 (MPEG-4 Video)" },
693     { VLC_FOURCC('S','M','P','4'), CODEC_ID_MPEG4,
694       VIDEO_ES, "Samsung SMP4 (MPEG-4 Video)" },
695     { VLC_FOURCC('f','v','f','w'), CODEC_ID_MPEG4,
696       VIDEO_ES, "FFmpeg MPEG-4" },
697     { VLC_FOURCC('F','V','F','W'), CODEC_ID_MPEG4,
698       VIDEO_ES, "FFmpeg MPEG-4" },
699
700     /* MSMPEG4 v1 */
701     { VLC_FOURCC('D','I','V','1'), CODEC_ID_MSMPEG4V1,
702       VIDEO_ES, "MS MPEG-4 Video v1" },
703     { VLC_FOURCC('d','i','v','1'), CODEC_ID_MSMPEG4V1,
704       VIDEO_ES, "MS MPEG-4 Video v1" },
705     { VLC_FOURCC('M','P','G','4'), CODEC_ID_MSMPEG4V1,
706       VIDEO_ES, "MS MPEG-4 Video v1" },
707     { VLC_FOURCC('m','p','g','4'), CODEC_ID_MSMPEG4V1,
708       VIDEO_ES, "MS MPEG-4 Video v1" },
709
710     /* MSMPEG4 v2 */
711     { VLC_FOURCC('D','I','V','2'), CODEC_ID_MSMPEG4V2,
712       VIDEO_ES, "MS MPEG-4 Video v2" },
713     { VLC_FOURCC('d','i','v','2'), CODEC_ID_MSMPEG4V2,
714       VIDEO_ES, "MS MPEG-4 Video v2" },
715     { VLC_FOURCC('M','P','4','2'), CODEC_ID_MSMPEG4V2,
716       VIDEO_ES, "MS MPEG-4 Video v2" },
717     { VLC_FOURCC('m','p','4','2'), CODEC_ID_MSMPEG4V2,
718       VIDEO_ES, "MS MPEG-4 Video v2" },
719
720     /* MSMPEG4 v3 / M$ mpeg4 v3 */
721     { VLC_FOURCC('M','P','G','3'), CODEC_ID_MSMPEG4V3,
722       VIDEO_ES, "MS MPEG-4 Video v3" },
723     { VLC_FOURCC('m','p','g','3'), CODEC_ID_MSMPEG4V3,
724       VIDEO_ES, "MS MPEG-4 Video v3" },
725     { VLC_FOURCC('d','i','v','3'), CODEC_ID_MSMPEG4V3,
726       VIDEO_ES, "MS MPEG-4 Video v3" },
727     { VLC_FOURCC('M','P','4','3'), CODEC_ID_MSMPEG4V3,
728       VIDEO_ES, "MS MPEG-4 Video v3" },
729     { VLC_FOURCC('m','p','4','3'), CODEC_ID_MSMPEG4V3,
730       VIDEO_ES, "MS MPEG-4 Video v3" },
731     /* DivX 3.20 */
732     { VLC_FOURCC('D','I','V','3'), CODEC_ID_MSMPEG4V3,
733       VIDEO_ES, "MS MPEG-4 Video v3" },
734     { VLC_FOURCC('D','I','V','4'), CODEC_ID_MSMPEG4V3,
735       VIDEO_ES, "MS MPEG-4 Video v3" },
736     { VLC_FOURCC('d','i','v','4'), CODEC_ID_MSMPEG4V3,
737       VIDEO_ES, "MS MPEG-4 Video v3" },
738     { VLC_FOURCC('D','I','V','5'), CODEC_ID_MSMPEG4V3,
739       VIDEO_ES, "MS MPEG-4 Video v3" },
740     { VLC_FOURCC('d','i','v','5'), CODEC_ID_MSMPEG4V3,
741       VIDEO_ES, "MS MPEG-4 Video v3" },
742     { VLC_FOURCC('D','I','V','6'), CODEC_ID_MSMPEG4V3,
743       VIDEO_ES, "MS MPEG-4 Video v3" },
744     { VLC_FOURCC('d','i','v','6'), CODEC_ID_MSMPEG4V3,
745       VIDEO_ES, "MS MPEG-4 Video v3" },
746     /* Cool Codec */
747     { VLC_FOURCC('C','O','L','1'), CODEC_ID_MSMPEG4V3,
748       VIDEO_ES, "MS MPEG-4 Video v3" },
749     { VLC_FOURCC('c','o','l','1'), CODEC_ID_MSMPEG4V3,
750       VIDEO_ES, "MS MPEG-4 Video v3" },
751     { VLC_FOURCC('C','O','L','0'), CODEC_ID_MSMPEG4V3,
752       VIDEO_ES, "MS MPEG-4 Video v3" },
753     { VLC_FOURCC('c','o','l','0'), CODEC_ID_MSMPEG4V3,
754       VIDEO_ES, "MS MPEG-4 Video v3" },
755     /* AngelPotion stuff */
756     { VLC_FOURCC('A','P','4','1'), CODEC_ID_MSMPEG4V3,
757       VIDEO_ES, "MS MPEG-4 Video v3" },
758     /* 3ivx doctered divx files */
759     { VLC_FOURCC('3','I','V','D'), CODEC_ID_MSMPEG4V3,
760       VIDEO_ES, "MS MPEG-4 Video v3" },
761     { VLC_FOURCC('3','i','v','d'), CODEC_ID_MSMPEG4V3,
762       VIDEO_ES, "MS MPEG-4 Video v3" },
763     /* who knows? */
764     { VLC_FOURCC('3','V','I','D'), CODEC_ID_MSMPEG4V3,
765       VIDEO_ES, "MS MPEG-4 Video v3" },
766     { VLC_FOURCC('3','v','i','d'), CODEC_ID_MSMPEG4V3,
767       VIDEO_ES, "MS MPEG-4 Video v3" },
768
769     /* Sorenson v1 */
770     { VLC_FOURCC('S','V','Q','1'), CODEC_ID_SVQ1,
771       VIDEO_ES, "SVQ-1 (Sorenson Video v1)" },
772     { VLC_FOURCC('s','v','q','1'), CODEC_ID_SVQ1,
773       VIDEO_ES, "SVQ-1 (Sorenson Video v1)" },
774     { VLC_FOURCC('s','v','q','i'), CODEC_ID_SVQ1,
775       VIDEO_ES, "SVQ-1 (Sorenson Video v1)" },
776
777     /* Sorenson v3 */
778     { VLC_FOURCC('S','V','Q','3'), CODEC_ID_SVQ3,
779       VIDEO_ES, "SVQ-3 (Sorenson Video v3)" },
780
781     /* h264 */
782     { VLC_FOURCC('h','2','6','4'), CODEC_ID_H264,
783       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
784     { VLC_FOURCC('H','2','6','4'), CODEC_ID_H264,
785       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
786     { VLC_FOURCC('x','2','6','4'), CODEC_ID_H264,
787       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
788     { VLC_FOURCC('X','2','6','4'), CODEC_ID_H264,
789       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
790     /* avc1: special case h264 */
791     { VLC_FOURCC('a','v','c','1'), CODEC_ID_H264,
792       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
793     { VLC_FOURCC('A','V','C','1'), CODEC_ID_H264,
794       VIDEO_ES, "H264 - MPEG-4 AVC (part 10)" },
795     { VLC_FOURCC('V','S','S','H'), CODEC_ID_H264,
796       VIDEO_ES, "Vanguard VSS H264" },
797     { VLC_FOURCC('V','S','S','W'), CODEC_ID_H264,
798       VIDEO_ES, "Vanguard VSS H264" },
799     { VLC_FOURCC('v','s','s','h'), CODEC_ID_H264,
800       VIDEO_ES, "Vanguard VSS H264" },
801     { VLC_FOURCC('D','A','V','C'), CODEC_ID_H264,
802       VIDEO_ES, "Dicas MPEGable H.264/MPEG-4 AVC" },
803     { VLC_FOURCC('d','a','v','c'), CODEC_ID_H264,
804       VIDEO_ES, "Dicas MPEGable H.264/MPEG-4 AVC" },
805
806 /* H263 and H263i */
807 /* H263(+) is also known as Real Video 1.0 */
808
809     /* H263 */
810     { VLC_FOURCC('D','2','6','3'), CODEC_ID_H263,
811       VIDEO_ES, "DEC H263" },
812     { VLC_FOURCC('H','2','6','3'), CODEC_ID_H263,
813       VIDEO_ES, "H263" },
814     { VLC_FOURCC('h','2','6','3'), CODEC_ID_H263,
815       VIDEO_ES, "H263" },
816     { VLC_FOURCC('L','2','6','3'), CODEC_ID_H263,
817       VIDEO_ES, "LEAD H263" },
818     { VLC_FOURCC('s','2','6','3'), CODEC_ID_H263,
819       VIDEO_ES, "H263" },
820     { VLC_FOURCC('S','2','6','3'), CODEC_ID_H263,
821       VIDEO_ES, "H263" },
822     { VLC_FOURCC('M','2','6','3'), CODEC_ID_H263,
823       VIDEO_ES, "Microsoft H263" },
824     { VLC_FOURCC('X','2','6','3'), CODEC_ID_H263,
825       VIDEO_ES, "Xirlink H263" },
826
827     /* Zygo (partial) */
828     { VLC_FOURCC('Z','y','G','o'), CODEC_ID_H263,
829       VIDEO_ES, "ITU H263+" },
830
831     /* H263i */
832     { VLC_FOURCC('I','2','6','3'), CODEC_ID_H263I,
833       VIDEO_ES, "I263.I" },
834     { VLC_FOURCC('i','2','6','3'), CODEC_ID_H263I,
835       VIDEO_ES, "I263.I" },
836
837     /* H263P */
838     { VLC_FOURCC('v','i','v','1'), CODEC_ID_H263P,
839       VIDEO_ES, "H263+" },
840     { VLC_FOURCC('v','i','v','O'), CODEC_ID_H263P,
841       VIDEO_ES, "H263+" },
842     { VLC_FOURCC('v','i','v','2'), CODEC_ID_H263P,
843       VIDEO_ES, "H263+" },
844     { VLC_FOURCC('U','2','6','3'), CODEC_ID_H263P,
845       VIDEO_ES, "UB H263+" },
846     { VLC_FOURCC('I','L','V','R'), CODEC_ID_H263P,
847       VIDEO_ES, "ITU H263+" },
848
849     /* Flash (H263) variant */
850     { VLC_FOURCC('F','L','V','1'), CODEC_ID_FLV1,
851       VIDEO_ES, "Flash Video" },
852
853     /* H261 */
854     { VLC_FOURCC('H','2','6','1'), CODEC_ID_H261,
855       VIDEO_ES, "H.261" },
856     { VLC_FOURCC('h','2','6','1'), CODEC_ID_H261,
857       VIDEO_ES, "H.261" },
858
859     { VLC_FOURCC('F','L','I','C'), CODEC_ID_FLIC,
860       VIDEO_ES, "Flic Video" },
861
862     /* MJPEG */
863     { VLC_FOURCC( 'M','J','P','G' ), CODEC_ID_MJPEG,
864       VIDEO_ES, "Motion JPEG Video" },
865     { VLC_FOURCC( 'm','j','p','g' ), CODEC_ID_MJPEG,
866       VIDEO_ES, "Motion JPEG Video" },
867     { VLC_FOURCC( 'm','j','p','a' ), CODEC_ID_MJPEG, /* for mov file */
868       VIDEO_ES, "Motion JPEG Video" },
869     { VLC_FOURCC( 'j','p','e','g' ), CODEC_ID_MJPEG,
870       VIDEO_ES, "Motion JPEG Video" },
871     { VLC_FOURCC( 'J','P','E','G' ), CODEC_ID_MJPEG,
872       VIDEO_ES, "Motion JPEG Video" },
873     { VLC_FOURCC( 'J','F','I','F' ), CODEC_ID_MJPEG,
874       VIDEO_ES, "Motion JPEG Video" },
875     { VLC_FOURCC( 'J','P','G','L' ), CODEC_ID_MJPEG,
876       VIDEO_ES, "Motion JPEG Video" },
877     { VLC_FOURCC( 'A','V','D','J' ), CODEC_ID_MJPEG,
878       VIDEO_ES, "Motion JPEG Video" },
879     { VLC_FOURCC( 'm','j','p','b' ), CODEC_ID_MJPEGB, /* for mov file */
880       VIDEO_ES, "Motion JPEG B Video" },
881     { VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_LJPEG,
882       VIDEO_ES, "Lead Motion JPEG Video" },
883     { VLC_FOURCC( 'L','J','P','G' ), CODEC_ID_MJPEG,
884       VIDEO_ES, "Lead Motion JPEG Video" },
885     /* AVID MJPEG */
886     { VLC_FOURCC( 'A','V','R','n' ), CODEC_ID_MJPEG,
887       VIDEO_ES, "Avid Motion JPEG" },
888     { VLC_FOURCC( 'A','D','J','V' ), CODEC_ID_MJPEG,
889       VIDEO_ES, "Avid Motion JPEG" },
890     { VLC_FOURCC( 'd','m','b','1' ), CODEC_ID_MJPEG,
891       VIDEO_ES, "Motion JPEG OpenDML Video" },
892
893     /* SP5x */
894     { VLC_FOURCC( 'S','P','5','X' ), CODEC_ID_SP5X,
895       VIDEO_ES, "Sunplus Motion JPEG Video" },
896     { VLC_FOURCC( 'S','P','5','3' ), CODEC_ID_SP5X,
897       VIDEO_ES, "Sunplus Motion JPEG Video" },
898     { VLC_FOURCC( 'S','P','5','4' ), CODEC_ID_SP5X,
899       VIDEO_ES, "Sunplus Motion JPEG Video" },
900     { VLC_FOURCC( 'S','P','5','5' ), CODEC_ID_SP5X,
901       VIDEO_ES, "Sunplus Motion JPEG Video" },
902     { VLC_FOURCC( 'S','P','5','6' ), CODEC_ID_SP5X,
903       VIDEO_ES, "Sunplus Motion JPEG Video" },
904     { VLC_FOURCC( 'S','P','5','7' ), CODEC_ID_SP5X,
905       VIDEO_ES, "Sunplus Motion JPEG Video" },
906     { VLC_FOURCC( 'S','P','5','8' ), CODEC_ID_SP5X,
907       VIDEO_ES, "Sunplus Motion JPEG Video" },
908
909     /* DV */
910     { VLC_FOURCC('d','v','s','l'), CODEC_ID_DVVIDEO,
911       VIDEO_ES, "DV Video" },
912     { VLC_FOURCC('d','v','s','d'), CODEC_ID_DVVIDEO,
913       VIDEO_ES, "DV Video" },
914     { VLC_FOURCC('D','V','S','D'), CODEC_ID_DVVIDEO,
915       VIDEO_ES, "DV Video" },
916     { VLC_FOURCC('d','v','h','d'), CODEC_ID_DVVIDEO,
917       VIDEO_ES, "DV Video" },
918     { VLC_FOURCC('d','v','c',' '), CODEC_ID_DVVIDEO,
919       VIDEO_ES, "DV Video" },
920     { VLC_FOURCC('d','v','c','p'), CODEC_ID_DVVIDEO,
921       VIDEO_ES, "DV Video PAL" },
922     { VLC_FOURCC('d','v','p',' '), CODEC_ID_DVVIDEO,
923       VIDEO_ES, "DV Video Pro" },
924     { VLC_FOURCC('d','v','p','p'), CODEC_ID_DVVIDEO,
925       VIDEO_ES, "DV Video Pro PAL" },
926     { VLC_FOURCC('C','D','V','C'), CODEC_ID_DVVIDEO,
927       VIDEO_ES, "DV Video" },
928     { VLC_FOURCC('c','d','v','c'), CODEC_ID_DVVIDEO,
929       VIDEO_ES, "DV Video" },
930     { VLC_FOURCC('d','v','5','p'), CODEC_ID_DVVIDEO,
931       VIDEO_ES, "DV Video C Pro 50 PAL" },
932     { VLC_FOURCC('d','v','5','n'), CODEC_ID_DVVIDEO,
933       VIDEO_ES, "DV Video C Pro 50 NTSC" },
934     { VLC_FOURCC('A','V','d','v'), CODEC_ID_DVVIDEO,
935       VIDEO_ES, "AVID DV" },
936
937     /* Windows Media Video */
938     { VLC_FOURCC('W','M','V','1'), CODEC_ID_WMV1,
939       VIDEO_ES, "Windows Media Video 1" },
940     { VLC_FOURCC('w','m','v','1'), CODEC_ID_WMV1,
941       VIDEO_ES, "Windows Media Video 1" },
942     { VLC_FOURCC('W','M','V','2'), CODEC_ID_WMV2,
943       VIDEO_ES, "Windows Media Video 2" },
944     { VLC_FOURCC('w','m','v','2'), CODEC_ID_WMV2,
945       VIDEO_ES, "Windows Media Video 2" },
946 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(10<<8)+1)
947     { VLC_FOURCC('W','M','V','3'), CODEC_ID_WMV3,
948       VIDEO_ES, "Windows Media Video 3" },
949     { VLC_FOURCC('w','m','v','3'), CODEC_ID_WMV3,
950       VIDEO_ES, "Windows Media Video 3" },
951     { VLC_FOURCC('W','V','C','1'), CODEC_ID_VC1,
952       VIDEO_ES, "Windows Media Video VC1" },
953     { VLC_FOURCC('w','v','c','1'), CODEC_ID_VC1,
954       VIDEO_ES, "Windows Media Video VC1" },
955     /* WMVA is the VC-1 codec before the standardization proces,
956        it is not bitstream compatible and deprecated  */
957     { VLC_FOURCC('W','M','V','A'), CODEC_ID_VC1,
958       VIDEO_ES, "Windows Media Video Advanced Profile" },
959 #endif
960
961     /* Microsoft Video 1 */
962     { VLC_FOURCC('M','S','V','C'), CODEC_ID_MSVIDEO1,
963       VIDEO_ES, "Microsoft Video 1" },
964     { VLC_FOURCC('m','s','v','c'), CODEC_ID_MSVIDEO1,
965       VIDEO_ES, "Microsoft Video 1" },
966     { VLC_FOURCC('C','R','A','M'), CODEC_ID_MSVIDEO1,
967       VIDEO_ES, "Microsoft Video 1" },
968     { VLC_FOURCC('c','r','a','m'), CODEC_ID_MSVIDEO1,
969       VIDEO_ES, "Microsoft Video 1" },
970     { VLC_FOURCC('W','H','A','M'), CODEC_ID_MSVIDEO1,
971       VIDEO_ES, "Microsoft Video 1" },
972     { VLC_FOURCC('w','h','a','m'), CODEC_ID_MSVIDEO1,
973       VIDEO_ES, "Microsoft Video 1" },
974
975     /* Microsoft RLE */
976     { VLC_FOURCC('m','r','l','e'), CODEC_ID_MSRLE,
977       VIDEO_ES, "Microsoft RLE Video" },
978     { VLC_FOURCC('W','R','L','E'), CODEC_ID_MSRLE,
979       VIDEO_ES, "Microsoft RLE Video" },
980     { VLC_FOURCC(0x1,0x0,0x0,0x0), CODEC_ID_MSRLE,
981       VIDEO_ES, "Microsoft RLE Video" },
982     { VLC_FOURCC(0x2,0x0,0x0,0x0), CODEC_ID_MSRLE,
983       VIDEO_ES, "Microsoft RLE Video" },
984
985     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
986     { VLC_FOURCC('I','V','3','1'), CODEC_ID_INDEO3,
987       VIDEO_ES, "Indeo Video v3" },
988     { VLC_FOURCC('i','v','3','1'), CODEC_ID_INDEO3,
989       VIDEO_ES, "Indeo Video v3" },
990     { VLC_FOURCC('I','V','3','2'), CODEC_ID_INDEO3,
991       VIDEO_ES, "Indeo Video v3" },
992     { VLC_FOURCC('i','v','3','2'), CODEC_ID_INDEO3,
993       VIDEO_ES, "Indeo Video v3" },
994
995     /* Huff YUV */
996     { VLC_FOURCC('H','F','Y','U'), CODEC_ID_HUFFYUV,
997       VIDEO_ES, "Huff YUV Video" },
998     { VLC_FOURCC('F','F','V','H'), CODEC_ID_FFVHUFF,
999       VIDEO_ES, "Huff YUV Video" },
1000
1001     /* Creative YUV */
1002     { VLC_FOURCC('C','Y','U','V'), CODEC_ID_CYUV,
1003       VIDEO_ES, "Creative YUV Video" },
1004     { VLC_FOURCC('c','y','u','v'), CODEC_ID_CYUV,
1005       VIDEO_ES, "Creative YUV Video" },
1006
1007     /* On2 VP3 Video Codecs */
1008     { VLC_FOURCC('V','P','3',' '), CODEC_ID_VP3,
1009       VIDEO_ES, "On2's VP3 Video" },
1010     { VLC_FOURCC('V','P','3','0'), CODEC_ID_VP3,
1011       VIDEO_ES, "On2's VP3 Video" },
1012     { VLC_FOURCC('V','P','3','1'), CODEC_ID_VP3,
1013       VIDEO_ES, "On2's VP3 Video" },
1014     { VLC_FOURCC('v','p','3','1'), CODEC_ID_VP3,
1015       VIDEO_ES, "On2's VP3 Video" },
1016
1017     /* On2  VP5, VP6 codecs */
1018 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(14<<8)+0)
1019     { VLC_FOURCC('V','P','5',' '), CODEC_ID_VP5,
1020       VIDEO_ES, "On2's VP5 Video" },
1021     { VLC_FOURCC('V','P','5','0'), CODEC_ID_VP5,
1022       VIDEO_ES, "On2's VP5 Video" },
1023     { VLC_FOURCC('V','P','6','2'), CODEC_ID_VP6,
1024       VIDEO_ES, "On2's VP6.2 Video" },
1025     { VLC_FOURCC('v','p','6','2'), CODEC_ID_VP6,
1026       VIDEO_ES, "On2's VP6.2 Video" },
1027     { VLC_FOURCC('V','P','6','F'), CODEC_ID_VP6F,
1028       VIDEO_ES, "On2's VP6.2 Video (Flash)" },
1029 #endif
1030
1031 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(27<<8)+0)
1032     { VLC_FOURCC('V','P','6','0'), CODEC_ID_VP6,
1033       VIDEO_ES, "On2's VP6.0 Video" },
1034     { VLC_FOURCC('V','P','6','1'), CODEC_ID_VP6,
1035       VIDEO_ES, "On2's VP6.1 Video" },
1036 #endif
1037
1038 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(47<<8)+0)
1039     { VLC_FOURCC('V','P','6','A'), CODEC_ID_VP6A,
1040       VIDEO_ES, "On2's VP6 A Video" },
1041 #endif
1042
1043     /* Xiph.org theora */
1044     { VLC_FOURCC('t','h','e','o'), CODEC_ID_THEORA,
1045       VIDEO_ES, "Xiph.org's Theora Video" },
1046     { VLC_FOURCC('T','h','r','a'), CODEC_ID_THEORA,
1047       VIDEO_ES, "Xiph.org's Theora Video" },
1048
1049 #if ( !defined( WORDS_BIGENDIAN ) )
1050     /* Asus Video (Another thing that doesn't work on PPC) */
1051     { VLC_FOURCC('A','S','V','1'), CODEC_ID_ASV1,
1052       VIDEO_ES, "Asus V1 Video" },
1053     { VLC_FOURCC('A','S','V','2'), CODEC_ID_ASV2,
1054       VIDEO_ES, "Asus V2 Video" },
1055 #endif
1056
1057     /* FFMPEG Video 1 (lossless codec) */
1058     { VLC_FOURCC('F','F','V','1'), CODEC_ID_FFV1,
1059       VIDEO_ES, "FFMpeg Video 1" },
1060
1061     /* ATI VCR1 */
1062     { VLC_FOURCC('V','C','R','1'), CODEC_ID_VCR1,
1063       VIDEO_ES, "ATI VCR1 Video" },
1064
1065     /* Cirrus Logic AccuPak */
1066     { VLC_FOURCC('C','L','J','R'), CODEC_ID_CLJR,
1067       VIDEO_ES, "Creative Logic AccuPak" },
1068
1069     /* Real Video */
1070     { VLC_FOURCC('R','V','1','0'), CODEC_ID_RV10,
1071       VIDEO_ES, "Real Video 10" },
1072     { VLC_FOURCC('r','v','1','0'), CODEC_ID_RV10,
1073       VIDEO_ES, "Real Video 10" },
1074     { VLC_FOURCC('R','V','1','3'), CODEC_ID_RV10,
1075       VIDEO_ES, "Real Video 13" },
1076     { VLC_FOURCC('r','v','1','3'), CODEC_ID_RV10,
1077       VIDEO_ES, "Real Video 13" },
1078 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(15<<8)+1)
1079     { VLC_FOURCC('R','V','2','0'), CODEC_ID_RV20,
1080       VIDEO_ES, "Real Video 20" },
1081     { VLC_FOURCC('r','v','2','0'), CODEC_ID_RV20,
1082       VIDEO_ES, "Real Video 20" },
1083 #endif
1084
1085     /* Apple Video */
1086     { VLC_FOURCC('r','p','z','a'), CODEC_ID_RPZA,
1087       VIDEO_ES, "Apple Video" },
1088     { VLC_FOURCC('a','z','p','r'), CODEC_ID_RPZA,
1089       VIDEO_ES, "Apple Video" },
1090
1091     { VLC_FOURCC('s','m','c',' '), CODEC_ID_SMC,
1092       VIDEO_ES, "Apple graphics" },
1093
1094  /* CINEPAK. We have our own decoder with an higher priority,
1095        but this can't harm */
1096     { VLC_FOURCC('C','V','I','D'), CODEC_ID_CINEPAK,
1097       VIDEO_ES, "Cinepak Video" },
1098     { VLC_FOURCC('c','v','i','d'), CODEC_ID_CINEPAK,
1099       VIDEO_ES, "Cinepak Video" },
1100
1101     /* Screen Capture Video Codecs */
1102     { VLC_FOURCC('t','s','c','c'), CODEC_ID_TSCC,
1103       VIDEO_ES, "TechSmith Camtasia Screen Capture Video" },
1104     { VLC_FOURCC('T','S','C','C'), CODEC_ID_TSCC,
1105       VIDEO_ES, "TechSmith Camtasia Screen Capture Video" },
1106
1107     { VLC_FOURCC('C','S','C','D'), CODEC_ID_CSCD,
1108       VIDEO_ES, "CamStudio Screen Codec" },
1109     { VLC_FOURCC('c','s','c','d'), CODEC_ID_CSCD,
1110       VIDEO_ES, "CamStudio Screen Codec" },
1111
1112     { VLC_FOURCC('Z','M','B','V'), CODEC_ID_ZMBV,
1113       VIDEO_ES, "DosBox Capture Codec" },
1114
1115 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(13<<8)+0)
1116     { VLC_FOURCC('V','M','n','c'), CODEC_ID_VMNC,
1117       VIDEO_ES, "VMware Video" },
1118 #endif
1119     { VLC_FOURCC('F','P','S','1'), CODEC_ID_FRAPS,
1120       VIDEO_ES, "FRAPS: Realtime Video Capture" },
1121     { VLC_FOURCC('f','p','s','1'), CODEC_ID_FRAPS,
1122       VIDEO_ES, "FRAPS: Realtime Video Capture" },
1123
1124     /* Duck TrueMotion */
1125     { VLC_FOURCC('D','U','C','K'), CODEC_ID_TRUEMOTION1,
1126       VIDEO_ES, "Duck TrueMotion v1 Video" },
1127     { VLC_FOURCC('T','M','2','0'), CODEC_ID_TRUEMOTION2,
1128       VIDEO_ES, "Duck TrueMotion v2.0 Video" },
1129
1130     /* FFMPEG's SNOW wavelet codec */
1131     { VLC_FOURCC('S','N','O','W'), CODEC_ID_SNOW,
1132       VIDEO_ES, "FFMpeg SNOW wavelet Video" },
1133     { VLC_FOURCC('s','n','o','w'), CODEC_ID_SNOW,
1134       VIDEO_ES, "FFMpeg SNOW wavelet Video" },
1135
1136     { VLC_FOURCC('r','l','e',' '), CODEC_ID_QTRLE,
1137       VIDEO_ES, "Apple QuickTime RLE Video" },
1138
1139     { VLC_FOURCC('q','d','r','w'), CODEC_ID_QDRAW,
1140       VIDEO_ES, "Apple QuickDraw Video" },
1141
1142     { VLC_FOURCC('Q','P','E','G'), CODEC_ID_QPEG,
1143       VIDEO_ES, "QPEG Video" },
1144     { VLC_FOURCC('Q','1','.','0'), CODEC_ID_QPEG,
1145       VIDEO_ES, "QPEG Video" },
1146     { VLC_FOURCC('Q','1','.','1'), CODEC_ID_QPEG,
1147       VIDEO_ES, "QPEG Video" },
1148
1149     { VLC_FOURCC('U','L','T','I'), CODEC_ID_ULTI,
1150       VIDEO_ES, "IBM Ultimotion Video" },
1151
1152     { VLC_FOURCC('V','I','X','L'), CODEC_ID_VIXL,
1153       VIDEO_ES, "Miro/Pinnacle VideoXL Video" },
1154     { VLC_FOURCC('P','I','X','L'), CODEC_ID_VIXL,
1155       VIDEO_ES, "Pinnacle VideoXL Video" },
1156
1157     { VLC_FOURCC('L','O','C','O'), CODEC_ID_LOCO,
1158       VIDEO_ES, "LOCO Video" },
1159
1160     { VLC_FOURCC('W','N','V','1'), CODEC_ID_WNV1,
1161       VIDEO_ES, "Winnov WNV1 Video" },
1162
1163     { VLC_FOURCC('A','A','S','C'), CODEC_ID_AASC,
1164       VIDEO_ES, "Autodesc RLE Video" },
1165
1166     { VLC_FOURCC('I','V','2','0'), CODEC_ID_INDEO2,
1167       VIDEO_ES, "Indeo Video v2" },
1168     { VLC_FOURCC('R','T','2','1'), CODEC_ID_INDEO2,
1169       VIDEO_ES, "Indeo Video v2" },
1170
1171         /* Flash Screen Video */
1172 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(11<<8)+0)
1173     { VLC_FOURCC('F','S','V','1'), CODEC_ID_FLASHSV,
1174               VIDEO_ES, "Flash Screen Video" },
1175 #endif
1176    { VLC_FOURCC('K','M','V','C'), CODEC_ID_KMVC,
1177       VIDEO_ES, "Karl Morton's Video Codec (Worms)" },
1178
1179 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(13<<8)+0)
1180     { VLC_FOURCC('N','U','V','1'), CODEC_ID_NUV,
1181       VIDEO_ES, "Nuppel Video" },
1182     { VLC_FOURCC('R','J','P','G'), CODEC_ID_NUV,
1183       VIDEO_ES, "Nuppel Video" },
1184 #endif
1185
1186 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(8<<8)+0)
1187     /* CODEC_ID_SMACKVIDEO */
1188     { VLC_FOURCC('S','M','K','2'), CODEC_ID_SMACKVIDEO,
1189       VIDEO_ES, "Smacker Video" },
1190     { VLC_FOURCC('S','M','K','4'), CODEC_ID_SMACKVIDEO,
1191       VIDEO_ES, "Smacker Video" },
1192 #endif
1193
1194     /* Chinese AVS - Untested */
1195 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(8<<8)+0)
1196     { VLC_FOURCC('C','A','V','S'), CODEC_ID_CAVS,
1197       VIDEO_ES, "Chinese AVS" },
1198 #endif
1199
1200 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+0)
1201     /* Untested yet */
1202     { VLC_FOURCC('A','V','d','n'), CODEC_ID_DNXHD,
1203       VIDEO_ES, "DNxHD" },
1204 #endif
1205     { VLC_FOURCC('8','B','P','S'), CODEC_ID_8BPS,
1206       VIDEO_ES, "8BPS" },
1207
1208 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(52<<8)+0)
1209     { VLC_FOURCC('M','L','2','O'), CODEC_ID_MIMIC,
1210       VIDEO_ES, "Mimic" },
1211 #endif
1212
1213     /* Videogames Codecs */
1214
1215     /* Interplay MVE */
1216     { VLC_FOURCC('i','m','v','e'), CODEC_ID_INTERPLAY_VIDEO,
1217       VIDEO_ES, "Interplay MVE Video" },
1218     { VLC_FOURCC('I','N','P','V'), CODEC_ID_INTERPLAY_VIDEO,
1219       VIDEO_ES, "Interplay MVE Video" },
1220
1221     /* Id Quake II CIN */
1222     { VLC_FOURCC('I','D','C','I'), CODEC_ID_IDCIN,
1223       VIDEO_ES, "Id Quake II CIN Video" },
1224
1225     /* 4X Technologies */
1226     { VLC_FOURCC('4','x','m','v'), CODEC_ID_4XM,
1227       VIDEO_ES, "4X Technologies Video" },
1228     { VLC_FOURCC('4','X','M','V'), CODEC_ID_4XM,
1229       VIDEO_ES, "4X Technologies Video" },
1230
1231     /* Id RoQ */
1232     { VLC_FOURCC('R','o','Q','v'), CODEC_ID_ROQ,
1233       VIDEO_ES, "Id RoQ Video" },
1234
1235     /* Sony Playstation MDEC */
1236     { VLC_FOURCC('M','D','E','C'), CODEC_ID_MDEC,
1237       VIDEO_ES, "PSX MDEC Video" },
1238
1239     /* Sierra VMD */
1240     { VLC_FOURCC('v','m','d','v'), CODEC_ID_VMDVIDEO,
1241       VIDEO_ES, "Sierra VMD Video" },
1242     { VLC_FOURCC('V','M','D','V'), CODEC_ID_VMDVIDEO,
1243       VIDEO_ES, "Sierra VMD Video" },
1244
1245 #if 0
1246 /*    UNTESTED VideoGames*/
1247     { VLC_FOURCC('W','C','3','V'), CODEC_ID_XAN_WC3,
1248       VIDEO_ES, "XAN wc3 Video" },
1249     { VLC_FOURCC('W','C','4','V'), CODEC_ID_XAN_WC4,
1250       VIDEO_ES, "XAN wc4 Video" },
1251     { VLC_FOURCC('S','T','3','C'), CODEC_ID_TXD,
1252       VIDEO_ES, "Renderware TeXture Dictionary" },
1253     { VLC_FOURCC('V','Q','A','V'), CODEC_ID_WS_VQA,
1254       VIDEO_ES, "WestWood Vector Quantized Animation" },
1255     { VLC_FOURCC('T','S','E','Q'), CODEC_ID_TIERTEXSEQVIDEO,
1256       VIDEO_ES, "Tiertex SEQ Video" },
1257     { VLC_FOURCC('D','X','A','1'), CODEC_ID_DXA,
1258       VIDEO_ES, "Feeble DXA Video" },
1259     { VLC_FOURCC('D','C','I','V'), CODEC_ID_DSICINVIDEO,
1260       VIDEO_ES, "Delphine CIN Video" },
1261     { VLC_FOURCC('T','H','P','V'), CODEC_ID_THP,
1262       VIDEO_ES, "THP Video" },
1263     { VLC_FOURCC('B','E','T','H'), CODEC_ID_BETHSOFTVID,
1264       VIDEO_ES, "THP Video" },
1265     { VLC_FOURCC('C','9','3','V'), CODEC_ID_C93,
1266       VIDEO_ES, "THP Video" },
1267 #endif
1268
1269     /*
1270      *  Image codecs
1271      */
1272     { VLC_FOURCC('p','n','g',' '), CODEC_ID_PNG,
1273       VIDEO_ES, "PNG Image" },
1274     { VLC_FOURCC('p','p','m',' '), CODEC_ID_PPM,
1275       VIDEO_ES, "PPM Image" },
1276     { VLC_FOURCC('p','g','m',' '), CODEC_ID_PGM,
1277       VIDEO_ES, "PGM Image" },
1278     { VLC_FOURCC('p','g','m','y'), CODEC_ID_PGMYUV,
1279       VIDEO_ES, "PGM YUV Image" },
1280     { VLC_FOURCC('p','a','m',' '), CODEC_ID_PAM,
1281       VIDEO_ES, "PAM Image" },
1282     { VLC_FOURCC('M','J','L','S'), CODEC_ID_JPEGLS,
1283       VIDEO_ES, "PAM Image" },
1284
1285 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(0<<8)+0)
1286     { VLC_FOURCC('b','m','p',' '), CODEC_ID_BMP,
1287       VIDEO_ES, "BMP Image" },
1288 #endif
1289
1290 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+1)
1291     { VLC_FOURCC('t','i','f','f'), CODEC_ID_TIFF,
1292       VIDEO_ES, "TIFF Image" },
1293     { VLC_FOURCC('g','i','f',' '), CODEC_ID_GIF,
1294       VIDEO_ES, "GIF Image" },
1295     { VLC_FOURCC('t','g','a',' '), CODEC_ID_TARGA,
1296       VIDEO_ES, "Truevision Targa Image" },
1297     { VLC_FOURCC('m','t','g','a'), CODEC_ID_TARGA,
1298       VIDEO_ES, "Truevision Targa Image" },
1299     { VLC_FOURCC('M','T','G','A'), CODEC_ID_TARGA,
1300       VIDEO_ES, "Truevision Targa Image" },
1301 #endif
1302 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+3)
1303     { VLC_FOURCC('s','g','i',' '), CODEC_ID_SGI,
1304       VIDEO_ES, "SGI Image" },
1305 #endif
1306
1307     /*
1308      *  Audio Codecs
1309      */
1310
1311     /* Windows Media Audio 1 */
1312     { VLC_FOURCC('W','M','A','1'), CODEC_ID_WMAV1,
1313       AUDIO_ES, "Windows Media Audio 1" },
1314     { VLC_FOURCC('w','m','a','1'), CODEC_ID_WMAV1,
1315       AUDIO_ES, "Windows Media Audio 1" },
1316
1317     /* Windows Media Audio 2 */
1318     { VLC_FOURCC('W','M','A','2'), CODEC_ID_WMAV2,
1319       AUDIO_ES, "Windows Media Audio 2" },
1320     { VLC_FOURCC('w','m','a','2'), CODEC_ID_WMAV2,
1321       AUDIO_ES, "Windows Media Audio 2" },
1322
1323     /* DV Audio */
1324     { VLC_FOURCC('d','v','a','u'), CODEC_ID_DVAUDIO,
1325       AUDIO_ES, "DV Audio" },
1326
1327     /* MACE-3 Audio */
1328     { VLC_FOURCC('M','A','C','3'), CODEC_ID_MACE3,
1329       AUDIO_ES, "MACE-3 Audio" },
1330
1331     /* MACE-6 Audio */
1332     { VLC_FOURCC('M','A','C','6'), CODEC_ID_MACE6,
1333       AUDIO_ES, "MACE-6 Audio" },
1334
1335 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(41<<8)+1)
1336     /* MUSEPACK7 Audio */
1337     { VLC_FOURCC('M','P','C',' '), CODEC_ID_MUSEPACK7,
1338       AUDIO_ES, "MUSEPACK7 Audio" },
1339 #endif
1340 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(48<<8)+0)
1341     /* MUSEPACK8 Audio */
1342     { VLC_FOURCC('M','P','C','K'), CODEC_ID_MUSEPACK8,
1343       AUDIO_ES, "MUSEPACK8 Audio" },
1344     { VLC_FOURCC('M','P','C','8'), CODEC_ID_MUSEPACK8,
1345       AUDIO_ES, "MUSEPACK8 Audio" },
1346 #endif
1347
1348     /* RealAudio 1.0 */
1349     { VLC_FOURCC('1','4','_','4'), CODEC_ID_RA_144,
1350       AUDIO_ES, "RealAudio 1.0" },
1351     { VLC_FOURCC('l','p','c','J'), CODEC_ID_RA_144,
1352       AUDIO_ES, "RealAudio 1.0" },
1353
1354     /* RealAudio 2.0 */
1355     { VLC_FOURCC('2','8','_','8'), CODEC_ID_RA_288,
1356       AUDIO_ES, "RealAudio 2.0" },
1357
1358     /* MPEG Audio layer 1/2/3 */
1359     { VLC_FOURCC('m','p','g','a'), CODEC_ID_MP2,
1360       AUDIO_ES, "MPEG Audio layer 1/2" },
1361     { VLC_FOURCC('m','p','3',' '), CODEC_ID_MP3,
1362       AUDIO_ES, "MPEG Audio layer 1/2/3" },
1363     { VLC_FOURCC('.','m','p','3'), CODEC_ID_MP3,
1364       AUDIO_ES, "MPEG Audio layer 1/2/3" },
1365     { VLC_FOURCC('M','P','3',' '), CODEC_ID_MP3,
1366       AUDIO_ES, "MPEG Audio layer 1/2/3" },
1367     { VLC_FOURCC('L','A','M','E'), CODEC_ID_MP3,
1368       AUDIO_ES, "MPEG Audio layer 1/2/3" },
1369
1370     /* A52 Audio (aka AC3) */
1371     { VLC_FOURCC('a','5','2',' '), CODEC_ID_AC3,
1372       AUDIO_ES, "A52 Audio (aka AC3)" },
1373     { VLC_FOURCC('a','5','2','b'), CODEC_ID_AC3, /* VLC specific hack */
1374       AUDIO_ES, "A52 Audio (aka AC3)" },
1375
1376     /* DTS Audio */
1377     { VLC_FOURCC('d','t','s',' '), CODEC_ID_DTS,
1378       AUDIO_ES, "DTS Audio" },
1379
1380     /* AAC audio */
1381     { VLC_FOURCC('m','p','4','a'), CODEC_ID_AAC,
1382       AUDIO_ES, "MPEG AAC Audio" },
1383
1384     /* AC-3 Audio (Dolby Digital) */
1385     { VLC_FOURCC('a','c','-','3'), CODEC_ID_AC3,
1386       AUDIO_ES, "AC-3 Audio (Dolby Digital)" },
1387
1388     /* 4X Technologies */
1389     { VLC_FOURCC('4','x','m','a'), CODEC_ID_ADPCM_4XM,
1390       AUDIO_ES, "4X Technologies Audio" },
1391
1392     /* EA ADPCM */
1393     { VLC_FOURCC('A','D','E','A'), CODEC_ID_ADPCM_EA,
1394       AUDIO_ES, "EA ADPCM Audio" },
1395
1396     /* Interplay DPCM */
1397     { VLC_FOURCC('i','d','p','c'), CODEC_ID_INTERPLAY_DPCM,
1398       AUDIO_ES, "Interplay DPCM Audio" },
1399
1400     /* Id RoQ */
1401     { VLC_FOURCC('R','o','Q','a'), CODEC_ID_ROQ_DPCM,
1402       AUDIO_ES, "Id RoQ DPCM Audio" },
1403
1404 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(27<<8)+0)
1405     /* DCIN Audio */
1406     { VLC_FOURCC('D','C','I','A'), CODEC_ID_DSICINAUDIO,
1407       AUDIO_ES, "Delphine CIN Audio" },
1408 #endif
1409
1410     /* Sony Playstation XA ADPCM */
1411     { VLC_FOURCC('x','a',' ',' '), CODEC_ID_ADPCM_XA,
1412       AUDIO_ES, "PSX XA ADPCM Audio" },
1413
1414     /* ADX ADPCM */
1415     { VLC_FOURCC('a','d','x',' '), CODEC_ID_ADPCM_ADX,
1416       AUDIO_ES, "ADX ADPCM Audio" },
1417
1418     /* Westwood ADPCM */
1419     { VLC_FOURCC('A','I','W','S'), CODEC_ID_ADPCM_IMA_WS,
1420       AUDIO_ES, "Westwood IMA ADPCM audio" },
1421
1422     /* Sierra VMD */
1423     { VLC_FOURCC('v','m','d','a'), CODEC_ID_VMDAUDIO,
1424       AUDIO_ES, "Sierra VMD Audio" },
1425
1426     /* G.726 ADPCM */
1427     { VLC_FOURCC('g','7','2','6'), CODEC_ID_ADPCM_G726,
1428       AUDIO_ES, "G.726 ADPCM Audio" },
1429
1430     /* AMR */
1431     { VLC_FOURCC('s','a','m','r'), CODEC_ID_AMR_NB,
1432       AUDIO_ES, "AMR narrow band" },
1433     { VLC_FOURCC('s','a','w','b'), CODEC_ID_AMR_WB,
1434       AUDIO_ES, "AMR wide band" },
1435
1436     /* FLAC */
1437     { VLC_FOURCC('f','l','a','c'), CODEC_ID_FLAC,
1438       AUDIO_ES, "FLAC (Free Lossless Audio Codec)" },
1439
1440     /* ALAC */
1441     { VLC_FOURCC('a','l','a','c'), CODEC_ID_ALAC,
1442       AUDIO_ES, "Apple Lossless Audio Codec" },
1443
1444 #if LIBAVCODEC_VERSION_INT >= ((50<<16)+(0<<8)+1)
1445     /* QDM2 */
1446     { VLC_FOURCC('Q','D','M','2'), CODEC_ID_QDM2,
1447       AUDIO_ES, "QDM2 Audio" },
1448 #endif
1449
1450 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(0<<8)+0)
1451     /* COOK */
1452     { VLC_FOURCC('c','o','o','k'), CODEC_ID_COOK,
1453       AUDIO_ES, "Cook Audio" },
1454 #endif
1455
1456 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(4<<8)+0)
1457     /* TTA: The Lossless True Audio */
1458     { VLC_FOURCC('T','T','A','1'), CODEC_ID_TTA,
1459       AUDIO_ES, "The Lossless True Audio" },
1460 #endif
1461
1462 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(8<<8)+0)
1463     /* Shorten */
1464     { VLC_FOURCC('s','h','n',' '), CODEC_ID_SHORTEN,
1465       AUDIO_ES, "Shorten Lossless Audio" },
1466     { VLC_FOURCC('s','h','r','n'), CODEC_ID_SHORTEN,
1467       AUDIO_ES, "Shorten Lossless Audio" },
1468 #endif
1469
1470 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(16<<8)+0)
1471     { VLC_FOURCC('w','v','p','k'), CODEC_ID_WAVPACK,
1472       AUDIO_ES, "WavPack" },
1473     { VLC_FOURCC('W','V','P','K'), CODEC_ID_WAVPACK,
1474       AUDIO_ES, "WavPack" },
1475 #endif
1476
1477 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(34<<8)+0)
1478     { VLC_FOURCC('g','s','m',' '), CODEC_ID_GSM,
1479       AUDIO_ES, "GSM Audio" },
1480     { VLC_FOURCC('g','s','m','s'), CODEC_ID_GSM_MS,
1481       AUDIO_ES, "Microsoft GSM Audio" },
1482 #endif
1483
1484 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+4)
1485     { VLC_FOURCC('a','t','r','c'), CODEC_ID_ATRAC3,
1486       AUDIO_ES, "atrac 3" },
1487     { VLC_FOURCC(0x70,0x2,0x0,0x0), CODEC_ID_ATRAC3,
1488       AUDIO_ES, "atrac 3" },
1489 #endif
1490
1491     { VLC_FOURCC('S','O','N','C'), CODEC_ID_SONIC,
1492       AUDIO_ES, "Sonic" },
1493
1494 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(34<<8)+0)
1495     { VLC_FOURCC(0x1,0x4,0x0,0x0), CODEC_ID_IMC,
1496       AUDIO_ES, "IMC" },
1497 #endif
1498     { VLC_FOURCC(0x22,0x0,0x0,0x0), CODEC_ID_TRUESPEECH,
1499       AUDIO_ES, "TrueSpeech" },
1500 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(46<<8)+0)
1501     { VLC_FOURCC('N','E','L','L'), CODEC_ID_NELLYMOSER,
1502       AUDIO_ES, "NellyMoser ASAO" },
1503 #endif
1504 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0)
1505     { VLC_FOURCC('A','P','E',' '), CODEC_ID_APE,
1506       AUDIO_ES, "Monkey's Audio" },
1507 #endif
1508     /* PCM */
1509     { VLC_FOURCC('s','8',' ',' '), CODEC_ID_PCM_S8,
1510       AUDIO_ES, "PCM S8" },
1511     { VLC_FOURCC('u','8',' ',' '), CODEC_ID_PCM_U8,
1512       AUDIO_ES, "PCM U8" },
1513     { VLC_FOURCC('s','1','6','l'), CODEC_ID_PCM_S16LE,
1514       AUDIO_ES, "PCM S16 LE" },
1515     { VLC_FOURCC('s','1','6','b'), CODEC_ID_PCM_S16BE,
1516       AUDIO_ES, "PCM S16 BE" },
1517     { VLC_FOURCC('u','1','6','l'), CODEC_ID_PCM_U16LE,
1518       AUDIO_ES, "PCM U16 LE" },
1519     { VLC_FOURCC('u','1','6','b'), CODEC_ID_PCM_U16BE,
1520       AUDIO_ES, "PCM U16 BE" },
1521     { VLC_FOURCC('s','2','4','l'), CODEC_ID_PCM_S24LE,
1522       AUDIO_ES, "PCM S24 LE" },
1523     { VLC_FOURCC('s','2','4','b'), CODEC_ID_PCM_S24BE,
1524       AUDIO_ES, "PCM S24 BE" },
1525     { VLC_FOURCC('u','2','4','l'), CODEC_ID_PCM_U24LE,
1526       AUDIO_ES, "PCM U24 LE" },
1527     { VLC_FOURCC('u','2','4','b'), CODEC_ID_PCM_U24BE,
1528       AUDIO_ES, "PCM U24 BE" },
1529     { VLC_FOURCC('s','3','2','l'), CODEC_ID_PCM_S32LE,
1530       AUDIO_ES, "PCM S32 LE" },
1531     { VLC_FOURCC('s','3','2','b'), CODEC_ID_PCM_S32BE,
1532       AUDIO_ES, "PCM S32 BE" },
1533     { VLC_FOURCC('u','3','2','l'), CODEC_ID_PCM_U32LE,
1534       AUDIO_ES, "PCM U32 LE" },
1535     { VLC_FOURCC('u','3','2','b'), CODEC_ID_PCM_U32BE,
1536       AUDIO_ES, "PCM U32 BE" },
1537     { VLC_FOURCC('a','l','a','w'), CODEC_ID_PCM_ALAW,
1538       AUDIO_ES, "PCM ALAW" },
1539     { VLC_FOURCC('u','l','a','w'), CODEC_ID_PCM_MULAW,
1540       AUDIO_ES, "PCM ULAW" },
1541     { VLC_FOURCC('d','a','u','d'), CODEC_ID_PCM_S24DAUD,
1542       AUDIO_ES, "PCM ULAW" },
1543
1544     { 0, 0, 0, 0 }
1545 };
1546
1547 int GetFfmpegCodec( vlc_fourcc_t i_fourcc, int *pi_cat,
1548                         int *pi_ffmpeg_codec, const char **ppsz_name )
1549 {
1550     int i;
1551
1552     for( i = 0; codecs_table[i].i_fourcc != 0; i++ )
1553     {
1554         if( codecs_table[i].i_fourcc == i_fourcc )
1555         {
1556             if( pi_cat ) *pi_cat = codecs_table[i].i_cat;
1557             if( pi_ffmpeg_codec ) *pi_ffmpeg_codec = codecs_table[i].i_codec;
1558             if( ppsz_name ) *ppsz_name = (char *)codecs_table[i].psz_name;
1559
1560             return true;
1561         }
1562     }
1563     return false;
1564 }
1565
1566 int GetVlcFourcc( int i_ffmpeg_codec, int *pi_cat,
1567                       vlc_fourcc_t *pi_fourcc, const char **ppsz_name )
1568 {
1569     int i;
1570
1571     for( i = 0; codecs_table[i].i_codec != 0; i++ )
1572     {
1573         if( codecs_table[i].i_codec == i_ffmpeg_codec )
1574         {
1575             if( pi_cat ) *pi_cat = codecs_table[i].i_cat;
1576             if( pi_fourcc ) *pi_fourcc = codecs_table[i].i_fourcc;
1577             if( ppsz_name ) *ppsz_name = codecs_table[i].psz_name;
1578
1579             return true;
1580         }
1581     }
1582     return false;
1583 }