fftools: add -report option.
This commit is contained in:
parent
5207f9597e
commit
337ce558b6
@ -131,6 +131,7 @@ easier to use. The changes are:
|
|||||||
- life source
|
- life source
|
||||||
- PCM format support in OMA demuxer
|
- PCM format support in OMA demuxer
|
||||||
- CLJR encoder
|
- CLJR encoder
|
||||||
|
- new option: -report
|
||||||
|
|
||||||
|
|
||||||
version 0.8:
|
version 0.8:
|
||||||
|
85
cmdutils.c
85
cmdutils.c
@ -55,6 +55,8 @@ AVDictionary *format_opts, *codec_opts;
|
|||||||
|
|
||||||
static const int this_year = 2011;
|
static const int this_year = 2011;
|
||||||
|
|
||||||
|
static FILE *report_file;
|
||||||
|
|
||||||
void init_opts(void)
|
void init_opts(void)
|
||||||
{
|
{
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
@ -77,6 +79,20 @@ void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
|
|||||||
vfprintf(stdout, fmt, vl);
|
vfprintf(stdout, fmt, vl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
|
||||||
|
{
|
||||||
|
va_list vl2;
|
||||||
|
char line[1024];
|
||||||
|
static int print_prefix = 1;
|
||||||
|
|
||||||
|
va_copy(vl2, vl);
|
||||||
|
av_log_default_callback(ptr, level, fmt, vl);
|
||||||
|
av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
|
||||||
|
va_end(vl2);
|
||||||
|
fputs(line, report_file);
|
||||||
|
fflush(report_file);
|
||||||
|
}
|
||||||
|
|
||||||
double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
|
double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
|
||||||
{
|
{
|
||||||
char *tail;
|
char *tail;
|
||||||
@ -344,6 +360,30 @@ static int locate_option(int argc, char **argv, const OptionDef *options, const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_argument(const char *a)
|
||||||
|
{
|
||||||
|
const unsigned char *p;
|
||||||
|
|
||||||
|
for (p = a; *p; p++)
|
||||||
|
if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
|
||||||
|
*p == '_' || (*p >= 'a' && *p <= 'z')))
|
||||||
|
break;
|
||||||
|
if (!*p) {
|
||||||
|
fputs(a, report_file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fputc('"', report_file);
|
||||||
|
for (p = a; *p; p++) {
|
||||||
|
if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
|
||||||
|
fprintf(report_file, "\\%c", *p);
|
||||||
|
else if (*p < ' ' || *p > '~')
|
||||||
|
fprintf(report_file, "\\x%02x", *p);
|
||||||
|
else
|
||||||
|
fputc(*p, report_file);
|
||||||
|
}
|
||||||
|
fputc('"', report_file);
|
||||||
|
}
|
||||||
|
|
||||||
void parse_loglevel(int argc, char **argv, const OptionDef *options)
|
void parse_loglevel(int argc, char **argv, const OptionDef *options)
|
||||||
{
|
{
|
||||||
int idx = locate_option(argc, argv, options, "loglevel");
|
int idx = locate_option(argc, argv, options, "loglevel");
|
||||||
@ -351,6 +391,19 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options)
|
|||||||
idx = locate_option(argc, argv, options, "v");
|
idx = locate_option(argc, argv, options, "v");
|
||||||
if (idx && argv[idx + 1])
|
if (idx && argv[idx + 1])
|
||||||
opt_loglevel("loglevel", argv[idx + 1]);
|
opt_loglevel("loglevel", argv[idx + 1]);
|
||||||
|
idx = locate_option(argc, argv, options, "report");
|
||||||
|
if (idx || getenv("FFREPORT")) {
|
||||||
|
opt_report("report");
|
||||||
|
if (report_file) {
|
||||||
|
int i;
|
||||||
|
fprintf(report_file, "Command line:\n");
|
||||||
|
for (i = 0; i < argc; i++) {
|
||||||
|
dump_argument(argv[i]);
|
||||||
|
fputc(i < argc - 1 ? ' ' : '\n', report_file);
|
||||||
|
}
|
||||||
|
fflush(report_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLAGS(o) ((o)->type == AV_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
|
#define FLAGS(o) ((o)->type == AV_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
|
||||||
@ -424,6 +477,38 @@ int opt_loglevel(const char *opt, const char *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int opt_report(const char *opt)
|
||||||
|
{
|
||||||
|
char filename[64];
|
||||||
|
time_t now;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
if (report_file) /* already opened */
|
||||||
|
return 0;
|
||||||
|
time(&now);
|
||||||
|
tm = localtime(&now);
|
||||||
|
snprintf(filename, sizeof(filename), "%s-%04d%02d%02d-%02d%02d%02d.log",
|
||||||
|
program_name,
|
||||||
|
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
||||||
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
report_file = fopen(filename, "w");
|
||||||
|
if (!report_file) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
|
||||||
|
filename, strerror(errno));
|
||||||
|
return AVERROR(errno);
|
||||||
|
}
|
||||||
|
av_log_set_callback(log_callback_report);
|
||||||
|
av_log(NULL, AV_LOG_INFO,
|
||||||
|
"%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
|
||||||
|
"Report written to \"%s\"\n",
|
||||||
|
program_name,
|
||||||
|
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
||||||
|
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||||
|
filename);
|
||||||
|
av_log_set_level(FFMAX(av_log_get_level(), AV_LOG_VERBOSE));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int opt_codec_debug(const char *opt, const char *arg)
|
int opt_codec_debug(const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
av_log_set_level(AV_LOG_DEBUG);
|
av_log_set_level(AV_LOG_DEBUG);
|
||||||
|
@ -76,6 +76,8 @@ int opt_default(const char *opt, const char *arg);
|
|||||||
*/
|
*/
|
||||||
int opt_loglevel(const char *opt, const char *arg);
|
int opt_loglevel(const char *opt, const char *arg);
|
||||||
|
|
||||||
|
int opt_report(const char *opt);
|
||||||
|
|
||||||
int opt_codec_debug(const char *opt, const char *arg);
|
int opt_codec_debug(const char *opt, const char *arg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,3 +14,4 @@
|
|||||||
{ "loglevel", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
|
{ "loglevel", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
|
||||||
{ "v", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
|
{ "v", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
|
||||||
{ "debug", HAS_ARG, {(void*)opt_codec_debug}, "set debug flags", "flags" },
|
{ "debug", HAS_ARG, {(void*)opt_codec_debug}, "set debug flags", "flags" },
|
||||||
|
{ "report", 0, {(void*)opt_report}, "generate a report" },
|
||||||
|
@ -123,6 +123,16 @@ the environment variable @env{FFMPEG_FORCE_COLOR}.
|
|||||||
The use of the environment variable @env{NO_COLOR} is deprecated and
|
The use of the environment variable @env{NO_COLOR} is deprecated and
|
||||||
will be dropped in a following FFmpeg version.
|
will be dropped in a following FFmpeg version.
|
||||||
|
|
||||||
|
@item -report
|
||||||
|
Dump full command line and console output to a file named
|
||||||
|
@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
|
||||||
|
directory.
|
||||||
|
This file can be useful for bug reports.
|
||||||
|
It also implies @code{-loglevel verbose}.
|
||||||
|
|
||||||
|
Note: setting the environment variable @code{FFREPORT} to any value has the
|
||||||
|
same effect.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section AVOptions
|
@section AVOptions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user