ffmpeg.c 40.7 KB
Newer Older
1
2
3
/*****************************************************************************
 * ffmpeg.c: video decoder using ffmpeg library
 *****************************************************************************
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
11
12
13
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
14
 *
15
16
17
18
19
20
21
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
dionoea's avatar
dionoea committed
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23
24
25
26
27
28
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include <vlc/vlc.h>
zorglub's avatar
zorglub committed
29
#include <vlc_codec.h>
30

gbazin's avatar
   
gbazin committed
31
/* ffmpeg header */
32
#define HAVE_MMX 1
gbazin's avatar
   
gbazin committed
33
34
35
36
37
#ifdef HAVE_FFMPEG_AVCODEC_H
#   include <ffmpeg/avcodec.h>
#else
#   include <avcodec.h>
#endif
38

39
40
#if LIBAVCODEC_BUILD < 5000
#   error You must have a libavcodec >= 5000 (get CVS)
41
#endif
42

43
#include "ffmpeg.h"
44

45
46
47
48
#ifdef HAVE_POSTPROC_POSTPROCESS_H
#    include <postproc/postprocess.h>
#else
#    include <libpostproc/postprocess.h>
49
50
#endif

gbazin's avatar
   
gbazin committed
51
52
53
54
55
56
57
58
59
/*****************************************************************************
 * decoder_sys_t: decoder descriptor
 *****************************************************************************/
struct decoder_sys_t
{
    /* Common part between video and audio decoder */
    int i_cat;
    int i_codec_id;
    char *psz_namecodec;
60

gbazin's avatar
   
gbazin committed
61
62
63
    AVCodecContext *p_context;
    AVCodec        *p_codec;
};
64

gbazin's avatar
   
gbazin committed
65
66
67
68
/****************************************************************************
 * Local prototypes
 ****************************************************************************/
static int OpenDecoder( vlc_object_t * );
gbazin's avatar
   
gbazin committed
69
static void CloseDecoder( vlc_object_t * );
70

71
static int  nloopf_list[] = { 0, 1, 2, 3, 4 };
72
static const char *nloopf_list_text[] =
73
74
  { N_("None"), N_("Non-ref"), N_("Bidir"), N_("Non-key"), N_("All") };

75
76
static const char *enc_hq_list[] = { "rd", "bits", "simple" };
static const char *enc_hq_list_text[] = { N_("rd"), N_("bits"), N_("simple") };
77
78

static int pi_mode_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 };
79
static const char *ppsz_mode_descriptions[] =
80
81
82
83
84
{ N_("Fast bilinear"), N_("Bilinear"), N_("Bicubic (good quality)"),
  N_("Experimental"), N_("Nearest neighbour (bad quality)"),
  N_("Area"), N_("Luma bicubic / chroma bilinear"), N_("Gauss"),
  N_("SincR"), N_("Lanczos"), N_("Bicubic spline") };

85
86
87
88
/*****************************************************************************
 * Module descriptor
 *****************************************************************************/
vlc_module_begin();
89
    set_shortname( "FFmpeg");
zorglub's avatar
zorglub committed
90
91
    set_category( CAT_INPUT );
    set_subcategory( SUBCAT_INPUT_SCODEC );
gbazin's avatar
   
gbazin committed
92
    /* decoder main module */
93
94
#if defined(MODULE_NAME_is_ffmpegaltivec) \
     || (defined(CAN_COMPILE_ALTIVEC) && !defined(NO_ALTIVEC_IN_FFMPEG))
95
    set_description( _("AltiVec FFmpeg audio/video decoder/encoder ((MS)MPEG4,SVQ1,H263,WMV,WMA)") );
Sam Hocevar's avatar
Sam Hocevar committed
96
    /*add_requirement( ALTIVEC );*/
97
98
    set_capability( "decoder", 71 );
#else
99
    set_description( _("FFmpeg audio/video decoder/encoder ((MS)MPEG4,SVQ1,H263,WMV,WMA)") );
gbazin's avatar
   
gbazin committed
100
    set_capability( "decoder", 70 );
101
#endif
zorglub's avatar
zorglub committed
102
    set_section( N_("Decoding") , NULL );
gbazin's avatar
   
gbazin committed
103
    set_callbacks( OpenDecoder, CloseDecoder );
gbazin's avatar
   
gbazin committed
104

gbazin's avatar
   
gbazin committed
105
    add_bool( "ffmpeg-dr", 1, NULL, DR_TEXT, DR_TEXT, VLC_TRUE );
gbazin's avatar
gbazin committed
106
    add_integer ( "ffmpeg-error-resilience", 1, NULL, ERROR_TEXT,
gbazin's avatar
   
gbazin committed
107
108
109
110
111
        ERROR_LONGTEXT, VLC_TRUE );
    add_integer ( "ffmpeg-workaround-bugs", 1, NULL, BUGS_TEXT, BUGS_LONGTEXT,
        VLC_FALSE );
    add_bool( "ffmpeg-hurry-up", 0, NULL, HURRYUP_TEXT, HURRYUP_LONGTEXT,
        VLC_FALSE );
gbazin's avatar
gbazin committed
112
113
    add_integer ( "ffmpeg-vismv", 0, NULL, VISMV_TEXT, VISMV_LONGTEXT,
        VLC_TRUE );
114
115
116
    add_integer ( "ffmpeg-lowres", 0, NULL, LOWRES_TEXT, LOWRES_LONGTEXT,
        VLC_TRUE );
        change_integer_range( 0, 2 );
117
118
119
    add_integer ( "ffmpeg-skiploopfilter", 0, NULL, SKIPLOOPF_TEXT,
                  SKIPLOOPF_LONGTEXT, VLC_TRUE );
        change_integer_list( nloopf_list, nloopf_list_text, 0 );
gbazin's avatar
   
gbazin committed
120

gbazin's avatar
   
gbazin committed
121
122
123
    add_integer( "ffmpeg-pp-q", 0, NULL, PP_Q_TEXT, PP_Q_LONGTEXT, VLC_FALSE );
    add_string( "ffmpeg-pp-name", "default", NULL, LIBAVCODEC_PP_TEXT,
        LIBAVCODEC_PP_LONGTEXT, VLC_TRUE );
124
125
    add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
                 VLC_TRUE );
gbazin's avatar
   
gbazin committed
126

gbazin's avatar
   
gbazin committed
127
128
    /* encoder submodule */
    add_submodule();
zorglub's avatar
zorglub committed
129
    set_section( N_("Encoding") , NULL );
130
    set_description( _("FFmpeg audio/video encoder") );
gbazin's avatar
   
gbazin committed
131
132
133
    set_capability( "encoder", 100 );
    set_callbacks( E_(OpenEncoder), E_(CloseEncoder) );

134
135
136
137
138
139
140
    add_string( ENC_CFG_PREFIX "hq", "simple", NULL, ENC_HQ_TEXT,
                ENC_HQ_LONGTEXT, VLC_FALSE );
        change_string_list( enc_hq_list, enc_hq_list_text, 0 );
    add_integer( ENC_CFG_PREFIX "keyint", 0, NULL, ENC_KEYINT_TEXT,
                 ENC_KEYINT_LONGTEXT, VLC_FALSE );
    add_integer( ENC_CFG_PREFIX "bframes", 0, NULL, ENC_BFRAMES_TEXT,
                 ENC_BFRAMES_LONGTEXT, VLC_FALSE );
