Statistics
| Branch: | Revision:

ffmpeg / cmdutils.c @ 7254edb5

History | View | Annotate | Download (12.8 KB)

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 "libavformat/avformat.h"
29
#include "libavfilter/avfilter.h"
30
#include "libavdevice/avdevice.h"
31
#include "libavutil/avstring.h"
32
#include "cmdutils.h"
33
#include "version.h"
34
#ifdef CONFIG_NETWORK
35
#include "libavformat/network.h"
36
#endif
37

    
38
#undef exit
39

    
40

    
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
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
void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
70
{
71
    const OptionDef *po;
72
    int first;
73

    
74
    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
            av_strlcpy(buf, po->name, sizeof(buf));
83
            if (po->flags & HAS_ARG) {
84
                av_strlcat(buf, " ", sizeof(buf));
85
                av_strlcat(buf, po->argname, sizeof(buf));
86
            }
87
            printf("-%-17s  %s\n", buf, po->help);
88
        }
89
    }
90
}
91

    
92
static const OptionDef* find_option(const OptionDef *po, const char *name){
93
    while (po->name != NULL) {
94
        if (!strcmp(name, po->name))
95
            break;
96
        po++;
97
    }
98
    return po;
99
}
100

    
101
void parse_options(int argc, char **argv, const OptionDef *options,
102
                   void (* parse_arg_function)(const char*))
103
{
104
    const char *opt, *arg;
105
    int optindex, handleoptions=1;
106
    const OptionDef *po;
107

    
108
    /* parse options */
109
    optindex = 1;
110
    while (optindex < argc) {
111
        opt = argv[optindex++];
112

    
113
        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
114
          if (opt[1] == '-' && opt[2] == '\0') {
115
            handleoptions = 0;
116
            continue;
117
          }
118
            po= find_option(options, opt + 1);
119
            if (!po->name)
120
                po= find_option(options, "default");
121
            if (!po->name) {
122
unknown_opt:
123
                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
                str = av_strdup(arg);
137
                *po->u.str_arg = str;
138
            } else if (po->flags & OPT_BOOL) {
139
                *po->u.int_arg = 1;
140
            } else if (po->flags & OPT_INT) {
141
                *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX);
142
            } else if (po->flags & OPT_INT64) {
143
                *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX);
144
            } else if (po->flags & OPT_FLOAT) {
145
                *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
146
            } else if (po->flags & OPT_FUNC2) {
147
                if(po->u.func2_arg(opt+1, arg)<0)
148
                    goto unknown_opt;
149
            } else {
150
                po->u.func_arg(arg);
151
            }
152
            if(po->flags & OPT_EXIT)
153
                exit(0);
154
        } else {
155
            if (parse_arg_function)
156
                parse_arg_function(opt);
157
        }
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
                "  for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
169
                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
    case AVERROR(EIO):
178
        fprintf(stderr, "%s: I/O error occurred\n"
179
                "Usually that means that input file is truncated and/or corrupted.\n",
180
                filename);
181
        break;
182
    case AVERROR(ENOMEM):
183
        fprintf(stderr, "%s: memory allocation error occurred\n", filename);
184
        break;
185
    case AVERROR(ENOENT):
186
        fprintf(stderr, "%s: no such file or directory\n", filename);
187
        break;
188
#ifdef CONFIG_NETWORK
189
    case AVERROR(FF_NETERROR(EPROTONOSUPPORT)):
190
        fprintf(stderr, "%s: Unsupported network protocol\n", filename);
191
        break;
192
#endif
193
    default:
194
        fprintf(stderr, "%s: Error while opening file\n", filename);
195
        break;
196
    }
