#include "avcodec.h"
#include "avutil.h"
+#include "chroma.h"
-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 51, 48, 0 )
-# error You must update libavcodec to a version >= 51.48.0
-#elif LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 25, 0 )
-# warning You should update libavcodec to get subtitle support
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 52, 25, 0 )
+# error You must update libavcodec to a version >= 52.25.0
#endif
/*****************************************************************************
#ifdef MERGE_FFMPEG
# include "../../demux/avformat/avformat.h"
+# include "../../access/avio.h"
#endif
/*****************************************************************************
* Module descriptor
*****************************************************************************/
-#define MODULE_DESCRIPTION N_( "Various audio and video decoders/encoders" \
+#define MODULE_DESCRIPTION N_( "Various audio and video decoders/encoders " \
"delivered by the FFmpeg library. This includes (MS)MPEG4, DivX, SV1,"\
"H261, H263, H264, WMV, WMA, AAC, AMR, DV, MJPEG and other codecs")
set_shortname( "FFmpeg")
add_shortcut( "ffmpeg" )
set_category( CAT_INPUT )
- set_subcategory( SUBCAT_INPUT_SCODEC )
+ set_subcategory( SUBCAT_INPUT_VCODEC )
/* decoder main module */
#if defined(MODULE_NAME_is_ffmpegaltivec) \
|| (defined(CAN_COMPILE_ALTIVEC) && !defined(NO_ALTIVEC_IN_FFMPEG))
add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
true )
#if defined(HAVE_AVCODEC_VAAPI) || defined(HAVE_AVCODEC_DXVA2)
- add_bool( "ffmpeg-hw", true, NULL, HW_TEXT, HW_LONGTEXT, true )
+ add_bool( "ffmpeg-hw", false, NULL, HW_TEXT, HW_LONGTEXT, true )
#endif
+#if defined(FF_THREAD_FRAME)
+ add_integer( "ffmpeg-threads", 0, NULL, THREADS_TEXT, THREADS_LONGTEXT, true );
+#endif
+
#ifdef ENABLE_SOUT
/* encoder submodule */
#ifdef MERGE_FFMPEG
add_submodule ()
# include "../../demux/avformat/avformat.c"
+ add_submodule ()
+ AVIO_MODULE
#endif
vlc_module_end ()
p_context = avcodec_alloc_context();
if( !p_context )
return VLC_ENOMEM;
- p_context->debug = config_GetInt( p_dec, "ffmpeg-debug" );
+ p_context->debug = var_InheritInteger( p_dec, "ffmpeg-debug" );
p_context->opaque = (void *)p_this;
/* Set CPU capabilities */
i_result = InitAudioDec ( p_dec, p_context, p_codec,
i_codec_id, psz_namecodec );
break;
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 25, 0 )
case SPU_ES:
p_dec->pf_decode_sub = DecodeSubtitle;
i_result = InitSubtitleDec( p_dec, p_context, p_codec,
i_codec_id, psz_namecodec );
break;
-#endif
default:
i_result = VLC_EGENERIC;
}
- if( i_result == VLC_SUCCESS ) p_dec->p_sys->i_cat = i_cat;
+ if( i_result == VLC_SUCCESS )
+ {
+ p_dec->p_sys->i_cat = i_cat;
+ if( p_context->profile != FF_PROFILE_UNKNOWN)
+ p_dec->fmt_in.i_profile = p_context->profile;
+ if( p_context->level != FF_LEVEL_UNKNOWN)
+ p_dec->fmt_in.i_level = p_context->level;
+ }
return i_result;
}
case VIDEO_ES:
EndVideoDec ( p_dec );
break;
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 25, 0 )
case SPU_ES:
EndSubtitleDec( p_dec );
break;
-#endif
}
if( p_sys->p_context )
vlc_avcodec_unlock();
}
+
+/*****************************************************************************
+ * ffmpeg_OpenCodec:
+ *****************************************************************************/
+int ffmpeg_OpenCodec( decoder_t *p_dec )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ if( p_sys->p_context->extradata_size <= 0 )
+ {
+ if( p_sys->i_codec_id == CODEC_ID_VC1 ||
+ p_sys->i_codec_id == CODEC_ID_VORBIS ||
+ p_sys->i_codec_id == CODEC_ID_THEORA ||
+ p_sys->i_codec_id == CODEC_ID_AAC )
+ {
+ msg_Warn( p_dec, "waiting for extra data for codec %s",
+ p_sys->psz_namecodec );
+ return 1;
+ }
+ }
+ if( p_dec->fmt_in.i_cat == VIDEO_ES )
+ {
+ p_sys->p_context->width = p_dec->fmt_in.video.i_width;
+ p_sys->p_context->height = p_dec->fmt_in.video.i_height;
+ p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.video.i_bits_per_pixel;
+ }
+ else if( p_dec->fmt_in.i_cat == AUDIO_ES )
+ {
+ p_sys->p_context->sample_rate = p_dec->fmt_in.audio.i_rate;
+ p_sys->p_context->channels = p_dec->fmt_in.audio.i_channels;
+
+ p_sys->p_context->block_align = p_dec->fmt_in.audio.i_blockalign;
+ p_sys->p_context->bit_rate = p_dec->fmt_in.i_bitrate;
+ p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.audio.i_bitspersample;
+ }
+ int ret;
+ vlc_avcodec_lock();
+ ret = avcodec_open( p_sys->p_context, p_sys->p_codec );
+ vlc_avcodec_unlock();
+ if( ret < 0 )
+ return VLC_EGENERIC;
+ msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
+
+#ifdef HAVE_AVCODEC_MT
+ if( p_dec->fmt_in.i_cat == VIDEO_ES )
+ {
+ switch( p_sys->p_context->active_thread_type )
+ {
+ case FF_THREAD_FRAME:
+ msg_Dbg( p_dec, "using frame thread mode with %d threads",
+ p_sys->p_context->thread_count );
+ break;
+ case FF_THREAD_SLICE:
+ msg_Dbg( p_dec, "using slice thread mode with %d threads",
+ p_sys->p_context->thread_count );
+ break;
+ case 0:
+ if( p_sys->p_context->thread_count > 1 )
+ msg_Warn( p_dec, "failed to enable threaded decoding" );
+ break;
+ default:
+ msg_Warn( p_dec, "using unknown thread mode with %d threads",
+ p_sys->p_context->thread_count );
+ break;
+ }
+ }
+#endif
+
+ p_sys->b_delayed_open = false;
+
+ return VLC_SUCCESS;
+}