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 fprintf(stderr, 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 fprintf(stderr, "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->u.func_arg) {
262 int ret = po->flags & OPT_FUNC2 ? po->u.func2_arg(optctx, opt, arg) :
263 po->u.func_arg(opt, arg);
265 av_log(NULL, AV_LOG_ERROR, "Failed to set value '%s' for option '%s'\n", arg, opt);
269 if (po->flags & OPT_EXIT)
271 return !!(po->flags & HAS_ARG);
274 void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
275 void (* parse_arg_function)(void *, const char*))
278 int optindex, handleoptions = 1, ret;
280 /* perform system-dependent conversions for arguments list */
281 prepare_app_arguments(&argc, &argv);
285 while (optindex < argc) {
286 opt = argv[optindex++];
288 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
289 if (opt[1] == '-' && opt[2] == '\0') {
295 if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
299 if (parse_arg_function)
300 parse_arg_function(optctx, opt);
305 #define FLAGS (o->type == FF_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
306 int opt_default(const char *opt, const char *arg)
309 char opt_stripped[128];
311 const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class(), *sc = sws_get_class();
313 if (!(p = strchr(opt, ':')))
314 p = opt + strlen(opt);
315 av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
317 if ((o = av_opt_find(&cc, opt_stripped, NULL, 0, AV_OPT_SEARCH_CHILDREN|AV_OPT_SEARCH_FAKE_OBJ)) ||
318 ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
319 (o = av_opt_find(&cc, opt+1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ))))
320 av_dict_set(&codec_opts, opt, arg, FLAGS);
321 else if ((o = av_opt_find(&fc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
322 av_dict_set(&format_opts, opt, arg, FLAGS);
323 else if ((o = av_opt_find(&sc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
324 // XXX we only support sws_flags, not arbitrary sws options
325 int ret = av_set_string3(sws_opts, opt, arg, 1, NULL);
327 av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
334 fprintf(stderr, "Unrecognized option '%s'\n", opt);
335 return AVERROR_OPTION_NOT_FOUND;
338 int opt_loglevel(const char *opt, const char *arg)
340 const struct { const char *name; int level; } log_levels[] = {
341 { "quiet" , AV_LOG_QUIET },
342 { "panic" , AV_LOG_PANIC },
343 { "fatal" , AV_LOG_FATAL },
344 { "error" , AV_LOG_ERROR },
345 { "warning", AV_LOG_WARNING },
346 { "info" , AV_LOG_INFO },
347 { "verbose", AV_LOG_VERBOSE },
348 { "debug" , AV_LOG_DEBUG },
354 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
355 if (!strcmp(log_levels[i].name, arg)) {
356 av_log_set_level(log_levels[i].level);
361 level = strtol(arg, &tail, 10);
363 fprintf(stderr, "Invalid loglevel \"%s\". "
364 "Possible levels are numbers or:\n", arg);
365 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
366 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
369 av_log_set_level(level);
373 int opt_timelimit(const char *opt, const char *arg)
376 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
377 struct rlimit rl = { lim, lim + 1 };
378 if (setrlimit(RLIMIT_CPU, &rl))
381 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
386 void print_error(const char *filename, int err)
389 const char *errbuf_ptr = errbuf;
391 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
392 errbuf_ptr = strerror(AVUNERROR(err));
393 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
396 static int warned_cfg = 0;
399 #define SHOW_VERSION 2
400 #define SHOW_CONFIG 4
402 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
403 if (CONFIG_##LIBNAME) { \
404 const char *indent = flags & INDENT? " " : ""; \
405 if (flags & SHOW_VERSION) { \
406 unsigned int version = libname##_version(); \
407 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
409 LIB##LIBNAME##_VERSION_MAJOR, \
410 LIB##LIBNAME##_VERSION_MINOR, \
411 LIB##LIBNAME##_VERSION_MICRO, \
412 version >> 16, version >> 8 & 0xff, version & 0xff); \
414 if (flags & SHOW_CONFIG) { \
415 const char *cfg = libname##_configuration(); \
416 if (strcmp(LIBAV_CONFIGURATION, cfg)) { \
419 "%sWARNING: library configuration mismatch\n", \
423 fprintf(stderr, "%s%-11s configuration: %s\n", \
424 indent, #libname, cfg); \
429 static void print_all_libs_info(FILE* outstream, int flags)
431 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
432 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
433 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
434 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
435 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
436 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
437 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
440 void show_banner(void)
442 fprintf(stderr, "%s version " LIBAV_VERSION ", Copyright (c) %d-%d the Libav developers\n",
443 program_name, program_birth_year, this_year);
444 fprintf(stderr, " built on %s %s with %s %s\n",
445 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
446 fprintf(stderr, " configuration: " LIBAV_CONFIGURATION "\n");
447 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
448 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
451 void show_version(void) {
452 printf("%s " LIBAV_VERSION "\n", program_name);
453 print_all_libs_info(stdout, SHOW_VERSION);
456 void show_license(void)
460 "This version of %s has nonfree parts compiled in.\n"
461 "Therefore it is not legally redistributable.\n",
464 "%s is free software; you can redistribute it and/or modify\n"
465 "it under the terms of the GNU General Public License as published by\n"
466 "the Free Software Foundation; either version 3 of the License, or\n"
467 "(at your option) any later version.\n"
469 "%s is distributed in the hope that it will be useful,\n"
470 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
471 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
472 "GNU General Public License for more details.\n"
474 "You should have received a copy of the GNU General Public License\n"
475 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
476 program_name, program_name, program_name
478 "%s is free software; you can redistribute it and/or modify\n"
479 "it under the terms of the GNU General Public License as published by\n"
480 "the Free Software Foundation; either version 2 of the License, or\n"
481 "(at your option) any later version.\n"
483 "%s is distributed in the hope that it will be useful,\n"
484 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
485 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
486 "GNU General Public License for more details.\n"
488 "You should have received a copy of the GNU General Public License\n"
489 "along with %s; if not, write to the Free Software\n"
490 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
491 program_name, program_name, program_name
493 "%s is free software; you can redistribute it and/or modify\n"
494 "it under the terms of the GNU Lesser General Public License as published by\n"
495 "the Free Software Foundation; either version 3 of the License, or\n"
496 "(at your option) any later version.\n"
498 "%s is distributed in the hope that it will be useful,\n"
499 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
500 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
501 "GNU Lesser General Public License for more details.\n"
503 "You should have received a copy of the GNU Lesser General Public License\n"
504 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
505 program_name, program_name, program_name
507 "%s is free software; you can redistribute it and/or\n"
508 "modify it under the terms of the GNU Lesser General Public\n"
509 "License as published by the Free Software Foundation; either\n"
510 "version 2.1 of the License, or (at your option) any later version.\n"
512 "%s is distributed in the hope that it will be useful,\n"
513 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
514 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
515 "Lesser General Public License for more details.\n"
517 "You should have received a copy of the GNU Lesser General Public\n"
518 "License along with %s; if not, write to the Free Software\n"
519 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
520 program_name, program_name, program_name
525 void show_formats(void)
527 AVInputFormat *ifmt=NULL;
528 AVOutputFormat *ofmt=NULL;
529 const char *last_name;
533 " D. = Demuxing supported\n"
534 " .E = Muxing supported\n"
540 const char *name=NULL;
541 const char *long_name=NULL;
543 while((ofmt= av_oformat_next(ofmt))) {
544 if((name == NULL || strcmp(ofmt->name, name)<0) &&
545 strcmp(ofmt->name, last_name)>0){
547 long_name= ofmt->long_name;
551 while((ifmt= av_iformat_next(ifmt))) {
552 if((name == NULL || strcmp(ifmt->name, name)<0) &&
553 strcmp(ifmt->name, last_name)>0){
555 long_name= ifmt->long_name;
558 if(name && strcmp(ifmt->name, name)==0)
570 long_name ? long_name:" ");
574 void show_codecs(void)
576 AVCodec *p=NULL, *p2;
577 const char *last_name;
580 " D..... = Decoding supported\n"
581 " .E.... = Encoding supported\n"
582 " ..V... = Video codec\n"
583 " ..A... = Audio codec\n"
584 " ..S... = Subtitle codec\n"
585 " ...S.. = Supports draw_horiz_band\n"
586 " ....D. = Supports direct rendering method 1\n"
587 " .....T = Supports weird frame truncation\n"
594 const char *type_str;
597 while((p= av_codec_next(p))) {
598 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
599 strcmp(p->name, last_name)>0){
601 decode= encode= cap=0;
603 if(p2 && strcmp(p->name, p2->name)==0){
604 if(p->decode) decode=1;
605 if(p->encode) encode=1;
606 cap |= p->capabilities;
614 case AVMEDIA_TYPE_VIDEO:
617 case AVMEDIA_TYPE_AUDIO:
620 case AVMEDIA_TYPE_SUBTITLE:
628 " %s%s%s%s%s%s %-15s %s",
629 decode ? "D": (/*p2->decoder ? "d":*/" "),
632 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
633 cap & CODEC_CAP_DR1 ? "D":" ",
634 cap & CODEC_CAP_TRUNCATED ? "T":" ",
636 p2->long_name ? p2->long_name : "");
637 /* if(p2->decoder && decode==0)
638 printf(" use %s for decoding", p2->decoder->name);*/
643 "Note, the names of encoders and decoders do not always match, so there are\n"
644 "several cases where the above table shows encoder only or decoder only entries\n"
645 "even though both encoding and decoding are supported. For example, the h263\n"
646 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
652 AVBitStreamFilter *bsf=NULL;
654 printf("Bitstream filters:\n");
655 while((bsf = av_bitstream_filter_next(bsf)))
656 printf("%s\n", bsf->name);
660 void show_protocols(void)
665 printf("Supported file protocols:\n"
667 while ((name = avio_enum_protocols(&opaque, 0)))
668 printf("%s\n", name);
670 while ((name = avio_enum_protocols(&opaque, 1)))
671 printf("%s\n", name);
674 void show_filters(void)
676 AVFilter av_unused(**filter) = NULL;
678 printf("Filters:\n");
680 while ((filter = av_filter_next(filter)) && *filter)
681 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
685 void show_pix_fmts(void)
687 enum PixelFormat pix_fmt;
691 "I.... = Supported Input format for conversion\n"
692 ".O... = Supported Output format for conversion\n"
693 "..H.. = Hardware accelerated format\n"
694 "...P. = Paletted format\n"
695 "....B = Bitstream format\n"
696 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
700 # define sws_isSupportedInput(x) 0
701 # define sws_isSupportedOutput(x) 0
704 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
705 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
706 printf("%c%c%c%c%c %-16s %d %2d\n",
707 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
708 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
709 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
710 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
711 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
713 pix_desc->nb_components,
714 av_get_bits_per_pixel(pix_desc));
721 int yesno = (toupper(c) == 'Y');
723 while (c != '\n' && c != EOF)
729 int read_file(const char *filename, char **bufptr, size_t *size)
731 FILE *f = fopen(filename, "rb");
734 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
735 return AVERROR(errno);
737 fseek(f, 0, SEEK_END);
739 fseek(f, 0, SEEK_SET);
740 *bufptr = av_malloc(*size + 1);
742 fprintf(stderr, "Could not allocate file buffer\n");
744 return AVERROR(ENOMEM);
746 fread(*bufptr, 1, *size, f);
747 (*bufptr)[*size++] = '\0';
753 void init_pts_correction(PtsCorrectionContext *ctx)
755 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
756 ctx->last_pts = ctx->last_dts = INT64_MIN;
759 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
761 int64_t pts = AV_NOPTS_VALUE;
763 if (dts != AV_NOPTS_VALUE) {
764 ctx->num_faulty_dts += dts <= ctx->last_dts;
767 if (reordered_pts != AV_NOPTS_VALUE) {
768 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
769 ctx->last_pts = reordered_pts;
771 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
772 && reordered_pts != AV_NOPTS_VALUE)
780 FILE *get_preset_file(char *filename, size_t filename_size,
781 const char *preset_name, int is_path, const char *codec_name)
785 const char *base[3]= { getenv("AVCONV_DATADIR"),
791 av_strlcpy(filename, preset_name, filename_size);
792 f = fopen(filename, "r");
794 for (i = 0; i < 3 && !f; i++) {
797 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.avconv", preset_name);
798 f = fopen(filename, "r");
799 if (!f && codec_name) {
800 snprintf(filename, filename_size,
801 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.avconv", codec_name, preset_name);
802 f = fopen(filename, "r");
810 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
812 if (*spec <= '9' && *spec >= '0') /* opt:index */
813 return strtol(spec, NULL, 0) == st->index;
814 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd') { /* opt:[vasd] */
815 enum AVMediaType type;
818 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
819 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
820 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
821 case 'd': type = AVMEDIA_TYPE_DATA; break;
823 if (type != st->codec->codec_type)
825 if (*spec++ == ':') { /* possibly followed by :index */
826 int i, index = strtol(spec, NULL, 0);
827 for (i = 0; i < s->nb_streams; i++)
828 if (s->streams[i]->codec->codec_type == type && index-- == 0)
829 return i == st->index;
833 } else if (!*spec) /* empty specifier, matches everything */
836 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
837 return AVERROR(EINVAL);
840 AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFormatContext *s, AVStream *st)
842 AVDictionary *ret = NULL;
843 AVDictionaryEntry *t = NULL;
844 AVCodec *codec = s->oformat ? avcodec_find_encoder(codec_id) : avcodec_find_decoder(codec_id);
845 int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM : AV_OPT_FLAG_DECODING_PARAM;
847 const AVClass *cc = avcodec_get_class();
852 switch (codec->type) {
853 case AVMEDIA_TYPE_VIDEO: prefix = 'v'; flags |= AV_OPT_FLAG_VIDEO_PARAM; break;
854 case AVMEDIA_TYPE_AUDIO: prefix = 'a'; flags |= AV_OPT_FLAG_AUDIO_PARAM; break;
855 case AVMEDIA_TYPE_SUBTITLE: prefix = 's'; flags |= AV_OPT_FLAG_SUBTITLE_PARAM; break;
858 while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
859 char *p = strchr(t->key, ':');
861 /* check stream specification in opt name */
863 switch (check_stream_specifier(s, st, p + 1)) {
864 case 1: *p = 0; break;
866 default: return NULL;
869 if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
870 (codec && codec->priv_class && av_opt_find(&codec->priv_class, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ)))
871 av_dict_set(&ret, t->key, t->value, 0);
872 else if (t->key[0] == prefix && av_opt_find(&cc, t->key+1, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ))
873 av_dict_set(&ret, t->key+1, t->value, 0);
881 AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts)
888 opts = av_mallocz(s->nb_streams * sizeof(*opts));
890 av_log(NULL, AV_LOG_ERROR, "Could not alloc memory for stream options.\n");
893 for (i = 0; i < s->nb_streams; i++)
894 opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id, s, s->streams[i]);
900 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
902 FFSinkContext *priv = ctx->priv;
905 return AVERROR(EINVAL);
906 *priv = *(FFSinkContext *)opaque;
911 static void null_end_frame(AVFilterLink *inlink) { }
913 static int ffsink_query_formats(AVFilterContext *ctx)
915 FFSinkContext *priv = ctx->priv;
916 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
918 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
924 .priv_size = sizeof(FFSinkContext),
927 .query_formats = ffsink_query_formats,
929 .inputs = (AVFilterPad[]) {{ .name = "default",
930 .type = AVMEDIA_TYPE_VIDEO,
931 .end_frame = null_end_frame,
932 .min_perms = AV_PERM_READ, },
934 .outputs = (AVFilterPad[]) {{ .name = NULL }},
937 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
938 AVFilterBufferRef **picref_ptr, AVRational *tb)
941 AVFilterBufferRef *picref;
943 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
945 if (!(picref = ctx->inputs[0]->cur_buf))
946 return AVERROR(ENOENT);
947 *picref_ptr = picref;
948 ctx->inputs[0]->cur_buf = NULL;
949 *tb = ctx->inputs[0]->time_base;
951 memcpy(frame->data, picref->data, sizeof(frame->data));
952 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
953 frame->interlaced_frame = picref->video->interlaced;
954 frame->top_field_first = picref->video->top_field_first;
955 frame->key_frame = picref->video->key_frame;
956 frame->pict_type = picref->video->pict_type;
961 void *grow_array(void *array, int elem_size, int *size, int new_size)
963 if (new_size >= INT_MAX / elem_size) {
964 av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
967 if (*size < new_size) {
968 uint8_t *tmp = av_realloc(array, new_size*elem_size);
970 av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
973 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
980 #endif /* CONFIG_AVFILTER */