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;
301 while ((p = av_codec_next(p))) {
302 AVClass *c = p->priv_class;
303 if (c && av_find_opt(&c, opt, NULL, 0, 0))
308 while ((oformat = av_oformat_next(oformat))) {
309 const AVClass *c = oformat->priv_class;
310 if (c && av_find_opt(&c, opt, NULL, 0, 0))
316 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
317 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
319 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
321 if(!o && avformat_opts)
322 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
324 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
326 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
327 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
328 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
329 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
330 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
331 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
336 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
340 fprintf(stderr, "Unrecognized option '%s'\n", opt);
345 // 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));
347 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
348 opt_values[opt_name_count] = av_strdup(arg);
349 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
350 opt_names[opt_name_count++] = av_strdup(opt);
352 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
353 av_log_set_level(AV_LOG_DEBUG);
357 int opt_loglevel(const char *opt, const char *arg)
359 const struct { const char *name; int level; } log_levels[] = {
360 { "quiet" , AV_LOG_QUIET },
361 { "panic" , AV_LOG_PANIC },
362 { "fatal" , AV_LOG_FATAL },
363 { "error" , AV_LOG_ERROR },
364 { "warning", AV_LOG_WARNING },
365 { "info" , AV_LOG_INFO },
366 { "verbose", AV_LOG_VERBOSE },
367 { "debug" , AV_LOG_DEBUG },
373 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
374 if (!strcmp(log_levels[i].name, arg)) {
375 av_log_set_level(log_levels[i].level);
380 level = strtol(arg, &tail, 10);
382 fprintf(stderr, "Invalid loglevel \"%s\". "
383 "Possible levels are numbers or:\n", arg);
384 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
385 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
388 av_log_set_level(level);
392 int opt_timelimit(const char *opt, const char *arg)
395 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
396 struct rlimit rl = { lim, lim + 1 };
397 if (setrlimit(RLIMIT_CPU, &rl))
400 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
405 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
409 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
410 AVCodecContext *avctx= ctx;
411 if(codec && codec->priv_class && avctx->priv_data){
412 priv_ctx= avctx->priv_data;
414 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
415 AVFormatContext *avctx = ctx;
416 if (avctx->oformat && avctx->oformat->priv_class) {
417 priv_ctx = avctx->priv_data;
421 for(i=0; i<opt_name_count; i++){
426 if (av_find_opt(priv_ctx, opt_names[i], NULL, flags, flags)) {
427 if (av_set_string3(priv_ctx, opt_names[i], opt_values[i], 0, NULL) < 0) {
428 fprintf(stderr, "Invalid value '%s' for option '%s'\n",
429 opt_names[i], opt_values[i]);
436 str = av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
437 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
438 if (str && ((opt->flags & flags) == flags))
439 av_set_string3(ctx, opt_names[i], str, 1, NULL);
444 void print_error(const char *filename, int err)
447 const char *errbuf_ptr = errbuf;
449 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
450 errbuf_ptr = strerror(AVUNERROR(err));
451 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
454 static int warned_cfg = 0;
457 #define SHOW_VERSION 2
458 #define SHOW_CONFIG 4
460 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
461 if (CONFIG_##LIBNAME) { \
462 const char *indent = flags & INDENT? " " : ""; \
463 if (flags & SHOW_VERSION) { \
464 unsigned int version = libname##_version(); \
465 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
467 LIB##LIBNAME##_VERSION_MAJOR, \
468 LIB##LIBNAME##_VERSION_MINOR, \
469 LIB##LIBNAME##_VERSION_MICRO, \
470 version >> 16, version >> 8 & 0xff, version & 0xff); \
472 if (flags & SHOW_CONFIG) { \
473 const char *cfg = libname##_configuration(); \
474 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
477 "%sWARNING: library configuration mismatch\n", \
481 fprintf(stderr, "%s%-11s configuration: %s\n", \
482 indent, #libname, cfg); \
487 static void print_all_libs_info(FILE* outstream, int flags)
489 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
490 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
491 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
492 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
493 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
494 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
495 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
498 void show_banner(void)
500 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
501 program_name, program_birth_year, this_year);
502 fprintf(stderr, " built on %s %s with %s %s\n",
503 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
504 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
505 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
506 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
509 void show_version(void) {
510 printf("%s " FFMPEG_VERSION "\n", program_name);
511 print_all_libs_info(stdout, SHOW_VERSION);
514 void show_license(void)
518 "This version of %s has nonfree parts compiled in.\n"
519 "Therefore it is not legally redistributable.\n",
522 "%s is free software; you can redistribute it and/or modify\n"
523 "it under the terms of the GNU General Public License as published by\n"
524 "the Free Software Foundation; either version 3 of the License, or\n"
525 "(at your option) any later version.\n"
527 "%s is distributed in the hope that it will be useful,\n"
528 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
529 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
530 "GNU General Public License for more details.\n"
532 "You should have received a copy of the GNU General Public License\n"
533 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
534 program_name, program_name, program_name
536 "%s is free software; you can redistribute it and/or modify\n"
537 "it under the terms of the GNU General Public License as published by\n"
538 "the Free Software Foundation; either version 2 of the License, or\n"
539 "(at your option) any later version.\n"
541 "%s is distributed in the hope that it will be useful,\n"
542 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
543 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
544 "GNU General Public License for more details.\n"
546 "You should have received a copy of the GNU General Public License\n"
547 "along with %s; if not, write to the Free Software\n"
548 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
549 program_name, program_name, program_name
551 "%s is free software; you can redistribute it and/or modify\n"
552 "it under the terms of the GNU Lesser General Public License as published by\n"
553 "the Free Software Foundation; either version 3 of the License, or\n"
554 "(at your option) any later version.\n"
556 "%s is distributed in the hope that it will be useful,\n"
557 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
558 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
559 "GNU Lesser General Public License for more details.\n"
561 "You should have received a copy of the GNU Lesser General Public License\n"
562 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
563 program_name, program_name, program_name
565 "%s is free software; you can redistribute it and/or\n"
566 "modify it under the terms of the GNU Lesser General Public\n"
567 "License as published by the Free Software Foundation; either\n"
568 "version 2.1 of the License, or (at your option) any later version.\n"
570 "%s is distributed in the hope that it will be useful,\n"
571 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
572 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
573 "Lesser General Public License for more details.\n"
575 "You should have received a copy of the GNU Lesser General Public\n"
576 "License along with %s; if not, write to the Free Software\n"
577 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
578 program_name, program_name, program_name
583 void show_formats(void)
585 AVInputFormat *ifmt=NULL;
586 AVOutputFormat *ofmt=NULL;
587 const char *last_name;
591 " D. = Demuxing supported\n"
592 " .E = Muxing supported\n"
598 const char *name=NULL;
599 const char *long_name=NULL;
601 while((ofmt= av_oformat_next(ofmt))) {
602 if((name == NULL || strcmp(ofmt->name, name)<0) &&
603 strcmp(ofmt->name, last_name)>0){
605 long_name= ofmt->long_name;
609 while((ifmt= av_iformat_next(ifmt))) {
610 if((name == NULL || strcmp(ifmt->name, name)<0) &&
611 strcmp(ifmt->name, last_name)>0){
613 long_name= ifmt->long_name;
616 if(name && strcmp(ifmt->name, name)==0)
628 long_name ? long_name:" ");
632 void show_codecs(void)
634 AVCodec *p=NULL, *p2;
635 const char *last_name;
638 " D..... = Decoding supported\n"
639 " .E.... = Encoding supported\n"
640 " ..V... = Video codec\n"
641 " ..A... = Audio codec\n"
642 " ..S... = Subtitle codec\n"
643 " ...S.. = Supports draw_horiz_band\n"
644 " ....D. = Supports direct rendering method 1\n"
645 " .....T = Supports weird frame truncation\n"
652 const char *type_str;
655 while((p= av_codec_next(p))) {
656 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
657 strcmp(p->name, last_name)>0){
659 decode= encode= cap=0;
661 if(p2 && strcmp(p->name, p2->name)==0){
662 if(p->decode) decode=1;
663 if(p->encode) encode=1;
664 cap |= p->capabilities;
672 case AVMEDIA_TYPE_VIDEO:
675 case AVMEDIA_TYPE_AUDIO:
678 case AVMEDIA_TYPE_SUBTITLE:
686 " %s%s%s%s%s%s %-15s %s",
687 decode ? "D": (/*p2->decoder ? "d":*/" "),
690 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
691 cap & CODEC_CAP_DR1 ? "D":" ",
692 cap & CODEC_CAP_TRUNCATED ? "T":" ",
694 p2->long_name ? p2->long_name : "");
695 /* if(p2->decoder && decode==0)
696 printf(" use %s for decoding", p2->decoder->name);*/
701 "Note, the names of encoders and decoders do not always match, so there are\n"
702 "several cases where the above table shows encoder only or decoder only entries\n"
703 "even though both encoding and decoding are supported. For example, the h263\n"
704 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
710 AVBitStreamFilter *bsf=NULL;
712 printf("Bitstream filters:\n");
713 while((bsf = av_bitstream_filter_next(bsf)))
714 printf("%s\n", bsf->name);
718 void show_protocols(void)
720 URLProtocol *up=NULL;
722 printf("Supported file protocols:\n"
723 "I.. = Input supported\n"
724 ".O. = Output supported\n"
725 "..S = Seek supported\n"
728 while((up = av_protocol_next(up)))
729 printf("%c%c%c %s\n",
730 up->url_read ? 'I' : '.',
731 up->url_write ? 'O' : '.',
732 up->url_seek ? 'S' : '.',
736 void show_filters(void)
738 AVFilter av_unused(**filter) = NULL;
740 printf("Filters:\n");
742 while ((filter = av_filter_next(filter)) && *filter)
743 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
747 void show_pix_fmts(void)
749 enum PixelFormat pix_fmt;
753 "I.... = Supported Input format for conversion\n"
754 ".O... = Supported Output format for conversion\n"
755 "..H.. = Hardware accelerated format\n"
756 "...P. = Paletted format\n"
757 "....B = Bitstream format\n"
758 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
762 # define sws_isSupportedInput(x) 0
763 # define sws_isSupportedOutput(x) 0
766 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
767 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
768 printf("%c%c%c%c%c %-16s %d %2d\n",
769 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
770 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
771 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
772 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
773 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
775 pix_desc->nb_components,
776 av_get_bits_per_pixel(pix_desc));
783 int yesno = (toupper(c) == 'Y');
785 while (c != '\n' && c != EOF)
791 int read_file(const char *filename, char **bufptr, size_t *size)
793 FILE *f = fopen(filename, "rb");
796 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
797 return AVERROR(errno);
799 fseek(f, 0, SEEK_END);
801 fseek(f, 0, SEEK_SET);
802 *bufptr = av_malloc(*size + 1);
804 fprintf(stderr, "Could not allocate file buffer\n");
806 return AVERROR(ENOMEM);
808 fread(*bufptr, 1, *size, f);
809 (*bufptr)[*size++] = '\0';
815 FILE *get_preset_file(char *filename, size_t filename_size,
816 const char *preset_name, int is_path, const char *codec_name)
820 const char *base[3]= { getenv("FFMPEG_DATADIR"),
826 av_strlcpy(filename, preset_name, filename_size);
827 f = fopen(filename, "r");
829 for (i = 0; i < 3 && !f; i++) {
832 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
833 f = fopen(filename, "r");
834 if (!f && codec_name) {
835 snprintf(filename, filename_size,
836 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
837 f = fopen(filename, "r");
847 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
849 FFSinkContext *priv = ctx->priv;
852 return AVERROR(EINVAL);
853 *priv = *(FFSinkContext *)opaque;
858 static void null_end_frame(AVFilterLink *inlink) { }
860 static int ffsink_query_formats(AVFilterContext *ctx)
862 FFSinkContext *priv = ctx->priv;
863 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
865 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
871 .priv_size = sizeof(FFSinkContext),
874 .query_formats = ffsink_query_formats,
876 .inputs = (AVFilterPad[]) {{ .name = "default",
877 .type = AVMEDIA_TYPE_VIDEO,
878 .end_frame = null_end_frame,
879 .min_perms = AV_PERM_READ, },
881 .outputs = (AVFilterPad[]) {{ .name = NULL }},
884 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
885 AVFilterBufferRef **picref_ptr, AVRational *tb)
888 AVFilterBufferRef *picref;
890 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
892 if (!(picref = ctx->inputs[0]->cur_buf))
893 return AVERROR(ENOENT);
894 *picref_ptr = picref;
895 ctx->inputs[0]->cur_buf = NULL;
896 *tb = ctx->inputs[0]->time_base;
898 memcpy(frame->data, picref->data, sizeof(frame->data));
899 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
900 frame->interlaced_frame = picref->video->interlaced;
901 frame->top_field_first = picref->video->top_field_first;
902 frame->key_frame = picref->video->key_frame;
903 frame->pict_type = picref->video->pict_type;
908 #endif /* CONFIG_AVFILTER */