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>
pull/283/head
Tobias Rapp 7 years ago
parent 197a4e8fee
commit 4b736bc921
  1. 65
      fftools/cmdutils.c

@ -881,28 +881,54 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg)
{ "debug" , AV_LOG_DEBUG }, { "debug" , AV_LOG_DEBUG },
{ "trace" , AV_LOG_TRACE }, { "trace" , AV_LOG_TRACE },
}; };
const char *token;
char *tail; char *tail;
int level; int flags = av_log_get_flags();
int flags; int level = av_log_get_level();
int i; int cmd, i = 0;
flags = av_log_get_flags(); av_assert0(arg);
tail = strstr(arg, "repeat"); while (*arg) {
if (tail) token = arg;
flags &= ~AV_LOG_SKIP_REPEATED; if (*token == '+' || *token == '-') {
else cmd = *token++;
flags |= AV_LOG_SKIP_REPEATED; } else {
cmd = 0;
av_log_set_flags(flags); }
if (tail == arg) if (!i && !cmd) {
arg += 6 + (arg[6]=='+'); flags = 0; /* missing relative prefix, build absolute value */
if(tail && !*arg) }
return 0; 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++) { for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
if (!strcmp(log_levels[i].name, arg)) { if (!strcmp(log_levels[i].name, arg)) {
av_log_set_level(log_levels[i].level); level = log_levels[i].level;
return 0; 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); av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
exit_program(1); exit_program(1);
} }
end:
av_log_set_flags(flags);
av_log_set_level(level); av_log_set_level(level);
return 0; return 0;
} }

Loading…
Cancel
Save