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