]> git.sesse.net Git - ffmpeg/blobdiff - ffmpeg_opt.c
Merge commit '44127b157e9f8acb837d4bb3a094f56b40da3ef5'
[ffmpeg] / ffmpeg_opt.c
index 85466c78c1e9808367342286eae22c5cf517036a..03e049bd8dd39a85394d95b35733e2e2a5c3131f 100644 (file)
@@ -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);