197
}
198

    
199
void show_banner(void)
200
{
201
    fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2008 Fabrice Bellard, et al.\n",
202
            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
    fprintf(stderr, "  libavdevice version: " AV_STRINGIFY(LIBAVDEVICE_VERSION) "\n");
208
#if ENABLE_AVFILTER
209
    fprintf(stderr, "  libavfilter version: " AV_STRINGIFY(LIBAVFILTER_VERSION) "\n");
210
#endif
211
    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
void show_version(void) {
220
     /* TODO: add function interface to avutil and avformat avdevice*/
221
    printf("%s " FFMPEG_VERSION "\n", program_name);
222
    printf("libavutil   %d\n"
223
           "libavcodec  %d\n"
224
           "libavformat %d\n"
225
           "libavdevice %d\n",
226
           LIBAVUTIL_BUILD, avcodec_version(), LIBAVFORMAT_BUILD, LIBAVDEVICE_BUILD);
227
}
228

    
229
void show_license(void)
230
{
231
#ifdef CONFIG_NONFREE
232
    printf(
233
    "This version of %s has nonfree parts compiled in.\n"
234
    "Therefore it is not legally redistributable.\n",
235
    program_name
236
    );
237
#elif CONFIG_GPL
238
    printf(
239
    "%s is free software; you can redistribute it and/or modify\n"
240
    "it under the terms of the GNU General Public License as published by\n"
241
    "the Free Software Foundation; either version 2 of the License, or\n"
242
    "(at your option) any later version.\n"
243
    "\n"
244
    "%s is distributed in the hope that it will be useful,\n"
245
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
246
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
247
    "GNU General Public License for more details.\n"
248
    "\n"
249
    "You should have received a copy of the GNU General Public License\n"
250
    "along with %s; if not, write to the Free Software\n"
251
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
252
    program_name, program_name, program_name
253
    );
254
#else
255
    printf(
256
    "%s is free software; you can redistribute it and/or\n"
257
    "modify it under the terms of the GNU Lesser General Public\n"
258
    "License as published by the Free Software Foundation; either\n"
259
    "version 2.1 of the License, or (at your option) any later version.\n"
260
    "\n"
261
    "%s is distributed in the hope that it will be useful,\n"
262
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
263
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
264
    "Lesser General Public License for more details.\n"
265
    "\n"
266
    "You should have received a copy of the GNU Lesser General Public\n"
267
    "License along with %s; if not, write to the Free Software\n"
268
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
269
    program_name, program_name, program_name
270
    );
271
#endif
272
}
273

    
274
void show_formats(void)
275
{
276
    AVInputFormat *ifmt=NULL;
277
    AVOutputFormat *ofmt=NULL;
278
    URLProtocol *up=NULL;
279
    AVCodec *p=NULL, *p2;
280
    AVBitStreamFilter *bsf=NULL;
281
    const char *last_name;
282

    
283
    printf("File formats:\n");
284
    last_name= "000";
285
    for(;;){
286
        int decode=0;
287
        int encode=0;
288
        const char *name=NULL;
289
        const char *long_name=NULL;
290

    
291
        while((ofmt= av_oformat_next(ofmt))) {
292
            if((name == NULL || strcmp(ofmt->name, name)<0) &&
293
                strcmp(ofmt->name, last_name)>0){
294
                name= ofmt->name;
295
                long_name= ofmt->long_name;
296
                encode=1;
297
            }
298
        }
299
        while((ifmt= av_iformat_next(ifmt))) {
300
            if((name == NULL || strcmp(ifmt->name, name)<0) &&
301
                strcmp(ifmt->name, last_name)>0){
302
                name= ifmt->name;
303
                long_name= ifmt->long_name;
304
                encode=0;
305
            }
306
            if(name && strcmp(ifmt->name, name)==0)
307
                decode=1;
308
        }
309
        if(name==NULL)
310
            break;
311
        last_name= name;
312

    
313
        printf(
314
            " %s%s %-15s %s\n",
315
            decode ? "D":" ",
316
            encode ? "E":" ",
317
            name,
318
            long_name ? long_name:" ");
319
    }
320
    printf("\n");
321

    
322
    printf("Codecs:\n");
323
    last_name= "000";
324
    for(;;){
325
        int decode=0;
326
        int encode=0;
327
        int cap=0;
328
        const char *type_str;
329

    
330
        p2=NULL;
331
        while((p= av_codec_next(p))) {
332
            if((p2==NULL || strcmp(p->name, p2->name)<0) &&
333
                strcmp(p->name, last_name)>0){
334
                p2= p;
335
                decode= encode= cap=0;
336
            }
337
            if(p2 && strcmp(p->name, p2->name)==0){
338
                if(p->decode) decode=1;
339
                if(p->encode) encode=1;
340
                cap |= p->capabilities;
341
            }
342
        }
343
        if(p2==NULL)
344
            break;
345
        last_name= p2->name;
346

    
347
        switch(p2->type) {
348
        case CODEC_TYPE_VIDEO:
349
            type_str = "V";
350
            break;
351
        case CODEC_TYPE_AUDIO:
352
            type_str = "A";
353
            break;
354
        case CODEC_TYPE_SUBTITLE:
355
            type_str = "S";
356
            break;
357
        default:
358
            type_str = "?";
359
            break;
360
        }
361
        printf(
362
            " %s%s%s%s%s%s %-15s %s",
363
            decode ? "D": (/*p2->decoder ? "d":*/" "),
364
            encode ? "E":" ",
365
            type_str,
366
            cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
367
            cap & CODEC_CAP_DR1 ? "D":" ",
368
            cap & CODEC_CAP_TRUNCATED ? "T":" ",
369
            p2->name,
370
            p2->long_name ? p2->long_name : "");
371
       /* if(p2->decoder && decode==0)
372
            printf(" use %s for decoding", p2->decoder->name);*/
373
        printf("\n");
374
    }
375
    printf("\n");
376

    
377
    printf("Bitstream filters:\n");
378
    while((bsf = av_bitstream_filter_next(bsf)))
379
        printf(" %s", bsf->name);
380
    printf("\n");
381

    
382
    printf("Supported file protocols:\n");
383
    while((up = av_protocol_next(up)))
384
        printf(" %s:", up->name);
385
    printf("\n");
386

    
387
    printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
388
    printf("\n");
389
    printf(
390
"Note, the names of encoders and decoders do not always match, so there are\n"
391
"several cases where the above table shows encoder only or decoder only entries\n"
392
"even though both encoding and decoding are supported. For example, the h263\n"
393
"decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
394
"worse.\n");
395
}