2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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. */
32 #include "libavformat/avformat.h"
33 #include "libavfilter/avfilter.h"
34 #include "libavdevice/avdevice.h"
35 #include "libswscale/swscale.h"
36 #include "libpostproc/postprocess.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/parseutils.h"
39 #include "libavutil/pixdesc.h"
40 #include "libavutil/eval.h"
41 #include "libavutil/dict.h"
42 #include "libavutil/opt.h"
46 #include "libavformat/network.h"
48 #if HAVE_SYS_RESOURCE_H
49 #include <sys/resource.h>
52 struct SwsContext *sws_opts;
53 AVDictionary *format_opts, *codec_opts;
55 static const int this_year = 2011;
60 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL);
64 void uninit_opts(void)
67 sws_freeContext(sws_opts);
70 av_dict_free(&format_opts);
71 av_dict_free(&codec_opts);
74 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
76 vfprintf(stdout, fmt, vl);
79 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
83 double d = av_strtod(numstr, &tail);
85 error= "Expected number for %s but found: %s\n";
86 else if (d < min || d > max)
87 error= "The value for %s was %s which is not within %f - %f\n";
88 else if(type == OPT_INT64 && (int64_t)d != d)
89 error= "Expected int64 for %s but found %s\n";
90 else if (type == OPT_INT && (int)d != d)
91 error= "Expected int for %s but found %s\n";
94 av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
99 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
102 if (av_parse_time(&us, timestr, is_duration) < 0) {
103 av_log(NULL, AV_LOG_FATAL, "Invalid %s specification for %s: %s\n",
104 is_duration ? "duration" : "date", context, timestr);
110 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
116 for(po = options; po->name != NULL; po++) {
118 if ((po->flags & mask) == value) {
123 av_strlcpy(buf, po->name, sizeof(buf));
124 if (po->flags & HAS_ARG) {
125 av_strlcat(buf, " ", sizeof(buf));
126 av_strlcat(buf, po->argname, sizeof(buf));
128 printf("-%-17s %s\n", buf, po->help);
133 static const OptionDef* find_option(const OptionDef *po, const char *name){
134 const char *p = strchr(name, ':');
135 int len = p ? p - name : strlen(name);
137 while (po->name != NULL) {
138 if (!strncmp(name, po->name, len) && strlen(po->name) == len)
145 #if defined(_WIN32) && !defined(__MINGW32CE__)
147 /* Will be leaked on exit */
148 static char** win32_argv_utf8 = NULL;
149 static int win32_argc = 0;
152 * Prepare command line arguments for executable.
153 * For Windows - perform wide-char to UTF-8 conversion.
154 * Input arguments should be main() function arguments.
155 * @param argc_ptr Arguments number (including executable)
156 * @param argv_ptr Arguments list.
158 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
162 int i, buffsize = 0, offset = 0;
164 if (win32_argv_utf8) {
165 *argc_ptr = win32_argc;
166 *argv_ptr = win32_argv_utf8;
171 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
172 if (win32_argc <= 0 || !argv_w)
175 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
176 for (i = 0; i < win32_argc; i++)
177 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
178 NULL, 0, NULL, NULL);
180 win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize);
181 argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1);
182 if (win32_argv_utf8 == NULL) {
187 for (i = 0; i < win32_argc; i++) {
188 win32_argv_utf8[i] = &argstr_flat[offset];
189 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
190 &argstr_flat[offset],
191 buffsize - offset, NULL, NULL);
193 win32_argv_utf8[i] = NULL;
196 *argc_ptr = win32_argc;
197 *argv_ptr = win32_argv_utf8;
200 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
204 #endif /* WIN32 && !__MINGW32CE__ */
206 int parse_option(void *optctx, const char *opt, const char *arg, const OptionDef *options)
213 po = find_option(options, opt);
214 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
215 /* handle 'no' bool option */
216 po = find_option(options, opt + 2);
217 if (!(po->name && (po->flags & OPT_BOOL)))
222 po = find_option(options, "default");
225 av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
226 return AVERROR(EINVAL);
228 if (po->flags & HAS_ARG && !arg) {
229 av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
230 return AVERROR(EINVAL);
233 /* new-style options contain an offset into optctx, old-style address of
235 dst = po->flags & (OPT_OFFSET|OPT_SPEC) ? (uint8_t*)optctx + po->u.off : po->u.dst_ptr;
237 if (po->flags & OPT_SPEC) {
238 SpecifierOpt **so = dst;
239 char *p = strchr(opt, ':');
241 dstcount = (int*)(so + 1);
242 *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
243 (*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : "");
244 dst = &(*so)[*dstcount - 1].u;
247 if (po->flags & OPT_STRING) {
249 str = av_strdup(arg);
251 } else if (po->flags & OPT_BOOL) {
252 *(int*)dst = bool_val;
253 } else if (po->flags & OPT_INT) {
254 *(int*)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
255 } else if (po->flags & OPT_INT64) {
256 *(int64_t*)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
257 } else if (po->flags & OPT_TIME) {
258 *(int64_t*)dst = parse_time_or_die(opt, arg, 1);
259 } else if (po->flags & OPT_FLOAT) {
260 *(float*)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
261 } else if (po->flags & OPT_DOUBLE) {
262 *(double*)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY);
263 } else if (po->u.func_arg) {
264 int ret = po->flags & OPT_FUNC2 ? po->u.func2_arg(optctx, opt, arg) :
265 po->u.func_arg(opt, arg);
267 av_log(NULL, AV_LOG_ERROR, "Failed to set value '%s' for option '%s'\n", arg, opt);
271 if (po->flags & OPT_EXIT)
273 return !!(po->flags & HAS_ARG);
276 void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
277 void (* parse_arg_function)(void *, const char*))
280 int optindex, handleoptions = 1, ret;
282 /* perform system-dependent conversions for arguments list */
283 prepare_app_arguments(&argc, &argv);
287 while (optindex < argc) {
288 opt = argv[optindex++];
290 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
291 if (opt[1] == '-' && opt[2] == '\0') {
297 if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
301 if (parse_arg_function)
302 parse_arg_function(optctx, opt);
308 * Return index of option opt in argv or 0 if not found.
310 static int locate_option(int argc, char **argv, const OptionDef *options, const char *optname)
315 for (i = 1; i < argc; i++) {
316 const char *cur_opt = argv[i];
318 if (*cur_opt++ != '-')
321 po = find_option(options, cur_opt);
322 if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
323 po = find_option(options, cur_opt + 2);
325 if ((!po->name && !strcmp(cur_opt, optname)) ||
326 (po->name && !strcmp(optname, po->name)))
329 if (!po || po->flags & HAS_ARG)
335 void parse_loglevel(int argc, char **argv, const OptionDef *options)
337 int idx = locate_option(argc, argv, options, "loglevel");
339 idx = locate_option(argc, argv, options, "v");
340 if (idx && argv[idx + 1])
341 opt_loglevel("loglevel", argv[idx + 1]);
344 #define FLAGS (o->type == FF_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
345 int opt_default(const char *opt, const char *arg)
348 char opt_stripped[128];
350 const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class(), *sc = sws_get_class();
352 if (!(p = strchr(opt, ':')))
353 p = opt + strlen(opt);
354 av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
356 if ((o = av_opt_find(&cc, opt_stripped, NULL, 0, AV_OPT_SEARCH_CHILDREN|AV_OPT_SEARCH_FAKE_OBJ)) ||
357 ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
358 (o = av_opt_find(&cc, opt+1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ))))
359 av_dict_set(&codec_opts, opt, arg, FLAGS);
360 else if ((o = av_opt_find(&fc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
361 av_dict_set(&format_opts, opt, arg, FLAGS);
362 else if ((o = av_opt_find(&sc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
363 // XXX we only support sws_flags, not arbitrary sws options
364 int ret = av_set_string3(sws_opts, opt, arg, 1, NULL);
366 av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
373 av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
374 return AVERROR_OPTION_NOT_FOUND;
377 int opt_loglevel(const char *opt, const char *arg)
379 const struct { const char *name; int level; } log_levels[] = {
380 { "quiet" , AV_LOG_QUIET },
381 { "panic" , AV_LOG_PANIC },
382 { "fatal" , AV_LOG_FATAL },
383 { "error" , AV_LOG_ERROR },
384 { "warning", AV_LOG_WARNING },
385 { "info" , AV_LOG_INFO },
386 { "verbose", AV_LOG_VERBOSE },
387 { "debug" , AV_LOG_DEBUG },
393 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
394 if (!strcmp(log_levels[i].name, arg)) {
395 av_log_set_level(log_levels[i].level);
400 level = strtol(arg, &tail, 10);
402 av_log(NULL, AV_LOG_FATAL, "Invalid loglevel \"%s\". "
403 "Possible levels are numbers or:\n", arg);
404 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
405 av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
408 av_log_set_level(level);
412 int opt_timelimit(const char *opt, const char *arg)
415 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
416 struct rlimit rl = { lim, lim + 1 };
417 if (setrlimit(RLIMIT_CPU, &rl))
420 av_log(NULL, AV_LOG_WARNING, "-%s not implemented on this OS\n", opt);
425 void print_error(const char *filename, int err)
428 const char *errbuf_ptr = errbuf;
430 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
431 errbuf_ptr = strerror(AVUNERROR(err));
432 av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr);
435 static int warned_cfg = 0;
438 #define SHOW_VERSION 2
439 #define SHOW_CONFIG 4
441 #define PRINT_LIB_INFO(libname, LIBNAME, flags, level) \
442 if (CONFIG_##LIBNAME) { \
443 const char *indent = flags & INDENT? " " : ""; \
444 if (flags & SHOW_VERSION) { \
445 unsigned int version = libname##_version(); \
446 av_log(NULL, level, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n",\
448 LIB##LIBNAME##_VERSION_MAJOR, \
449 LIB##LIBNAME##_VERSION_MINOR, \
450 LIB##LIBNAME##_VERSION_MICRO, \
451 version >> 16, version >> 8 & 0xff, version & 0xff); \
453 if (flags & SHOW_CONFIG) { \
454 const char *cfg = libname##_configuration(); \
455 if (strcmp(LIBAV_CONFIGURATION, cfg)) { \
457 av_log(NULL, level, \
458 "%sWARNING: library configuration mismatch\n", \
462 av_log(NULL, level, "%s%-11s configuration: %s\n", \
463 indent, #libname, cfg); \
468 static void print_all_libs_info(int flags, int level)
470 PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
471 PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
472 PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
473 PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
474 PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
475 PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
476 PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
479 void show_banner(void)
481 av_log(NULL, AV_LOG_INFO, "%s version " LIBAV_VERSION ", Copyright (c) %d-%d the Libav developers\n",
482 program_name, program_birth_year, this_year);
483 av_log(NULL, AV_LOG_INFO, " built on %s %s with %s %s\n",
484 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
485 av_log(NULL, AV_LOG_VERBOSE, " configuration: " LIBAV_CONFIGURATION "\n");
486 print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_VERBOSE);
487 print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_VERBOSE);
490 void show_version(void) {
491 av_log_set_callback(log_callback_help);
492 printf("%s " LIBAV_VERSION "\n", program_name);
493 print_all_libs_info(SHOW_VERSION, AV_LOG_INFO);
496 void show_license(void)
500 "This version of %s has nonfree parts compiled in.\n"
501 "Therefore it is not legally redistributable.\n",
504 "%s is free software; you can redistribute it and/or modify\n"
505 "it under the terms of the GNU General Public License as published by\n"
506 "the Free Software Foundation; either version 3 of the License, or\n"
507 "(at your option) any later version.\n"
509 "%s is distributed in the hope that it will be useful,\n"
510 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
511 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
512 "GNU General Public License for more details.\n"
514 "You should have received a copy of the GNU General Public License\n"
515 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
516 program_name, program_name, program_name
518 "%s is free software; you can redistribute it and/or modify\n"
519 "it under the terms of the GNU General Public License as published by\n"
520 "the Free Software Foundation; either version 2 of the License, or\n"
521 "(at your option) any later version.\n"
523 "%s is distributed in the hope that it will be useful,\n"
524 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
525 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
526 "GNU General Public License for more details.\n"
528 "You should have received a copy of the GNU General Public License\n"
529 "along with %s; if not, write to the Free Software\n"
530 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
531 program_name, program_name, program_name
533 "%s is free software; you can redistribute it and/or modify\n"
534 "it under the terms of the GNU Lesser General Public License as published by\n"
535 "the Free Software Foundation; either version 3 of the License, or\n"
536 "(at your option) any later version.\n"
538 "%s is distributed in the hope that it will be useful,\n"
539 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
540 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
541 "GNU Lesser General Public License for more details.\n"
543 "You should have received a copy of the GNU Lesser General Public License\n"
544 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
545 program_name, program_name, program_name
547 "%s is free software; you can redistribute it and/or\n"
548 "modify it under the terms of the GNU Lesser General Public\n"
549 "License as published by the Free Software Foundation; either\n"
550 "version 2.1 of the License, or (at your option) any later version.\n"
552 "%s is distributed in the hope that it will be useful,\n"
553 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
554 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
555 "Lesser General Public License for more details.\n"
557 "You should have received a copy of the GNU Lesser General Public\n"
558 "License along with %s; if not, write to the Free Software\n"
559 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
560 program_name, program_name, program_name
565 void show_formats(void)
567 AVInputFormat *ifmt=NULL;
568 AVOutputFormat *ofmt=NULL;
569 const char *last_name;
573 " D. = Demuxing supported\n"
574 " .E = Muxing supported\n"
580 const char *name=NULL;
581 const char *long_name=NULL;
583 while((ofmt= av_oformat_next(ofmt))) {
584 if((name == NULL || strcmp(ofmt->name, name)<0) &&
585 strcmp(ofmt->name, last_name)>0){
587 long_name= ofmt->long_name;
591 while((ifmt= av_iformat_next(ifmt))) {
592 if((name == NULL || strcmp(ifmt->name, name)<0) &&
593 strcmp(ifmt->name, last_name)>0){
595 long_name= ifmt->long_name;
598 if(name && strcmp(ifmt->name, name)==0)
610 long_name ? long_name:" ");
614 void show_codecs(void)
616 AVCodec *p=NULL, *p2;
617 const char *last_name;
620 " D..... = Decoding supported\n"
621 " .E.... = Encoding supported\n"
622 " ..V... = Video codec\n"
623 " ..A... = Audio codec\n"
624 " ..S... = Subtitle codec\n"
625 " ...S.. = Supports draw_horiz_band\n"
626 " ....D. = Supports direct rendering method 1\n"
627 " .....T = Supports weird frame truncation\n"
634 const char *type_str;
637 while((p= av_codec_next(p))) {
638 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
639 strcmp(p->name, last_name)>0){
641 decode= encode= cap=0;
643 if(p2 && strcmp(p->name, p2->name)==0){
644 if(p->decode) decode=1;
645 if(p->encode) encode=1;
646 cap |= p->capabilities;
654 case AVMEDIA_TYPE_VIDEO:
657 case AVMEDIA_TYPE_AUDIO:
660 case AVMEDIA_TYPE_SUBTITLE:
668 " %s%s%s%s%s%s %-15s %s",
669 decode ? "D": (/*p2->decoder ? "d":*/" "),
672 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
673 cap & CODEC_CAP_DR1 ? "D":" ",
674 cap & CODEC_CAP_TRUNCATED ? "T":" ",
676 p2->long_name ? p2->long_name : "");
677 /* if(p2->decoder && decode==0)
678 printf(" use %s for decoding", p2->decoder->name);*/
683 "Note, the names of encoders and decoders do not always match, so there are\n"
684 "several cases where the above table shows encoder only or decoder only entries\n"
685 "even though both encoding and decoding are supported. For example, the h263\n"
686 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
692 AVBitStreamFilter *bsf=NULL;
694 printf("Bitstream filters:\n");
695 while((bsf = av_bitstream_filter_next(bsf)))
696 printf("%s\n", bsf->name);
700 void show_protocols(void)
705 printf("Supported file protocols:\n"
707 while ((name = avio_enum_protocols(&opaque, 0)))
708 printf("%s\n", name);
710 while ((name = avio_enum_protocols(&opaque, 1)))
711 printf("%s\n", name);
714 void show_filters(void)
716 AVFilter av_unused(**filter) = NULL;
718 printf("Filters:\n");
720 while ((filter = av_filter_next(filter)) && *filter)
721 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
725 void show_pix_fmts(void)
727 enum PixelFormat pix_fmt;
731 "I.... = Supported Input format for conversion\n"
732 ".O... = Supported Output format for conversion\n"
733 "..H.. = Hardware accelerated format\n"
734 "...P. = Paletted format\n"
735 "....B = Bitstream format\n"
736 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
740 # define sws_isSupportedInput(x) 0
741 # define sws_isSupportedOutput(x) 0
744 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
745 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
746 printf("%c%c%c%c%c %-16s %d %2d\n",
747 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
748 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
749 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
750 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
751 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
753 pix_desc->nb_components,
754 av_get_bits_per_pixel(pix_desc));
758 int show_sample_fmts(const char *opt, const char *arg)
762 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
763 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
770 int yesno = (toupper(c) == 'Y');
772 while (c != '\n' && c != EOF)
778 int read_file(const char *filename, char **bufptr, size_t *size)
780 FILE *f = fopen(filename, "rb");
783 av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename, strerror(errno));
784 return AVERROR(errno);
786 fseek(f, 0, SEEK_END);
788 fseek(f, 0, SEEK_SET);
789 *bufptr = av_malloc(*size + 1);
791 av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n");
793 return AVERROR(ENOMEM);
795 fread(*bufptr, 1, *size, f);
796 (*bufptr)[*size++] = '\0';
802 void init_pts_correction(PtsCorrectionContext *ctx)
804 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
805 ctx->last_pts = ctx->last_dts = INT64_MIN;
808 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
810 int64_t pts = AV_NOPTS_VALUE;
812 if (dts != AV_NOPTS_VALUE) {
813 ctx->num_faulty_dts += dts <= ctx->last_dts;
816 if (reordered_pts != AV_NOPTS_VALUE) {
817 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
818 ctx->last_pts = reordered_pts;
820 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
821 && reordered_pts != AV_NOPTS_VALUE)
829 FILE *get_preset_file(char *filename, size_t filename_size,
830 const char *preset_name, int is_path, const char *codec_name)
834 const char *base[3]= { getenv("AVCONV_DATADIR"),
840 av_strlcpy(filename, preset_name, filename_size);
841 f = fopen(filename, "r");
843 for (i = 0; i < 3 && !f; i++) {
846 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.avconv", preset_name);
847 f = fopen(filename, "r");
848 if (!f && codec_name) {
849 snprintf(filename, filename_size,
850 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.avconv", codec_name, preset_name);
851 f = fopen(filename, "r");
859 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
861 if (*spec <= '9' && *spec >= '0') /* opt:index */
862 return strtol(spec, NULL, 0) == st->index;
863 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' || *spec == 't') { /* opt:[vasdt] */
864 enum AVMediaType type;
867 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
868 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
869 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
870 case 'd': type = AVMEDIA_TYPE_DATA; break;
871 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
873 if (type != st->codec->codec_type)
875 if (*spec++ == ':') { /* possibly followed by :index */
876 int i, index = strtol(spec, NULL, 0);
877 for (i = 0; i < s->nb_streams; i++)
878 if (s->streams[i]->codec->codec_type == type && index-- == 0)
879 return i == st->index;
883 } else if (*spec == 'p' && *(spec + 1) == ':') {
887 prog_id = strtol(spec, &endptr, 0);
888 for (i = 0; i < s->nb_programs; i++) {
889 if (s->programs[i]->id != prog_id)
892 if (*endptr++ == ':') {
893 int stream_idx = strtol(endptr, NULL, 0);
894 return (stream_idx >= 0 && stream_idx < s->programs[i]->nb_stream_indexes &&
895 st->index == s->programs[i]->stream_index[stream_idx]);
898 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
899 if (st->index == s->programs[i]->stream_index[j])
903 } else if (!*spec) /* empty specifier, matches everything */
906 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
907 return AVERROR(EINVAL);
910 AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFormatContext *s, AVStream *st)
912 AVDictionary *ret = NULL;
913 AVDictionaryEntry *t = NULL;
914 AVCodec *codec = s->oformat ? avcodec_find_encoder(codec_id) : avcodec_find_decoder(codec_id);
915 int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM : AV_OPT_FLAG_DECODING_PARAM;
917 const AVClass *cc = avcodec_get_class();
922 switch (codec->type) {
923 case AVMEDIA_TYPE_VIDEO: prefix = 'v'; flags |= AV_OPT_FLAG_VIDEO_PARAM; break;
924 case AVMEDIA_TYPE_AUDIO: prefix = 'a'; flags |= AV_OPT_FLAG_AUDIO_PARAM; break;
925 case AVMEDIA_TYPE_SUBTITLE: prefix = 's'; flags |= AV_OPT_FLAG_SUBTITLE_PARAM; break;
928 while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
929 char *p = strchr(t->key, ':');
931 /* check stream specification in opt name */
933 switch (check_stream_specifier(s, st, p + 1)) {
934 case 1: *p = 0; break;
936 default: return NULL;
939 if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
940 (codec && codec->priv_class && av_opt_find(&codec->priv_class, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ)))
941 av_dict_set(&ret, t->key, t->value, 0);
942 else if (t->key[0] == prefix && av_opt_find(&cc, t->key+1, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ))
943 av_dict_set(&ret, t->key+1, t->value, 0);
951 AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts)
958 opts = av_mallocz(s->nb_streams * sizeof(*opts));
960 av_log(NULL, AV_LOG_ERROR, "Could not alloc memory for stream options.\n");
963 for (i = 0; i < s->nb_streams; i++)
964 opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id, s, s->streams[i]);
970 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
972 FFSinkContext *priv = ctx->priv;
975 return AVERROR(EINVAL);
976 *priv = *(FFSinkContext *)opaque;
981 static void null_end_frame(AVFilterLink *inlink) { }
983 static int ffsink_query_formats(AVFilterContext *ctx)
985 FFSinkContext *priv = ctx->priv;
986 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
988 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
994 .priv_size = sizeof(FFSinkContext),
997 .query_formats = ffsink_query_formats,
999 .inputs = (AVFilterPad[]) {{ .name = "default",
1000 .type = AVMEDIA_TYPE_VIDEO,
1001 .end_frame = null_end_frame,
1002 .min_perms = AV_PERM_READ, },
1004 .outputs = (AVFilterPad[]) {{ .name = NULL }},
1007 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
1008 AVFilterBufferRef **picref_ptr, AVRational *tb)
1011 AVFilterBufferRef *picref;
1013 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
1015 if (!(picref = ctx->inputs[0]->cur_buf))
1016 return AVERROR(ENOENT);
1017 *picref_ptr = picref;
1018 ctx->inputs[0]->cur_buf = NULL;
1019 *tb = ctx->inputs[0]->time_base;
1021 memcpy(frame->data, picref->data, sizeof(frame->data));
1022 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
1023 frame->interlaced_frame = picref->video->interlaced;
1024 frame->top_field_first = picref->video->top_field_first;
1025 frame->key_frame = picref->video->key_frame;
1026 frame->pict_type = picref->video->pict_type;
1031 #endif /* CONFIG_AVFILTER */
1033 void *grow_array(void *array, int elem_size, int *size, int new_size)
1035 if (new_size >= INT_MAX / elem_size) {
1036 av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
1039 if (*size < new_size) {
1040 uint8_t *tmp = av_realloc(array, new_size*elem_size);
1042 av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
1045 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);