Statistics
| Branch: | Revision:

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
}