[FFmpeg-devel] [PATCH 5/5] ffmpeg: add abort_on option to allow aborting on empty output

Marton Balint cus at passwd.hu
Sun Oct 18 00:24:07 CEST 2015


Signed-off-by: Marton Balint <cus at passwd.hu>
---
 doc/ffmpeg.texi |  8 ++++++++
 ffmpeg.c        |  7 +++++++
 ffmpeg.h        |  3 +++
 ffmpeg_opt.c    | 21 +++++++++++++++++++++
 4 files changed, 39 insertions(+)

diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index de49618..022304d 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -1236,6 +1236,14 @@ Discard all frames excepts keyframes.
 Discard all frames.
 @end table
 
+ at item -abort_on @var{flags} (@emph{global})
+Stop and abort on various conditions. The following flags are available:
+
+ at table @option
+ at item empty_output
+No packets were passed to the muxer, the output is empty.
+ at end table
+
 @item -xerror (@emph{global})
 Stop and exit on error
 
diff --git a/ffmpeg.c b/ffmpeg.c
index f6947f8..18b8c65 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -4049,6 +4049,7 @@ static int transcode(void)
     OutputStream *ost;
     InputStream *ist;
     int64_t timer_start;
+    int64_t total_packets_written = 0;
 
     ret = transcode_init();
     if (ret < 0)
@@ -4129,6 +4130,12 @@ static int transcode(void)
         if (ost->encoding_needed) {
             av_freep(&ost->enc_ctx->stats_in);
         }
+        total_packets_written += ost->packets_written;
+    }
+
+    if (!total_packets_written && (abort_on_flags & ABORT_ON_FLAG_EMPTY_OUTPUT)) {
+        av_log(NULL, AV_LOG_FATAL, "Empty output\n");
+        exit_program(1);
     }
 
     /* close each decoder */
diff --git a/ffmpeg.h b/ffmpeg.h
index 5722816..7844b9d 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -382,6 +382,8 @@ enum forced_keyframes_const {
     FKF_NB
 };
 
+#define ABORT_ON_FLAG_EMPTY_OUTPUT (1 <<  0)
+
 extern const char *const forced_keyframes_const_names[];
 
 typedef enum {
@@ -524,6 +526,7 @@ extern int start_at_zero;
 extern int copy_tb;
 extern int debug_ts;
 extern int exit_on_error;
+extern int abort_on_flags;
 extern int print_stats;
 extern int qp_hist;
 extern int stdin_interaction;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 7139114..4dd3a18 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -103,6 +103,7 @@ int start_at_zero     = 0;
 int copy_tb           = -1;
 int debug_ts          = 0;
 int exit_on_error     = 0;
+int abort_on_flags    = 0;
 int print_stats       = -1;
 int qp_hist           = 0;
 int stdin_interaction = 1;
@@ -196,6 +197,24 @@ static AVDictionary *strip_specifiers(AVDictionary *dict)
     return ret;
 }
 
+static int opt_abort_on(void *optctx, const char *opt, const char *arg)
+{
+    static const AVOption opts[] = {
+        { "abort_on"        , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
+        { "empty_output"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT     },    .unit = "flags" },
+        { NULL },
+    };
+    static const AVClass class = {
+        .class_name = "",
+        .item_name  = av_default_item_name,
+        .option     = opts,
+        .version    = LIBAVUTIL_VERSION_INT,
+    };
+    const AVClass *pclass = &class;
+
+    return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
+}
+
 static int opt_sameq(void *optctx, const char *opt, const char *arg)
 {
     av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
@@ -3120,6 +3139,8 @@ const OptionDef options[] = {
         "timestamp error delta threshold", "threshold" },
     { "xerror",         OPT_BOOL | OPT_EXPERT,                       { &exit_on_error },
         "exit on error", "error" },
+    { "abort_on",       HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_abort_on },
+        "abort on the specified condition flags", "flags" },
     { "copyinkf",       OPT_BOOL | OPT_EXPERT | OPT_SPEC |
                         OPT_OUTPUT,                                  { .off = OFFSET(copy_initial_nonkeyframes) },
         "copy initial non-keyframes" },
-- 
2.1.4



More information about the ffmpeg-devel mailing list