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