[FFmpeg-cvslog] avconv: pass libavresample options to AVFilterGraph

Justin Ruggles git at videolan.org
Sun Feb 24 17:42:31 CET 2013


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Tue Dec 18 21:47:28 2012 -0500| [5c7db097ebe1fb5c233cedd8846615074e7d6044] | committer: Justin Ruggles

avconv: pass libavresample options to AVFilterGraph

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5c7db097ebe1fb5c233cedd8846615074e7d6044
---

 avconv.c        |    1 +
 avconv.h        |    1 +
 avconv_filter.c |   18 +++++++++++++++++-
 avconv_opt.c    |    2 ++
 cmdutils.c      |   12 ++++++++++--
 cmdutils.h      |    3 ++-
 6 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/avconv.c b/avconv.c
index f086cbb..4ad01c2 100644
--- a/avconv.c
+++ b/avconv.c
@@ -2303,6 +2303,7 @@ static int transcode(void)
                 av_freep(&ost->st->codec->subtitle_header);
                 av_free(ost->forced_kf_pts);
                 av_dict_free(&ost->opts);
+                av_dict_free(&ost->resample_opts);
             }
         }
     }
diff --git a/avconv.h b/avconv.h
index defdf59..da7259e 100644
--- a/avconv.h
+++ b/avconv.h
@@ -293,6 +293,7 @@ typedef struct OutputStream {
 
     int64_t sws_flags;
     AVDictionary *opts;
+    AVDictionary *resample_opts;
     int finished;        /* no more packets should be written for this stream */
     int stream_copy;
     const char *attachment_filename;
diff --git a/avconv_filter.c b/avconv_filter.c
index 50e1e73..9cef1af 100644
--- a/avconv_filter.c
+++ b/avconv_filter.c
@@ -23,8 +23,12 @@
 #include "libavfilter/avfilter.h"
 #include "libavfilter/avfiltergraph.h"
 
+#include "libavresample/avresample.h"
+
 #include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
 #include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/pixfmt.h"
 #include "libavutil/samplefmt.h"
@@ -501,9 +505,21 @@ int configure_filtergraph(FilterGraph *fg)
 
     if (simple) {
         OutputStream *ost = fg->outputs[0]->ost;
-        char args[255];
+        char args[512];
+        AVDictionaryEntry *e = NULL;
+        const AVClass *rc = avresample_get_class();
+
         snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
         fg->graph->scale_sws_opts = av_strdup(args);
+
+        args[0] = '\0';
+        while ((e = av_dict_get(fg->outputs[0]->ost->resample_opts, "", e,
+                                AV_DICT_IGNORE_SUFFIX))) {
+            av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
+        }
+        if (strlen(args))
+            args[strlen(args) - 1] = '\0';
+        fg->graph->resample_lavr_opts = av_strdup(args);
     }
 
     if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
diff --git a/avconv_opt.c b/avconv_opt.c
index e67abef..2a40087 100644
--- a/avconv_opt.c
+++ b/avconv_opt.c
@@ -844,6 +844,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
 
     av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
 
+    av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
+
     ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
 
     return ost;
diff --git a/cmdutils.c b/cmdutils.c
index 5b853fd..ee6baa1 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -54,7 +54,7 @@
 #endif
 
 struct SwsContext *sws_opts;
-AVDictionary *format_opts, *codec_opts;
+AVDictionary *format_opts, *codec_opts, *resample_opts;
 
 static const int this_year = 2013;
 
@@ -74,6 +74,7 @@ void uninit_opts(void)
 #endif
     av_dict_free(&format_opts);
     av_dict_free(&codec_opts);
+    av_dict_free(&resample_opts);
 }
 
 void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
@@ -405,6 +406,7 @@ int opt_default(void *optctx, const char *opt, const char *arg)
     char opt_stripped[128];
     const char *p;
     const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
+    const AVClass *rc = avresample_get_class();
 #if CONFIG_SWSCALE
     const AVClass *sc = sws_get_class();
 #endif
@@ -421,6 +423,9 @@ int opt_default(void *optctx, const char *opt, const char *arg)
     else if ((o = av_opt_find(&fc, opt, NULL, 0,
                               AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
         av_dict_set(&format_opts, opt, arg, FLAGS);
+    else if ((o = av_opt_find(&rc, opt, NULL, 0,
+                              AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
+        av_dict_set(&resample_opts, opt, arg, FLAGS);
 #if CONFIG_SWSCALE
     else if ((o = av_opt_find(&sc, opt, NULL, 0,
                               AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
@@ -480,9 +485,11 @@ static void finish_group(OptionParseContext *octx, int group_idx,
 #endif
     g->codec_opts  = codec_opts;
     g->format_opts = format_opts;
+    g->resample_opts = resample_opts;
 
     codec_opts  = NULL;
     format_opts = NULL;
+    resample_opts = NULL;
 #if CONFIG_SWSCALE
     sws_opts    = NULL;
 #endif
@@ -539,6 +546,7 @@ void uninit_parse_context(OptionParseContext *octx)
             av_freep(&l->groups[j].opts);
             av_dict_free(&l->groups[j].codec_opts);
             av_dict_free(&l->groups[j].format_opts);
+            av_dict_free(&l->groups[j].resample_opts);
 #if CONFIG_SWSCALE
             sws_freeContext(l->groups[j].sws_opts);
 #endif
@@ -645,7 +653,7 @@ do {                                                                           \
         return AVERROR_OPTION_NOT_FOUND;
     }
 
-    if (octx->cur_group.nb_opts || codec_opts || format_opts)
+    if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
         av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
                "commandline.\n");
 
diff --git a/cmdutils.h b/cmdutils.h
index ed9c68e..84d9068 100644
--- a/cmdutils.h
+++ b/cmdutils.h
@@ -42,7 +42,7 @@ extern const int program_birth_year;
 extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
 extern AVFormatContext *avformat_opts;
 extern struct SwsContext *sws_opts;
-extern AVDictionary *format_opts, *codec_opts;
+extern AVDictionary *format_opts, *codec_opts, *resample_opts;
 
 /**
  * Initialize the cmdutils option system, in particular
@@ -235,6 +235,7 @@ typedef struct OptionGroup {
 
     AVDictionary *codec_opts;
     AVDictionary *format_opts;
+    AVDictionary *resample_opts;
     struct SwsContext *sws_opts;
 } OptionGroup;
 



More information about the ffmpeg-cvslog mailing list