Statistics
| Branch: | Revision:

ffmpeg / cmdutils.c @ 831ec935

History | View | Annotate | Download (12.7 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 63d026b1 Diego Biurrun
#include "config.h"
28 245976da Diego Biurrun
#include "libavformat/avformat.h"
29
#include "libavfilter/avfilter.h"
30
#include "libavdevice/avdevice.h"
31
#include "libavutil/avstring.h"
32 01310af2 Fabrice Bellard
#include "cmdutils.h"
33 86074ed1 Stefano Sabatini
#include "version.h"
34 0b705fa4 Ramiro Polla
#ifdef CONFIG_NETWORK
35 245976da Diego Biurrun
#include "libavformat/network.h"
36 0b705fa4 Ramiro Polla
#endif
37 01310af2 Fabrice Bellard
38 c367d067 Michael Niedermayer
#undef exit
39
40 086ab001 Michael Niedermayer
41
double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
42
{
43
    char *tail;
44
    const char *error;
45
    double d = strtod(numstr, &tail);
46
    if (*tail)
47
        error= "Expected number for %s but found: %s\n";
48
    else if (d < min || d > max)
49
        error= "The value for %s was %s which is not within %f - %f\n";
50
    else if(type == OPT_INT64 && (int64_t)d != d)
51
        error= "Expected int64 for %s but found %s\n";
52
    else
53
        return d;
54
    fprintf(stderr, error, context, numstr, min, max);
55
    exit(1);
56
}
57
58 7542157d Stefano Sabatini
int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
59
{
60
    int64_t us = parse_date(timestr, is_duration);
61
    if (us == INT64_MIN) {
62
        fprintf(stderr, "Invalid %s specification for %s: %s\n",
63
                is_duration ? "duration" : "date", context, timestr);
64
        exit(1);
65
    }
66
    return us;
67
}
68
69 02d504a7 Fabrice Bellard
void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
70 01310af2 Fabrice Bellard
{
71
    const OptionDef *po;
72 02d504a7 Fabrice Bellard
    int first;
73 01310af2 Fabrice Bellard
74 02d504a7 Fabrice Bellard
    first = 1;
75
    for(po = options; po->name != NULL; po++) {
76
        char buf[64];
77
        if ((po->flags & mask) == value) {
78
            if (first) {
79
                printf("%s", msg);
80
                first = 0;
81
            }
82 f7d78f36 Måns Rullgård
            av_strlcpy(buf, po->name, sizeof(buf));
83 02d504a7 Fabrice Bellard
            if (po->flags & HAS_ARG) {
84 f7d78f36 Måns Rullgård
                av_strlcat(buf, " ", sizeof(buf));
85
                av_strlcat(buf, po->argname, sizeof(buf));
86 01310af2 Fabrice Bellard
            }
87 02d504a7 Fabrice Bellard
            printf("-%-17s  %s\n", buf, po->help);
88 01310af2 Fabrice Bellard
        }
89
    }
90
}
91
92 fccfc475 Måns Rullgård
static const OptionDef* find_option(const OptionDef *po, const char *name){
93 8bbf6db9 Michael Niedermayer
    while (po->name != NULL) {
94
        if (!strcmp(name, po->name))
95
            break;
96
        po++;
97
    }
98
    return po;
99
}
100
101 60a9966e Stefano Sabatini
void parse_options(int argc, char **argv, const OptionDef *options,
102
                   void (* parse_arg_function)(const char*))
103 01310af2 Fabrice Bellard
{
104
    const char *opt, *arg;
105 b0d7bc1e Loren Merritt
    int optindex, handleoptions=1;
106 01310af2 Fabrice Bellard
    const OptionDef *po;
107
108
    /* parse options */
109
    optindex = 1;
110
    while (optindex < argc) {
111
        opt = argv[optindex++];
112 115329f1 Diego Biurrun
113 84bf226b Timo Lindfors
        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
114
          if (opt[1] == '-' && opt[2] == '\0') {
115
            handleoptions = 0;
116
            continue;
117
          }
118 8bbf6db9 Michael Niedermayer
            po= find_option(options, opt + 1);
119
            if (!po->name)
120
                po= find_option(options, "default");
121 01310af2 Fabrice Bellard
            if (!po->name) {
122 8bbf6db9 Michael Niedermayer
unknown_opt:
123 01310af2 Fabrice Bellard
                fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
124
                exit(1);
125
            }
126
            arg = NULL;
127
            if (po->flags & HAS_ARG) {
128
                arg = argv[optindex++];
129
                if (!arg) {
130
                    fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
131
                    exit(1);
132
                }
133
            }
134
            if (po->flags & OPT_STRING) {
135
                char *str;
136 02d504a7 Fabrice Bellard
                str = av_strdup(arg);
137 01310af2 Fabrice Bellard
                *po->u.str_arg = str;
138
            } else if (po->flags & OPT_BOOL) {
139
                *po->u.int_arg = 1;
140 26d4f26b Michael Niedermayer
            } else if (po->flags & OPT_INT) {
141 7c84b8bc Stefano Sabatini
                *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX);
142 ffdf9a1f Baptiste Coudurier
            } else if (po->flags & OPT_INT64) {
143 7c84b8bc Stefano Sabatini
                *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX);
144 1f631450 Michael Niedermayer
            } else if (po->flags & OPT_FLOAT) {
145 1f3d74d3 Michael Niedermayer
                *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
146 8bbf6db9 Michael Niedermayer
            } else if (po->flags & OPT_FUNC2) {
147
                if(po->u.func2_arg(opt+1, arg)<0)
148
                    goto unknown_opt;
149 01310af2 Fabrice Bellard
            } else {
150 bb270c08 Diego Biurrun
                po->u.func_arg(arg);
151 01310af2 Fabrice Bellard
            }
152 a0b3bcd9 Michael Niedermayer
            if(po->flags & OPT_EXIT)
153
                exit(0);
154 01310af2 Fabrice Bellard
        } else {
155 60a9966e Stefano Sabatini
            if (parse_arg_function)
156
                parse_arg_function(opt);
157 01310af2 Fabrice Bellard
        }
