2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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/opt.h"
45 #include "libavformat/network.h"
47 #if HAVE_SYS_RESOURCE_H
48 #include <sys/resource.h>
51 const char **opt_names;
52 const char **opt_values;
53 static int opt_name_count;
54 AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
55 AVFormatContext *avformat_opts;
56 struct SwsContext *sws_opts;
58 static const int this_year = 2011;
63 for (i = 0; i < AVMEDIA_TYPE_NB; i++)
64 avcodec_opts[i] = avcodec_alloc_context2(i);
65 avformat_opts = avformat_alloc_context();
67 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL);
71 void uninit_opts(void)
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);
81 for (i = 0; i < opt_name_count; i++) {
82 av_freep(&opt_names[i]);
83 av_freep(&opt_values[i]);
86 av_freep(&opt_values);
89 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
91 vfprintf(stdout, fmt, vl);
94 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
98 double d = av_strtod(numstr, &tail);
100 error= "Expected number for %s but found: %s\n";
101 else if (d < min || d > max)
102 error= "The value for %s was %s which is not within %f - %f\n";
103 else if(type == OPT_INT64 && (int64_t)d != d)
104 error= "Expected int64 for %s but found %s\n";
105 else if (type == OPT_INT && (int)d != d)
106 error= "Expected int for %s but found %s\n";
109 fprintf(stderr, error, context, numstr, min, max);
113 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
116 if (av_parse_time(&us, timestr, is_duration) < 0) {
117 fprintf(stderr, "Invalid %s specification for %s: %s\n",
118 is_duration ? "duration" : "date", context, timestr);
124 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
130 for(po = options; po->name != NULL; po++) {
132 if ((po->flags & mask) == value) {
137 av_strlcpy(buf, po->name, sizeof(buf));
138 if (po->flags & HAS_ARG) {
139 av_strlcat(buf, " ", sizeof(buf));
140 av_strlcat(buf, po->argname, sizeof(buf));
142 printf("-%-17s %s\n", buf, po->help);
147 static const OptionDef* find_option(const OptionDef *po, const char *name){
148 while (po->name != NULL) {
149 if (!strcmp(name, po->name))
156 #if defined(_WIN32) && !defined(__MINGW32CE__)
158 /* Will be leaked on exit */
159 static char** win32_argv_utf8 = NULL;
160 static int win32_argc = 0;
163 * Prepare command line arguments for executable.
164 * For Windows - perform wide-char to UTF-8 conversion.
165 * Input arguments should be main() function arguments.
166 * @param argc_ptr Arguments number (including executable)
167 * @param argv_ptr Arguments list.
169 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
173 int i, buffsize = 0, offset = 0;
175 if (win32_argv_utf8) {
176 *argc_ptr = win32_argc;
177 *argv_ptr = win32_argv_utf8;
182 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
183 if (win32_argc <= 0 || !argv_w)
186 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
187 for (i = 0; i < win32_argc; i++)
188 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
189 NULL, 0, NULL, NULL);
191 win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize);
192 argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1);
193 if (win32_argv_utf8 == NULL) {
198 for (i = 0; i < win32_argc; i++) {
199 win32_argv_utf8[i] = &argstr_flat[offset];
200 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
201 &argstr_flat[offset],
202 buffsize - offset, NULL, NULL);
204 win32_argv_utf8[i] = NULL;
207 *argc_ptr = win32_argc;
208 *argv_ptr = win32_argv_utf8;
211 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
215 #endif /* WIN32 && !__MINGW32CE__ */
217 void parse_options(int argc, char **argv, const OptionDef *options,
218 void (* parse_arg_function)(const char*))
220 const char *opt, *arg;
221 int optindex, handleoptions=1;
224 /* perform system-dependent conversions for arguments list */
225 prepare_app_arguments(&argc, &argv);
229 while (optindex < argc) {
230 opt = argv[optindex++];
232 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
234 if (opt[1] == '-' && opt[2] == '\0') {
239 po= find_option(options, opt);
240 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
241 /* handle 'no' bool option */
242 po = find_option(options, opt + 2);
243 if (!(po->name && (po->flags & OPT_BOOL)))
248 po= find_option(options, "default");
251 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
255 if (po->flags & HAS_ARG) {
256 arg = argv[optindex++];
258 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
262 if (po->flags & OPT_STRING) {
264 str = av_strdup(arg);
265 *po->u.str_arg = str;
266 } else if (po->flags & OPT_BOOL) {
267 *po->u.int_arg = bool_val;
268 } else if (po->flags & OPT_INT) {
269 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
270 } else if (po->flags & OPT_INT64) {
271 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
272 } else if (po->flags & OPT_FLOAT) {
273 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
274 } else if (po->flags & OPT_FUNC2) {
275 if (po->u.func2_arg(opt, arg) < 0) {
276 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
279 } else if (po->flags & OPT_DUMMY) {
280 /* Do nothing for this option */
284 if(po->flags & OPT_EXIT)
287 if (parse_arg_function)
288 parse_arg_function(opt);
293 int opt_default(const char *opt, const char *arg){
296 const AVOption *o= NULL;
297 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
299 AVOutputFormat *oformat = NULL;
300 AVInputFormat *iformat = NULL;
302 while ((p = av_codec_next(p))) {
303 AVClass *c = p->priv_class;
304 if (c && av_find_opt(&c, opt, NULL, 0, 0))
309 while ((oformat = av_oformat_next(oformat))) {
310 const AVClass *c = oformat->priv_class;
311 if (c && av_find_opt(&c, opt, NULL, 0, 0))
316 while ((iformat = av_iformat_next(iformat))) {
317 const AVClass *c = iformat->priv_class;
318 if (c && av_find_opt(&c, opt, NULL, 0, 0))
324 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
325 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
327 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
329 if(!o && avformat_opts)
330 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
332 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
334 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
335 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
336 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
337 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
338 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
339 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
344 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
348 fprintf(stderr, "Unrecognized option '%s'\n", opt);
353 // 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));
355 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
356 opt_values[opt_name_count] = av_strdup(arg);
357 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
358 opt_names[opt_name_count++] = av_strdup(opt);
360 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
361 av_log_set_level(AV_LOG_DEBUG);
365 int opt_loglevel(const char *opt, const char *arg)
367 const struct { const char *name; int level; } log_levels[] = {
368 { "quiet" , AV_LOG_QUIET },
369 { "panic" , AV_LOG_PANIC },
370 { "fatal" , AV_LOG_FATAL },
371 { "error" , AV_LOG_ERROR },
372 { "warning", AV_LOG_WARNING },
373 { "info" , AV_LOG_INFO },
374 { "verbose", AV_LOG_VERBOSE },
375 { "debug" , AV_LOG_DEBUG },
381 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
382 if (!strcmp(log_levels[i].name, arg)) {
383 av_log_set_level(log_levels[i].level);
388 level = strtol(arg, &tail, 10);
390 fprintf(stderr, "Invalid loglevel \"%s\". "
391 "Possible levels are numbers or:\n", arg);
392 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
393 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
396 av_log_set_level(level);
400 int opt_timelimit(const char *opt, const char *arg)
403 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
404 struct rlimit rl = { lim, lim + 1 };
405 if (setrlimit(RLIMIT_CPU, &rl))
408 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
413 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
417 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
418 AVCodecContext *avctx= ctx;
419 if(codec && codec->priv_class && avctx->priv_data){
420 priv_ctx= avctx->priv_data;
422 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
423 AVFormatContext *avctx = ctx;
424 if (avctx->oformat && avctx->oformat->priv_class) {
425 priv_ctx = avctx->priv_data;
426 } else if (avctx->iformat && avctx->iformat->priv_class) {
427 priv_ctx = avctx->priv_data;
431 for(i=0; i<opt_name_count; i++){
436 if (av_find_opt(priv_ctx, opt_names[i], NULL, flags, flags)) {
437 if (av_set_string3(priv_ctx, opt_names[i], opt_values[i], 0, NULL) < 0) {
438 fprintf(stderr, "Invalid value '%s' for option '%s'\n",
439 opt_names[i], opt_values[i]);
446 str = av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
447 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
448 if (str && ((opt->flags & flags) == flags))
449 av_set_string3(ctx, opt_names[i], str, 1, NULL);
454 void print_error(const char *filename, int err)
457 const char *errbuf_ptr = errbuf;
459 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
460 errbuf_ptr = strerror(AVUNERROR(err));
461 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
464 static int warned_cfg = 0;
467 #define SHOW_VERSION 2
468 #define SHOW_CONFIG 4
470 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
471 if (CONFIG_##LIBNAME) { \
472 const char *indent = flags & INDENT? " " : ""; \
473 if (flags & SHOW_VERSION) { \
474 unsigned int version = libname##_version(); \
475 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
477 LIB##LIBNAME##_VERSION_MAJOR, \
478 LIB##LIBNAME##_VERSION_MINOR, \
479 LIB##LIBNAME##_VERSION_MICRO, \
480 version >> 16, version >> 8 & 0xff, version & 0xff); \
482 if (flags & SHOW_CONFIG) { \
483 const char *cfg = libname##_configuration(); \
484 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
487 "%sWARNING: library configuration mismatch\n", \
491 fprintf(stderr, "%s%-11s configuration: %s\n", \
492 indent, #libname, cfg); \
497 static void print_all_libs_info(FILE* outstream, int flags)
499 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
500 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
501 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
502 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
503 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
504 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
505 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
508 void show_banner(void)
510 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
511 program_name, program_birth_year, this_year);
512 fprintf(stderr, " built on %s %s with %s %s\n",
513 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
514 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
515 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
516 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
519 void show_version(void) {
520 printf("%s " FFMPEG_VERSION "\n", program_name);
521 print_all_libs_info(stdout, SHOW_VERSION);
524 void show_license(void)
528 "This version of %s has nonfree parts compiled in.\n"
529 "Therefore it is not legally redistributable.\n",
532 "%s is free software; you can redistribute it and/or modify\n"
533 "it under the terms of the GNU General Public License as published by\n"
534 "the Free Software Foundation; either version 3 of the License, or\n"
535 "(at your option) any later version.\n"
537 "%s is distributed in the hope that it will be useful,\n"
538 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
539 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
540 "GNU General Public License for more details.\n"
542 "You should have received a copy of the GNU General Public License\n"
543 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
544 program_name, program_name, program_name
546 "%s is free software; you can redistribute it and/or modify\n"
547 "it under the terms of the GNU General Public License as published by\n"
548 "the Free Software Foundation; either version 2 of the License, or\n"
549 "(at your option) any later version.\n"
551 "%s is distributed in the hope that it will be useful,\n"
552 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
553 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
554 "GNU General Public License for more details.\n"
556 "You should have received a copy of the GNU General Public License\n"
557 "along with %s; if not, write to the Free Software\n"
558 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
559 program_name, program_name, program_name
561 "%s is free software; you can redistribute it and/or modify\n"
562 "it under the terms of the GNU Lesser General Public License as published by\n"
563 "the Free Software Foundation; either version 3 of the License, or\n"
564 "(at your option) any later version.\n"
566 "%s is distributed in the hope that it will be useful,\n"
567 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
568 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
569 "GNU Lesser General Public License for more details.\n"
571 "You should have received a copy of the GNU Lesser General Public License\n"
572 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
573 program_name, program_name, program_name
575 "%s is free software; you can redistribute it and/or\n"
576 "modify it under the terms of the GNU Lesser General Public\n"
577 "License as published by the Free Software Foundation; either\n"
578 "version 2.1 of the License, or (at your option) any later version.\n"
580 "%s is distributed in the hope that it will be useful,\n"
581 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
582 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
583 "Lesser General Public License for more details.\n"
585 "You should have received a copy of the GNU Lesser General Public\n"
586 "License along with %s; if not, write to the Free Software\n"
587 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
588 program_name, program_name, program_name
593 void show_formats(void)
595 AVInputFormat *ifmt=NULL;
596 AVOutputFormat *ofmt=NULL;
597 const char *last_name;
601 " D. = Demuxing supported\n"
602 " .E = Muxing supported\n"
608 const char *name=NULL;
609 const char *long_name=NULL;
611 while((ofmt= av_oformat_next(ofmt))) {
612 if((name == NULL || strcmp(ofmt->name, name)<0) &&
613 strcmp(ofmt->name, last_name)>0){
615 long_name= ofmt->long_name;
619 while((ifmt= av_iformat_next(ifmt))) {
620 if((name == NULL || strcmp(ifmt->name, name)<0) &&
621 strcmp(ifmt->name, last_name)>0){
623 long_name= ifmt->long_name;
626 if(name && strcmp(ifmt->name, name)==0)
638 long_name ? long_name:" ");
642 void show_codecs(void)
644 AVCodec *p=NULL, *p2;
645 const char *last_name;
648 " D..... = Decoding supported\n"
649 " .E.... = Encoding supported\n"
650 " ..V... = Video codec\n"
651 " ..A... = Audio codec\n"
652 " ..S... = Subtitle codec\n"
653 " ...S.. = Supports draw_horiz_band\n"
654 " ....D. = Supports direct rendering method 1\n"
655 " .....T = Supports weird frame truncation\n"
662 const char *type_str;
665 while((p= av_codec_next(p))) {
666 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
667 strcmp(p->name, last_name)>0){
669 decode= encode= cap=0;
671 if(p2 && strcmp(p->name, p2->name)==0){
672 if(p->decode) decode=1;
673 if(p->encode) encode=1;
674 cap |= p->capabilities;
682 case AVMEDIA_TYPE_VIDEO:
685 case AVMEDIA_TYPE_AUDIO:
688 case AVMEDIA_TYPE_SUBTITLE:
696 " %s%s%s%s%s%s %-15s %s",
697 decode ? "D": (/*p2->decoder ? "d":*/" "),
700 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
701 cap & CODEC_CAP_DR1 ? "D":" ",
702 cap & CODEC_CAP_TRUNCATED ? "T":" ",
704 p2->long_name ? p2->long_name : "");
705 /* if(p2->decoder && decode==0)
706 printf(" use %s for decoding", p2->decoder->name);*/
711 "Note, the names of encoders and decoders do not always match, so there are\n"
712 "several cases where the above table shows encoder only or decoder only entries\n"
713 "even though both encoding and decoding are supported. For example, the h263\n"
714 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
720 AVBitStreamFilter *bsf=NULL;
722 printf("Bitstream filters:\n");
723 while((bsf = av_bitstream_filter_next(bsf)))
724 printf("%s\n", bsf->name);
728 void show_protocols(void)
730 URLProtocol *up=NULL;
732 printf("Supported file protocols:\n"
733 "I.. = Input supported\n"
734 ".O. = Output supported\n"
735 "..S = Seek supported\n"
738 while((up = av_protocol_next(up)))
739 printf("%c%c%c %s\n",
740 up->url_read ? 'I' : '.',
741 up->url_write ? 'O' : '.',
742 up->url_seek ? 'S' : '.',
746 void show_filters(void)
748 AVFilter av_unused(**filter) = NULL;
750 printf("Filters:\n");
752 while ((filter = av_filter_next(filter)) && *filter)
753 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
757 void show_pix_fmts(void)
759 enum PixelFormat pix_fmt;
763 "I.... = Supported Input format for conversion\n"
764 ".O... = Supported Output format for conversion\n"
765 "..H.. = Hardware accelerated format\n"
766 "...P. = Paletted format\n"
767 "....B = Bitstream format\n"
768 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
772 # define sws_isSupportedInput(x) 0
773 # define sws_isSupportedOutput(x) 0
776 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
777 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
778 printf("%c%c%c%c%c %-16s %d %2d\n",
779 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
780 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
781 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
782 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
783 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
785 pix_desc->nb_components,
786 av_get_bits_per_pixel(pix_desc));
793 int yesno = (toupper(c) == 'Y');
795 while (c != '\n' && c != EOF)
801 int read_file(const char *filename, char **bufptr, size_t *size)
803 FILE *f = fopen(filename, "rb");
806 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
807 return AVERROR(errno);
809 fseek(f, 0, SEEK_END);
811 fseek(f, 0, SEEK_SET);
812 *bufptr = av_malloc(*size + 1);
814 fprintf(stderr, "Could not allocate file buffer\n");
816 return AVERROR(ENOMEM);
818 fread(*bufptr, 1, *size, f);
819 (*bufptr)[*size++] = '\0';
825 FILE *get_preset_file(char *filename, size_t filename_size,
826 const char *preset_name, int is_path, const char *codec_name)
830 const char *base[3]= { getenv("FFMPEG_DATADIR"),
836 av_strlcpy(filename, preset_name, filename_size);
837 f = fopen(filename, "r");
839 for (i = 0; i < 3 && !f; i++) {
842 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
843 f = fopen(filename, "r");
844 if (!f && codec_name) {
845 snprintf(filename, filename_size,
846 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
847 f = fopen(filename, "r");
857 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
859 FFSinkContext *priv = ctx->priv;
862 return AVERROR(EINVAL);
863 *priv = *(FFSinkContext *)opaque;
868 static void null_end_frame(AVFilterLink *inlink) { }
870 static int ffsink_query_formats(AVFilterContext *ctx)
872 FFSinkContext *priv = ctx->priv;
873 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
875 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
881 .priv_size = sizeof(FFSinkContext),
884 .query_formats = ffsink_query_formats,
886 .inputs = (AVFilterPad[]) {{ .name = "default",
887 .type = AVMEDIA_TYPE_VIDEO,
888 .end_frame = null_end_frame,
889 .min_perms = AV_PERM_READ, },
891 .outputs = (AVFilterPad[]) {{ .name = NULL }},
894 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
895 AVFilterBufferRef **picref_ptr, AVRational *tb)
898 AVFilterBufferRef *picref;
900 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
902 if (!(picref = ctx->inputs[0]->cur_buf))
903 return AVERROR(ENOENT);
904 *picref_ptr = picref;
905 ctx->inputs[0]->cur_buf = NULL;
906 *tb = ctx->inputs[0]->time_base;
908 memcpy(frame->data, picref->data, sizeof(frame->data));
909 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
910 frame->interlaced_frame = picref->video->interlaced;
911 frame->top_field_first = picref->video->top_field_first;
912 frame->key_frame = picref->video->key_frame;
913 frame->pict_type = picref->video->pict_type;
918 #endif /* CONFIG_AVFILTER */