@ -1617,31 +1617,6 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
return 0 ;
}
static int ffserver_streams_copy_context ( AVCodecContext * dest , const AVCodecContext * src ,
const char * configuration )
{
int ret ;
if ( ( ret = avcodec_copy_context ( dest , src ) ) < 0 )
return ret ;
dest - > codec = avcodec_find_encoder ( src - > codec_id ) ;
if ( ! dest - > codec )
return AVERROR ( EINVAL ) ;
if ( ! dest - > codec - > priv_class | | ! dest - > codec - > priv_data_size )
return 0 ;
if ( ! dest - > priv_data ) {
dest - > priv_data = av_mallocz ( dest - > codec - > priv_data_size ) ;
if ( ! dest - > priv_data )
return AVERROR ( ENOMEM ) ;
* ( const AVClass * * ) dest - > priv_data = dest - > codec - > priv_class ;
}
av_opt_set_defaults ( dest - > priv_data ) ;
if ( av_set_options_string ( dest - > priv_data , configuration , " = " , " , " ) < 0 ) {
av_log ( dest , AV_LOG_WARNING , " Cannot copy private codec options. Using defaults. \n " ) ;
av_opt_set_defaults ( dest - > priv_data ) ;
}
return 0 ;
}
static int read_ffserver_streams ( OptionsContext * o , AVFormatContext * s , const char * filename )
{
int i , err ;
@ -1656,6 +1631,7 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
AVStream * st ;
OutputStream * ost ;
AVCodec * codec ;
const char * enc_config ;
codec = avcodec_find_encoder ( ic - > streams [ i ] - > codec - > codec_id ) ;
if ( ! codec ) {
@ -1669,15 +1645,22 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
ost = new_output_stream ( o , s , codec - > type , - 1 ) ;
st = ost - > st ;
ffserver_streams_copy_context ( st - > codec , ic - > streams [ i ] - > codec ,
av_stream_get_recommended_encoder_configuration ( ic - > streams [ i ] ) ) ;
avcodec_get_context_defaults3 ( st - > codec , codec ) ;
enc_config = av_stream_get_recommended_encoder_configuration ( ic - > streams [ i ] ) ;
if ( enc_config ) {
AVDictionary * opts = NULL ;
av_dict_parse_string ( & opts , enc_config , " = " , " , " , 0 ) ;
av_opt_set_dict2 ( st - > codec , & opts , AV_OPT_SEARCH_CHILDREN ) ;
av_dict_free ( & opts ) ;
}
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO & & ! ost - > stream_copy )
choose_sample_fmt ( st , codec ) ;
else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO & & ! ost - > stream_copy )
choose_pixel_fmt ( st , st - > codec , codec , st - > codec - > pix_fmt ) ;
ffserver_streams_copy_context ( ost - > enc_ctx , st - > codec ,
av_stream_get_recommended_encoder_configuration ( ic - > streams [ i ] ) ) ;
avcodec_copy_context ( ost - > enc_ctx , st - > codec ) ;
if ( enc_config )
av_dict_parse_string ( & ost - > encoder_opts , enc_config , " = " , " , " , 0 ) ;
}
avformat_close_input ( & ic ) ;