141
    add_bool( ENC_CFG_PREFIX "hurry-up", 0, NULL, ENC_HURRYUP_TEXT,
142
143
144
              ENC_HURRYUP_LONGTEXT, VLC_FALSE );
    add_bool( ENC_CFG_PREFIX "interlace", 0, NULL, ENC_INTERLACE_TEXT,
              ENC_INTERLACE_LONGTEXT, VLC_TRUE );
145
146
    add_bool( ENC_CFG_PREFIX "interlace-me", 1, NULL, ENC_INTERLACE_ME_TEXT,
              ENC_INTERLACE_ME_LONGTEXT, VLC_TRUE );
147
148
    add_integer( ENC_CFG_PREFIX "vt", 0, NULL, ENC_VT_TEXT,
                 ENC_VT_LONGTEXT, VLC_TRUE );
149
    add_bool( ENC_CFG_PREFIX "pre-me", 0, NULL, ENC_PRE_ME_TEXT,
150
              ENC_PRE_ME_LONGTEXT, VLC_TRUE );
151
    add_bool( ENC_CFG_PREFIX "strict-rc", 0, NULL, ENC_RC_STRICT_TEXT,
152
              ENC_RC_STRICT_LONGTEXT, VLC_TRUE );
153
    add_integer( ENC_CFG_PREFIX "rc-buffer-size", 224*1024*8, NULL,
154
                 ENC_RC_BUF_TEXT, ENC_RC_BUF_LONGTEXT, VLC_TRUE );
155
    add_float( ENC_CFG_PREFIX "rc-buffer-aggressivity", 1.0, NULL,
156
               ENC_RC_BUF_AGGR_TEXT, ENC_RC_BUF_AGGR_LONGTEXT, VLC_TRUE );
157
    add_float( ENC_CFG_PREFIX "i-quant-factor", 0, NULL,
158
               ENC_IQUANT_FACTOR_TEXT, ENC_IQUANT_FACTOR_LONGTEXT, VLC_TRUE );
159
    add_integer( ENC_CFG_PREFIX "noise-reduction", 0, NULL,
160
                 ENC_NOISE_RED_TEXT, ENC_NOISE_RED_LONGTEXT, VLC_TRUE );
161
    add_bool( ENC_CFG_PREFIX "mpeg4-matrix", 0, NULL,
162
163
164
165
166
167
168
              ENC_MPEG4_MATRIX_TEXT, ENC_MPEG4_MATRIX_LONGTEXT, VLC_TRUE );
    add_integer( ENC_CFG_PREFIX "qmin", 0, NULL,
                 ENC_QMIN_TEXT, ENC_QMIN_LONGTEXT, VLC_TRUE );
    add_integer( ENC_CFG_PREFIX "qmax", 0, NULL,
                 ENC_QMAX_TEXT, ENC_QMAX_LONGTEXT, VLC_TRUE );
    add_bool( ENC_CFG_PREFIX "trellis", 0, NULL,
              ENC_TRELLIS_TEXT, ENC_TRELLIS_LONGTEXT, VLC_TRUE );
gbazin's avatar
gbazin committed
169
170
171
172
    add_float( ENC_CFG_PREFIX "qscale", 0, NULL,
               ENC_QSCALE_TEXT, ENC_QSCALE_LONGTEXT, VLC_TRUE );
    add_integer( ENC_CFG_PREFIX "strict", 0, NULL,
                 ENC_STRICT_TEXT, ENC_STRICT_LONGTEXT, VLC_TRUE );
173
174
175
176
177
178
179
180
181
182
183
184
    add_float( ENC_CFG_PREFIX "lumi-masking", 0.0, NULL,
               ENC_LUMI_MASKING_TEXT, ENC_LUMI_MASKING_LONGTEXT, VLC_TRUE );
    add_float( ENC_CFG_PREFIX "dark-masking", 0.0, NULL,
               ENC_DARK_MASKING_TEXT, ENC_DARK_MASKING_LONGTEXT, VLC_TRUE );
    add_float( ENC_CFG_PREFIX "p-masking", 0.0, NULL,
               ENC_P_MASKING_TEXT, ENC_P_MASKING_LONGTEXT, VLC_TRUE );
    add_float( ENC_CFG_PREFIX "border-masking", 0.0, NULL,
               ENC_BORDER_MASKING_TEXT, ENC_BORDER_MASKING_LONGTEXT, VLC_TRUE );
    add_integer( ENC_CFG_PREFIX "luma-elim-threshold", 0, NULL,
                 ENC_LUMA_ELIM_TEXT, ENC_LUMA_ELIM_LONGTEXT, VLC_TRUE );
    add_integer( ENC_CFG_PREFIX "chroma-elim-threshold", 0, NULL,
                 ENC_CHROMA_ELIM_TEXT, ENC_CHROMA_ELIM_LONGTEXT, VLC_TRUE );
185

gbazin's avatar
   
gbazin committed
186
    /* demux submodule */
gbazin's avatar
   
gbazin committed
187
    add_submodule();
188
    set_description( _("FFmpeg demuxer" ) );
189
    set_capability( "demux2", 2 );
gbazin's avatar
   
gbazin committed
190
191
    set_callbacks( E_(OpenDemux), E_(CloseDemux) );

192
193
194
195
    /* mux submodule */
    add_submodule();
    set_description( _("FFmpeg muxer" ) );
    set_capability( "sout mux", 2 );
196
197
    add_string( "ffmpeg-mux", NULL, NULL, MUX_TEXT,
                MUX_LONGTEXT, VLC_TRUE );
198
199
    set_callbacks( E_(OpenMux), E_(CloseMux) );

200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE)
    /* video filter submodule */
    add_submodule();
    set_description( _("Video scaling filter") );
    set_capability( "video filter2", 1000 );
    set_category( CAT_VIDEO );
    set_subcategory( SUBCAT_VIDEO_VFILTER );
    set_callbacks( E_(OpenScaler), E_(CloseScaler) );
    add_integer( "swscale-mode", 0, NULL, SCALEMODE_TEXT, SCALEMODE_LONGTEXT, VLC_TRUE );
        change_integer_list( pi_mode_values, ppsz_mode_descriptions, 0 );
#else
    /* chroma conversion submodule */
    add_submodule();
    set_capability( "chroma", 50 );
    set_callbacks( E_(OpenChroma), E_(CloseChroma) );
    set_description( _("FFmpeg chroma conversion") );

217
218
219
220
    /* video filter submodule */
    add_submodule();
    set_capability( "video filter2", 50 );
    set_callbacks( E_(OpenFilter), E_(CloseFilter) );
221
    set_description( _("FFmpeg video filter") );
222

223
224
225
226
    /* crop/padd submodule */
    add_submodule();
    set_capability( "crop padd", 10 );
    set_callbacks( E_(OpenCropPadd), E_(CloseFilter) );
