mirror of
				https://git.ffmpeg.org/ffmpeg.git
				synced 2025-10-31 07:40:55 +00:00 
			
		
		
		
	fftools: add -report option.
This commit is contained in:
		
							parent
							
								
									5207f9597e
								
							
						
					
					
						commit
						337ce558b6
					
				
					 5 changed files with 99 additions and 0 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nicolas George
						Nicolas George