]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - cmdutils.c
Remove pointless #if around header #includes.
[frescor/ffmpeg.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 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 #include "config.h"
32 #include "libavformat/avformat.h"
33 #include "libavfilter/avfilter.h"
34 #include "libavdevice/avdevice.h"
35 #include "libswscale/swscale.h"
36 #include "libpostproc/postprocess.h"
37 #include "libavutil/avstring.h"
38 #include "libavcodec/opt.h"
39 #include "cmdutils.h"
40 #include "version.h"
41 #include "libavformat/network.h"
42
43 #undef exit
44
45 const char **opt_names;
46 static int opt_name_count;
47 AVCodecContext *avctx_opts[CODEC_TYPE_NB];
48 AVFormatContext *avformat_opts;
49 struct SwsContext *sws_opts;
50
51 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
52 {
53     char *tail;
54     const char *error;
55     double d = strtod(numstr, &tail);
56     if (*tail)
57         error= "Expected number for %s but found: %s\n";
58     else if (d < min || d > max)
59         error= "The value for %s was %s which is not within %f - %f\n";
60     else if(type == OPT_INT64 && (int64_t)d != d)
61         error= "Expected int64 for %s but found %s\n";
62     else
63         return d;
64     fprintf(stderr, error, context, numstr, min, max);
65     exit(1);
66 }
67
68 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
69 {
70     int64_t us = parse_date(timestr, is_duration);
71     if (us == INT64_MIN) {
72         fprintf(stderr, "Invalid %s specification for %s: %s\n",
73                 is_duration ? "duration" : "date", context, timestr);
74         exit(1);
75     }
76     return us;
77 }
78
79 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
80 {
81     const OptionDef *po;
82     int first;
83
84     first = 1;
85     for(po = options; po->name != NULL; po++) {
86         char buf[64];
87         if ((po->flags & mask) == value) {
88             if (first) {
89                 printf("%s", msg);
90                 first = 0;
91             }
92             av_strlcpy(buf, po->name, sizeof(buf));
93             if (po->flags & HAS_ARG) {
94                 av_strlcat(buf, " ", sizeof(buf));
95                 av_strlcat(buf, po->argname, sizeof(buf));
96             }
97             printf("-%-17s  %s\n", buf, po->help);
98         }
99     }
100 }
101
102 static const OptionDef* find_option(const OptionDef *po, const char *name){
103     while (po->name != NULL) {
104         if (!strcmp(name, po->name))
105             break;
106         po++;
107     }
108     return po;
109 }
110
111 void parse_options(int argc, char **argv, const OptionDef *options,
112                    void (* parse_arg_function)(const char*))
113 {
114     const char *opt, *arg;
115     int optindex, handleoptions=1;
116     const OptionDef *po;
117
118     /* parse options */
119     optindex = 1;
120     while (optindex < argc) {
121         opt = argv[optindex++];
122
123         if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
124             if (opt[1] == '-' && opt[2] == '\0') {
125                 handleoptions = 0;
126                 continue;
127             }
128             po= find_option(options, opt + 1);
129             if (!po->name)
130                 po= find_option(options, "default");
131             if (!po->name) {
132 unknown_opt:
133                 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
134                 exit(1);
135             }
136             arg = NULL;
137             if (po->flags & HAS_ARG) {
138                 arg = argv[optindex++];
139                 if (!arg) {
140                     fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
141                     exit(1);
142                 }
143             }
144             if (po->flags & OPT_STRING) {
145                 char *str;
146                 str = av_strdup(arg);
147                 *po->u.str_arg = str;
148             } else if (po->flags & OPT_BOOL) {
149                 *po->u.int_arg = 1;
150             } else if (po->flags & OPT_INT) {
151                 *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX);
152             } else if (po->flags & OPT_INT64) {
153                 *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX);
154             } else if (po->flags & OPT_FLOAT) {
155                 *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
156             } else if (po->flags & OPT_FUNC2) {
157                 if(po->u.func2_arg(opt+1, arg)<0)
158                     goto unknown_opt;
159             } else {
160                 po->u.func_arg(arg);
161             }
162             if(po->flags & OPT_EXIT)
163                 exit(0);
164         } else {
165             if (parse_arg_function)
166                 parse_arg_function(opt);
167         }
168     }
169 }
170
171 int opt_default(const char *opt, const char *arg){
172     int type;
173     int ret= 0;
174     const AVOption *o= NULL;
175     int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
176
177     for(type=0; type<CODEC_TYPE_NB && ret>= 0; type++){
178         const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
179         if(o2)
180             ret = av_set_string3(avctx_opts[type], opt, arg, 1, &o);
181     }
182     if(!o)
183         ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
184     if(!o)
185         ret = av_set_string3(sws_opts, opt, arg, 1, &o);
186     if(!o){
187         if(opt[0] == 'a')
188             ret = av_set_string3(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1, &o);
189         else if(opt[0] == 'v')
190             ret = av_set_string3(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1, &o);
191         else if(opt[0] == 's')
192             ret = av_set_string3(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1, &o);
193     }
194     if (o && ret < 0) {
195         fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
196         exit(1);
197     }
198     if(!o)
199         return -1;
200
201 //    av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
202
203     //FIXME we should always use avctx_opts, ... for storing options so there will not be any need to keep track of what i set over this
204     opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
205     opt_names[opt_name_count++]= o->name;
206
207     if(avctx_opts[0]->debug || avformat_opts->debug)
208         av_log_set_level(AV_LOG_DEBUG);
209     return 0;
210 }
211
212 void set_context_opts(void *ctx, void *opts_ctx, int flags)
213 {
214     int i;
215     for(i=0; i<opt_name_count; i++){
216         char buf[256];
217         const AVOption *opt;
218         const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
219         /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
220         if(str && ((opt->flags & flags) == flags))
221             av_set_string3(ctx, opt_names[i], str, 1, NULL);
222     }
223 }
224
225 void print_error(const char *filename, int err)
226 {
227     switch(err) {
228     case AVERROR_NUMEXPECTED:
229         fprintf(stderr, "%s: Incorrect image filename syntax.\n"
230                 "Use '%%d' to specify the image number:\n"
231                 "  for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
232                 "  for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
233                 filename);
234         break;
235     case AVERROR_INVALIDDATA:
236         fprintf(stderr, "%s: Error while parsing header\n", filename);
237         break;
238     case AVERROR_NOFMT:
239         fprintf(stderr, "%s: Unknown format\n", filename);
240         break;
241     case AVERROR(EIO):
242         fprintf(stderr, "%s: I/O error occurred\n"
243                 "Usually that means that input file is truncated and/or corrupted.\n",
244                 filename);
245         break;
246     case AVERROR(ENOMEM):
247         fprintf(stderr, "%s: memory allocation error occurred\n", filename);
248         break;
249     case AVERROR(ENOENT):
250         fprintf(stderr, "%s: no such file or directory\n", filename);
251         break;
252 #if CONFIG_NETWORK
253     case AVERROR(FF_NETERROR(EPROTONOSUPPORT)):
254         fprintf(stderr, "%s: Unsupported network protocol\n", filename);
255         break;
256 #endif
257     default:
258         fprintf(stderr, "%s: Error while opening file\n", filename);
259         break;
260     }
261 }
262
263 #define PRINT_LIB_VERSION(outstream,libname,LIBNAME,indent) \
264     version= libname##_version(); \
265     fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", indent? "  " : "", #libname, \
266             LIB##LIBNAME##_VERSION_MAJOR, LIB##LIBNAME##_VERSION_MINOR, LIB##LIBNAME##_VERSION_MICRO, \
267             version >> 16, version >> 8 & 0xff, version & 0xff);
268
269 static void print_all_lib_versions(FILE* outstream, int indent)
270 {
271     unsigned int version;
272     PRINT_LIB_VERSION(outstream, avutil,   AVUTIL,   indent);
273     PRINT_LIB_VERSION(outstream, avcodec,  AVCODEC,  indent);
274     PRINT_LIB_VERSION(outstream, avformat, AVFORMAT, indent);
275     PRINT_LIB_VERSION(outstream, avdevice, AVDEVICE, indent);
276 #if CONFIG_AVFILTER
277     PRINT_LIB_VERSION(outstream, avfilter, AVFILTER, indent);
278 #endif
279 #if CONFIG_SWSCALE
280     PRINT_LIB_VERSION(outstream, swscale,  SWSCALE,  indent);
281 #endif
282 #if CONFIG_POSTPROC
283     PRINT_LIB_VERSION(outstream, postproc, POSTPROC, indent);
284 #endif
285 }
286
287 void show_banner(void)
288 {
289     fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2009 Fabrice Bellard, et al.\n",
290             program_name, program_birth_year);
291     fprintf(stderr, "  configuration: " FFMPEG_CONFIGURATION "\n");
292     print_all_lib_versions(stderr, 1);
293     fprintf(stderr, "  built on " __DATE__ " " __TIME__);
294 #ifdef __GNUC__
295     fprintf(stderr, ", gcc: " __VERSION__ "\n");
296 #else
297     fprintf(stderr, ", using a non-gcc compiler\n");
298 #endif
299 }
300
301 void show_version(void) {
302     printf("%s " FFMPEG_VERSION "\n", program_name);
303     print_all_lib_versions(stdout, 0);
304 }
305
306 void show_license(void)
307 {
308 #if CONFIG_NONFREE
309     printf(
310     "This version of %s has nonfree parts compiled in.\n"
311     "Therefore it is not legally redistributable.\n",
312     program_name
313     );
314 #elif CONFIG_GPL
315     printf(
316     "%s is free software; you can redistribute it and/or modify\n"
317     "it under the terms of the GNU General Public License as published by\n"
318     "the Free Software Foundation; either version 2 of the License, or\n"
319     "(at your option) any later version.\n"
320     "\n"
321     "%s is distributed in the hope that it will be useful,\n"
322     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
323     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
324     "GNU General Public License for more details.\n"
325     "\n"
326     "You should have received a copy of the GNU General Public License\n"
327     "along with %s; if not, write to the Free Software\n"
328     "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
329     program_name, program_name, program_name
330     );
331 #else
332     printf(
333     "%s is free software; you can redistribute it and/or\n"
334     "modify it under the terms of the GNU Lesser General Public\n"
335     "License as published by the Free Software Foundation; either\n"
336     "version 2.1 of the License, or (at your option) any later version.\n"
337     "\n"
338     "%s is distributed in the hope that it will be useful,\n"
339     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
340     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
341     "Lesser General Public License for more details.\n"
342     "\n"
343     "You should have received a copy of the GNU Lesser General Public\n"
344     "License along with %s; if not, write to the Free Software\n"
345     "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
346     program_name, program_name, program_name
347     );
348 #endif
349 }
350
351 void show_formats(void)
352 {
353     AVInputFormat *ifmt=NULL;
354     AVOutputFormat *ofmt=NULL;
355     URLProtocol *up=NULL;
356     AVCodec *p=NULL, *p2;
357     AVBitStreamFilter *bsf=NULL;
358     const char *last_name;
359
360     printf("File formats:\n");
361     last_name= "000";
362     for(;;){
363         int decode=0;
364         int encode=0;
365         const char *name=NULL;
366         const char *long_name=NULL;
367
368         while((ofmt= av_oformat_next(ofmt))) {
369             if((name == NULL || strcmp(ofmt->name, name)<0) &&
370                 strcmp(ofmt->name, last_name)>0){
371                 name= ofmt->name;
372                 long_name= ofmt->long_name;
373                 encode=1;
374             }
375         }
376         while((ifmt= av_iformat_next(ifmt))) {
377             if((name == NULL || strcmp(ifmt->name, name)<0) &&
378                 strcmp(ifmt->name, last_name)>0){
379                 name= ifmt->name;
380                 long_name= ifmt->long_name;
381                 encode=0;
382             }
383             if(name && strcmp(ifmt->name, name)==0)
384                 decode=1;
385         }
386         if(name==NULL)
387             break;
388         last_name= name;
389
390         printf(
391             " %s%s %-15s %s\n",
392             decode ? "D":" ",
393             encode ? "E":" ",
394             name,
395             long_name ? long_name:" ");
396     }
397     printf("\n");
398
399     printf("Codecs:\n");
400     last_name= "000";
401     for(;;){
402         int decode=0;
403         int encode=0;
404         int cap=0;
405         const char *type_str;
406
407         p2=NULL;
408         while((p= av_codec_next(p))) {
409             if((p2==NULL || strcmp(p->name, p2->name)<0) &&
410                 strcmp(p->name, last_name)>0){
411                 p2= p;
412                 decode= encode= cap=0;
413             }
414             if(p2 && strcmp(p->name, p2->name)==0){
415                 if(p->decode) decode=1;
416                 if(p->encode) encode=1;
417                 cap |= p->capabilities;
418             }
419         }
420         if(p2==NULL)
421             break;
422         last_name= p2->name;
423
424         switch(p2->type) {
425         case CODEC_TYPE_VIDEO:
426             type_str = "V";
427             break;
428         case CODEC_TYPE_AUDIO:
429             type_str = "A";
430             break;
431         case CODEC_TYPE_SUBTITLE:
432             type_str = "S";
433             break;
434         default:
435             type_str = "?";
436             break;
437         }
438         printf(
439             " %s%s%s%s%s%s %-15s %s",
440             decode ? "D": (/*p2->decoder ? "d":*/" "),
441             encode ? "E":" ",
442             type_str,
443             cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
444             cap & CODEC_CAP_DR1 ? "D":" ",
445             cap & CODEC_CAP_TRUNCATED ? "T":" ",
446             p2->name,
447             p2->long_name ? p2->long_name : "");
448        /* if(p2->decoder && decode==0)
449             printf(" use %s for decoding", p2->decoder->name);*/
450         printf("\n");
451     }
452     printf("\n");
453
454     printf("Bitstream filters:\n");
455     while((bsf = av_bitstream_filter_next(bsf)))
456         printf(" %s", bsf->name);
457     printf("\n");
458
459     printf("Supported file protocols:\n");
460     while((up = av_protocol_next(up)))
461         printf(" %s:", up->name);
462     printf("\n");
463
464     printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
465     printf("\n");
466     printf(
467 "Note, the names of encoders and decoders do not always match, so there are\n"
468 "several cases where the above table shows encoder only or decoder only entries\n"
469 "even though both encoding and decoding are supported. For example, the h263\n"
470 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
471 "worse.\n");
472 }