158
    }
159
}
160
161
void print_error(const char *filename, int err)
162
{
163
    switch(err) {
164
    case AVERROR_NUMEXPECTED:
165
        fprintf(stderr, "%s: Incorrect image filename syntax.\n"
166
                "Use '%%d' to specify the image number:\n"
167
                "  for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
168 115329f1 Diego Biurrun
                "  for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
169 01310af2 Fabrice Bellard
                filename);
170
        break;
171
    case AVERROR_INVALIDDATA:
172
        fprintf(stderr, "%s: Error while parsing header\n", filename);
173
        break;
174
    case AVERROR_NOFMT:
175
        fprintf(stderr, "%s: Unknown format\n", filename);
176
        break;
177 6f3e0b21 Panagiotis Issaris
    case AVERROR(EIO):
178 d9526386 Diego Biurrun
        fprintf(stderr, "%s: I/O error occurred\n"
179 bb270c08 Diego Biurrun
                "Usually that means that input file is truncated and/or corrupted.\n",
180
                filename);
181 45ce5ddb Kostya Shishkov
        break;
182 769e10f0 Panagiotis Issaris
    case AVERROR(ENOMEM):
183 d9526386 Diego Biurrun
        fprintf(stderr, "%s: memory allocation error occurred\n", filename);
184 45ce5ddb Kostya Shishkov
        break;
185 24fddf48 Panagiotis Issaris
    case AVERROR(ENOENT):
186 0ba0c8de Benoit Fouet
        fprintf(stderr, "%s: no such file or directory\n", filename);
187
        break;
188 0b705fa4 Ramiro Polla
#ifdef CONFIG_NETWORK
189 18ec0460 Luca Barbato
    case AVERROR(FF_NETERROR(EPROTONOSUPPORT)):
190
        fprintf(stderr, "%s: Unsupported network protocol\n", filename);
191
        break;
192 0b705fa4 Ramiro Polla
#endif
193 01310af2 Fabrice Bellard
    default:
194
        fprintf(stderr, "%s: Error while opening file\n", filename);
195
        break;
196
    }
197
}
198 f35917b2 Stefano Sabatini
199 ea9c581f Stefano Sabatini
void show_banner(void)
200 86074ed1 Stefano Sabatini
{
201 69c12fbb Benoit Fouet
    fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2008 Fabrice Bellard, et al.\n",
202 86074ed1 Stefano Sabatini
            program_name, program_birth_year);
