[FFmpeg-devel] [PATCH] ffmpeg: store value of -filter and -filter_script per-stream option in OutputStream struct

Stefano Sabatini stefasab at gmail.com
Mon Nov 4 10:15:38 CET 2013


Avoid the need for multiple potentially inconsistent access operations,
slightly factorize code.
---
 ffmpeg.h     |  2 ++
 ffmpeg_opt.c | 42 ++++++++++++++++++------------------------
 2 files changed, 20 insertions(+), 24 deletions(-)

diff --git a/ffmpeg.h b/ffmpeg.h
index c001d2c..409525c 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -357,6 +357,8 @@ typedef struct OutputStream {
 
     OutputFilter *filter;
     char *avfilter;
+    char *filters;         ///< filtergraph associated to the -filter option
+    char *filters_script;  ///< filtergraph script associated to the -filter_script option
 
     int64_t sws_flags;
     AVDictionary *opts;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 36e4845..be9b7ed 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -1151,21 +1151,17 @@ static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
                              OutputStream *ost)
 {
     AVStream *st = ost->st;
-    char *filter = NULL, *filter_script = NULL;
 
-    MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
-    MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
-
-    if (filter_script && filter) {
+    if (ost->filters_script && ost->filters) {
         av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
                "output stream #%d:%d.\n", nb_output_files, st->index);
         exit_program(1);
     }
 
-    if (filter_script)
-        return read_file(filter_script);
-    else if (filter)
-        return av_strdup(filter);
+    if (ost->filters_script)
+        return read_file(ost->filters_script);
+    else if (ost->filters)
+        return av_strdup(ost->filters);
 
     return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
                      "null" : "anull");
@@ -1174,16 +1170,12 @@ static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
                                      const OutputStream *ost, enum AVMediaType type)
 {
-    char *filter_script = NULL, *filter = NULL;
-    MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, ost->st);
-    MATCH_PER_STREAM_OPT(filters,        str, filter,        oc, ost->st);
-    if (filter_script || filter) {
+    if (ost->filters_script || ost->filters) {
         av_log(NULL, AV_LOG_ERROR,
                "Filtergraph '%s' or filter_script '%s' was defined for %s output stream "
-               "%d:%d but codec copy was selected.\n"
-               "Filtering and streamcopy cannot be used together.\n",
-               (char *)av_x_if_null(filter, "(none)"),
-               (char *)av_x_if_null(filter_script, "(none)"),
+               "%d:%d but codec copy was selected.\n",
+               (char *)av_x_if_null(ost->filters, "(none)"),
+               (char *)av_x_if_null(ost->filters_script, "(none)"),
                av_get_media_type_string(type),
                ost->file_index, ost->index);
         exit_program(1);
@@ -1218,6 +1210,9 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
         ost->frame_aspect_ratio = q;
     }
 
+    MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
+    MATCH_PER_STREAM_OPT(filters,        str, ost->filters,        oc, st);
+
     if (!ost->stream_copy) {
         const char *p = NULL;
         char *frame_size = NULL;
@@ -1349,6 +1344,9 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
     audio_enc = st->codec;
     audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
 
+    MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
+    MATCH_PER_STREAM_OPT(filters,        str, ost->filters,        oc, st);
+
     if (!ost->stream_copy) {
         char *sample_fmt = NULL;
 
@@ -1574,17 +1572,13 @@ static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
     }
 
     if (ost->avfilter) {
-        char *filter_script = NULL, *filter = NULL;
-        MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, ost->st);
-        MATCH_PER_STREAM_OPT(filters, str, filter, oc, ost->st);
-
-        if (filter || filter_script) {
+        if (ost->filters || ost->filters_script) {
             av_log(NULL, AV_LOG_ERROR,
                    "Filter graph '%s' or filter script '%s' was specified through the -filter/-filter_script/-vf/-af option "
                    "for output stream %d:%d, which is fed from a complex filtergraph.\n"
                    "-filter/-filter_script and -filter_complex cannot be used together for the same stream.\n",
-                   (char *)av_x_if_null(filter, "(none)"),
-                   (char *)av_x_if_null(filter_script, "(none)"),
+                   (char *)av_x_if_null(ost->filters, "(none)"),
+                   (char *)av_x_if_null(ost->filters_script, "(none)"),
                    ost->file_index, ost->index);
             exit_program(1);
         }
-- 
1.8.1.2



More information about the ffmpeg-devel mailing list