X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fffmpeg%2Fffmpeg.c;h=e3cbfbd5f0a8400e05b17cc1d9afabeda7e1e04e;hb=c84e40d0a9048e364c2eeb61b416ae57bbb05080;hp=1a25676cbfc19f521721747bf0000fc95988d5d8;hpb=e1d934ce37614be8122f6c2f4cc535990f192b62;p=vlc diff --git a/modules/codec/ffmpeg/ffmpeg.c b/modules/codec/ffmpeg/ffmpeg.c index 1a25676cbf..e3cbfbd5f0 100644 --- a/modules/codec/ffmpeg/ffmpeg.c +++ b/modules/codec/ffmpeg/ffmpeg.c @@ -5,7 +5,7 @@ * $Id$ * * Authors: Laurent Aimar - * Gildas Bazin + * Gildas Bazin * * 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 @@ -76,10 +76,20 @@ static char *enc_hq_list_text[] = { N_("rd"), N_("bits"), N_("simple") }; * Module descriptor *****************************************************************************/ vlc_module_begin(); - + set_shortname( "FFmpeg"); + set_category( CAT_INPUT ); + set_subcategory( SUBCAT_INPUT_SCODEC ); /* decoder main module */ - set_description( _("ffmpeg audio/video decoder((MS)MPEG4,SVQ1,H263,WMV,WMA)") ); +#if defined(MODULE_NAME_is_ffmpegaltivec) \ + || (defined(CAN_COMPILE_ALTIVEC) && !defined(NO_ALTIVEC_IN_FFMPEG)) + set_description( _("AltiVec ffmpeg audio/video decoder/encoder ((MS)MPEG4,SVQ1,H263,WMV,WMA)") ); + /*add_requirement( ALTIVEC );*/ + set_capability( "decoder", 71 ); +#else + set_description( _("ffmpeg audio/video decoder/encoder ((MS)MPEG4,SVQ1,H263,WMV,WMA)") ); set_capability( "decoder", 70 ); +#endif + set_section( N_("Decoding") , NULL ); set_callbacks( OpenDecoder, CloseDecoder ); add_bool( "ffmpeg-dr", 1, NULL, DR_TEXT, DR_TEXT, VLC_TRUE ); @@ -91,6 +101,9 @@ vlc_module_begin(); VLC_FALSE ); add_integer ( "ffmpeg-vismv", 0, NULL, VISMV_TEXT, VISMV_LONGTEXT, VLC_TRUE ); + add_integer ( "ffmpeg-lowres", 0, NULL, LOWRES_TEXT, LOWRES_LONGTEXT, + VLC_TRUE ); + change_integer_range( 0, 2 ); #ifdef LIBAVCODEC_PP add_integer( "ffmpeg-pp-q", 0, NULL, PP_Q_TEXT, PP_Q_LONGTEXT, VLC_FALSE ); @@ -108,6 +121,7 @@ vlc_module_begin(); /* encoder submodule */ add_submodule(); + set_section( N_("Encoding") , NULL ); set_description( _("ffmpeg audio/video encoder") ); set_capability( "encoder", 100 ); set_callbacks( E_(OpenEncoder), E_(CloseEncoder) ); @@ -153,9 +167,22 @@ vlc_module_begin(); /* demux submodule */ add_submodule(); set_description( _("ffmpeg demuxer" ) ); - set_capability( "demux2", 1 ); + set_capability( "demux2", 2 ); set_callbacks( E_(OpenDemux), E_(CloseDemux) ); + /* video filter submodule */ + add_submodule(); + set_capability( "video filter2", 50 ); + set_callbacks( E_(OpenFilter), E_(CloseFilter) ); + set_description( _("ffmpeg video filter") ); + + /* video filter submodule */ + add_submodule(); + set_capability( "video filter2", 0 ); + set_callbacks( E_(OpenDeinterlace), E_(CloseDeinterlace) ); + set_description( _("ffmpeg deinterlace video filter") ); + add_shortcut( "ffmpeg-deinterlace" ); + var_Create( p_module->p_libvlc, "avcodec", VLC_VAR_MUTEX ); vlc_module_end(); @@ -217,6 +244,9 @@ static int OpenDecoder( vlc_object_t *p_this ) if( !(p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_SSE) ) { p_context->dsp_mask |= FF_MM_SSE; + } + if( !(p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_SSE2) ) + { p_context->dsp_mask |= FF_MM_SSE2; } @@ -237,7 +267,7 @@ static int OpenDecoder( vlc_object_t *p_this ) i_result = VLC_EGENERIC; } - p_dec->p_sys->i_cat = i_cat; + if( i_result == VLC_SUCCESS ) p_dec->p_sys->i_cat = i_cat; return i_result; } @@ -250,16 +280,6 @@ static void CloseDecoder( vlc_object_t *p_this ) decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys = p_dec->p_sys; - if( p_sys->p_context ) - { - if( p_sys->p_context->extradata ) - free( p_sys->p_context->extradata ); - - avcodec_close( p_sys->p_context ); - msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec ); - av_free( p_sys->p_context ); - } - switch( p_sys->i_cat ) { case AUDIO_ES: @@ -270,39 +290,22 @@ static void CloseDecoder( vlc_object_t *p_this ) break; } + if( p_sys->p_context ) + { + if( p_sys->p_context->extradata ) + free( p_sys->p_context->extradata ); + + avcodec_close( p_sys->p_context ); + msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec ); + av_free( p_sys->p_context ); + } + free( p_sys ); } - + /***************************************************************************** * local Functions *****************************************************************************/ -int E_(GetFfmpegChroma)( vlc_fourcc_t i_chroma ) -{ - switch( i_chroma ) - { - case VLC_FOURCC( 'I', '4', '2', '0' ): - return PIX_FMT_YUV420P; - case VLC_FOURCC( 'I', '4', '2', '2' ): - return PIX_FMT_YUV422P; - case VLC_FOURCC( 'I', '4', '4', '4' ): - return PIX_FMT_YUV444P; - case VLC_FOURCC( 'R', 'V', '1', '5' ): - return PIX_FMT_RGB555; - case VLC_FOURCC( 'R', 'V', '1', '6' ): - return PIX_FMT_RGB565; - case VLC_FOURCC( 'R', 'V', '2', '4' ): - return PIX_FMT_RGB24; - case VLC_FOURCC( 'R', 'V', '3', '2' ): - return PIX_FMT_RGBA32; - case VLC_FOURCC( 'G', 'R', 'E', 'Y' ): - return PIX_FMT_GRAY8; - case VLC_FOURCC( 'Y', 'U', 'Y', '2' ): - return PIX_FMT_YUV422; - default: - return -1; - } -} - void E_(InitLibavcodec)( vlc_object_t *p_object ) { static int b_ffmpeginit = 0; @@ -329,7 +332,73 @@ void E_(InitLibavcodec)( vlc_object_t *p_object ) vlc_mutex_unlock( lockval.p_address ); } +/***************************************************************************** + * Chroma fourcc -> ffmpeg_id mapping + *****************************************************************************/ +static struct +{ + vlc_fourcc_t i_chroma; + int i_chroma_id; + +} chroma_table[] = +{ + /* Planar YUV formats */ + { VLC_FOURCC('Y','U','V','A'), PIX_FMT_YUV444P }, /* Hack */ + { VLC_FOURCC('I','4','4','4'), PIX_FMT_YUV444P }, + { VLC_FOURCC('J','4','4','4'), PIX_FMT_YUVJ444P }, + { VLC_FOURCC('I','4','2','2'), PIX_FMT_YUV422P }, + { VLC_FOURCC('J','4','2','2'), PIX_FMT_YUVJ422P }, + { 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 }, + { VLC_FOURCC('J','4','2','0'), PIX_FMT_YUVJ420P }, + { 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 }, +#if LIBAVCODEC_BUILD >= 4720 + { VLC_FOURCC('U','Y','V','Y'), PIX_FMT_UYVY422 }, +#endif + + /* 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 }, + {0} +}; + +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 + *****************************************************************************/ static struct { vlc_fourcc_t i_fourcc; @@ -378,6 +447,8 @@ static struct VIDEO_ES, "MPEG-4 Video" }, { VLC_FOURCC('m','p','4','v'), CODEC_ID_MPEG4, VIDEO_ES, "MPEG-4 Video" }, + { VLC_FOURCC('M','P','4','V'), CODEC_ID_MPEG4, + VIDEO_ES, "MPEG-4 Video" }, { VLC_FOURCC( 4, 0, 0, 0 ), CODEC_ID_MPEG4, VIDEO_ES, "MPEG-4 Video" }, { VLC_FOURCC('m','4','c','c'), CODEC_ID_MPEG4, @@ -555,6 +626,12 @@ static struct VIDEO_ES, "Windows Media Video 1" }, { VLC_FOURCC('W','M','V','2'), CODEC_ID_WMV2, VIDEO_ES, "Windows Media Video 2" }, +#if 0 + { VLC_FOURCC('W','M','V','3'), CODEC_ID_WMV3, + VIDEO_ES, "Windows Media Video 3" }, + { VLC_FOURCC('V','C','9',' '), CODEC_ID_VC9, + VIDEO_ES, "Windows Media Video VC9" }, +#endif #if LIBAVCODEC_BUILD >= 4683 /* Microsoft Video 1 */ @@ -588,6 +665,11 @@ static struct { VLC_FOURCC('i','v','3','2'), CODEC_ID_INDEO3, VIDEO_ES, "Indeo Video v3" }, +#if LIBAVCODEC_BUILD >= 4721 + { VLC_FOURCC('t','s','c','c'), CODEC_ID_TSCC, + VIDEO_ES, "TechSmith Camtasia Screen Capture Video" }, +#endif + /* Huff YUV */ { VLC_FOURCC('H','F','Y','U'), CODEC_ID_HUFFYUV, VIDEO_ES, "Huff YUV Video" }, @@ -685,6 +767,56 @@ static struct VIDEO_ES, "FFMpeg SNOW wavelet Video" }, #endif +#if LIBAVCODEC_BUILD >= 4752 + { 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" }, + + { VLC_FOURCC('V','I','X','L'), CODEC_ID_VIXL, + VIDEO_ES, "Miro/Pinnacle VideoXL Video" }, + + { 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" }, +#endif +#if LIBAVCODEC_BUILD >= 4753 + { VLC_FOURCC('I','V','2','0'), CODEC_ID_INDEO2, + VIDEO_ES, "Indeo Video v2" }, + { VLC_FOURCC('R','T','2','1'), CODEC_ID_INDEO2, + VIDEO_ES, "Indeo Video v2" }, +#endif + + /* + * Image codecs + */ + +#if LIBAVCODEC_BUILD >= 4731 + { 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" }, +#endif + /* * Audio Codecs */ @@ -777,6 +909,26 @@ static struct AUDIO_ES, "G.726 ADPCM Audio" }, #endif +#if LIBAVCODEC_BUILD >= 4683 + /* AMR */ + { VLC_FOURCC('s','a','m','r'), CODEC_ID_AMR_NB, + AUDIO_ES, "AMR narrow band" }, + { VLC_FOURCC('s','a','w','b'), CODEC_ID_AMR_WB, + AUDIO_ES, "AMR wide band" }, +#endif + +#if LIBAVCODEC_BUILD >= 4703 + /* FLAC */ + { VLC_FOURCC('f','l','a','c'), CODEC_ID_FLAC, + AUDIO_ES, "FLAC (Free Lossless Audio Codec)" }, +#endif + +#if LIBAVCODEC_BUILD >= 4745 + /* ALAC */ + { VLC_FOURCC('a','l','a','c'), CODEC_ID_ALAC, + AUDIO_ES, "Apple Lossless Audio Codec" }, +#endif + /* PCM */ { VLC_FOURCC('s','8',' ',' '), CODEC_ID_PCM_S8, AUDIO_ES, "PCM S8" },