203
    fprintf(stderr, "  configuration: " FFMPEG_CONFIGURATION "\n");
204
    fprintf(stderr, "  libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
205
    fprintf(stderr, "  libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
206
    fprintf(stderr, "  libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
207 2208741a Michael Niedermayer
    fprintf(stderr, "  libavdevice version: " AV_STRINGIFY(LIBAVDEVICE_VERSION) "\n");
208 ab4b28f0 Vitor Sessak
#if ENABLE_AVFILTER
209
    fprintf(stderr, "  libavfilter version: " AV_STRINGIFY(LIBAVFILTER_VERSION) "\n");
210
#endif
211 86074ed1 Stefano Sabatini
    fprintf(stderr, "  built on " __DATE__ " " __TIME__);
212
#ifdef __GNUC__
213
    fprintf(stderr, ", gcc: " __VERSION__ "\n");
214
#else
215
    fprintf(stderr, ", using a non-gcc compiler\n");
216
#endif
217
}
218
219 64555bd9 Michael Niedermayer
void show_version(void) {
220 2208741a Michael Niedermayer
     /* TODO: add function interface to avutil and avformat avdevice*/
221 86074ed1 Stefano Sabatini
    printf("%s " FFMPEG_VERSION "\n", program_name);
222
    printf("libavutil   %d\n"
223
           "libavcodec  %d\n"
224 2208741a Michael Niedermayer
           "libavformat %d\n"
225
           "libavdevice %d\n",
226
           LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD, LIBAVDEVICE_BUILD);
227 86074ed1 Stefano Sabatini
}
228
229 f35917b2 Stefano Sabatini
void show_license(void)
230
{
231 7ead693b Diego Biurrun
#ifdef CONFIG_NONFREE
232
    printf(
233
    "This version of FFmpeg has nonfree parts compiled in.\n"
234
    "Therefore it is not legally redistributable.\n"
235
    );
236
#elif CONFIG_GPL
237 f35917b2 Stefano Sabatini
    printf(
238
    "FFmpeg is free software; you can redistribute it and/or modify\n"
239
    "it under the terms of the GNU General Public License as published by\n"
240
    "the Free Software Foundation; either version 2 of the License, or\n"
241
    "(at your option) any later version.\n"
242
    "\n"
243
    "FFmpeg is distributed in the hope that it will be useful,\n"
244
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
245
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
246
    "GNU General Public License for more details.\n"
247
    "\n"
248
    "You should have received a copy of the GNU General Public License\n"
249
    "along with FFmpeg; if not, write to the Free Software\n"
250
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
251
    );
252
#else
253
    printf(
254
    "FFmpeg is free software; you can redistribute it and/or\n"
255
    "modify it under the terms of the GNU Lesser General Public\n"
256
    "License as published by the Free Software Foundation; either\n"
257
    "version 2.1 of the License, or (at your option) any later version.\n"
258
    "\n"
259
    "FFmpeg is distributed in the hope that it will be useful,\n"
260
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
261
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
262
    "Lesser General Public License for more details.\n"
263
    "\n"
264
    "You should have received a copy of the GNU Lesser General Public\n"
265
    "License along with FFmpeg; if not, write to the Free Software\n"
266
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
267
    );
268
#endif
269
}
270 ba9880c1 Stefano Sabatini
271
void show_formats(void)
272
{
273
    AVInputFormat *ifmt=NULL;
274
    AVOutputFormat *ofmt=NULL;
275
    URLProtocol *up=NULL;
276
    AVCodec *p=NULL, *p2;
277
    AVBitStreamFilter *bsf=NULL;
278
    const char *last_name;
279
280
    printf("File formats:\n");
281
    last_name= "000";
282
    for(;;){
283
        int decode=0;
284
        int encode=0;
285
        const char *name=NULL;
286
        const char *long_name=NULL;
287
288
        while((ofmt= av_oformat_next(ofmt))) {
289
            if((name == NULL || strcmp(ofmt->name, name)<0) &&
290
                strcmp(ofmt->name, last_name)>0){
291
                name= ofmt->name;
292
                long_name= ofmt->long_name;
293
                encode=1;
294
            }
295
        }
296
        while((ifmt= av_iformat_next(ifmt))) {
297
            if((name == NULL || strcmp(ifmt->name, name)<0) &&
298
                strcmp(ifmt->name, last_name)>0){
299
                name= ifmt->name;
300
                long_name= ifmt->long_name;
301
                encode=0;
302
            }
303
            if(name && strcmp(ifmt->name, name)==0)
304
                decode=1;
305
        }
306
        if(name==NULL)
307
            break;
308
        last_name= name;
309
310
        printf(
311
            " %s%s %-15s %s\n",
312
            decode ? "D":" ",
313
            encode ? "E":" ",
314
            name,
315
            long_name ? long_name:" ");
316
    }
317
    printf("\n");
318
319
    printf("Codecs:\n");
320
    last_name= "000";
321
    for(;;){
322
        int decode=0;
323
        int encode=0;
324
        int cap=0;
325
        const char *type_str;
326
327
        p2=NULL;
328
        while((p= av_codec_next(p))) {
329
            if((p2==NULL || strcmp(p->name, p2->name)<0) &&
330
                strcmp(p->name, last_name)>0){
331
                p2= p;
332
                decode= encode= cap=0;
333
            }
334
            if(p2 && strcmp(p->name, p2->name)==0){
335
                if(p->decode) decode=1;
336
                if(p->encode) encode=1;
337
                cap |= p->capabilities;
338
            }
339
        }
340
        if(p2==NULL)
341
            break;
342
        last_name= p2->name;
343
344
        switch(p2->type) {
345
        case CODEC_TYPE_VIDEO:
346
            type_str = "V";
347
            break;
348
        case CODEC_TYPE_AUDIO:
349
            type_str = "A";
350
            break;
351
        case CODEC_TYPE_SUBTITLE:
352
            type_str = "S";
353
            break;
354
        default:
355
            type_str = "?";
356
            break;
357
        }
358
        printf(
359
            " %s%s%s%s%s%s %-15s %s",
360
            decode ? "D": (/*p2->decoder ? "d":*/" "),
361
            encode ? "E":" ",
362
            type_str,
363
            cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
364
            cap & CODEC_CAP_DR1 ? "D":" ",
365
            cap & CODEC_CAP_TRUNCATED ? "T":" ",
366
            p2->name,
367
            p2->long_name ? p2->long_name : "");
368
       /* if(p2->decoder && decode==0)
369
            printf(" use %s for decoding", p2->decoder->name);*/
370
        printf("\n");
371
    }
372
    printf("\n");
373
374
    printf("Bitstream filters:\n");
375
    while((bsf = av_bitstream_filter_next(bsf)))
376
        printf(" %s", bsf->name);
377
    printf("\n");
378
379
    printf("Supported file protocols:\n");
380
    while((up = av_protocol_next(up)))
381
        printf(" %s:", up->name);
382
    printf("\n");
383
384
    printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
385
    printf("\n");
386
    printf(
387
"Note, the names of encoders and decoders do not always match, so there are\n"
388
"several cases where the above table shows encoder only or decoder only entries\n"
389
"even though both encoding and decoding are supported. For example, the h263\n"
390
"decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
391
"worse.\n");
392
}