mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ffmpeg_opt: make use of recommended encoder configuration
So far ffmpeg used recommended configuration only for codec priv options. ffmpeg will use now codec defaults and then apply recommended configuration for all options. Recommended configuration possibly contains minimal set of options to filful user configuration. Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
This commit is contained in:
parent
500d608861
commit
3ff3990104
41
ffmpeg_opt.c
41
ffmpeg_opt.c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user