Fix previously broken x86_64 check, simplifying it in the process.
[libav.git] / cmdutils.c
1 /*
2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <string.h>
23 #include <stdlib.h>
24 #include <errno.h>
25 #include <math.h>
26
27 #include "config.h"
28 #include "avformat.h"
29 #include "avfilter.h"
30 #include "avdevice.h"
31 #include "cmdutils.h"
32 #include "avstring.h"
33 #include "version.h"
34
35 #undef exit
36
37
38 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
39 {
40 char *tail;
41 const char *error;
42 double d = strtod(numstr, &tail);
43 if (*tail)
44 error= "Expected number for %s but found: %s\n";
45 else if (d < min || d > max)
46 error= "The value for %s was %s which is not within %f - %f\n";
47 else if(type == OPT_INT64 && (int64_t)d != d)
48 error= "Expected int64 for %s but found %s\n";
49 else
50 return d;
51 fprintf(stderr, error, context, numstr, min, max);
52 exit(1);
53 }
54
55 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
56 {
57 const OptionDef *po;
58 int first;
59
60 first = 1;
61 for(po = options; po->name != NULL; po++) {
62 char buf[64];
63 if ((po->flags & mask) == value) {
64 if (first) {
65 printf("%s", msg);
66 first = 0;
67 }
68 av_strlcpy(buf, po->name, sizeof(buf));
69 if (po->flags & HAS_ARG) {
70 av_strlcat(buf, " ", sizeof(buf));
71 av_strlcat(buf, po->argname, sizeof(buf));
72 }
73 printf("-%-17s %s\n", buf, po->help);
74 }
75 }
76 }
77
78 static const OptionDef* find_option(const OptionDef *po, const char *name){
79 while (po->name != NULL) {
80 if (!strcmp(name, po->name))
81 break;
82 po++;
83 }
84 return po;
85 }
86
87 void parse_options(int argc, char **argv, const OptionDef *options,
88 void (* parse_arg_function)(const char*))
89 {
90 const char *opt, *arg;
91 int optindex, handleoptions=1;
92 const OptionDef *po;
93
94 /* parse options */
95 optindex = 1;
96 while (optindex < argc) {
97 opt = argv[optindex++];
98
99 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
100 if (opt[1] == '-' && opt[2] == '\0') {
101 handleoptions = 0;
102 continue;
103 }
104 po= find_option(options, opt + 1);
105 if (!po->name)
106 po= find_option(options, "default");
107 if (!po->name) {
108 unknown_opt:
109 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
110 exit(1);
111 }
112 arg = NULL;
113 if (po->flags & HAS_ARG) {
114 arg = argv[optindex++];
115 if (!arg) {
116 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
117 exit(1);
118 }
119 }
120 if (po->flags & OPT_STRING) {
121 char *str;
122 str = av_strdup(arg);
123 *po->u.str_arg = str;
124 } else if (po->flags & OPT_BOOL) {
125 *po->u.int_arg = 1;
126 } else if (po->flags & OPT_INT) {
127 *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX);
128 } else if (po->flags & OPT_INT64) {
129 *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX);
130 } else if (po->flags & OPT_FLOAT) {
131 *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
132 } else if (po->flags & OPT_FUNC2) {
133 if(po->u.func2_arg(opt+1, arg)<0)
134 goto unknown_opt;
135 } else {
136 po->u.func_arg(arg);
137 }
138 } else {
139 if (parse_arg_function)
140 parse_arg_function(opt);
141 }
142 }
143 }
144
145 void print_error(const char *filename, int err)
146 {
147 switch(err) {
148 case AVERROR_NUMEXPECTED:
149 fprintf(stderr, "%s: Incorrect image filename syntax.\n"
150 "Use '%%d' to specify the image number:\n"
151 " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
152 " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
153 filename);
154 break;
155 case AVERROR_INVALIDDATA:
156 fprintf(stderr, "%s: Error while parsing header\n", filename);
157 break;
158 case AVERROR_NOFMT:
159 fprintf(stderr, "%s: Unknown format\n", filename);
160 break;
161 case AVERROR(EIO):
162 fprintf(stderr, "%s: I/O error occured\n"
163 "Usually that means that input file is truncated and/or corrupted.\n",
164 filename);
165 break;
166 case AVERROR(ENOMEM):
167 fprintf(stderr, "%s: memory allocation error occured\n", filename);
168 break;
169 case AVERROR(ENOENT):
170 fprintf(stderr, "%s: no such file or directory\n", filename);
171 break;
172 default:
173 fprintf(stderr, "%s: Error while opening file\n", filename);
174 break;
175 }
176 }
177
178 void show_banner(const char *program_name, int program_birth_year)
179 {
180 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2008 Fabrice Bellard, et al.\n",
181 program_name, program_birth_year);
182 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
183 fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
184 fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
185 fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
186 fprintf(stderr, " libavdevice version: " AV_STRINGIFY(LIBAVDEVICE_VERSION) "\n");
187 #if ENABLE_AVFILTER
188 fprintf(stderr, " libavfilter version: " AV_STRINGIFY(LIBAVFILTER_VERSION) "\n");
189 #endif
190 fprintf(stderr, " built on " __DATE__ " " __TIME__);
191 #ifdef __GNUC__
192 fprintf(stderr, ", gcc: " __VERSION__ "\n");
193 #else
194 fprintf(stderr, ", using a non-gcc compiler\n");
195 #endif
196 }
197
198 void show_version(const char *program_name) {
199 /* TODO: add function interface to avutil and avformat avdevice*/
200 printf("%s " FFMPEG_VERSION "\n", program_name);
201 printf("libavutil %d\n"
202 "libavcodec %d\n"
203 "libavformat %d\n"
204 "libavdevice %d\n",
205 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD, LIBAVDEVICE_BUILD);
206 }
207
208 void show_license(void)
209 {
210 #ifdef CONFIG_NONFREE
211 printf(
212 "This version of FFmpeg has nonfree parts compiled in.\n"
213 "Therefore it is not legally redistributable.\n"
214 );
215 #elif CONFIG_GPL
216 printf(
217 "FFmpeg is free software; you can redistribute it and/or modify\n"
218 "it under the terms of the GNU General Public License as published by\n"
219 "the Free Software Foundation; either version 2 of the License, or\n"
220 "(at your option) any later version.\n"
221 "\n"
222 "FFmpeg is distributed in the hope that it will be useful,\n"
223 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
224 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
225 "GNU General Public License for more details.\n"
226 "\n"
227 "You should have received a copy of the GNU General Public License\n"
228 "along with FFmpeg; if not, write to the Free Software\n"
229 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
230 );
231 #else
232 printf(
233 "FFmpeg is free software; you can redistribute it and/or\n"
234 "modify it under the terms of the GNU Lesser General Public\n"
235 "License as published by the Free Software Foundation; either\n"
236 "version 2.1 of the License, or (at your option) any later version.\n"
237 "\n"
238 "FFmpeg is distributed in the hope that it will be useful,\n"
239 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
240 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
241 "Lesser General Public License for more details.\n"
242 "\n"
243 "You should have received a copy of the GNU Lesser General Public\n"
244 "License along with FFmpeg; if not, write to the Free Software\n"
245 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
246 );
247 #endif
248 }