]> git.sesse.net Git - vlc/blob - modules/codec/ffmpeg/ffmpeg.c
* modules/codec/ffmpeg/ffmpeg.c: CODEC_ID_MPEG2VIDEO only supported from version...
[vlc] / modules / codec / ffmpeg / ffmpeg.c
1 /*****************************************************************************
2  * ffmpeg.c: video decoder using ffmpeg library
3  *****************************************************************************
4  * Copyright (C) 1999-2001 VideoLAN
5  * $Id: ffmpeg.c,v 1.58 2003/10/29 20:53:41 gbazin Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Gildas Bazin <gbazin@netcourrier.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <stdlib.h>                                      /* malloc(), free() */
29 #include <string.h>
30
31 #include <vlc/vlc.h>
32 #include <vlc/vout.h>
33 #include <vlc/aout.h>
34 #include <vlc/decoder.h>
35 #include <vlc/input.h>
36
37 #ifdef HAVE_SYS_TIMES_H
38 #   include <sys/times.h>
39 #endif
40
41 /* ffmpeg header */
42 #ifdef HAVE_FFMPEG_AVCODEC_H
43 #   include <ffmpeg/avcodec.h>
44 #else
45 #   include <avcodec.h>
46 #endif
47
48 #if LIBAVCODEC_BUILD < 4655
49 #   error You must have a libavcodec >= 4655 (get CVS)
50 #endif
51
52 #include "ffmpeg.h"
53
54 #ifdef LIBAVCODEC_PP
55 #   ifdef HAVE_POSTPROC_POSTPROCESS_H
56 #       include <postproc/postprocess.h>
57 #   else
58 #       include <libpostproc/postprocess.h>
59 #   endif
60 #endif
61
62 /*****************************************************************************
63  * decoder_sys_t: decoder descriptor
64  *****************************************************************************/
65 struct decoder_sys_t
66 {
67     /* Common part between video and audio decoder */
68     int i_cat;
69     int i_codec_id;
70     char *psz_namecodec;
71
72     AVCodecContext *p_context;
73     AVCodec        *p_codec;
74 };
75
76 /****************************************************************************
77  * Local prototypes
78  ****************************************************************************/
79 static int OpenDecoder( vlc_object_t * );
80 static int InitDecoder( decoder_t * );
81 static int EndDecoder( decoder_t * );
82
83 static int b_ffmpeginit = 0;
84
85 /*****************************************************************************
86  * Module descriptor
87  *****************************************************************************/
88 vlc_module_begin();
89
90     /* decoder main module */
91     add_category_hint( N_("ffmpeg"), NULL, VLC_FALSE );
92     set_capability( "decoder", 70 );
93     set_callbacks( OpenDecoder, NULL );
94     set_description( _("ffmpeg audio/video decoder((MS)MPEG4,SVQ1,H263,WMV,WMA)") );
95
96     add_bool( "ffmpeg-dr", 1, NULL, DR_TEXT, DR_TEXT, VLC_TRUE );
97     add_integer ( "ffmpeg-error-resilience", -1, NULL, ERROR_TEXT,
98         ERROR_LONGTEXT, VLC_TRUE );
99     add_integer ( "ffmpeg-workaround-bugs", 1, NULL, BUGS_TEXT, BUGS_LONGTEXT,
100         VLC_FALSE );
101     add_bool( "ffmpeg-hurry-up", 0, NULL, HURRYUP_TEXT, HURRYUP_LONGTEXT,
102         VLC_FALSE );
103     add_integer( "ffmpeg-truncated", 0, NULL, TRUNC_TEXT, TRUNC_LONGTEXT,
104         VLC_FALSE );
105
106 #ifdef LIBAVCODEC_PP
107     add_integer( "ffmpeg-pp-q", 0, NULL, PP_Q_TEXT, PP_Q_LONGTEXT, VLC_FALSE );
108     add_string( "ffmpeg-pp-name", "default", NULL, LIBAVCODEC_PP_TEXT,
109         LIBAVCODEC_PP_LONGTEXT, VLC_TRUE );
110 #endif
111
112     /* chroma conversion submodule */
113     add_submodule();
114     set_capability( "chroma", 50 );
115     set_callbacks( E_(OpenChroma), NULL );
116     set_description( _("ffmpeg chroma conversion") );
117
118      /* video encoder submodule */
119      add_submodule();
120      set_description( _("ffmpeg video encoder") );
121      set_capability( "video encoder", 100 );
122      set_callbacks( E_(OpenVideoEncoder), E_(CloseVideoEncoder) );
123  
124      /* audio encoder submodule */
125      add_submodule();
126      set_description( _("ffmpeg audio encoder") );
127      set_capability( "audio encoder", 10 );
128      set_callbacks( E_(OpenAudioEncoder), E_(CloseAudioEncoder) );
129  
130     var_Create( p_module->p_libvlc, "avcodec", VLC_VAR_MUTEX );
131 vlc_module_end();
132
133 /*****************************************************************************
134  * OpenDecoder: probe the decoder and return score
135  *****************************************************************************/
136 static int OpenDecoder( vlc_object_t *p_this )
137 {
138     decoder_t *p_dec = (decoder_t*) p_this;
139     int i_cat, i_codec_id;
140     char *psz_namecodec;
141
142     if( !E_(GetFfmpegCodec)( p_dec->p_fifo->i_fourcc, &i_cat, &i_codec_id,
143                              &psz_namecodec ) )
144     {
145         return VLC_EGENERIC;
146     }
147
148     /* Initialization must be done before avcodec_find_decoder() */
149     E_(InitLibavcodec)(p_this);
150
151     if( !avcodec_find_decoder( i_codec_id ) )
152     {
153         msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec );
154         return VLC_EGENERIC;
155     }
156
157     p_dec->pf_init = InitDecoder;
158     p_dec->pf_decode = (i_cat == VIDEO_ES) ? E_(DecodeVideo) : E_(DecodeAudio);
159     p_dec->pf_end = EndDecoder;
160
161     return VLC_SUCCESS;
162 }
163
164 /*****************************************************************************
165  * InitDecoder: Initalize the decoder
166  *****************************************************************************/
167 static int InitDecoder( decoder_t *p_dec )
168 {
169     int i_cat, i_codec_id, i_result;
170     char *psz_namecodec;
171     AVCodecContext *p_context;
172     AVCodec        *p_codec;
173
174     /* *** determine codec type *** */
175     E_(GetFfmpegCodec)( p_dec->p_fifo->i_fourcc,
176                         &i_cat, &i_codec_id, &psz_namecodec );
177
178     /* *** ask ffmpeg for a decoder *** */
179     if( !( p_codec = avcodec_find_decoder( i_codec_id ) ) )
180     {
181         msg_Err( p_dec, "codec not found (%s)", psz_namecodec );
182         return VLC_EGENERIC;
183     }
184
185     /* *** get a p_context *** */
186     p_context = avcodec_alloc_context();
187
188     switch( i_cat )
189     {
190     case VIDEO_ES:
191         i_result = E_( InitVideoDec )( p_dec, p_context, p_codec,
192                                        i_codec_id, psz_namecodec );
193         p_dec->pf_decode = E_(DecodeVideo);
194         break;
195     case AUDIO_ES:
196         i_result = E_( InitAudioDec )( p_dec, p_context, p_codec,
197                                        i_codec_id, psz_namecodec );
198         p_dec->pf_decode = E_(DecodeAudio);
199         break;
200     default:
201         i_result = VLC_EGENERIC;
202     }
203
204     p_dec->p_sys->i_cat = i_cat;
205
206     return i_result;
207 }
208   
209 /*****************************************************************************
210  * EndDecoder: decoder destruction
211  *****************************************************************************/
212 static int EndDecoder( decoder_t *p_dec )
213 {
214     decoder_sys_t *p_sys = p_dec->p_sys;
215
216     if( !p_sys->p_context )
217     {
218         if( p_sys->p_context->extradata )
219             free( p_sys->p_context->extradata );
220
221         avcodec_close( p_sys->p_context );
222         msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec );
223         free( p_sys->p_context );
224     }
225
226     switch( p_sys->i_cat )
227     {
228     case AUDIO_ES:
229         E_( EndAudioDec )( p_dec );
230         break;
231     case VIDEO_ES:
232         E_( EndVideoDec )( p_dec );
233         break;
234     }
235
236     free( p_sys );
237     return VLC_SUCCESS;
238 }
239   
240 /*****************************************************************************
241  * local Functions
242  *****************************************************************************/
243 int E_(GetFfmpegCodec)( vlc_fourcc_t i_fourcc, int *pi_cat,
244                         int *pi_ffmpeg_codec, char **ppsz_name )
245 {
246     int i_cat;
247     int i_codec;
248     char *psz_name;
249
250     switch( i_fourcc )
251     {
252
253     /*
254      *  Video Codecs
255      */
256
257     /* MPEG-1 Video */
258     case VLC_FOURCC('m','p','1','v'):
259         i_cat = VIDEO_ES;
260         i_codec = CODEC_ID_MPEG1VIDEO;
261         psz_name = "MPEG-1 Video";
262         break;
263
264     /* MPEG-2 Video */
265     case VLC_FOURCC('m','p','2','v'):
266     case VLC_FOURCC('m','p','g','v'):
267         i_cat = VIDEO_ES;
268 #if LIBAVCODEC_BUILD >= 4676
269         i_codec = CODEC_ID_MPEG2VIDEO;
270         psz_name = "MPEG-2 Video";
271 #else
272         i_codec = CODEC_ID_MPEG1VIDEO;
273         psz_name = "MPEG-1 Video";
274 #endif
275         break;
276
277     /* MPEG-4 Video */
278     case VLC_FOURCC('D','I','V','X'):
279     case VLC_FOURCC('d','i','v','x'):
280     case VLC_FOURCC('M','P','4','S'):
281     case VLC_FOURCC('m','p','4','s'):
282     case VLC_FOURCC('M','4','S','2'):
283     case VLC_FOURCC('m','4','s','2'):
284     case VLC_FOURCC('x','v','i','d'):
285     case VLC_FOURCC('X','V','I','D'):
286     case VLC_FOURCC('X','v','i','D'):
287     case VLC_FOURCC('D','X','5','0'):
288     case VLC_FOURCC('m','p','4','v'):
289     case VLC_FOURCC( 4,  0,  0,  0 ):
290     case VLC_FOURCC('m','4','c','c'):
291     case VLC_FOURCC('M','4','C','C'):
292     /* 3ivx delta 3.5 Unsupported
293      * putting it here gives extreme distorted images
294     case VLC_FOURCC('3','I','V','1'):
295     case VLC_FOURCC('3','i','v','1'): */
296     /* 3ivx delta 4 */
297     case VLC_FOURCC('3','I','V','2'):
298     case VLC_FOURCC('3','i','v','2'):
299         i_cat = VIDEO_ES;
300         i_codec = CODEC_ID_MPEG4;
301         psz_name = "MPEG-4";
302         break;
303
304     /* MSMPEG4 v1 */
305     case VLC_FOURCC('D','I','V','1'):
306     case VLC_FOURCC('d','i','v','1'):
307     case VLC_FOURCC('M','P','G','4'):
308     case VLC_FOURCC('m','p','g','4'):
309         i_cat = VIDEO_ES;
310         i_codec = CODEC_ID_MSMPEG4V1;
311         psz_name = "MS MPEG-4 v1";
312         break;
313
314     /* MSMPEG4 v2 */
315     case VLC_FOURCC('D','I','V','2'):
316     case VLC_FOURCC('d','i','v','2'):
317     case VLC_FOURCC('M','P','4','2'):
318     case VLC_FOURCC('m','p','4','2'):
319         i_cat = VIDEO_ES;
320         i_codec = CODEC_ID_MSMPEG4V2;
321         psz_name = "MS MPEG-4 v2";
322         break;
323
324     /* MSMPEG4 v3 / M$ mpeg4 v3 */
325     case VLC_FOURCC('M','P','G','3'):
326     case VLC_FOURCC('m','p','g','3'):
327     case VLC_FOURCC('d','i','v','3'):
328     case VLC_FOURCC('M','P','4','3'):
329     case VLC_FOURCC('m','p','4','3'):
330     /* DivX 3.20 */
331     case VLC_FOURCC('D','I','V','3'):
332     case VLC_FOURCC('D','I','V','4'):
333     case VLC_FOURCC('d','i','v','4'):
334     case VLC_FOURCC('D','I','V','5'):
335     case VLC_FOURCC('d','i','v','5'):
336     case VLC_FOURCC('D','I','V','6'):
337     case VLC_FOURCC('d','i','v','6'):
338     /* AngelPotion stuff */
339     case VLC_FOURCC('A','P','4','1'):
340     /* 3ivx doctered divx files */
341     case VLC_FOURCC('3','I','V','D'):
342     case VLC_FOURCC('3','i','v','d'):
343     /* who knows? */
344     case VLC_FOURCC('3','V','I','D'):
345     case VLC_FOURCC('3','v','i','d'):
346         i_cat = VIDEO_ES;
347         i_codec = CODEC_ID_MSMPEG4V3;
348         psz_name = "MS MPEG-4 v3";
349         break;
350
351     /* Sorenson v1 */
352     case VLC_FOURCC('S','V','Q','1'):
353         i_cat = VIDEO_ES;
354         i_codec = CODEC_ID_SVQ1;
355         psz_name = "SVQ-1 (Sorenson Video v1)";
356         break;
357
358     /* Sorenson v3 */
359     case VLC_FOURCC('S','V','Q','3'):
360         i_cat = VIDEO_ES;
361         i_codec = CODEC_ID_SVQ3;
362         psz_name = "SVQ-3 (Sorenson Video v3)";
363         break;
364
365 /* H263 and H263i */
366 /* H263(+) is also known as Real Video 1.0 */
367
368 /* FIXME FOURCC_H263P exist but what fourcc ? */
369
370     /* H263 */
371     case VLC_FOURCC('H','2','6','3'):
372     case VLC_FOURCC('h','2','6','3'):
373     case VLC_FOURCC('U','2','6','3'):
374         i_cat = VIDEO_ES;
375         i_codec = CODEC_ID_H263;
376         psz_name = "H263";
377         break;
378
379     /* H263i */
380     case VLC_FOURCC('I','2','6','3'):
381     case VLC_FOURCC('i','2','6','3'):
382         i_cat = VIDEO_ES;
383         i_codec = CODEC_ID_H263I;
384         psz_name = "I263.I";
385         break;
386
387 #if LIBAVCODEC_BUILD >= 4669
388     /* Flash (H263) variant */
389     case VLC_FOURCC('F','L','V','1'):
390         i_cat    = VIDEO_ES;
391         i_codec  = CODEC_ID_FLV1;
392         psz_name = "Flash Video";
393         break;
394 #endif
395
396     /* MJPEG */
397     case VLC_FOURCC( 'M', 'J', 'P', 'G' ):
398     case VLC_FOURCC( 'm', 'j', 'p', 'g' ):
399     case VLC_FOURCC( 'm', 'j', 'p', 'a' ): /* for mov file */
400     case VLC_FOURCC( 'j', 'p', 'e', 'g' ):
401     case VLC_FOURCC( 'J', 'P', 'E', 'G' ):
402     case VLC_FOURCC( 'J', 'F', 'I', 'F' ):
403     case VLC_FOURCC( 'J', 'P', 'G', 'L' ):
404         i_cat = VIDEO_ES;
405         i_codec = CODEC_ID_MJPEG;
406         psz_name = "Motion JPEG";
407         break;
408     case VLC_FOURCC( 'm', 'j', 'p', 'b' ): /* for mov file */
409         i_cat = VIDEO_ES;
410         i_codec = CODEC_ID_MJPEGB;
411         psz_name = "Motion JPEG B";
412         break;
413
414     /* DV */
415     case VLC_FOURCC('d','v','s','l'):
416     case VLC_FOURCC('d','v','s','d'):
417     case VLC_FOURCC('D','V','S','D'):
418     case VLC_FOURCC('d','v','h','d'):
419     case VLC_FOURCC('d','v','c',' '):
420     case VLC_FOURCC('d','v','p',' '):
421     case VLC_FOURCC('C','D','V','C'):
422         i_cat = VIDEO_ES;
423         i_codec = CODEC_ID_DVVIDEO;
424         psz_name = "DV video";
425         break;
426
427     /* Windows Media Video */
428     case VLC_FOURCC('W','M','V','1'):
429         i_cat = VIDEO_ES;
430         i_codec = CODEC_ID_WMV1;
431         psz_name ="Windows Media Video 1";
432         break;
433     case VLC_FOURCC('W','M','V','2'):
434         i_cat = VIDEO_ES;
435         i_codec = CODEC_ID_WMV2;
436         psz_name ="Windows Media Video 2";
437         break;
438
439 #if LIBAVCODEC_BUILD >= 4683
440     /* Microsoft Video 1 */
441     case VLC_FOURCC('M','S','V','C'):
442     case VLC_FOURCC('m','s','v','c'):
443     case VLC_FOURCC('C','R','A','M'):
444     case VLC_FOURCC('c','r','a','m'):
445     case VLC_FOURCC('W','H','A','M'):
446     case VLC_FOURCC('w','h','a','m'):
447         i_cat    = VIDEO_ES;
448         i_codec  = CODEC_ID_MSVIDEO1;
449         psz_name = "Microsoft Video 1";
450         break;
451
452     /* Microsoft RLE */
453     case VLC_FOURCC('m','r','l','e'):
454     case VLC_FOURCC(0x1,0x0,0x0,0x0):
455         i_cat    = VIDEO_ES;
456         i_codec  = CODEC_ID_MSRLE;
457         psz_name = "Microsoft RLE";
458         break;
459 #endif
460
461 #if( ( LIBAVCODEC_BUILD >= 4663 ) && ( !defined( WORDS_BIGENDIAN ) ) )
462     /* Indeo Video Codecs (Quality of this decoder on ppc is not good) */
463     case VLC_FOURCC('I','V','3','1'):
464     case VLC_FOURCC('i','v','3','1'):
465     case VLC_FOURCC('I','V','3','2'):
466     case VLC_FOURCC('i','v','3','2'):
467         i_cat    = VIDEO_ES;
468         i_codec  = CODEC_ID_INDEO3;
469         psz_name = "Indeo v3";
470         break;
471 #endif
472
473     /* Huff YUV */
474     case VLC_FOURCC('H','F','Y','U'):
475         i_cat = VIDEO_ES;
476         i_codec = CODEC_ID_HUFFYUV;
477         psz_name ="Huff YUV";
478         break;
479
480     /* Creative YUV */
481     case VLC_FOURCC('C','Y','U','V'):
482         i_cat = VIDEO_ES;
483         i_codec = CODEC_ID_CYUV;
484         psz_name ="Creative YUV";
485         break;
486
487 #if LIBAVCODEC_BUILD >= 4668
488     /* On2 VP3 Video Codecs */
489     case VLC_FOURCC('V','P','3','1'):
490     case VLC_FOURCC('v','p','3','1'):
491         i_cat    = VIDEO_ES;
492         i_codec  = CODEC_ID_VP3;
493         psz_name = "On2's VP3 Video";
494         break;
495 #endif
496
497 #if ( !defined( WORDS_BIGENDIAN ) )
498 #if LIBAVCODEC_BUILD >= 4668
499     /* Asus Video (Another thing that doesn't work on PPC) */
500     case VLC_FOURCC('A','S','V','1'):
501         i_cat    = VIDEO_ES;
502         i_codec  = CODEC_ID_ASV1;
503         psz_name = "Asus V1";
504         break;
505 #endif
506 #if LIBAVCODEC_BUILD >= 4677
507     case VLC_FOURCC('A','S','V','2'):
508         i_cat    = VIDEO_ES;
509         i_codec  = CODEC_ID_ASV2;
510         psz_name = "Asus V2";
511         break;
512 #endif
513 #endif
514
515 #if LIBAVCODEC_BUILD >= 4668
516     /* FFMPEG Video 1 (lossless codec) */
517     case VLC_FOURCC('F','F','V','1'):
518         i_cat    = VIDEO_ES;
519         i_codec  = CODEC_ID_FFV1;
520         psz_name = "FFMpeg Video 1";
521         break;
522 #endif
523
524 #if LIBAVCODEC_BUILD >= 4669
525     /* ATI VCR1 */
526     case VLC_FOURCC('V','C','R','1'):
527         i_cat    = VIDEO_ES;
528         i_codec  = CODEC_ID_VCR1;
529         psz_name = "ATI VCR1";
530         break;
531 #endif
532
533 #if LIBAVCODEC_BUILD >= 4672
534     /* Cirrus Logic AccuPak */
535     case VLC_FOURCC('C','L','J','R'):
536         i_cat    = VIDEO_ES;
537         i_codec  = CODEC_ID_CLJR;
538         psz_name = "Creative Logic AccuPak";
539         break;
540 #endif
541
542 #if LIBAVCODEC_BUILD >= 4683
543     /* Apple Video */
544     case VLC_FOURCC('r','p','z','a'):
545         i_cat    = VIDEO_ES;
546         i_codec  = CODEC_ID_RPZA;
547         psz_name = "Apple Video";
548         break;
549 #endif
550
551 #if LIBAVCODEC_BUILD >= 4683
552     /* Cinepak */
553     case VLC_FOURCC('c','v','i','d'):
554         i_cat    = VIDEO_ES;
555         i_codec  = CODEC_ID_CINEPAK;
556         psz_name = "Cinepak";
557         break;
558 #endif
559
560     /*
561      *  Audio Codecs
562      */
563
564     /* Windows Media Audio 1 */
565     case VLC_FOURCC('W','M','A','1'):
566     case VLC_FOURCC('w','m','a','1'):
567         i_cat = AUDIO_ES;
568         i_codec = CODEC_ID_WMAV1;
569         psz_name ="Windows Media Audio 1";
570         break;
571
572     /* Windows Media Audio 2 */
573     case VLC_FOURCC('W','M','A','2'):
574     case VLC_FOURCC('w','m','a','2'):
575         i_cat = AUDIO_ES;
576         i_codec = CODEC_ID_WMAV2;
577         psz_name ="Windows Media Audio 2";
578         break;
579
580     /* DV Audio */
581     case VLC_FOURCC('d','v','a','u'):
582         i_cat = AUDIO_ES;
583         i_codec = CODEC_ID_DVAUDIO;
584         psz_name = "DV audio";
585         break;
586
587     /* MACE-3 Audio */
588     case VLC_FOURCC('M','A','C','3'):
589         i_cat = AUDIO_ES;
590         i_codec = CODEC_ID_MACE3;
591         psz_name = "MACE-3 audio";
592         break;
593
594     /* MACE-6 Audio */
595     case VLC_FOURCC('M','A','C','6'):
596         i_cat = AUDIO_ES;
597         i_codec = CODEC_ID_MACE6;
598         psz_name = "MACE-6 audio";
599         break;
600
601 #if LIBAVCODEC_BUILD >= 4668
602     /* RealAudio 1.0 */
603     case VLC_FOURCC('1','4','_','4'):
604         i_cat    = AUDIO_ES;
605         i_codec  = CODEC_ID_RA_144;
606         psz_name = "RealAudio 1.0";
607         break;
608
609     /* RealAudio 2.0 */
610     case VLC_FOURCC('2','8','_','8'):
611         i_cat    = AUDIO_ES;
612         i_codec  = CODEC_ID_RA_288;
613         psz_name = "RealAudio 2.0";
614         break;
615 #endif
616
617     /* MPEG Audio layer 1/2/3 */
618     case VLC_FOURCC('m','p','g','a'):
619         i_cat    = AUDIO_ES;
620         i_codec  = CODEC_ID_MP2;
621         psz_name = "MPEG Audio layer 1/2";
622         break;
623     case VLC_FOURCC('m','p','3',' '):
624         i_cat    = AUDIO_ES;
625 #if LIBAVCODEC_BUILD >= 4678
626         i_codec  = CODEC_ID_MP3;
627 #else
628         i_codec  = CODEC_ID_MP3LAME;
629 #endif
630         psz_name = "MPEG Audio layer 1/2/3";
631         break;
632
633     /* A52 Audio (aka AC3) */
634     case VLC_FOURCC('a','5','2',' '):
635     case VLC_FOURCC('a','5','2','b'): /* VLC specific hack */
636         i_cat    = AUDIO_ES;
637         i_codec  = CODEC_ID_AC3;
638         psz_name = "A52 Audio (aka AC3)";
639         break;
640
641     /* AAC audio */
642     case VLC_FOURCC('m','p','4','a'):
643         i_cat    = AUDIO_ES;
644         i_codec  = CODEC_ID_AAC;
645         psz_name = "MPEG AAC Audio";
646         break;
647
648     default:
649         i_cat = UNKNOWN_ES;
650         i_codec = CODEC_ID_NONE;
651         psz_name = NULL;
652         break;
653     }
654
655     if( i_codec != CODEC_ID_NONE )
656     {
657         if( pi_cat ) *pi_cat = i_cat;
658         if( pi_ffmpeg_codec ) *pi_ffmpeg_codec = i_codec;
659         if( ppsz_name ) *ppsz_name = psz_name;
660         return VLC_TRUE;
661     }
662
663     return VLC_FALSE;
664 }
665
666 int E_(GetFfmpegChroma)( vlc_fourcc_t i_chroma )
667 {
668     switch( i_chroma )
669     {
670     case VLC_FOURCC( 'I', '4', '2', '0' ):
671         return PIX_FMT_YUV420P;
672     case VLC_FOURCC( 'I', '4', '2', '2' ):
673         return PIX_FMT_YUV422P;
674     case VLC_FOURCC( 'I', '4', '4', '4' ):
675         return PIX_FMT_YUV444P;
676     case VLC_FOURCC( 'R', 'V', '1', '5' ):
677         return PIX_FMT_RGB555;
678     case VLC_FOURCC( 'R', 'V', '1', '6' ):
679         return PIX_FMT_RGB565;
680     case VLC_FOURCC( 'R', 'V', '2', '4' ):
681         return PIX_FMT_RGB24;
682     case VLC_FOURCC( 'R', 'V', '3', '2' ):
683         return PIX_FMT_RGBA32;
684     case VLC_FOURCC( 'G', 'R', 'E', 'Y' ):
685         return PIX_FMT_GRAY8;
686     case VLC_FOURCC( 'Y', 'U', 'Y', '2' ):
687         return PIX_FMT_YUV422;
688     default:
689         return 0;
690     }
691 }
692
693 void E_(InitLibavcodec)( vlc_object_t *p_object )
694 {
695     vlc_value_t lockval;
696
697     var_Get( p_object->p_libvlc, "avcodec", &lockval );
698     vlc_mutex_lock( lockval.p_address );
699
700      /* *** init ffmpeg library (libavcodec) *** */
701     if( !b_ffmpeginit )
702     {
703         avcodec_init();
704         avcodec_register_all();
705         b_ffmpeginit = 1;
706
707         msg_Dbg( p_object, "libavcodec initialized (interface %d )",
708                  LIBAVCODEC_BUILD );
709     }
710     else
711     {
712         msg_Dbg( p_object, "libavcodec already initialized" );
713     }
714
715     vlc_mutex_unlock( lockval.p_address );
716 }