Statistics
| Branch: | Revision:

ffmpeg / cmdutils.c @ e8723e24

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