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 $
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@netcourrier.com>
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.
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.
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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
28 #include <stdlib.h> /* malloc(), free() */
34 #include <vlc/decoder.h>
35 #include <vlc/input.h>
37 #ifdef HAVE_SYS_TIMES_H
38 # include <sys/times.h>
42 #ifdef HAVE_FFMPEG_AVCODEC_H
43 # include <ffmpeg/avcodec.h>
48 #if LIBAVCODEC_BUILD < 4655
49 # error You must have a libavcodec >= 4655 (get CVS)
55 # ifdef HAVE_POSTPROC_POSTPROCESS_H
56 # include <postproc/postprocess.h>
58 # include <libpostproc/postprocess.h>
62 /*****************************************************************************
63 * decoder_sys_t: decoder descriptor
64 *****************************************************************************/
67 /* Common part between video and audio decoder */
72 AVCodecContext *p_context;
76 /****************************************************************************
78 ****************************************************************************/
79 static int OpenDecoder( vlc_object_t * );
80 static int InitDecoder( decoder_t * );
81 static int EndDecoder( decoder_t * );
83 static int b_ffmpeginit = 0;
85 /*****************************************************************************
87 *****************************************************************************/
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)") );
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,
101 add_bool( "ffmpeg-hurry-up", 0, NULL, HURRYUP_TEXT, HURRYUP_LONGTEXT,
103 add_integer( "ffmpeg-truncated", 0, NULL, TRUNC_TEXT, TRUNC_LONGTEXT,
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 );
112 /* chroma conversion submodule */
114 set_capability( "chroma", 50 );
115 set_callbacks( E_(OpenChroma), NULL );
116 set_description( _("ffmpeg chroma conversion") );
118 /* video encoder submodule */
120 set_description( _("ffmpeg video encoder") );
121 set_capability( "video encoder", 100 );
122 set_callbacks( E_(OpenVideoEncoder), E_(CloseVideoEncoder) );
124 /* audio encoder submodule */
126 set_description( _("ffmpeg audio encoder") );
127 set_capability( "audio encoder", 10 );
128 set_callbacks( E_(OpenAudioEncoder), E_(CloseAudioEncoder) );
130 var_Create( p_module->p_libvlc, "avcodec", VLC_VAR_MUTEX );
133 /*****************************************************************************
134 * OpenDecoder: probe the decoder and return score
135 *****************************************************************************/
136 static int OpenDecoder( vlc_object_t *p_this )
138 decoder_t *p_dec = (decoder_t*) p_this;
139 int i_cat, i_codec_id;
142 if( !E_(GetFfmpegCodec)( p_dec->p_fifo->i_fourcc, &i_cat, &i_codec_id,
148 /* Initialization must be done before avcodec_find_decoder() */
149 E_(InitLibavcodec)(p_this);
151 if( !avcodec_find_decoder( i_codec_id ) )
153 msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec );
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;
164 /*****************************************************************************
165 * InitDecoder: Initalize the decoder
166 *****************************************************************************/
167 static int InitDecoder( decoder_t *p_dec )
169 int i_cat, i_codec_id, i_result;
171 AVCodecContext *p_context;
174 /* *** determine codec type *** */
175 E_(GetFfmpegCodec)( p_dec->p_fifo->i_fourcc,
176 &i_cat, &i_codec_id, &psz_namecodec );
178 /* *** ask ffmpeg for a decoder *** */
179 if( !( p_codec = avcodec_find_decoder( i_codec_id ) ) )
181 msg_Err( p_dec, "codec not found (%s)", psz_namecodec );
185 /* *** get a p_context *** */
186 p_context = avcodec_alloc_context();
191 i_result = E_( InitVideoDec )( p_dec, p_context, p_codec,
192 i_codec_id, psz_namecodec );
193 p_dec->pf_decode = E_(DecodeVideo);
196 i_result = E_( InitAudioDec )( p_dec, p_context, p_codec,
197 i_codec_id, psz_namecodec );
198 p_dec->pf_decode = E_(DecodeAudio);
201 i_result = VLC_EGENERIC;
204 p_dec->p_sys->i_cat = i_cat;
209 /*****************************************************************************
210 * EndDecoder: decoder destruction
211 *****************************************************************************/
212 static int EndDecoder( decoder_t *p_dec )
214 decoder_sys_t *p_sys = p_dec->p_sys;
216 if( !p_sys->p_context )
218 if( p_sys->p_context->extradata )
219 free( p_sys->p_context->extradata );
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 );
226 switch( p_sys->i_cat )
229 E_( EndAudioDec )( p_dec );
232 E_( EndVideoDec )( p_dec );
240 /*****************************************************************************
242 *****************************************************************************/
243 int E_(GetFfmpegCodec)( vlc_fourcc_t i_fourcc, int *pi_cat,
244 int *pi_ffmpeg_codec, char **ppsz_name )
258 case VLC_FOURCC('m','p','1','v'):
260 i_codec = CODEC_ID_MPEG1VIDEO;
261 psz_name = "MPEG-1 Video";
265 case VLC_FOURCC('m','p','2','v'):
266 case VLC_FOURCC('m','p','g','v'):
268 #if LIBAVCODEC_BUILD >= 4676
269 i_codec = CODEC_ID_MPEG2VIDEO;
270 psz_name = "MPEG-2 Video";
272 i_codec = CODEC_ID_MPEG1VIDEO;
273 psz_name = "MPEG-1 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'): */
297 case VLC_FOURCC('3','I','V','2'):
298 case VLC_FOURCC('3','i','v','2'):
300 i_codec = CODEC_ID_MPEG4;
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'):
310 i_codec = CODEC_ID_MSMPEG4V1;
311 psz_name = "MS MPEG-4 v1";
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'):
320 i_codec = CODEC_ID_MSMPEG4V2;
321 psz_name = "MS MPEG-4 v2";
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'):
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'):
344 case VLC_FOURCC('3','V','I','D'):
345 case VLC_FOURCC('3','v','i','d'):
347 i_codec = CODEC_ID_MSMPEG4V3;
348 psz_name = "MS MPEG-4 v3";
352 case VLC_FOURCC('S','V','Q','1'):
354 i_codec = CODEC_ID_SVQ1;
355 psz_name = "SVQ-1 (Sorenson Video v1)";
359 case VLC_FOURCC('S','V','Q','3'):
361 i_codec = CODEC_ID_SVQ3;
362 psz_name = "SVQ-3 (Sorenson Video v3)";
366 /* H263(+) is also known as Real Video 1.0 */
368 /* FIXME FOURCC_H263P exist but what fourcc ? */
371 case VLC_FOURCC('H','2','6','3'):
372 case VLC_FOURCC('h','2','6','3'):
373 case VLC_FOURCC('U','2','6','3'):
375 i_codec = CODEC_ID_H263;
380 case VLC_FOURCC('I','2','6','3'):
381 case VLC_FOURCC('i','2','6','3'):
383 i_codec = CODEC_ID_H263I;
387 #if LIBAVCODEC_BUILD >= 4669
388 /* Flash (H263) variant */
389 case VLC_FOURCC('F','L','V','1'):
391 i_codec = CODEC_ID_FLV1;
392 psz_name = "Flash Video";
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' ):
405 i_codec = CODEC_ID_MJPEG;
406 psz_name = "Motion JPEG";
408 case VLC_FOURCC( 'm', 'j', 'p', 'b' ): /* for mov file */
410 i_codec = CODEC_ID_MJPEGB;
411 psz_name = "Motion JPEG B";
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'):
423 i_codec = CODEC_ID_DVVIDEO;
424 psz_name = "DV video";
427 /* Windows Media Video */
428 case VLC_FOURCC('W','M','V','1'):
430 i_codec = CODEC_ID_WMV1;
431 psz_name ="Windows Media Video 1";
433 case VLC_FOURCC('W','M','V','2'):
435 i_codec = CODEC_ID_WMV2;
436 psz_name ="Windows Media Video 2";
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'):
448 i_codec = CODEC_ID_MSVIDEO1;
449 psz_name = "Microsoft Video 1";
453 case VLC_FOURCC('m','r','l','e'):
454 case VLC_FOURCC(0x1,0x0,0x0,0x0):
456 i_codec = CODEC_ID_MSRLE;
457 psz_name = "Microsoft RLE";
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'):
468 i_codec = CODEC_ID_INDEO3;
469 psz_name = "Indeo v3";
474 case VLC_FOURCC('H','F','Y','U'):
476 i_codec = CODEC_ID_HUFFYUV;
477 psz_name ="Huff YUV";
481 case VLC_FOURCC('C','Y','U','V'):
483 i_codec = CODEC_ID_CYUV;
484 psz_name ="Creative YUV";
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'):
492 i_codec = CODEC_ID_VP3;
493 psz_name = "On2's VP3 Video";
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'):
502 i_codec = CODEC_ID_ASV1;
503 psz_name = "Asus V1";
506 #if LIBAVCODEC_BUILD >= 4677
507 case VLC_FOURCC('A','S','V','2'):
509 i_codec = CODEC_ID_ASV2;
510 psz_name = "Asus V2";
515 #if LIBAVCODEC_BUILD >= 4668
516 /* FFMPEG Video 1 (lossless codec) */
517 case VLC_FOURCC('F','F','V','1'):
519 i_codec = CODEC_ID_FFV1;
520 psz_name = "FFMpeg Video 1";
524 #if LIBAVCODEC_BUILD >= 4669
526 case VLC_FOURCC('V','C','R','1'):
528 i_codec = CODEC_ID_VCR1;
529 psz_name = "ATI VCR1";
533 #if LIBAVCODEC_BUILD >= 4672
534 /* Cirrus Logic AccuPak */
535 case VLC_FOURCC('C','L','J','R'):
537 i_codec = CODEC_ID_CLJR;
538 psz_name = "Creative Logic AccuPak";
542 #if LIBAVCODEC_BUILD >= 4683
544 case VLC_FOURCC('r','p','z','a'):
546 i_codec = CODEC_ID_RPZA;
547 psz_name = "Apple Video";
551 #if LIBAVCODEC_BUILD >= 4683
553 case VLC_FOURCC('c','v','i','d'):
555 i_codec = CODEC_ID_CINEPAK;
556 psz_name = "Cinepak";
564 /* Windows Media Audio 1 */
565 case VLC_FOURCC('W','M','A','1'):
566 case VLC_FOURCC('w','m','a','1'):
568 i_codec = CODEC_ID_WMAV1;
569 psz_name ="Windows Media Audio 1";
572 /* Windows Media Audio 2 */
573 case VLC_FOURCC('W','M','A','2'):
574 case VLC_FOURCC('w','m','a','2'):
576 i_codec = CODEC_ID_WMAV2;
577 psz_name ="Windows Media Audio 2";
581 case VLC_FOURCC('d','v','a','u'):
583 i_codec = CODEC_ID_DVAUDIO;
584 psz_name = "DV audio";
588 case VLC_FOURCC('M','A','C','3'):
590 i_codec = CODEC_ID_MACE3;
591 psz_name = "MACE-3 audio";
595 case VLC_FOURCC('M','A','C','6'):
597 i_codec = CODEC_ID_MACE6;
598 psz_name = "MACE-6 audio";
601 #if LIBAVCODEC_BUILD >= 4668
603 case VLC_FOURCC('1','4','_','4'):
605 i_codec = CODEC_ID_RA_144;
606 psz_name = "RealAudio 1.0";
610 case VLC_FOURCC('2','8','_','8'):
612 i_codec = CODEC_ID_RA_288;
613 psz_name = "RealAudio 2.0";
617 /* MPEG Audio layer 1/2/3 */
618 case VLC_FOURCC('m','p','g','a'):
620 i_codec = CODEC_ID_MP2;
621 psz_name = "MPEG Audio layer 1/2";
623 case VLC_FOURCC('m','p','3',' '):
625 #if LIBAVCODEC_BUILD >= 4678
626 i_codec = CODEC_ID_MP3;
628 i_codec = CODEC_ID_MP3LAME;
630 psz_name = "MPEG Audio layer 1/2/3";
633 /* A52 Audio (aka AC3) */
634 case VLC_FOURCC('a','5','2',' '):
635 case VLC_FOURCC('a','5','2','b'): /* VLC specific hack */
637 i_codec = CODEC_ID_AC3;
638 psz_name = "A52 Audio (aka AC3)";
642 case VLC_FOURCC('m','p','4','a'):
644 i_codec = CODEC_ID_AAC;
645 psz_name = "MPEG AAC Audio";
650 i_codec = CODEC_ID_NONE;
655 if( i_codec != CODEC_ID_NONE )
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;
666 int E_(GetFfmpegChroma)( vlc_fourcc_t i_chroma )
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;
693 void E_(InitLibavcodec)( vlc_object_t *p_object )
697 var_Get( p_object->p_libvlc, "avcodec", &lockval );
698 vlc_mutex_lock( lockval.p_address );
700 /* *** init ffmpeg library (libavcodec) *** */
704 avcodec_register_all();
707 msg_Dbg( p_object, "libavcodec initialized (interface %d )",
712 msg_Dbg( p_object, "libavcodec already initialized" );
715 vlc_mutex_unlock( lockval.p_address );