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