summaryrefslogtreecommitdiff
path: root/fftools
diff options
context:
space:
mode:
authorTobias Rapp <t.rapp@noa-archive.com>2018-04-03 08:54:10 +0200
committerTobias Rapp <t.rapp@noa-archive.com>2018-04-03 10:17:38 +0200
commit4b736bc921ed96ad6d312ce0cbe0de29b9e3fe81 (patch)
tree48da35bec4af36ff23938044418f219cf5697941 /fftools
parent197a4e8feed45b2e5868760240e83636818f32a9 (diff)
fftools/cmdutils: add support for level flag in loglevel option parser
Allows to manage the AV_LOG_PRINT_LEVEL flag as a prefix to the loglevel option value, similar to the existing AV_LOG_SKIP_REPEATE flag. Adds support for setting flags relative to the existing value by using a +/- prefix. Previous version reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Tobias Rapp <t.rapp@noa-archive.com>
Diffstat (limited to 'fftools')
-rw-r--r--fftools/cmdutils.c65
1 files changed, 47 insertions, 18 deletions
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 1001f36299..8ffc9d240b 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -881,28 +881,54 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg)
{ "debug" , AV_LOG_DEBUG },
{ "trace" , AV_LOG_TRACE },
};
+ const char *token;
char *tail;
- int level;
- int flags;
- int i;
-
- flags = av_log_get_flags();
- tail = strstr(arg, "repeat");
- if (tail)
- flags &= ~AV_LOG_SKIP_REPEATED;
- else
- flags |= AV_LOG_SKIP_REPEATED;
-
- av_log_set_flags(flags);
- if (tail == arg)
- arg += 6 + (arg[6]=='+');
- if(tail && !*arg)
- return 0;
+ int flags = av_log_get_flags();
+ int level = av_log_get_level();
+ int cmd, i = 0;
+
+ av_assert0(arg);
+ while (*arg) {
+ token = arg;
+ if (*token == '+' || *token == '-') {
+ cmd = *token++;
+ } else {
+ cmd = 0;
+ }
+ if (!i && !cmd) {
+ flags = 0; /* missing relative prefix, build absolute value */
+ }
+ if (!strncmp(token, "repeat", 6)) {
+ if (cmd == '-') {
+ flags |= AV_LOG_SKIP_REPEATED;
+ } else {
+ flags &= ~AV_LOG_SKIP_REPEATED;
+ }
+ arg = token + 6;
+ } else if (!strncmp(token, "level", 5)) {
+ if (cmd == '-') {
+ flags &= ~AV_LOG_PRINT_LEVEL;
+ } else {
+ flags |= AV_LOG_PRINT_LEVEL;
+ }
+ arg = token + 5;
+ } else {
+ break;
+ }
+ i++;
+ }
+ if (!*arg) {
+ goto end;
+ } else if (*arg == '+') {
+ arg++;
+ } else if (!i) {
+ flags = av_log_get_flags(); /* level value without prefix, reset flags */
+ }
for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
if (!strcmp(log_levels[i].name, arg)) {
- av_log_set_level(log_levels[i].level);
- return 0;
+ level = log_levels[i].level;
+ goto end;
}
}
@@ -914,6 +940,9 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg)
av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
exit_program(1);
}
+
+end:
+ av_log_set_flags(flags);
av_log_set_level(level);
return 0;
}