ffmpeg / cmdutils.c @ 6580d5e3
History | View | Annotate | Download (22.4 KB)
1 | 01310af2 | Fabrice Bellard | /*
|
---|---|---|---|
2 | * Various utilities for command line tools
|
||
3 | * Copyright (c) 2000-2003 Fabrice Bellard
|
||
4 | *
|
||
5 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
6 | *
|
||
7 | * FFmpeg is free software; you can redistribute it and/or
|
||
8 | 01310af2 | Fabrice Bellard | * modify it under the terms of the GNU Lesser General Public
|
9 | * License as published by the Free Software Foundation; either
|
||
10 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
11 | 01310af2 | Fabrice Bellard | *
|
12 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
13 | 01310af2 | Fabrice Bellard | * 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 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
19 | 5509bffa | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 | 01310af2 | Fabrice Bellard | */
|
21 | 364a9607 | Diego Biurrun | |
22 | 0f4e8165 | Ronald S. Bultje | #include <string.h> |
23 | #include <stdlib.h> |
||
24 | #include <errno.h> |
||
25 | 7c84b8bc | Stefano Sabatini | #include <math.h> |
26 | 0f4e8165 | Ronald S. Bultje | |
27 | 2cd39dbf | Diego Pettenò | /* Include only the enabled headers since some compilers (namely, Sun
|
28 | Studio) will not omit unused inline functions and create undefined
|
||
29 | references to libraries that are not being built. */
|
||
30 | |||
31 | 63d026b1 | Diego Biurrun | #include "config.h" |
32 | 245976da | Diego Biurrun | #include "libavformat/avformat.h" |
33 | #include "libavfilter/avfilter.h" |
||
34 | #include "libavdevice/avdevice.h" |
||
35 | db6d50c7 | Stefano Sabatini | #include "libswscale/swscale.h" |
36 | 1981deaf | Stefano Sabatini | #include "libpostproc/postprocess.h" |
37 | 245976da | Diego Biurrun | #include "libavutil/avstring.h" |
38 | 9cb5c760 | Stefano Sabatini | #include "libavutil/pixdesc.h" |
39 | 85663ef3 | Michael Niedermayer | #include "libavcodec/opt.h" |
40 | 01310af2 | Fabrice Bellard | #include "cmdutils.h" |
41 | 86074ed1 | Stefano Sabatini | #include "version.h" |
42 | da2dc39e | Ramiro Polla | #if CONFIG_NETWORK
|
43 | 245976da | Diego Biurrun | #include "libavformat/network.h" |
44 | da2dc39e | Ramiro Polla | #endif
|
45 | ffcc6e24 | Måns Rullgård | #if HAVE_SYS_RESOURCE_H
|
46 | #include <sys/resource.h> |
||
47 | #endif
|
||
48 | 01310af2 | Fabrice Bellard | |
49 | 85663ef3 | Michael Niedermayer | const char **opt_names; |
50 | static int opt_name_count; |
||
51 | 636f1c4c | Stefano Sabatini | AVCodecContext *avcodec_opts[CODEC_TYPE_NB]; |
52 | 85663ef3 | Michael Niedermayer | AVFormatContext *avformat_opts; |
53 | struct SwsContext *sws_opts;
|
||
54 | 086ab001 | Michael Niedermayer | |
55 | 7a78bc85 | Stefano Sabatini | const int this_year = 2010; |
56 | ef4c0bb1 | Stefano Sabatini | |
57 | 086ab001 | Michael Niedermayer | double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max) |
58 | { |
||
59 | char *tail;
|
||
60 | const char *error; |
||
61 | double d = strtod(numstr, &tail);
|
||
62 | if (*tail)
|
||
63 | error= "Expected number for %s but found: %s\n";
|
||
64 | else if (d < min || d > max) |
||
65 | error= "The value for %s was %s which is not within %f - %f\n";
|
||
66 | else if(type == OPT_INT64 && (int64_t)d != d) |
||
67 | error= "Expected int64 for %s but found %s\n";
|
||
68 | else
|
||
69 | return d;
|
||
70 | fprintf(stderr, error, context, numstr, min, max); |
||
71 | exit(1);
|
||
72 | } |
||
73 | |||
74 | 7542157d | Stefano Sabatini | int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration) |
75 | { |
||
76 | int64_t us = parse_date(timestr, is_duration); |
||
77 | if (us == INT64_MIN) {
|
||
78 | fprintf(stderr, "Invalid %s specification for %s: %s\n",
|
||
79 | is_duration ? "duration" : "date", context, timestr); |
||
80 | exit(1);
|
||
81 | } |
||
82 | return us;
|
||
83 | } |
||
84 | |||
85 | 02d504a7 | Fabrice Bellard | void show_help_options(const OptionDef *options, const char *msg, int mask, int value) |
86 | 01310af2 | Fabrice Bellard | { |
87 | const OptionDef *po;
|
||
88 | 02d504a7 | Fabrice Bellard | int first;
|
89 | 01310af2 | Fabrice Bellard | |
90 | 02d504a7 | Fabrice Bellard | first = 1;
|
91 | for(po = options; po->name != NULL; po++) { |
||
92 | char buf[64]; |
||
93 | if ((po->flags & mask) == value) {
|
||
94 | if (first) {
|
||
95 | printf("%s", msg);
|
||
96 | first = 0;
|
||
97 | } |
||
98 | f7d78f36 | Måns Rullgård | av_strlcpy(buf, po->name, sizeof(buf));
|
99 | 02d504a7 | Fabrice Bellard | if (po->flags & HAS_ARG) {
|
100 | f7d78f36 | Måns Rullgård | av_strlcat(buf, " ", sizeof(buf)); |
101 | av_strlcat(buf, po->argname, sizeof(buf));
|
||
102 | 01310af2 | Fabrice Bellard | } |
103 | 02d504a7 | Fabrice Bellard | printf("-%-17s %s\n", buf, po->help);
|
104 | 01310af2 | Fabrice Bellard | } |
105 | } |
||
106 | } |
||
107 | |||
108 | fccfc475 | Måns Rullgård | static const OptionDef* find_option(const OptionDef *po, const char *name){ |
109 | 8bbf6db9 | Michael Niedermayer | while (po->name != NULL) { |
110 | if (!strcmp(name, po->name))
|
||
111 | break;
|
||
112 | po++; |
||
113 | } |
||
114 | return po;
|
||
115 | } |
||
116 | |||
117 | 60a9966e | Stefano Sabatini | void parse_options(int argc, char **argv, const OptionDef *options, |
118 | void (* parse_arg_function)(const char*)) |
||
119 | 01310af2 | Fabrice Bellard | { |
120 | const char *opt, *arg; |
||
121 | b0d7bc1e | Loren Merritt | int optindex, handleoptions=1; |
122 | 01310af2 | Fabrice Bellard | const OptionDef *po;
|
123 | |||
124 | /* parse options */
|
||
125 | optindex = 1;
|
||
126 | while (optindex < argc) {
|
||
127 | opt = argv[optindex++]; |
||
128 | 115329f1 | Diego Biurrun | |
129 | 84bf226b | Timo Lindfors | if (handleoptions && opt[0] == '-' && opt[1] != '\0') { |
130 | b1d6e5e8 | Benoit Fouet | int bool_val = 1; |
131 | 3749076c | Stefano Sabatini | if (opt[1] == '-' && opt[2] == '\0') { |
132 | handleoptions = 0;
|
||
133 | continue;
|
||
134 | } |
||
135 | c3c78324 | Stefano Sabatini | opt++; |
136 | po= find_option(options, opt); |
||
137 | if (!po->name && opt[0] == 'n' && opt[1] == 'o') { |
||
138 | b1d6e5e8 | Benoit Fouet | /* handle 'no' bool option */
|
139 | c3c78324 | Stefano Sabatini | po = find_option(options, opt + 2);
|
140 | b1d6e5e8 | Benoit Fouet | if (!(po->name && (po->flags & OPT_BOOL)))
|
141 | goto unknown_opt;
|
||
142 | bool_val = 0;
|
||
143 | } |
||
144 | 8bbf6db9 | Michael Niedermayer | if (!po->name)
|
145 | po= find_option(options, "default");
|
||
146 | 01310af2 | Fabrice Bellard | if (!po->name) {
|
147 | 8bbf6db9 | Michael Niedermayer | unknown_opt:
|
148 | 01310af2 | Fabrice Bellard | fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt); |
149 | exit(1);
|
||
150 | } |
||
151 | arg = NULL;
|
||
152 | if (po->flags & HAS_ARG) {
|
||
153 | arg = argv[optindex++]; |
||
154 | if (!arg) {
|
||
155 | fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt); |
||
156 | exit(1);
|
||
157 | } |
||
158 | } |
||
159 | if (po->flags & OPT_STRING) {
|
||
160 | char *str;
|
||
161 | 02d504a7 | Fabrice Bellard | str = av_strdup(arg); |
162 | 01310af2 | Fabrice Bellard | *po->u.str_arg = str; |
163 | } else if (po->flags & OPT_BOOL) { |
||
164 | b1d6e5e8 | Benoit Fouet | *po->u.int_arg = bool_val; |
165 | 26d4f26b | Michael Niedermayer | } else if (po->flags & OPT_INT) { |
166 | c3c78324 | Stefano Sabatini | *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); |
167 | ffdf9a1f | Baptiste Coudurier | } else if (po->flags & OPT_INT64) { |
168 | c3c78324 | Stefano Sabatini | *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX); |
169 | 1f631450 | Michael Niedermayer | } else if (po->flags & OPT_FLOAT) { |
170 | c3c78324 | Stefano Sabatini | *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0); |
171 | 8bbf6db9 | Michael Niedermayer | } else if (po->flags & OPT_FUNC2) { |
172 | 9e5381a2 | Stefano Sabatini | if (po->u.func2_arg(opt, arg) < 0) { |
173 | fprintf(stderr, "%s: invalid value '%s' for option '%s'\n", argv[0], arg, opt); |
||
174 | exit(1);
|
||
175 | } |
||
176 | 01310af2 | Fabrice Bellard | } else {
|
177 | bb270c08 | Diego Biurrun | po->u.func_arg(arg); |
178 | 01310af2 | Fabrice Bellard | } |
179 | a0b3bcd9 | Michael Niedermayer | if(po->flags & OPT_EXIT)
|
180 | exit(0);
|
||
181 | 01310af2 | Fabrice Bellard | } else {
|
182 | 60a9966e | Stefano Sabatini | if (parse_arg_function)
|
183 | parse_arg_function(opt); |
||
184 | 01310af2 | Fabrice Bellard | } |
185 | } |
||
186 | } |
||
187 | |||
188 | 85663ef3 | Michael Niedermayer | int opt_default(const char *opt, const char *arg){ |
189 | int type;
|
||
190 | 5c3383e5 | Stefano Sabatini | int ret= 0; |
191 | 85663ef3 | Michael Niedermayer | const AVOption *o= NULL; |
192 | int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0}; |
||
193 | |||
194 | 5c3383e5 | Stefano Sabatini | for(type=0; type<CODEC_TYPE_NB && ret>= 0; type++){ |
195 | 636f1c4c | Stefano Sabatini | const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]); |
196 | 85663ef3 | Michael Niedermayer | if(o2)
|
197 | 636f1c4c | Stefano Sabatini | ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
|
198 | 85663ef3 | Michael Niedermayer | } |
199 | if(!o)
|
||
200 | 5c3383e5 | Stefano Sabatini | ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
|
201 | da033b05 | Stefano Sabatini | if(!o && sws_opts)
|
202 | 5c3383e5 | Stefano Sabatini | ret = av_set_string3(sws_opts, opt, arg, 1, &o);
|
203 | 85663ef3 | Michael Niedermayer | if(!o){
|
204 | if(opt[0] == 'a') |
||
205 | 636f1c4c | Stefano Sabatini | ret = av_set_string3(avcodec_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1, &o); |
206 | 85663ef3 | Michael Niedermayer | else if(opt[0] == 'v') |
207 | 636f1c4c | Stefano Sabatini | ret = av_set_string3(avcodec_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1, &o); |
208 | 85663ef3 | Michael Niedermayer | else if(opt[0] == 's') |
209 | 636f1c4c | Stefano Sabatini | ret = av_set_string3(avcodec_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1, &o); |
210 | 5c3383e5 | Stefano Sabatini | } |
211 | if (o && ret < 0) { |
||
212 | fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
|
||
213 | exit(1);
|
||
214 | 85663ef3 | Michael Niedermayer | } |
215 | 33bc7947 | Stefano Sabatini | if (!o) {
|
216 | fprintf(stderr, "Unrecognized option '%s'\n", opt);
|
||
217 | exit(1);
|
||
218 | } |
||
219 | 85663ef3 | Michael Niedermayer | |
220 | 636f1c4c | Stefano Sabatini | // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avcodec_opts, opt, NULL), (int)av_get_int(avcodec_opts, opt, NULL));
|
221 | 85663ef3 | Michael Niedermayer | |
222 | 636f1c4c | Stefano Sabatini | //FIXME we should always use avcodec_opts, ... for storing options so there will not be any need to keep track of what i set over this
|
223 | 85663ef3 | Michael Niedermayer | opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1)); |
224 | opt_names[opt_name_count++]= o->name; |
||
225 | |||
226 | 636f1c4c | Stefano Sabatini | if(avcodec_opts[0]->debug || avformat_opts->debug) |
227 | 85663ef3 | Michael Niedermayer | av_log_set_level(AV_LOG_DEBUG); |
228 | return 0; |
||
229 | } |
||
230 | |||
231 | 4c97a6fa | Stefano Sabatini | int opt_loglevel(const char *opt, const char *arg) |
232 | { |
||
233 | da4c2dab | Carl Eugen Hoyos | const struct { const char *name; int level; } log_levels[] = { |
234 | 4c97a6fa | Stefano Sabatini | { "quiet" , AV_LOG_QUIET },
|
235 | { "panic" , AV_LOG_PANIC },
|
||
236 | { "fatal" , AV_LOG_FATAL },
|
||
237 | { "error" , AV_LOG_ERROR },
|
||
238 | { "warning", AV_LOG_WARNING },
|
||
239 | { "info" , AV_LOG_INFO },
|
||
240 | { "verbose", AV_LOG_VERBOSE },
|
||
241 | { "debug" , AV_LOG_DEBUG },
|
||
242 | }; |
||
243 | char *tail;
|
||
244 | int level;
|
||
245 | int i;
|
||
246 | |||
247 | for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) { |
||
248 | if (!strcmp(log_levels[i].name, arg)) {
|
||
249 | av_log_set_level(log_levels[i].level); |
||
250 | return 0; |
||
251 | } |
||
252 | } |
||
253 | |||
254 | level = strtol(arg, &tail, 10);
|
||
255 | if (*tail) {
|
||
256 | fprintf(stderr, "Invalid loglevel \"%s\". "
|
||
257 | "Possible levels are numbers or:\n", arg);
|
||
258 | for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) |
||
259 | fprintf(stderr, "\"%s\"\n", log_levels[i].name);
|
||
260 | exit(1);
|
||
261 | } |
||
262 | av_log_set_level(level); |
||
263 | return 0; |
||
264 | } |
||
265 | |||
266 | ffcc6e24 | Måns Rullgård | int opt_timelimit(const char *opt, const char *arg) |
267 | { |
||
268 | 0104b608 | Måns Rullgård | #if HAVE_SETRLIMIT
|
269 | ffcc6e24 | Måns Rullgård | int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); |
270 | struct rlimit rl = { lim, lim + 1 }; |
||
271 | if (setrlimit(RLIMIT_CPU, &rl))
|
||
272 | perror("setrlimit");
|
||
273 | #else
|
||
274 | fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
|
||
275 | #endif
|
||
276 | return 0; |
||
277 | } |
||
278 | |||
279 | 85663ef3 | Michael Niedermayer | void set_context_opts(void *ctx, void *opts_ctx, int flags) |
280 | { |
||
281 | int i;
|
||
282 | for(i=0; i<opt_name_count; i++){ |
||
283 | char buf[256]; |
||
284 | const AVOption *opt;
|
||
285 | const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf)); |
||
286 | /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
|
||
287 | if(str && ((opt->flags & flags) == flags))
|
||
288 | f16dd7e6 | Stefano Sabatini | av_set_string3(ctx, opt_names[i], str, 1, NULL); |
289 | 85663ef3 | Michael Niedermayer | } |
290 | } |
||
291 | |||
292 | 01310af2 | Fabrice Bellard | void print_error(const char *filename, int err) |
293 | { |
||
294 | switch(err) {
|
||
295 | case AVERROR_NUMEXPECTED:
|
||
296 | fprintf(stderr, "%s: Incorrect image filename syntax.\n"
|
||
297 | "Use '%%d' to specify the image number:\n"
|
||
298 | " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
|
||
299 | 115329f1 | Diego Biurrun | " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
|
300 | 01310af2 | Fabrice Bellard | filename); |
301 | break;
|
||
302 | case AVERROR_INVALIDDATA:
|
||
303 | fprintf(stderr, "%s: Error while parsing header\n", filename);
|
||
304 | break;
|
||
305 | case AVERROR_NOFMT:
|
||
306 | fprintf(stderr, "%s: Unknown format\n", filename);
|
||
307 | break;
|
||
308 | 6f3e0b21 | Panagiotis Issaris | case AVERROR(EIO):
|
309 | d9526386 | Diego Biurrun | fprintf(stderr, "%s: I/O error occurred\n"
|
310 | bb270c08 | Diego Biurrun | "Usually that means that input file is truncated and/or corrupted.\n",
|
311 | filename); |
||
312 | 45ce5ddb | Kostya Shishkov | break;
|
313 | 769e10f0 | Panagiotis Issaris | case AVERROR(ENOMEM):
|
314 | d9526386 | Diego Biurrun | fprintf(stderr, "%s: memory allocation error occurred\n", filename);
|
315 | 45ce5ddb | Kostya Shishkov | break;
|
316 | 24fddf48 | Panagiotis Issaris | case AVERROR(ENOENT):
|
317 | 0ba0c8de | Benoit Fouet | fprintf(stderr, "%s: no such file or directory\n", filename);
|
318 | break;
|
||
319 | b250f9c6 | Aurelien Jacobs | #if CONFIG_NETWORK
|
320 | 18ec0460 | Luca Barbato | case AVERROR(FF_NETERROR(EPROTONOSUPPORT)):
|
321 | fprintf(stderr, "%s: Unsupported network protocol\n", filename);
|
||
322 | break;
|
||
323 | 0b705fa4 | Ramiro Polla | #endif
|
324 | 01310af2 | Fabrice Bellard | default:
|
325 | fprintf(stderr, "%s: Error while opening file\n", filename);
|
||
326 | break;
|
||
327 | } |
||
328 | } |
||
329 | f35917b2 | Stefano Sabatini | |
330 | 5116571d | Måns Rullgård | #define PRINT_LIB_VERSION(outstream,libname,LIBNAME,indent) \
|
331 | if (CONFIG_##LIBNAME) { \ |
||
332 | 695f7de6 | Stefano Sabatini | unsigned int version = libname##_version(); \ |
333 | 5116571d | Måns Rullgård | fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", \
|
334 | indent? " " : "", #libname, \ |
||
335 | LIB##LIBNAME##_VERSION_MAJOR, \ |
||
336 | LIB##LIBNAME##_VERSION_MINOR, \ |
||
337 | LIB##LIBNAME##_VERSION_MICRO, \ |
||
338 | version >> 16, version >> 8 & 0xff, version & 0xff); \ |
||
339 | 58fe804a | Måns Rullgård | } |
340 | 9a109272 | Stefano Sabatini | |
341 | 88b77ef1 | Diego Pettenò | static void print_all_lib_versions(FILE* outstream, int indent) |
342 | 9a109272 | Stefano Sabatini | { |
343 | e9df66a7 | Stefano Sabatini | PRINT_LIB_VERSION(outstream, avutil, AVUTIL, indent); |
344 | PRINT_LIB_VERSION(outstream, avcodec, AVCODEC, indent); |
||
345 | 9a109272 | Stefano Sabatini | PRINT_LIB_VERSION(outstream, avformat, AVFORMAT, indent); |
346 | PRINT_LIB_VERSION(outstream, avdevice, AVDEVICE, indent); |
||
347 | PRINT_LIB_VERSION(outstream, avfilter, AVFILTER, indent); |
||
348 | e9df66a7 | Stefano Sabatini | PRINT_LIB_VERSION(outstream, swscale, SWSCALE, indent); |
349 | 1981deaf | Stefano Sabatini | PRINT_LIB_VERSION(outstream, postproc, POSTPROC, indent); |
350 | 9a109272 | Stefano Sabatini | } |
351 | |||
352 | 9120e2cd | Måns Rullgård | static void maybe_print_config(const char *lib, const char *cfg) |
353 | { |
||
354 | static int warned_cfg; |
||
355 | |||
356 | if (strcmp(FFMPEG_CONFIGURATION, cfg)) {
|
||
357 | if (!warned_cfg) {
|
||
358 | fprintf(stderr, " WARNING: library configuration mismatch\n");
|
||
359 | warned_cfg = 1;
|
||
360 | } |
||
361 | fprintf(stderr, " %-11s configuration: %s\n", lib, cfg);
|
||
362 | } |
||
363 | } |
||
364 | |||
365 | 58fe804a | Måns Rullgård | #define PRINT_LIB_CONFIG(lib, tag, cfg) do { \ |
366 | if (CONFIG_##lib) \ |
||
367 | maybe_print_config(tag, cfg); \ |
||
368 | } while (0) |
||
369 | |||
370 | ea9c581f | Stefano Sabatini | void show_banner(void) |
371 | 86074ed1 | Stefano Sabatini | { |
372 | 13887093 | Stefano Sabatini | fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n", |
373 | ef4c0bb1 | Stefano Sabatini | program_name, program_birth_year, this_year); |
374 | a3d7c197 | Diego Biurrun | fprintf(stderr, " built on %s %s with %s %s\n",
|
375 | __DATE__, __TIME__, CC_TYPE, CC_VERSION); |
||
376 | 5c1f57ff | Diego Biurrun | fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); |
377 | 58fe804a | Måns Rullgård | PRINT_LIB_CONFIG(AVUTIL, "libavutil", avutil_configuration());
|
378 | PRINT_LIB_CONFIG(AVCODEC, "libavcodec", avcodec_configuration());
|
||
379 | PRINT_LIB_CONFIG(AVFORMAT, "libavformat", avformat_configuration());
|
||
380 | PRINT_LIB_CONFIG(AVDEVICE, "libavdevice", avdevice_configuration());
|
||
381 | PRINT_LIB_CONFIG(AVFILTER, "libavfilter", avfilter_configuration());
|
||
382 | PRINT_LIB_CONFIG(SWSCALE, "libswscale", swscale_configuration());
|
||
383 | PRINT_LIB_CONFIG(POSTPROC, "libpostproc", postproc_configuration());
|
||
384 | 5c1f57ff | Diego Biurrun | print_all_lib_versions(stderr, 1);
|
385 | 86074ed1 | Stefano Sabatini | } |
386 | |||
387 | 64555bd9 | Michael Niedermayer | void show_version(void) { |
388 | 86074ed1 | Stefano Sabatini | printf("%s " FFMPEG_VERSION "\n", program_name); |
389 | 9a109272 | Stefano Sabatini | print_all_lib_versions(stdout, 0);
|
390 | 86074ed1 | Stefano Sabatini | } |
391 | |||
392 | f35917b2 | Stefano Sabatini | void show_license(void) |
393 | { |
||
394 | 7ead693b | Diego Biurrun | printf( |
395 | 3bf28f9d | Stefano Sabatini | #if CONFIG_NONFREE
|
396 | 304ba23a | Stefano Sabatini | "This version of %s has nonfree parts compiled in.\n"
|
397 | "Therefore it is not legally redistributable.\n",
|
||
398 | program_name |
||
399 | 9cad0e4e | Diego Biurrun | #elif CONFIG_GPLV3
|
400 | "%s is free software; you can redistribute it and/or modify\n"
|
||
401 | "it under the terms of the GNU General Public License as published by\n"
|
||
402 | "the Free Software Foundation; either version 3 of the License, or\n"
|
||
403 | "(at your option) any later version.\n"
|
||
404 | "\n"
|
||
405 | "%s is distributed in the hope that it will be useful,\n"
|
||
406 | "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||
407 | "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||
408 | "GNU General Public License for more details.\n"
|
||
409 | "\n"
|
||
410 | "You should have received a copy of the GNU General Public License\n"
|
||
411 | "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
|
||
412 | program_name, program_name, program_name |
||
413 | 7ead693b | Diego Biurrun | #elif CONFIG_GPL
|
414 | 304ba23a | Stefano Sabatini | "%s is free software; you can redistribute it and/or modify\n"
|
415 | f35917b2 | Stefano Sabatini | "it under the terms of the GNU General Public License as published by\n"
|
416 | "the Free Software Foundation; either version 2 of the License, or\n"
|
||
417 | "(at your option) any later version.\n"
|
||
418 | "\n"
|
||
419 | 304ba23a | Stefano Sabatini | "%s is distributed in the hope that it will be useful,\n"
|
420 | f35917b2 | Stefano Sabatini | "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
421 | "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||
422 | "GNU General Public License for more details.\n"
|
||
423 | "\n"
|
||
424 | "You should have received a copy of the GNU General Public License\n"
|
||
425 | 304ba23a | Stefano Sabatini | "along with %s; if not, write to the Free Software\n"
|
426 | "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
|
||
427 | program_name, program_name, program_name |
||
428 | 9cad0e4e | Diego Biurrun | #elif CONFIG_LGPLV3
|
429 | "%s is free software; you can redistribute it and/or modify\n"
|
||
430 | "it under the terms of the GNU Lesser General Public License as published by\n"
|
||
431 | "the Free Software Foundation; either version 3 of the License, or\n"
|
||
432 | "(at your option) any later version.\n"
|
||
433 | "\n"
|
||
434 | "%s is distributed in the hope that it will be useful,\n"
|
||
435 | "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||
436 | "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||
437 | "GNU Lesser General Public License for more details.\n"
|
||
438 | "\n"
|
||
439 | "You should have received a copy of the GNU Lesser General Public License\n"
|
||
440 | "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
|
||
441 | program_name, program_name, program_name |
||
442 | f35917b2 | Stefano Sabatini | #else
|
443 | 304ba23a | Stefano Sabatini | "%s is free software; you can redistribute it and/or\n"
|
444 | f35917b2 | Stefano Sabatini | "modify it under the terms of the GNU Lesser General Public\n"
|
445 | "License as published by the Free Software Foundation; either\n"
|
||
446 | "version 2.1 of the License, or (at your option) any later version.\n"
|
||
447 | "\n"
|
||
448 | 304ba23a | Stefano Sabatini | "%s is distributed in the hope that it will be useful,\n"
|
449 | f35917b2 | Stefano Sabatini | "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
450 | "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
|
||
451 | "Lesser General Public License for more details.\n"
|
||
452 | "\n"
|
||
453 | "You should have received a copy of the GNU Lesser General Public\n"
|
||
454 | 304ba23a | Stefano Sabatini | "License along with %s; if not, write to the Free Software\n"
|
455 | "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
|
||
456 | program_name, program_name, program_name |
||
457 | f35917b2 | Stefano Sabatini | #endif
|
458 | 3bf28f9d | Stefano Sabatini | ); |
459 | f35917b2 | Stefano Sabatini | } |
460 | ba9880c1 | Stefano Sabatini | |
461 | c5dc6026 | Stefano Sabatini | void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts) |
462 | { |
||
463 | int i;
|
||
464 | char fmt_str[128]; |
||
465 | for (i=-1; i < nb_fmts; i++) { |
||
466 | get_fmt_string (fmt_str, sizeof(fmt_str), i);
|
||
467 | fprintf(stdout, "%s\n", fmt_str);
|
||
468 | } |
||
469 | } |
||
470 | |||
471 | ba9880c1 | Stefano Sabatini | void show_formats(void) |
472 | { |
||
473 | AVInputFormat *ifmt=NULL;
|
||
474 | AVOutputFormat *ofmt=NULL;
|
||
475 | const char *last_name; |
||
476 | |||
477 | 5a8597a0 | William R. Zwicky | printf( |
478 | "File formats:\n"
|
||
479 | " D. = Demuxing supported\n"
|
||
480 | " .E = Muxing supported\n"
|
||
481 | " --\n");
|
||
482 | ba9880c1 | Stefano Sabatini | last_name= "000";
|
483 | for(;;){
|
||
484 | int decode=0; |
||
485 | int encode=0; |
||
486 | const char *name=NULL; |
||
487 | const char *long_name=NULL; |
||
488 | |||
489 | while((ofmt= av_oformat_next(ofmt))) {
|
||
490 | if((name == NULL || strcmp(ofmt->name, name)<0) && |
||
491 | strcmp(ofmt->name, last_name)>0){
|
||
492 | name= ofmt->name; |
||
493 | long_name= ofmt->long_name; |
||
494 | encode=1;
|
||
495 | } |
||
496 | } |
||
497 | while((ifmt= av_iformat_next(ifmt))) {
|
||
498 | if((name == NULL || strcmp(ifmt->name, name)<0) && |
||
499 | strcmp(ifmt->name, last_name)>0){
|
||
500 | name= ifmt->name; |
||
501 | long_name= ifmt->long_name; |
||
502 | encode=0;
|
||
503 | } |
||
504 | if(name && strcmp(ifmt->name, name)==0) |
||
505 | decode=1;
|
||
506 | } |
||
507 | if(name==NULL) |
||
508 | break;
|
||
509 | last_name= name; |
||
510 | |||
511 | printf( |
||
512 | " %s%s %-15s %s\n",
|
||
513 | decode ? "D":" ", |
||
514 | encode ? "E":" ", |
||
515 | name, |
||
516 | long_name ? long_name:" ");
|
||
517 | } |
||
518 | 8447f0bd | Michael Niedermayer | } |
519 | ba9880c1 | Stefano Sabatini | |
520 | 8447f0bd | Michael Niedermayer | void show_codecs(void) |
521 | { |
||
522 | AVCodec *p=NULL, *p2;
|
||
523 | const char *last_name; |
||
524 | 5a8597a0 | William R. Zwicky | printf( |
525 | "Codecs:\n"
|
||
526 | " D..... = Decoding supported\n"
|
||
527 | " .E.... = Encoding supported\n"
|
||
528 | " ..V... = Video codec\n"
|
||
529 | " ..A... = Audio codec\n"
|
||
530 | " ..S... = Subtitle codec\n"
|
||
531 | " ...S.. = Supports draw_horiz_band\n"
|
||
532 | " ....D. = Supports direct rendering method 1\n"
|
||
533 | " .....T = Supports weird frame truncation\n"
|
||
534 | " ------\n");
|
||
535 | ba9880c1 | Stefano Sabatini | last_name= "000";
|
536 | for(;;){
|
||
537 | int decode=0; |
||
538 | int encode=0; |
||
539 | int cap=0; |
||
540 | const char *type_str; |
||
541 | |||
542 | p2=NULL;
|
||
543 | while((p= av_codec_next(p))) {
|
||
544 | if((p2==NULL || strcmp(p->name, p2->name)<0) && |
||
545 | strcmp(p->name, last_name)>0){
|
||
546 | p2= p; |
||
547 | decode= encode= cap=0;
|
||
548 | } |
||
549 | if(p2 && strcmp(p->name, p2->name)==0){ |
||
550 | if(p->decode) decode=1; |
||
551 | if(p->encode) encode=1; |
||
552 | cap |= p->capabilities; |
||
553 | } |
||
554 | } |
||
555 | if(p2==NULL) |
||
556 | break;
|
||
557 | last_name= p2->name; |
||
558 | |||
559 | switch(p2->type) {
|
||
560 | case CODEC_TYPE_VIDEO:
|
||
561 | type_str = "V";
|
||
562 | break;
|
||
563 | case CODEC_TYPE_AUDIO:
|
||
564 | type_str = "A";
|
||
565 | break;
|
||
566 | case CODEC_TYPE_SUBTITLE:
|
||
567 | type_str = "S";
|
||
568 | break;
|
||
569 | default:
|
||
570 | type_str = "?";
|
||
571 | break;
|
||
572 | } |
||
573 | printf( |
||
574 | " %s%s%s%s%s%s %-15s %s",
|
||
575 | decode ? "D": (/*p2->decoder ? "d":*/" "), |
||
576 | encode ? "E":" ", |
||
577 | type_str, |
||
578 | cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ", |
||
579 | cap & CODEC_CAP_DR1 ? "D":" ", |
||
580 | cap & CODEC_CAP_TRUNCATED ? "T":" ", |
||
581 | p2->name, |
||
582 | p2->long_name ? p2->long_name : "");
|
||
583 | /* if(p2->decoder && decode==0)
|
||
584 | printf(" use %s for decoding", p2->decoder->name);*/
|
||
585 | printf("\n");
|
||
586 | } |
||
587 | printf("\n");
|
||
588 | 8447f0bd | Michael Niedermayer | printf( |
589 | "Note, the names of encoders and decoders do not always match, so there are\n"
|
||
590 | "several cases where the above table shows encoder only or decoder only entries\n"
|
||
591 | "even though both encoding and decoding are supported. For example, the h263\n"
|
||
592 | "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
|
||
593 | "worse.\n");
|
||
594 | } |
||
595 | |||
596 | void show_bsfs(void) |
||
597 | { |
||
598 | AVBitStreamFilter *bsf=NULL;
|
||
599 | ba9880c1 | Stefano Sabatini | |
600 | printf("Bitstream filters:\n");
|
||
601 | while((bsf = av_bitstream_filter_next(bsf)))
|
||
602 | 2091b27b | Stefano Sabatini | printf("%s\n", bsf->name);
|
603 | ba9880c1 | Stefano Sabatini | printf("\n");
|
604 | 8447f0bd | Michael Niedermayer | } |
605 | |||
606 | void show_protocols(void) |
||
607 | { |
||
608 | URLProtocol *up=NULL;
|
||
609 | ba9880c1 | Stefano Sabatini | |
610 | printf("Supported file protocols:\n");
|
||
611 | while((up = av_protocol_next(up)))
|
||
612 | 2cb2d6f0 | Stefano Sabatini | printf("%s\n", up->name);
|
613 | ba9880c1 | Stefano Sabatini | printf("\n");
|
614 | |||
615 | printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
|
||
616 | } |
||
617 | 090b61b2 | Stefano Sabatini | |
618 | 62d75662 | Stefano Sabatini | void show_filters(void) |
619 | { |
||
620 | 78638628 | Diego Biurrun | AVFilter av_unused(**filter) = NULL;
|
621 | 62d75662 | Stefano Sabatini | |
622 | printf("Filters:\n");
|
||
623 | 663c2edf | Stefano Sabatini | #if CONFIG_AVFILTER
|
624 | 62d75662 | Stefano Sabatini | while ((filter = av_filter_next(filter)) && *filter)
|
625 | printf("%-16s %s\n", (*filter)->name, (*filter)->description);
|
||
626 | 663c2edf | Stefano Sabatini | #endif
|
627 | 62d75662 | Stefano Sabatini | } |
628 | |||
629 | 3f7bb426 | Stefano Sabatini | void show_pix_fmts(void) |
630 | { |
||
631 | 9cb5c760 | Stefano Sabatini | enum PixelFormat pix_fmt;
|
632 | |||
633 | printf( |
||
634 | "Pixel formats:\n"
|
||
635 | "I.... = Supported Input format for conversion\n"
|
||
636 | ".O... = Supported Output format for conversion\n"
|
||
637 | "..H.. = Hardware accelerated format\n"
|
||
638 | "...P. = Paletted format\n"
|
||
639 | "....B = Bitstream format\n"
|
||
640 | "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
|
||
641 | "-----\n");
|
||
642 | |||
643 | for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) { |
||
644 | const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
|
||
645 | printf("%c%c%c%c%c %-16s %d %2d\n",
|
||
646 | sws_isSupportedInput (pix_fmt) ? 'I' : '.', |
||
647 | sws_isSupportedOutput(pix_fmt) ? 'O' : '.', |
||
648 | pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.', |
||
649 | pix_desc->flags & PIX_FMT_PAL ? 'P' : '.', |
||
650 | pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.', |
||
651 | pix_desc->name, |
||
652 | pix_desc->nb_components, |
||
653 | av_get_bits_per_pixel(pix_desc)); |
||
654 | } |
||
655 | 3f7bb426 | Stefano Sabatini | } |
656 | |||
657 | 090b61b2 | Stefano Sabatini | int read_yesno(void) |
658 | { |
||
659 | int c = getchar();
|
||
660 | int yesno = (toupper(c) == 'Y'); |
||
661 | |||
662 | while (c != '\n' && c != EOF) |
||
663 | c = getchar(); |
||
664 | |||
665 | return yesno;
|
||
666 | } |