227
    set_description( _("FFmpeg crop padd filter") );
228

229
230
231
232
    /* video filter submodule */
    add_submodule();
    set_capability( "video filter2", 0 );
    set_callbacks( E_(OpenDeinterlace), E_(CloseDeinterlace) );
233
    set_description( _("FFmpeg deinterlace video filter") );
234
    add_shortcut( "ffmpeg-deinterlace" );
235
#endif
236

237
238
    var_Create( p_module->p_libvlc_global, "avcodec", VLC_VAR_MUTEX );

239
240
241
242
243
244
245
vlc_module_end();

/*****************************************************************************
 * OpenDecoder: probe the decoder and return score
 *****************************************************************************/
static int OpenDecoder( vlc_object_t *p_this )
{
gbazin's avatar
   
gbazin committed
246
    decoder_t *p_dec = (decoder_t*) p_this;
gbazin's avatar
   
gbazin committed
247
    int i_cat, i_codec_id, i_result;
248
    const char *psz_namecodec;
gbazin's avatar
   
gbazin committed
249

Jean-Paul Saman's avatar
Jean-Paul Saman committed
250
251
    AVCodecContext *p_context = NULL;
    AVCodec        *p_codec = NULL;
gbazin's avatar
   
gbazin committed
252
253
254

    /* *** determine codec type *** */
    if( !E_(GetFfmpegCodec)( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id,
gbazin's avatar
   
gbazin committed
255
256
257
258
                             &psz_namecodec ) )
    {
        return VLC_EGENERIC;
    }
259

gbazin's avatar
   
gbazin committed
260
261
262
263
264
265
266
267
    /* Bail out if buggy decoder */
    if( i_codec_id == CODEC_ID_AAC )
    {
        msg_Dbg( p_dec, "refusing to use ffmpeg's (%s) decoder which is buggy",
                 psz_namecodec );
        return VLC_EGENERIC;
    }

gbazin's avatar
   
gbazin committed
268
269
270
    /* Initialization must be done before avcodec_find_decoder() */
    E_(InitLibavcodec)(p_this);

271
    /* *** ask ffmpeg for a decoder *** */
Jean-Paul Saman's avatar
Jean-Paul Saman committed
272
273
    p_codec = avcodec_find_decoder( i_codec_id );
    if( !p_codec )
274
    {
gbazin's avatar
   
gbazin committed
275
        msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec );
gbazin's avatar
   
gbazin committed
276
        return VLC_EGENERIC;
277
278
    }

gbazin's avatar
   
gbazin committed
279
280
    /* *** get a p_context *** */
    p_context = avcodec_alloc_context();
Jean-Paul Saman's avatar
Jean-Paul Saman committed
281
    if( !p_context )
Jean-Paul Saman's avatar
Jean-Paul Saman committed
282
        return VLC_ENOMEM;
283
    p_context->debug = config_GetInt( p_dec, "ffmpeg-debug" );
284
    p_context->opaque = (void *)p_this;
285

gbazin's avatar
   
gbazin committed
286
287
    /* Set CPU capabilities */
    p_context->dsp_mask = 0;
288
    if( !(p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMX) )
gbazin's avatar
   
gbazin committed
289
    {
gbazin's avatar
   
gbazin committed
290
        p_context->dsp_mask |= FF_MM_MMX;
gbazin's avatar
   
gbazin committed
291
    }
292
    if( !(p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_MMXEXT) )
gbazin's avatar
   
gbazin committed
293
    {
gbazin's avatar
   
gbazin committed
294
        p_context->dsp_mask |= FF_MM_MMXEXT;
gbazin's avatar
   
gbazin committed
295
    }
296
    if( !(p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_3DNOW) )
gbazin's avatar
   
gbazin committed
297
    {
gbazin's avatar
   
gbazin committed
298
        p_context->dsp_mask |= FF_MM_3DNOW;
gbazin's avatar
   
gbazin committed
299
    }
300
    if( !(p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_SSE) )
gbazin's avatar
   
gbazin committed
301
    {
gbazin's avatar
   
gbazin committed
302
        p_context->dsp_mask |= FF_MM_SSE;
303
    }
304
    if( !(p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_SSE2) )
305
    {
gbazin's avatar
   
gbazin committed
306
        p_context->dsp_mask |= FF_MM_SSE2;
gbazin's avatar
   
gbazin committed
307
308
    }

309
    p_dec->b_need_packetized = VLC_TRUE;
gbazin's avatar
   
gbazin committed
310
    switch( i_cat )
311
    {
gbazin's avatar
   
gbazin committed
312
    case VIDEO_ES:
gbazin's avatar
   
gbazin committed
313
        p_dec->pf_decode_video = E_(DecodeVideo);
gbazin's avatar
   
gbazin committed
314
315
316
317
        i_result = E_( InitVideoDec )( p_dec, p_context, p_codec,
                                       i_codec_id, psz_namecodec );
        break;
    case AUDIO_ES:
gbazin's avatar
   
gbazin committed
318
        p_dec->pf_decode_audio = E_(DecodeAudio);
gbazin's avatar
   
gbazin committed
319
320
321
322
323
        i_result = E_( InitAudioDec )( p_dec, p_context, p_codec,
                                       i_codec_id, psz_namecodec );
        break;
    default:
        i_result = VLC_EGENERIC;
324
    }
325

326
    if( i_result == VLC_SUCCESS ) p_dec->p_sys->i_cat = i_cat;
327

gbazin's avatar
   
gbazin committed
328
    return i_result;
329
}
gbazin's avatar
   
gbazin committed
330

331
/*****************************************************************************
gbazin's avatar
   
gbazin committed
332
 * CloseDecoder: decoder destruction
333
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
334
static void CloseDecoder( vlc_object_t *p_this )
335
{
gbazin's avatar
   
gbazin committed
336
    decoder_t *p_dec = (decoder_t *)p_this;
gbazin's avatar
   
gbazin committed
337
    decoder_sys_t *p_sys = p_dec->p_sys;
338
339
    vlc_value_t lockval;

340
    var_Get( p_dec->p_libvlc_global, "avcodec", &lockval );
341

gbazin's avatar
   
gbazin committed
342
    switch( p_sys->i_cat )
343
    {
gbazin's avatar
   
gbazin committed
344
345
346
347
348
349
    case AUDIO_ES:
        E_( EndAudioDec )( p_dec );
        break;
    case VIDEO_ES:
        E_( EndVideoDec )( p_dec );
        break;
350
    }
351

352
353
354
355
    if( p_sys->p_context )
    {
        if( p_sys->p_context->extradata )
            free( p_sys->p_context->extradata );
Jean-Paul Saman's avatar
Jean-Paul Saman committed
356
        p_sys->p_context->extradata = NULL;
357
        vlc_mutex_lock( lockval.p_address );
358
        avcodec_close( p_sys->p_context );
359
        vlc_mutex_unlock( lockval.p_address );
360
361
362
363
        msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec );
        av_free( p_sys->p_context );
    }

gbazin's avatar
   
gbazin committed
364
    free( p_sys );
365
}
366

367
/*****************************************************************************
368
 *
369
 *****************************************************************************/
