Skip to content
Newer
Older
100644 249 lines (233 sloc) 8.64 KB
c6141f3 added ffplay utility
bellard authored
1 /*
2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
4 *
3500415 Change license headers to say 'FFmpeg' instead of 'this program/this …
diego authored
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
c6141f3 added ffplay utility
bellard authored
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
3500415 Change license headers to say 'FFmpeg' instead of 'this program/this …
diego authored
10 * version 2.1 of the License, or (at your option) any later version.
c6141f3 added ffplay utility
bellard authored
11 *
3500415 Change license headers to say 'FFmpeg' instead of 'this program/this …
diego authored
12 * FFmpeg is distributed in the hope that it will be useful,
c6141f3 added ffplay utility
bellard authored
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
3500415 Change license headers to say 'FFmpeg' instead of 'this program/this …
diego authored
18 * License along with FFmpeg; if not, write to the Free Software
5e6273d Update licensing information: The FSF changed postal address.
diego authored
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c6141f3 added ffplay utility
bellard authored
20 */
ad8ee43 Move HAVE_AV_CONFIG_H definition to the Makefile like in the rest of …
diego authored
21
3b7ac48 to be able to compile without HAVE_AV_CONFIG_H
benoit authored
22 #include <string.h>
23 #include <stdlib.h>
24 #include <errno.h>
bb1d793 Make parse_options() use parse_number_or_die().
benoit authored
25 #include <math.h>
3b7ac48 to be able to compile without HAVE_AV_CONFIG_H
benoit authored
26
c6141f3 added ffplay utility
bellard authored
27 #include "avformat.h"
722a944 Print libavfilter version if it is enabled in configure
vitor authored
28 #include "avfilter.h"
6e1c442 Print libavdevice version.
michael authored
29 #include "avdevice.h"
c6141f3 added ffplay utility
bellard authored
30 #include "cmdutils.h"
438ba2f replace the uses of old string functions that Reimar missed
mru authored
31 #include "avstring.h"
65a3a9a Implement common show version and banner.
benoit authored
32 #include "version.h"
8e4409c cmdutils.c uses FFMPEG_CONFIGURATION from config.h without directly i…
diego authored
33 #include "config.h"
c6141f3 added ffplay utility
bellard authored
34
7dfac14 prevent exit missuse
michael authored
35 #undef exit
36
6de0637 parse_number_or_die()
michael authored
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
8c50b14 more sections in help - copyright fixes
bellard authored
55 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
c6141f3 added ffplay utility
bellard authored
56 {
57 const OptionDef *po;
8c50b14 more sections in help - copyright fixes
bellard authored
58 int first;
c6141f3 added ffplay utility
bellard authored
59
8c50b14 more sections in help - copyright fixes
bellard authored
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 }
438ba2f replace the uses of old string functions that Reimar missed
mru authored
68 av_strlcpy(buf, po->name, sizeof(buf));
8c50b14 more sections in help - copyright fixes
bellard authored
69 if (po->flags & HAS_ARG) {
438ba2f replace the uses of old string functions that Reimar missed
mru authored
70 av_strlcat(buf, " ", sizeof(buf));
71 av_strlcat(buf, po->argname, sizeof(buf));
c6141f3 added ffplay utility
bellard authored
72 }
8c50b14 more sections in help - copyright fixes
bellard authored
73 printf("-%-17s %s\n", buf, po->help);
c6141f3 added ffplay utility
bellard authored
74 }
75 }
76 }
77
d3c394b fix const warning
mru authored
78 static const OptionDef* find_option(const OptionDef *po, const char *name){
0aaffc4 AVOption API improvments
michael authored
79 while (po->name != NULL) {
80 if (!strcmp(name, po->name))
81 break;
82 po++;
83 }
84 return po;
85 }
86
13e5863 Make cmdutils.c:parse_options accept as argument a function to parse
diego authored
87 void parse_options(int argc, char **argv, const OptionDef *options,
88 void (* parse_arg_function)(const char*))
c6141f3 added ffplay utility
bellard authored
89 {
90 const char *opt, *arg;
305cefc 10l in r7174 caused all options to be treated as filenames.
lorenm authored
91 int optindex, handleoptions=1;
c6141f3 added ffplay utility
bellard authored
92 const OptionDef *po;
93
94 /* parse options */
95 optindex = 1;
96 while (optindex < argc) {
97 opt = argv[optindex++];
0b33aaf COSMETICS: Remove all trailing whitespace.
diego authored
98
6cacebc Add support for files that begin with a dash.
gpoirier authored
99 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
100 if (opt[1] == '-' && opt[2] == '\0') {
101 handleoptions = 0;
102 continue;
103 }
0aaffc4 AVOption API improvments
michael authored
104 po= find_option(options, opt + 1);
105 if (!po->name)
106 po= find_option(options, "default");
c6141f3 added ffplay utility
bellard authored
107 if (!po->name) {
0aaffc4 AVOption API improvments
michael authored
108 unknown_opt:
c6141f3 added ffplay utility
bellard authored
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;
8c50b14 more sections in help - copyright fixes
bellard authored
122 str = av_strdup(arg);
c6141f3 added ffplay utility
bellard authored
123 *po->u.str_arg = str;
124 } else if (po->flags & OPT_BOOL) {
125 *po->u.int_arg = 1;
b383eef OPT_INT
michael authored
126 } else if (po->flags & OPT_INT) {
bb1d793 Make parse_options() use parse_number_or_die().
benoit authored
127 *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX);
9ee38da add OPT_INT64 option
bcoudurier authored
128 } else if (po->flags & OPT_INT64) {
bb1d793 Make parse_options() use parse_number_or_die().
benoit authored
129 *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX);
c99f6dc OPT_FLOAT
michael authored
130 } else if (po->flags & OPT_FLOAT) {
bb1d793 Make parse_options() use parse_number_or_die().
benoit authored
131 *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -INFINITY, INFINITY);
0aaffc4 AVOption API improvments
michael authored
132 } else if (po->flags & OPT_FUNC2) {
133 if(po->u.func2_arg(opt+1, arg)<0)
134 goto unknown_opt;
c6141f3 added ffplay utility
bellard authored
135 } else {
1d9cb94 COSMETICS: tabs --> spaces, some prettyprinting
diego authored
136 po->u.func_arg(arg);
c6141f3 added ffplay utility
bellard authored
137 }
138 } else {
13e5863 Make cmdutils.c:parse_options accept as argument a function to parse
diego authored
139 if (parse_arg_function)
140 parse_arg_function(opt);
c6141f3 added ffplay utility
bellard authored
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"
0b33aaf COSMETICS: Remove all trailing whitespace.
diego authored
152 " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
c6141f3 added ffplay utility
bellard authored
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;
ccd06a1 Replace all occurrances of AVERROR_IO with AVERROR(EIO).
takis authored
161 case AVERROR(EIO):
fff30bd handle AVERROR_IO and AVERROR_NOMEM patch by (Kostya <cannonball bw-t…
michael authored
162 fprintf(stderr, "%s: I/O error occured\n"
1d9cb94 COSMETICS: tabs --> spaces, some prettyprinting
diego authored
163 "Usually that means that input file is truncated and/or corrupted.\n",
164 filename);
fff30bd handle AVERROR_IO and AVERROR_NOMEM patch by (Kostya <cannonball bw-t…
michael authored
165 break;
f3c1ec6 Replace all occurrances of AVERROR_NOMEM with AVERROR(ENOMEM).
takis authored
166 case AVERROR(ENOMEM):
fff30bd handle AVERROR_IO and AVERROR_NOMEM patch by (Kostya <cannonball bw-t…
michael authored
167 fprintf(stderr, "%s: memory allocation error occured\n", filename);
168 break;
25558f2 Replace the only occurrance of AVERROR_NOENT with AVERROR(ENOENT).
takis authored
169 case AVERROR(ENOENT):
8af69a9 Use url_fopen error code when opening input file
benoit authored
170 fprintf(stderr, "%s: no such file or directory\n", filename);
171 break;
c6141f3 added ffplay utility
bellard authored
172 default:
173 fprintf(stderr, "%s: Error while opening file\n", filename);
174 break;
175 }
176 }
af99c1a Implement the cmdutils.c show_license function.
benoit authored
177
65a3a9a Implement common show version and banner.
benoit authored
178 void show_banner(const char *program_name, int program_birth_year)
179 {
8cfd72f Update show_banner date.
benoit authored
180 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2008 Fabrice Bellard, et al.\n",
65a3a9a Implement common show version and banner.
benoit authored
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");
6e1c442 Print libavdevice version.
michael authored
186 fprintf(stderr, " libavdevice version: " AV_STRINGIFY(LIBAVDEVICE_VERSION) "\n");
722a944 Print libavfilter version if it is enabled in configure
vitor authored
187 #if ENABLE_AVFILTER
188 fprintf(stderr, " libavfilter version: " AV_STRINGIFY(LIBAVFILTER_VERSION) "\n");
189 #endif
65a3a9a Implement common show version and banner.
benoit authored
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) {
6e1c442 Print libavdevice version.
michael authored
199 /* TODO: add function interface to avutil and avformat avdevice*/
65a3a9a Implement common show version and banner.
benoit authored
200 printf("%s " FFMPEG_VERSION "\n", program_name);
201 printf("libavutil %d\n"
202 "libavcodec %d\n"
6e1c442 Print libavdevice version.
michael authored
203 "libavformat %d\n"
204 "libavdevice %d\n",
205 LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD, LIBAVDEVICE_BUILD);
65a3a9a Implement common show version and banner.
benoit authored
206 }
207
af99c1a Implement the cmdutils.c show_license function.
benoit authored
208 void show_license(void)
209 {
2761d1d Do not print an (L)GPL license statement when nonfree parts have been…
diego authored
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
af99c1a Implement the cmdutils.c show_license function.
benoit authored
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 }
Something went wrong with that request. Please try again.