ffmpeg: add abort_on option to allow aborting on empty output
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
5821244b22
commit
ddc6bd8c95
@ -1260,6 +1260,14 @@ Discard all frames excepts keyframes.
|
|||||||
Discard all frames.
|
Discard all frames.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@item -abort_on @var{flags} (@emph{global})
|
||||||
|
Stop and abort on various conditions. The following flags are available:
|
||||||
|
|
||||||
|
@table @option
|
||||||
|
@item empty_output
|
||||||
|
No packets were passed to the muxer, the output is empty.
|
||||||
|
@end table
|
||||||
|
|
||||||
@item -xerror (@emph{global})
|
@item -xerror (@emph{global})
|
||||||
Stop and exit on error
|
Stop and exit on error
|
||||||
|
|
||||||
|
7
ffmpeg.c
7
ffmpeg.c
@ -4054,6 +4054,7 @@ static int transcode(void)
|
|||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
InputStream *ist;
|
InputStream *ist;
|
||||||
int64_t timer_start;
|
int64_t timer_start;
|
||||||
|
int64_t total_packets_written = 0;
|
||||||
|
|
||||||
ret = transcode_init();
|
ret = transcode_init();
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -4134,6 +4135,12 @@ static int transcode(void)
|
|||||||
if (ost->encoding_needed) {
|
if (ost->encoding_needed) {
|
||||||
av_freep(&ost->enc_ctx->stats_in);
|
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 */
|
/* close each decoder */
|
||||||
|
3
ffmpeg.h
3
ffmpeg.h
@ -383,6 +383,8 @@ enum forced_keyframes_const {
|
|||||||
FKF_NB
|
FKF_NB
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define ABORT_ON_FLAG_EMPTY_OUTPUT (1 << 0)
|
||||||
|
|
||||||
extern const char *const forced_keyframes_const_names[];
|
extern const char *const forced_keyframes_const_names[];
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -527,6 +529,7 @@ extern int start_at_zero;
|
|||||||
extern int copy_tb;
|
extern int copy_tb;
|
||||||
extern int debug_ts;
|
extern int debug_ts;
|
||||||
extern int exit_on_error;
|
extern int exit_on_error;
|
||||||
|
extern int abort_on_flags;
|
||||||
extern int print_stats;
|
extern int print_stats;
|
||||||
extern int qp_hist;
|
extern int qp_hist;
|
||||||
extern int stdin_interaction;
|
extern int stdin_interaction;
|
||||||
|
21
ffmpeg_opt.c
21
ffmpeg_opt.c
@ -106,6 +106,7 @@ int start_at_zero = 0;
|
|||||||
int copy_tb = -1;
|
int copy_tb = -1;
|
||||||
int debug_ts = 0;
|
int debug_ts = 0;
|
||||||
int exit_on_error = 0;
|
int exit_on_error = 0;
|
||||||
|
int abort_on_flags = 0;
|
||||||
int print_stats = -1;
|
int print_stats = -1;
|
||||||
int qp_hist = 0;
|
int qp_hist = 0;
|
||||||
int stdin_interaction = 1;
|
int stdin_interaction = 1;
|
||||||
@ -199,6 +200,24 @@ static AVDictionary *strip_specifiers(AVDictionary *dict)
|
|||||||
return ret;
|
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)
|
static int opt_sameq(void *optctx, const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
||||||
@ -3123,6 +3142,8 @@ const OptionDef options[] = {
|
|||||||
"timestamp error delta threshold", "threshold" },
|
"timestamp error delta threshold", "threshold" },
|
||||||
{ "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
|
{ "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
|
||||||
"exit on error", "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 |
|
{ "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
|
||||||
OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
|
OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
|
||||||
"copy initial non-keyframes" },
|
"copy initial non-keyframes" },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user