370
371
void E_(LibavcodecCallback)( void *p_opaque, int i_level,
                             const char *psz_format, va_list va )
372
373
374
375
376
377
378
379
{
    int i_vlc_level;
    AVCodecContext *p_avctx = (AVCodecContext *)p_opaque;
    AVClass *p_avc;
    vlc_object_t *p_this;
    char *psz_new_format;
    const char *psz_item_name;

380
381
    p_avc = p_avctx ? p_avctx->av_class : 0;

382
#define cln p_avc->class_name
383
    /* Make sure we can get p_this back */
384
385
386
    if( !p_avctx || !p_avc || !cln ||
        cln[0]!='A' || cln[1]!='V' || cln[2]!='C' || cln[3]!='o' ||
        cln[4]!='d' || cln[5]!='e' || cln[6]!='c' )
387
388
    {
        if( i_level == AV_LOG_ERROR ) vfprintf( stderr, psz_format, va );
389
        return;
390
    }
391
#undef cln
392

393
394
395
396
397
398
399
400
401
402
403
404
405
406
    p_this = (vlc_object_t *)p_avctx->opaque;

    switch( i_level )
    {
    case AV_LOG_QUIET:
        i_vlc_level = VLC_MSG_ERR;
        break;
    case AV_LOG_ERROR:
        i_vlc_level = VLC_MSG_WARN;
        break;
    case AV_LOG_INFO:
        i_vlc_level = VLC_MSG_DBG;
        break;
    case AV_LOG_DEBUG:
407
408
409
        /* Print debug messages if they were requested */
        if( p_avctx->debug ) vfprintf( stderr, psz_format, va );
        return;
410
411
412
413
414
415
    default:
        return;
    }

    psz_item_name = p_avc->item_name(p_opaque);
    psz_new_format = malloc( strlen(psz_format) + strlen(psz_item_name)
416
                              + 18 + 5 );
417
418
    snprintf( psz_new_format, strlen(psz_format) + strlen(psz_item_name)
              + 18 + 5, "%s (%s@%p)", psz_format, p_avc->item_name(p_opaque), p_opaque );
419
    msg_GenericVa( p_this, MSG_QUEUE_NORMAL, i_vlc_level,
zorglub's avatar
zorglub committed
420
                    MODULE_STRING, psz_new_format, va );
421
422
423
    free( psz_new_format );
}

gbazin's avatar
   
gbazin committed
424
425
426
427
428
void E_(InitLibavcodec)( vlc_object_t *p_object )
{
    static int b_ffmpeginit = 0;
    vlc_value_t lockval;

429
    var_Get( p_object->p_libvlc_global, "avcodec", &lockval );
gbazin's avatar
   
gbazin committed
430
431
432
433
434
435
436
    vlc_mutex_lock( lockval.p_address );

    /* *** init ffmpeg library (libavcodec) *** */
    if( !b_ffmpeginit )
    {
        avcodec_init();
        avcodec_register_all();
437
        av_log_set_callback( E_(LibavcodecCallback) );
gbazin's avatar
   
gbazin committed
438
        b_ffmpeginit = 1;
439

gbazin's avatar
   
gbazin committed
440
        msg_Dbg( p_object, "libavcodec initialized (interface %d )",
441
                 LIBAVCODEC_VERSION_INT );
gbazin's avatar
   
gbazin committed
442
443
    }
    else
444
    {
gbazin's avatar
   
gbazin committed
445
446
        msg_Dbg( p_object, "libavcodec already initialized" );
    }
447

gbazin's avatar
   
gbazin committed
448
449
450
    vlc_mutex_unlock( lockval.p_address );
}

451
452
453
454
455
456
457
458
459
460
461
/*****************************************************************************
 * Chroma fourcc -> ffmpeg_id mapping
 *****************************************************************************/
static struct
{
    vlc_fourcc_t  i_chroma;
    int  i_chroma_id;

} chroma_table[] =
{
    /* Planar YUV formats */
462
    { VLC_FOURCC('Y','U','V','A'), PIX_FMT_YUV444P }, /* Hack */
463
    { VLC_FOURCC('I','4','4','4'), PIX_FMT_YUV444P },
464
    { VLC_FOURCC('J','4','4','4'), PIX_FMT_YUVJ444P },
465
    { VLC_FOURCC('I','4','2','2'), PIX_FMT_YUV422P },
466
    { VLC_FOURCC('J','4','2','2'), PIX_FMT_YUVJ422P },
467
468
469
    { VLC_FOURCC('I','4','2','0'), PIX_FMT_YUV420P },
    { VLC_FOURCC('Y','V','1','2'), PIX_FMT_YUV420P },
    { VLC_FOURCC('I','Y','U','V'), PIX_FMT_YUV420P },
470
    { VLC_FOURCC('J','4','2','0'), PIX_FMT_YUVJ420P },
471
472
473
474
475
476
    { VLC_FOURCC('I','4','1','1'), PIX_FMT_YUV411P },
    { VLC_FOURCC('I','4','1','0'), PIX_FMT_YUV410P },
    { VLC_FOURCC('Y','V','U','9'), PIX_FMT_YUV410P },

    /* Packed YUV formats */
    { VLC_FOURCC('Y','U','Y','2'), PIX_FMT_YUV422 },
477
    { VLC_FOURCC('Y','U','Y','V'), PIX_FMT_YUV422 },
478
    { VLC_FOURCC('U','Y','V','Y'), PIX_FMT_UYVY422 },
479
480
481
482
483
484
485
486

    /* Packed RGB formats */
    { VLC_FOURCC('R','V','1','5'), PIX_FMT_RGB555 },
    { VLC_FOURCC('R','V','1','6'), PIX_FMT_RGB565 },
    { VLC_FOURCC('R','V','2','4'), PIX_FMT_RGB24 },
    { VLC_FOURCC('R','V','3','2'), PIX_FMT_RGBA32 },
    { VLC_FOURCC('G','R','E','Y'), PIX_FMT_GRAY8 },

487
    { 0, 0 }
488
};
gbazin's avatar
   
gbazin committed
489

490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
int E_(GetFfmpegChroma)( vlc_fourcc_t i_chroma )
{
    int i;

    for( i = 0; chroma_table[i].i_chroma != 0; i++ )
    {
        if( chroma_table[i].i_chroma == i_chroma )
            return chroma_table[i].i_chroma_id;
    }
    return -1;
}

vlc_fourcc_t E_(GetVlcChroma)( int i_ffmpeg_chroma )
{
    int i;

    for( i = 0; chroma_table[i].i_chroma != 0; i++ )
    {
        if( chroma_table[i].i_chroma_id == i_ffmpeg_chroma )
            return chroma_table[i].i_chroma;
    }
    return 0;
}

/*****************************************************************************
 * Codec fourcc -> ffmpeg_id mapping
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
517
518
519
520
521
static struct
{
    vlc_fourcc_t  i_fourcc;
    int  i_codec;
    int  i_cat;
522
    const char *psz_name;
gbazin's avatar
   
gbazin committed
523

gbazin's avatar
   
gbazin committed
524
525
} codecs_table[] =
{
gbazin's avatar
   
gbazin committed
526
    /* MPEG-1 Video */
