Commit 9478802c authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

avcodec: move video-specific code to video.c

parent d632dcc2
......@@ -371,9 +371,7 @@ int ffmpeg_OpenCodec( decoder_t *p_dec )
if( p_sys->p_context->extradata_size <= 0 )
{
if( p_sys->i_codec_id == AV_CODEC_ID_VC1 ||
p_sys->i_codec_id == AV_CODEC_ID_VORBIS ||
p_sys->i_codec_id == AV_CODEC_ID_THEORA ||
if( p_sys->i_codec_id == AV_CODEC_ID_VORBIS ||
( p_sys->i_codec_id == AV_CODEC_ID_AAC &&
!p_dec->fmt_in.b_packetized ) )
{
......@@ -382,21 +380,7 @@ int ffmpeg_OpenCodec( decoder_t *p_dec )
return 1;
}
}
if( p_dec->fmt_in.i_cat == VIDEO_ES )
{
p_sys->p_context->width = p_dec->fmt_in.video.i_visible_width;
p_sys->p_context->height = p_dec->fmt_in.video.i_visible_height;
if (p_sys->p_context->width == 0)
p_sys->p_context->width = p_dec->fmt_in.video.i_width;
else if (p_sys->p_context->width != p_dec->fmt_in.video.i_width)
p_sys->p_context->coded_width = p_dec->fmt_in.video.i_width;
if (p_sys->p_context->height == 0)
p_sys->p_context->height = p_dec->fmt_in.video.i_height;
else if (p_sys->p_context->height != p_dec->fmt_in.video.i_height)
p_sys->p_context->coded_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 )
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;
......@@ -410,9 +394,11 @@ int ffmpeg_OpenCodec( decoder_t *p_dec )
p_sys->p_context->bits_per_coded_sample = p_sys->p_context->bit_rate /
p_sys->p_context->sample_rate;
}
int ret;
char *psz_opts = var_InheritString( p_dec, "avcodec-options" );
AVDictionary *options = NULL;
int ret;
if (psz_opts && *psz_opts)
options = vlc_av_get_options(psz_opts);
free(psz_opts);
......@@ -428,35 +414,12 @@ int ffmpeg_OpenCodec( decoder_t *p_dec )
av_dict_free(&options);
if( ret < 0 )
return VLC_EGENERIC;
msg_Dbg( p_dec, "avcodec 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;
}
msg_Err( p_dec, "cannot start codec (%s)", p_sys->psz_namecodec );
return VLC_EGENERIC;
}
#endif
msg_Dbg( p_dec, "codec (%s) started", p_sys->psz_namecodec );
p_sys->b_delayed_open = false;
return VLC_SUCCESS;
}
......@@ -196,6 +196,61 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
return decoder_NewPicture( p_dec );
}
static int OpenVideoCodec( 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 == AV_CODEC_ID_VC1 ||
p_sys->i_codec_id == AV_CODEC_ID_THEORA )
{
msg_Warn( p_dec, "waiting for extra data for codec %s",
p_sys->psz_namecodec );
return 1;
}
}
p_sys->p_context->width = p_dec->fmt_in.video.i_visible_width;
p_sys->p_context->height = p_dec->fmt_in.video.i_visible_height;
if (p_sys->p_context->width == 0)
p_sys->p_context->width = p_dec->fmt_in.video.i_width;
else if (p_sys->p_context->width != p_dec->fmt_in.video.i_width)
p_sys->p_context->coded_width = p_dec->fmt_in.video.i_width;
if (p_sys->p_context->height == 0)
p_sys->p_context->height = p_dec->fmt_in.video.i_height;
else if (p_sys->p_context->height != p_dec->fmt_in.video.i_height)
p_sys->p_context->coded_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;
int ret = ffmpeg_OpenCodec( p_dec );
if( ret < 0 )
return ret;
#ifdef HAVE_AVCODEC_MT
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
return VLC_SUCCESS;
}
/*****************************************************************************
* InitVideo: initialize the video decoder
*****************************************************************************
......@@ -396,9 +451,8 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
ffmpeg_InitCodec( p_dec );
/* ***** Open the codec ***** */
if( ffmpeg_OpenCodec( p_dec ) < 0 )
if( OpenVideoCodec( p_dec ) < 0 )
{
msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
avcodec_free_frame( &p_sys->p_ff_pic );
vlc_sem_destroy( &p_sys->sem_mt );
free( p_sys );
......@@ -425,10 +479,7 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
{
ffmpeg_InitCodec( p_dec );
if( p_sys->b_delayed_open )
{
if( ffmpeg_OpenCodec( p_dec ) )
msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
}
OpenVideoCodec( p_dec );
}
p_block = *pp_block;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment