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