ffmpeg.c 40.8 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" },
535
536
537
    /* ATI VCR2 */
    { VLC_FOURCC('V','C','R','2'), CODEC_ID_MPEG2VIDEO,
      VIDEO_ES, "ATI VCR2 Video" },
gbazin's avatar
   
gbazin committed
538
539

    /* MPEG-4 Video */
gbazin's avatar
   
gbazin committed
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
    { 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" },
558
559
560
561
    { 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
562
563
564
565
566
567
    { 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" },
568
569
    { VLC_FOURCC('M','P','4','V'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
570
571
572
573
574
575
    { 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" },
576
577
    { VLC_FOURCC('F','M','P','4'), CODEC_ID_MPEG4,
      VIDEO_ES, "MPEG-4 Video" },
gbazin's avatar
   
gbazin committed
578
579
    /* 3ivx delta 3.5 Unsupported
     * putting it here gives extreme distorted images
gbazin's avatar
   
gbazin committed
580
581
582
583
    { 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
584
    /* 3ivx delta 4 */
gbazin's avatar
   
gbazin committed
585
586
587
588
    { 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
589
590

    /* MSMPEG4 v1 */
gbazin's avatar
   
gbazin committed
591
592
593
594
595
596
597
598
    { 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
599
600

    /* MSMPEG4 v2 */
gbazin's avatar
   
gbazin committed
601
602
603
604
605
606
607
608
    { 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
609
610

    /* MSMPEG4 v3 / M$ mpeg4 v3 */
gbazin's avatar
   
gbazin committed
611
612
613
614
615
616
617
618
619
620
    { 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
621
    /* DivX 3.20 */
gbazin's avatar
   
gbazin committed
622
623
624
625
626
627
628
629
630
631
632
633
634
635
    { 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
636
    /* AngelPotion stuff */
gbazin's avatar
   
gbazin committed
637
638
    { VLC_FOURCC('A','P','4','1'), CODEC_ID_MSMPEG4V3,
      VIDEO_ES, "MS MPEG-4 Video v3" },
gbazin's avatar
   
gbazin committed
639
    /* 3ivx doctered divx files */
gbazin's avatar
   
gbazin committed
640
641
642
643
    { 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
644
    /* who knows? */
gbazin's avatar
   
gbazin committed
645
646
647
648
    { 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
649
650

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

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

Laurent Aimar's avatar
Laurent Aimar committed
658
    /* h264 */
gbazin's avatar
   
gbazin committed
659
660
661
662
    { VLC_FOURCC('h','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
    { VLC_FOURCC('H','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
663
664
    { VLC_FOURCC('x','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
665
666
    { VLC_FOURCC('X','2','6','4'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
667
668
669
    /* avc1: special case h264 */
    { VLC_FOURCC('a','v','c','1'), CODEC_ID_H264,
      VIDEO_ES, "h264" },
Laurent Aimar's avatar
Laurent Aimar committed
670
671
672
673
    { 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
674

gbazin's avatar
   
gbazin committed
675
676
/* H263 and H263i */
/* H263(+) is also known as Real Video 1.0 */
hartman's avatar
hartman committed
677

678
/* FIXME FOURCC_H263P exist but what fourcc ? */
hartman's avatar
hartman committed
679

gbazin's avatar
   
gbazin committed
680
    /* H263 */
gbazin's avatar
   
gbazin committed
681
682
683
684
685
686
    { 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" },
687
688
    { VLC_FOURCC('M','2','6','3'), CODEC_ID_H263,
      VIDEO_ES, "H263" },
gbazin's avatar
   
gbazin committed
689
690

    /* H263i */
gbazin's avatar
   
gbazin committed
691
692
693
694
    { 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
695
696

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

700
701
702
    { VLC_FOURCC('H','2','6','1'), CODEC_ID_H261,
      VIDEO_ES, "H.261" },

gbazin's avatar
   
gbazin committed
703
704
    { VLC_FOURCC('F','L','I','C'), CODEC_ID_FLIC,
      VIDEO_ES, "Flic Video" },
705

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

gbazin's avatar
   
gbazin committed
726
    /* DV */
gbazin's avatar
   
gbazin committed
727
728
729
730
731
732
733
734
735
736
    { 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" },
737
738
    { VLC_FOURCC('d','v','c','p'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video PAL" },
gbazin's avatar
   
gbazin committed
739
    { VLC_FOURCC('d','v','p',' '), CODEC_ID_DVVIDEO,
740
741
742
      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
743
744
    { VLC_FOURCC('C','D','V','C'), CODEC_ID_DVVIDEO,
      VIDEO_ES, "DV Video" },
gbazin's avatar
   
gbazin committed
745
746

    /* Windows Media Video */
gbazin's avatar
   
gbazin committed
747
748
749
750
    { 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" },
751
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(10<<8)+1)
752
753
    { VLC_FOURCC('W','M','V','3'), CODEC_ID_WMV3,
      VIDEO_ES, "Windows Media Video 3" },
754
755
    { VLC_FOURCC('W','V','C','1'), CODEC_ID_VC1,
      VIDEO_ES, "Windows Media Video VC1" },
756
#endif
757
758
759
760
761
#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" },
762
#endif
gbazin's avatar
   
gbazin committed
763
764

    /* Microsoft Video 1 */
gbazin's avatar
   
gbazin committed
765
766
767
768
769
770
771
772
773
774
775
776
    { 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
777
778

    /* Microsoft RLE */
gbazin's avatar
   
gbazin committed
779
780
781
782
    { 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
783

gbazin's avatar
   
gbazin committed
784
    /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
gbazin's avatar
   
gbazin committed
785
786
787
788
789
790
791
792
    { 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" },
793

794
795
796
    { VLC_FOURCC('t','s','c','c'), CODEC_ID_TSCC,
      VIDEO_ES, "TechSmith Camtasia Screen Capture Video" },

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

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

    /* On2 VP3 Video Codecs */
806
807
808
809
    { 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
810
811
812
813
    { 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" },
814

815
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(14<<8)+0)
816
817
818
819
820
821
822
823
    { 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" },
824
825
    { VLC_FOURCC('V','P','6','F'), CODEC_ID_VP6F,
      VIDEO_ES, "On2's VP6.2 Video (Flash)" },
826
827
#endif

828
829
830
831
832
833
834
#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

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

hartman's avatar
hartman committed
839
#if ( !defined( WORDS_BIGENDIAN ) )
gbazin's avatar
   
gbazin committed
840
    /* Asus Video (Another thing that doesn't work on PPC) */
gbazin's avatar
   
gbazin committed
841
842
843
844
    { 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
845
#endif
846

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

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

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

gbazin's avatar
   
gbazin committed
859
860
861
862
863
    /* 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" },
864
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(15<<8)+1)
865
866
867
    { VLC_FOURCC('R','V','2','0'), CODEC_ID_RV20,
      VIDEO_ES, "Real Video 20" },
#endif
868

gbazin's avatar
   
gbazin committed
869
    /* Apple Video */
gbazin's avatar
   
gbazin committed
870
871
    { VLC_FOURCC('r','p','z','a'), CODEC_ID_RPZA,
      VIDEO_ES, "Apple Video" },
gbazin's avatar
   
gbazin committed
872

sigmunau's avatar
sigmunau committed
873
874
    { VLC_FOURCC('s','m','c',' '), CODEC_ID_SMC,
      VIDEO_ES, "Apple graphics" },
hartman's avatar
hartman committed
875

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

    /* 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
883

gbazin's avatar
   
gbazin committed
884
885
886
887
888
889
890
891
    /* 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
892
893
894
895
    /* Interplay MVE */
    { VLC_FOURCC('i','m','v','e'), CODEC_ID_INTERPLAY_VIDEO,
      VIDEO_ES, "Interplay MVE Video" },

gbazin's avatar
   
gbazin committed
896
897
898
899
900
901
902
903
904
905
906
907
    /* 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
908
909
910
911
    /* FFMPEG's SNOW wavelet codec */
    { VLC_FOURCC('S','N','O','W'), CODEC_ID_SNOW,
      VIDEO_ES, "FFMpeg SNOW wavelet Video" },

912
913
914
    { VLC_FOURCC('r','l','e',' '), CODEC_ID_QTRLE,
      VIDEO_ES, "Apple QuickTime RLE Video" },

915
916
917
918
919
920
921
922
923
924
925
926
927
    { 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" },

928
929
930
    { VLC_FOURCC('V','I','X','L'), CODEC_ID_VIXL,
      VIDEO_ES, "Miro/Pinnacle VideoXL Video" },

931
932
933
934
935
936
937
938
    { 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" },
939

940
941
    { VLC_FOURCC('I','V','2','0'), CODEC_ID_INDEO2,
      VIDEO_ES, "Indeo Video v2" },
942
943
    { VLC_FOURCC('R','T','2','1'), CODEC_ID_INDEO2,
      VIDEO_ES, "Indeo Video v2" },
944

945
946
947
948
949
    /* 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
950
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(13<<8)+0)
951
952
953
954
    { VLC_FOURCC('V','M','n','c'), CODEC_ID_VMNC,
      VIDEO_ES, "VMware Video" },
#endif

955
956
957
958
959
960
961
962
963
964
965
966
967
    /*
     *  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" },
968

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

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

gbazin's avatar
   
gbazin committed
979
980
981
982
983
    /*
     *  Audio Codecs
     */

    /* Windows Media Audio 1 */
gbazin's avatar
   
gbazin committed
984
985
986
987
    { 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
988
989

    /* Windows Media Audio 2 */
gbazin's avatar
   
gbazin committed
990
991
992
993
    { 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
994
995

    /* DV Audio */
gbazin's avatar
   
gbazin committed
996
997
    { VLC_FOURCC('d','v','a','u'), CODEC_ID_DVAUDIO,
      AUDIO_ES, "DV Audio" },
gbazin's avatar
   
gbazin committed
998
999

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

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

    /* RealAudio 1.0 */
gbazin's avatar
   
gbazin committed
1008
1009
    { VLC_FOURCC('1','4','_','4'), CODEC_ID_RA_144,
      AUDIO_ES, "RealAudio 1.0" },
gbazin's avatar
   
gbazin committed
1010
1011

    /* RealAudio 2.0 */
gbazin's avatar
   
gbazin committed
1012
1013
    { VLC_FOURCC('2','8','_','8'), CODEC_ID_RA_288,
      AUDIO_ES, "RealAudio 2.0" },
gbazin's avatar
   
gbazin committed
1014
1015

    /* MPEG Audio layer 1/2/3 */
gbazin's avatar
   
gbazin committed
1016
1017
1018
1019
    { 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
1020
1021

    /* A52 Audio (aka AC3) */
gbazin's avatar
   
gbazin committed
1022
1023
1024
1025
    { VLC_FOURCC('a','5','2',' '), CODEC_ID_AC3,
      AUDIO_ES, "A52 Audio (aka AC3)" },
    { VLC_FOURCC('a','5','2','b'), CODEC_ID_AC3, /* VLC specific hack */