gbazin's avatar
   
gbazin committed
527
528
    { VLC_FOURCC('m','p','1','v'), CODEC_ID_MPEG1VIDEO,
      VIDEO_ES, "MPEG-1 Video" },
gbazin's avatar
   
gbazin committed
529
530

    /* MPEG-2 Video */
gbazin's avatar
   
gbazin committed
531
532
533
534
    { VLC_FOURCC('m','p','2','v'), CODEC_ID_MPEG2VIDEO,
      VIDEO_ES, "MPEG-2 Video" },
    { VLC_FOURCC('m','p','g','v'), CODEC_ID_MPEG2VIDEO,
      VIDEO_ES, "MPEG-2 Video" },
gbazin's avatar
   
gbazin committed
535
536

    /* MPEG-4 Video */
gbazin's avatar
   
gbazin committed
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
    { VLC_FOURCC('D','I','V','X'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('d','i','v','x'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('M','P','4','S'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('m','p','4','s'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('M','4','S','2'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('m','4','s','2'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('x','v','i','d'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('X','V','I','D'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('X','v','i','D'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
555
556
557
558
    { VLC_FOURCC('X','V','I','X'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('x','v','i','x'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
559
560
561
562
563
564
    { VLC_FOURCC('D','X','5','0'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('d','x','5','0'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('m','p','4','v'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
565
566
    { VLC_FOURCC('M','P','4','V'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
567
568
569
570
571
572
    { VLC_FOURCC( 4,  0,  0,  0 ), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('m','4','c','c'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('M','4','C','C'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
573
574
    { VLC_FOURCC('F','M','P','4'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
575
576
    /* 3ivx delta 3.5 Unsupported
     * putting it here gives extreme distorted images
gbazin's avatar
   
gbazin committed
577
578
579
580
    { VLC_FOURCC('3','I','V','1'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('3','i','v','1'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" }, */
gbazin's avatar
   
gbazin committed
581
    /* 3ivx delta 4 */
gbazin's avatar
   
gbazin committed
582
583
584
585
    { VLC_FOURCC('3','I','V','2'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
    { VLC_FOURCC('3','i','v','2'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
586
587

    /* MSMPEG4 v1 */
gbazin's avatar
   
gbazin committed
588
589
590
591
592
593
594
595
    { VLC_FOURCC('D','I','V','1'), CODEC_ID_MSMPEG4V1,
      VIDEO_ES, "MS MPEG-4 Video v1" },
    { VLC_FOURCC('d','i','v','1'), CODEC_ID_MSMPEG4V1,
      VIDEO_ES, "MS MPEG-4 Video v1" },
    { VLC_FOURCC('M','P','G','4'), CODEC_ID_MSMPEG4V1,
      VIDEO_ES, "MS MPEG-4 Video v1" },
    { VLC_FOURCC('m','p','g','4'), CODEC_ID_MSMPEG4V1,
      VIDEO_ES, "MS MPEG-4 Video v1" },
gbazin's avatar
   
gbazin committed
596
597

    /* MSMPEG4 v2 */
gbazin's avatar
   
gbazin committed
598
599
600
601
602
603
604
605
    { VLC_FOURCC('D','I','V','2'), CODEC_ID_MSMPEG4V2,
      VIDEO_ES, "MS MPEG-4 Video v2" },
    { VLC_FOURCC('d','i','v','2'), CODEC_ID_MSMPEG4V2,
      VIDEO_ES, "MS MPEG-4 Video v2" },
    { VLC_FOURCC('M','P','4','2'), CODEC_ID_MSMPEG4V2,
      VIDEO_ES, "MS MPEG-4 Video v2" },
    { VLC_FOURCC('m','p','4','2'), CODEC_ID_MSMPEG4V2,
      VIDEO_ES, "MS MPEG-4 Video v2" },
gbazin's avatar
   
gbazin committed
606
607

    /* MSMPEG4 v3 / M$ mpeg4 v3 */
gbazin's avatar
   
gbazin committed
608
609
610
611
612
613
614
615
616
617
    { VLC_FOURCC('M','P','G','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('m','p','g','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('d','i','v','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('M','P','4','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('m','p','4','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
618
    /* DivX 3.20 */
gbazin's avatar
   
gbazin committed
619
620
621
622
623
624
625
626
627
628
629
630
631
632
    { VLC_FOURCC('D','I','V','3'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('D','I','V','4'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('d','i','v','4'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('D','I','V','5'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('d','i','v','5'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('D','I','V','6'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('d','i','v','6'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
633
    /* AngelPotion stuff */
gbazin's avatar
   
gbazin committed
634
635
    { VLC_FOURCC('A','P','4','1'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
636
    /* 3ivx doctered divx files */
gbazin's avatar
   
gbazin committed
637
638
639
640
    { VLC_FOURCC('3','I','V','D'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('3','i','v','d'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
641
    /* who knows? */
gbazin's avatar
   
gbazin committed
642
643
644
645
    { VLC_FOURCC('3','V','I','D'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
    { VLC_FOURCC('3','v','i','d'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
646
647

    /* Sorenson v1 */
gbazin's avatar
   
gbazin committed
648
649
    { VLC_FOURCC('S','V','Q','1'), CODEC_ID_SVQ1,
      VIDEO_ES, "SVQ-1 (Sorenson Video v1)" },
gbazin's avatar
   
gbazin committed
650
651

    /* Sorenson v3 */
gbazin's avatar
   
gbazin committed
652
653
    { VLC_FOURCC('S','V','Q','3'), CODEC_ID_SVQ3,
      VIDEO_ES, "SVQ-3 (Sorenson Video v3)" },
gbazin's avatar
   
gbazin committed
654

Laurent Aimar's avatar
Laurent Aimar committed
655
    /* h264 */
gbazin's avatar
   
gbazin committed
656
657
658
659
    { VLC_FOURCC('h','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
    { VLC_FOURCC('H','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
660
661
    { VLC_FOURCC('x','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
662
663
    { VLC_FOURCC('X','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
664
665
666
    /* avc1: special case h264 */
    { VLC_FOURCC('a','v','c','1'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
Laurent Aimar's avatar
Laurent Aimar committed
667
668
669
670
    { VLC_FOURCC('V','S','S','H'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
    { VLC_FOURCC('v','s','s','h'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
Laurent Aimar's avatar
Laurent Aimar committed
671

gbazin's avatar
   
gbazin committed
672
673
/* H263 and H263i */
/* H263(+) is also known as Real Video 1.0 */
hartman's avatar
hartman committed
674

675
/* FIXME FOURCC_H263P exist but what fourcc ? */
hartman's avatar
hartman committed
676

gbazin's avatar
   
gbazin committed
677
    /* H263 */
gbazin's avatar
   
gbazin committed
678
679
680
681
682
683
    { VLC_FOURCC('H','2','6','3'), CODEC_ID_H263,
      VIDEO_ES, "H263" },
    { VLC_FOURCC('h','2','6','3'), CODEC_ID_H263,
      VIDEO_ES, "H263" },
    { VLC_FOURCC('U','2','6','3'), CODEC_ID_H263,
      VIDEO_ES, "H263" },
684
685
    { VLC_FOURCC('M','2','6','3'), CODEC_ID_H263,
      VIDEO_ES, "H263" },
gbazin's avatar
   
gbazin committed
686
687

    /* H263i */
gbazin's avatar
   
gbazin committed
688
689
690
691
    { VLC_FOURCC('I','2','6','3'), CODEC_ID_H263I,
      VIDEO_ES, "I263.I" },
    { VLC_FOURCC('i','2','6','3'), CODEC_ID_H263I,
      VIDEO_ES, "I263.I" },
gbazin's avatar
   
gbazin committed
692
693

    /* Flash (H263) variant */
gbazin's avatar
   
gbazin committed
694
695
    { VLC_FOURCC('F','L','V','1'), CODEC_ID_FLV1,
      VIDEO_ES, "Flash Video" },
696

697
698
699
    { VLC_FOURCC('H','2','6','1'), CODEC_ID_H261,
      VIDEO_ES, "H.261" },

gbazin's avatar
   
gbazin committed
700
701
    { VLC_FOURCC('F','L','I','C'), CODEC_ID_FLIC,
      VIDEO_ES, "Flic Video" },
702

gbazin's avatar
   
gbazin committed
703
    /* MJPEG */
704
    { VLC_FOURCC( 'M','J','P','G' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
705
      VIDEO_ES, "Motion JPEG Video" },
706
    { VLC_FOURCC( 'm','j','p','g' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
707
      VIDEO_ES, "Motion JPEG Video" },
708
    { VLC_FOURCC( 'm','j','p','a' ), CODEC_ID_MJPEG, /* for mov file */
gbazin's avatar
   
gbazin committed
709
      VIDEO_ES, "Motion JPEG Video" },
710
    { VLC_FOURCC( 'j','p','e','g' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
711
      VIDEO_ES, "Motion JPEG Video" },
712
    { VLC_FOURCC( 'J','P','E','G' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
713
      VIDEO_ES, "Motion JPEG Video" },
714
    { VLC_FOURCC( 'J','F','I','F' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
715
      VIDEO_ES, "Motion JPEG Video" },
716
    { VLC_FOURCC( 'J','P','G','L' ), CODEC_ID_MJPEG,
gbazin's avatar
   
gbazin committed
717
      VIDEO_ES, "Motion JPEG Video" },
718
    { VLC_FOURCC( 'm','j','p','b' ), CODEC_ID_MJPEGB, /* for mov file */
gbazin's avatar
   
gbazin committed
719
      VIDEO_ES, "Motion JPEG B Video" },
720
    { VLC_FOURCC( 'S','P','5','X' ), CODEC_ID_SP5X,
gbazin's avatar
   
gbazin committed
721
722
      VIDEO_ES, "Sunplus Motion JPEG Video" },

gbazin's avatar
   
gbazin committed
723
    /* DV */
gbazin's avatar
   
gbazin committed
724
725
726
727
728
729
730
731
732
733
    { VLC_FOURCC('d','v','s','l'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
    { VLC_FOURCC('d','v','s','d'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
    { VLC_FOURCC('D','V','S','D'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
    { VLC_FOURCC('d','v','h','d'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
    { VLC_FOURCC('d','v','c',' '), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
734
735
    { VLC_FOURCC('d','v','c','p'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video PAL" },
gbazin's avatar
   
gbazin committed
736
    { VLC_FOURCC('d','v','p',' '), CODEC_ID_DVVIDEO,
737
738
739
      VIDEO_ES, "DV Video Pro" },
    { VLC_FOURCC('d','v','p','p'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video Pro PAL" },
gbazin's avatar
   
gbazin committed
740
741
    { VLC_FOURCC('C','D','V','C'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
gbazin's avatar
   
gbazin committed
742
743

    /* Windows Media Video */
gbazin's avatar
   
gbazin committed
744
745
746
747
    { VLC_FOURCC('W','M','V','1'), CODEC_ID_WMV1,
      VIDEO_ES, "Windows Media Video 1" },
    { VLC_FOURCC('W','M','V','2'), CODEC_ID_WMV2,
      VIDEO_ES, "Windows Media Video 2" },
748
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(10<<8)+1)
749
750
    { VLC_FOURCC('W','M','V','3'), CODEC_ID_WMV3,
      VIDEO_ES, "Windows Media Video 3" },
751
752
    { VLC_FOURCC('W','V','C','1'), CODEC_ID_VC1,
      VIDEO_ES, "Windows Media Video VC1" },
753
#endif
754
755
756
757
758
#if 0
    /* WMVA is the VC-1 codec before the standardization proces,
       it is not bitstream compatible and deprecated  */
    { VLC_FOURCC('W','M','V','A'), CODEC_ID_VC1,
      VIDEO_ES, "Windows Media Video Advanced Profile" },
759
#endif
gbazin's avatar
   
gbazin committed
760
761

    /* Microsoft Video 1 */
gbazin's avatar
   
gbazin committed
762
763
764
765
766
767
768
769
770
771
772
773
    { VLC_FOURCC('M','S','V','C'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
    { VLC_FOURCC('m','s','v','c'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
    { VLC_FOURCC('C','R','A','M'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
    { VLC_FOURCC('c','r','a','m'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
    { VLC_FOURCC('W','H','A','M'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
    { VLC_FOURCC('w','h','a','m'), CODEC_ID_MSVIDEO1,
      VIDEO_ES, "Microsoft Video 1" },
gbazin's avatar
   
gbazin committed
774
775

    /* Microsoft RLE */
gbazin's avatar
   
gbazin committed
776
777
778
779
    { VLC_FOURCC('m','r','l','e'), CODEC_ID_MSRLE,
      VIDEO_ES, "Microsoft RLE Video" },
    { VLC_FOURCC(0x1,0x0,0x0,0x0), CODEC_ID_MSRLE,
      VIDEO_ES, "Microsoft RLE Video" },
hartman's avatar
hartman committed
780

gbazin's avatar
   
gbazin committed
781
    /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
gbazin's avatar
   
gbazin committed
782
783
784
785
786
787
788
789
    { VLC_FOURCC('I','V','3','1'), CODEC_ID_INDEO3,
      VIDEO_ES, "Indeo Video v3" },
    { VLC_FOURCC('i','v','3','1'), CODEC_ID_INDEO3,
      VIDEO_ES, "Indeo Video v3" },
    { VLC_FOURCC('I','V','3','2'), CODEC_ID_INDEO3,
      VIDEO_ES, "Indeo Video v3" },
    { VLC_FOURCC('i','v','3','2'), CODEC_ID_INDEO3,
      VIDEO_ES, "Indeo Video v3" },
790

791
792
793
    { VLC_FOURCC('t','s','c','c'), CODEC_ID_TSCC,
      VIDEO_ES, "TechSmith Camtasia Screen Capture Video" },

gbazin's avatar
   
gbazin committed
794
    /* Huff YUV */
gbazin's avatar
   
gbazin committed
795
796
    { VLC_FOURCC('H','F','Y','U'), CODEC_ID_HUFFYUV,
      VIDEO_ES, "Huff YUV Video" },
gbazin's avatar
   
gbazin committed
797
798

    /* Creative YUV */
gbazin's avatar
   
gbazin committed
799
800
    { VLC_FOURCC('C','Y','U','V'), CODEC_ID_CYUV,
      VIDEO_ES, "Creative YUV Video" },
gbazin's avatar
   
gbazin committed
801
802

    /* On2 VP3 Video Codecs */
803
804
805
806
    { VLC_FOURCC('V','P','3',' '), CODEC_ID_VP3,
      VIDEO_ES, "On2's VP3 Video" },
    { VLC_FOURCC('V','P','3','0'), CODEC_ID_VP3,
      VIDEO_ES, "On2's VP3 Video" },
gbazin's avatar
   
gbazin committed
807
808
809
810
    { VLC_FOURCC('V','P','3','1'), CODEC_ID_VP3,
      VIDEO_ES, "On2's VP3 Video" },
    { VLC_FOURCC('v','p','3','1'), CODEC_ID_VP3,
      VIDEO_ES, "On2's VP3 Video" },
811

812
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(14<<8)+0)
813
814
815
816
817
818
819
820
    { VLC_FOURCC('V','P','5',' '), CODEC_ID_VP5,
      VIDEO_ES, "On2's VP5 Video" },
    { VLC_FOURCC('V','P','5','0'), CODEC_ID_VP5,
      VIDEO_ES, "On2's VP5 Video" },
    { VLC_FOURCC('V','P','6','2'), CODEC_ID_VP6,
      VIDEO_ES, "On2's VP6.2 Video" },
    { VLC_FOURCC('v','p','6','2'), CODEC_ID_VP6,
      VIDEO_ES, "On2's VP6.2 Video" },
821
822
    { VLC_FOURCC('V','P','6','F'), CODEC_ID_VP6F,
      VIDEO_ES, "On2's VP6.2 Video (Flash)" },
823
824
#endif

825
826
827
828
829
830
831
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(27<<8)+0)
    { VLC_FOURCC('V','P','6','0'), CODEC_ID_VP6,
      VIDEO_ES, "On2's VP6.0 Video" },
    { VLC_FOURCC('V','P','6','1'), CODEC_ID_VP6,
      VIDEO_ES, "On2's VP6.1 Video" },
#endif

832
    /* Xiph.org theora */
gbazin's avatar
   
gbazin committed
833
834
    { VLC_FOURCC('t','h','e','o'), CODEC_ID_THEORA,
      VIDEO_ES, "Xiph.org's Theora Video" },
835

hartman's avatar
hartman committed
836
#if ( !defined( WORDS_BIGENDIAN ) )
gbazin's avatar
   
gbazin committed
837
    /* Asus Video (Another thing that doesn't work on PPC) */
gbazin's avatar
   
gbazin committed
838
839
840
841
    { VLC_FOURCC('A','S','V','1'), CODEC_ID_ASV1,
      VIDEO_ES, "Asus V1 Video" },
    { VLC_FOURCC('A','S','V','2'), CODEC_ID_ASV2,
      VIDEO_ES, "Asus V2 Video" },
gbazin's avatar
   
gbazin committed
842
#endif
843

gbazin's avatar
   
gbazin committed
844
    /* FFMPEG Video 1 (lossless codec) */
gbazin's avatar
   
gbazin committed
845
846
    { VLC_FOURCC('F','F','V','1'), CODEC_ID_FFV1,
      VIDEO_ES, "FFMpeg Video 1" },
hartman's avatar
hartman committed
847

gbazin's avatar
   
gbazin committed
848
    /* ATI VCR1 */
gbazin's avatar
   
gbazin committed
849
850
    { VLC_FOURCC('V','C','R','1'), CODEC_ID_VCR1,
      VIDEO_ES, "ATI VCR1 Video" },
hartman's avatar
hartman committed
851

gbazin's avatar
   
gbazin committed
852
    /* Cirrus Logic AccuPak */
gbazin's avatar
   
gbazin committed
853
854
    { VLC_FOURCC('C','L','J','R'), CODEC_ID_CLJR,
      VIDEO_ES, "Creative Logic AccuPak" },
hartman's avatar
hartman committed
855

gbazin's avatar
   
gbazin committed
856
857
858
859
860
    /* Real Video */
    { VLC_FOURCC('R','V','1','0'), CODEC_ID_RV10,
      VIDEO_ES, "Real Video 10" },
    { VLC_FOURCC('R','V','1','3'), CODEC_ID_RV10,
      VIDEO_ES, "Real Video 13" },
861
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(15<<8)+1)
862
863
864
    { VLC_FOURCC('R','V','2','0'), CODEC_ID_RV20,
      VIDEO_ES, "Real Video 20" },
#endif
865

gbazin's avatar
   
gbazin committed
866
    /* Apple Video */
gbazin's avatar
   
gbazin committed
867
868
    { VLC_FOURCC('r','p','z','a'), CODEC_ID_RPZA,
      VIDEO_ES, "Apple Video" },
gbazin's avatar
   
gbazin committed
869

sigmunau's avatar
sigmunau committed
870
871
    { VLC_FOURCC('s','m','c',' '), CODEC_ID_SMC,
      VIDEO_ES, "Apple graphics" },
hartman's avatar
hartman committed
872

gbazin's avatar
   
gbazin committed
873
    /* Cinepak */
gbazin's avatar
   
gbazin committed
874
875
    { VLC_FOURCC('c','v','i','d'), CODEC_ID_CINEPAK,
      VIDEO_ES, "Cinepak Video" },
gbazin's avatar
   
gbazin committed
876
877
878
879

    /* Id Quake II CIN */
    { VLC_FOURCC('I','D','C','I'), CODEC_ID_IDCIN,
      VIDEO_ES, "Id Quake II CIN Video" },
gbazin's avatar
   
gbazin committed
880

gbazin's avatar
   
gbazin committed
881
882
883
884
885
886
887
888
    /* 4X Technologies */
    { VLC_FOURCC('4','x','m','v'), CODEC_ID_4XM,
      VIDEO_ES, "4X Technologies Video" },

    /* Duck TrueMotion */
    { VLC_FOURCC('D','U','C','K'), CODEC_ID_TRUEMOTION1,
      VIDEO_ES, "Duck TrueMotion v1 Video" },

gbazin's avatar
   
gbazin committed
889
890
891
892
    /* Interplay MVE */
    { VLC_FOURCC('i','m','v','e'), CODEC_ID_INTERPLAY_VIDEO,
      VIDEO_ES, "Interplay MVE Video" },

gbazin's avatar
   
gbazin committed
893
894
895
896
897
898
899
900
901
902
903
904
    /* Id RoQ */
    { VLC_FOURCC('R','o','Q','v'), CODEC_ID_ROQ,
      VIDEO_ES, "Id RoQ Video" },

    /* Sony Playstation MDEC */
    { VLC_FOURCC('M','D','E','C'), CODEC_ID_MDEC,
      VIDEO_ES, "PSX MDEC Video" },

    /* Sierra VMD */
    { VLC_FOURCC('v','m','d','v'), CODEC_ID_VMDVIDEO,
      VIDEO_ES, "Sierra VMD Video" },

gbazin's avatar
gbazin committed
905
906
907
908
    /* FFMPEG's SNOW wavelet codec */
    { VLC_FOURCC('S','N','O','W'), CODEC_ID_SNOW,
      VIDEO_ES, "FFMpeg SNOW wavelet Video" },

909
910
911
    { VLC_FOURCC('r','l','e',' '), CODEC_ID_QTRLE,
      VIDEO_ES, "Apple QuickTime RLE Video" },

912
913
914
915
916
917
918
919
920
921
922
923
924
    { VLC_FOURCC('q','d','r','w'), CODEC_ID_QDRAW,
      VIDEO_ES, "Apple QuickDraw Video" },

    { VLC_FOURCC('Q','P','E','G'), CODEC_ID_QPEG,
      VIDEO_ES, "QPEG Video" },
    { VLC_FOURCC('Q','1','.','0'), CODEC_ID_QPEG,
      VIDEO_ES, "QPEG Video" },
    { VLC_FOURCC('Q','1','.','1'), CODEC_ID_QPEG,
      VIDEO_ES, "QPEG Video" },

    { VLC_FOURCC('U','L','T','I'), CODEC_ID_ULTI,
      VIDEO_ES, "IBM Ultimotion Video" },

925
926
927
    { VLC_FOURCC('V','I','X','L'), CODEC_ID_VIXL,
      VIDEO_ES, "Miro/Pinnacle VideoXL Video" },

928
929
930
931
932
933
934
935
    { VLC_FOURCC('L','O','C','O'), CODEC_ID_LOCO,
      VIDEO_ES, "LOCO Video" },

    { VLC_FOURCC('W','N','V','1'), CODEC_ID_WNV1,
      VIDEO_ES, "Winnov WNV1 Video" },

    { VLC_FOURCC('A','A','S','C'), CODEC_ID_AASC,
      VIDEO_ES, "Autodesc RLE Video" },
936

937
938
    { VLC_FOURCC('I','V','2','0'), CODEC_ID_INDEO2,
      VIDEO_ES, "Indeo Video v2" },
939
940
    { VLC_FOURCC('R','T','2','1'), CODEC_ID_INDEO2,
      VIDEO_ES, "Indeo Video v2" },
941

942
943
944
945
946
    /* Flash Screen Video */
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(11<<8)+0)
    { VLC_FOURCC('F','S','V','1'), CODEC_ID_FLASHSV,
              VIDEO_ES, "Flash Screen Video" },
#endif
947
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(13<<8)+0)
948
949
950
951
    { VLC_FOURCC('V','M','n','c'), CODEC_ID_VMNC,
      VIDEO_ES, "VMware Video" },
#endif

952
953
954
955
956
957
958
959
960
961
962
963
964
    /*
     *  Image codecs
     */
    { VLC_FOURCC('p','n','g',' '), CODEC_ID_PNG,
      VIDEO_ES, "PNG Image" },
    { VLC_FOURCC('p','p','m',' '), CODEC_ID_PPM,
      VIDEO_ES, "PPM Image" },
    { VLC_FOURCC('p','g','m',' '), CODEC_ID_PGM,
      VIDEO_ES, "PGM Image" },
    { VLC_FOURCC('p','g','m','y'), CODEC_ID_PGMYUV,
      VIDEO_ES, "PGM YUV Image" },
    { VLC_FOURCC('p','a','m',' '), CODEC_ID_PAM,
      VIDEO_ES, "PAM Image" },
965

966
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(0<<8)+0)
967
968
    { VLC_FOURCC('b','m','p',' '), CODEC_ID_BMP,
      VIDEO_ES, "BMP Image" },
969
970
#endif

971
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(40<<8)+1)
972
973
974
975
    { VLC_FOURCC('g','i','f',' '), CODEC_ID_GIF,
      VIDEO_ES, "GIF Image" },
#endif

gbazin's avatar
   
gbazin committed
976
977
978
979
980
    /*
     *  Audio Codecs
     */

    /* Windows Media Audio 1 */
gbazin's avatar
   
gbazin committed
981
982
983
984
    { VLC_FOURCC('W','M','A','1'), CODEC_ID_WMAV1,
      AUDIO_ES, "Windows Media Audio 1" },
    { VLC_FOURCC('w','m','a','1'), CODEC_ID_WMAV1,
      AUDIO_ES, "Windows Media Audio 1" },
gbazin's avatar
   
gbazin committed
985
986

    /* Windows Media Audio 2 */
gbazin's avatar
   
gbazin committed
987
988
989
990
    { VLC_FOURCC('W','M','A','2'), CODEC_ID_WMAV2,
      AUDIO_ES, "Windows Media Audio 2" },
    { VLC_FOURCC('w','m','a','2'), CODEC_ID_WMAV2,
      AUDIO_ES, "Windows Media Audio 2" },
gbazin's avatar
   
gbazin committed
991
992

    /* DV Audio */
gbazin's avatar
   
gbazin committed
993
994
    { VLC_FOURCC('d','v','a','u'), CODEC_ID_DVAUDIO,
      AUDIO_ES, "DV Audio" },
gbazin's avatar
   
gbazin committed
995
996

    /* MACE-3 Audio */
gbazin's avatar
   
gbazin committed
997
998
    { VLC_FOURCC('M','A','C','3'), CODEC_ID_MACE3,
      AUDIO_ES, "MACE-3 Audio" },
gbazin's avatar
   
gbazin committed
999
1000

    /* MACE-6 Audio */
gbazin's avatar
   
gbazin committed
1001
1002
    { VLC_FOURCC('M','A','C','6'), CODEC_ID_MACE6,
      AUDIO_ES, "MACE-6 Audio" },
gbazin's avatar
   
gbazin committed
1003
1004

    /* RealAudio 1.0 */
gbazin's avatar
   
gbazin committed
1005
1006
    { VLC_FOURCC('1','4','_','4'), CODEC_ID_RA_144,
      AUDIO_ES, "RealAudio 1.0" },
gbazin's avatar
   
gbazin committed
1007
1008

    /* RealAudio 2.0 */
gbazin's avatar
   
gbazin committed
1009
1010
    { VLC_FOURCC('2','8','_','8'), CODEC_ID_RA_288,
      AUDIO_ES, "RealAudio 2.0" },
gbazin's avatar
   
gbazin committed
1011
1012

    /* MPEG Audio layer 1/2/3 */
gbazin's avatar
   
gbazin committed
1013
1014
1015
1016
    { VLC_FOURCC('m','p','g','a'), CODEC_ID_MP2,
      AUDIO_ES, "MPEG Audio layer 1/2" },
    { VLC_FOURCC('m','p','3',' '), CODEC_ID_MP3,
      AUDIO_ES, "MPEG Audio layer 1/2/3" },
gbazin's avatar
   
gbazin committed
1017