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/pixdesc.h"
39 #include "libavutil/eval.h"
40 #include "libavcodec/opt.h"
41 #include "libavcore/avcore.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 //opt_values are only stored for codec-specific options in which case
83 //both the name and value are dup'd
85 av_freep(&opt_names[i]);
86 av_freep(&opt_values[i]);
90 av_freep(&opt_values);
93 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
95 vfprintf(stdout, fmt, vl);
98 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
102 double d = av_strtod(numstr, &tail);
104 error= "Expected number for %s but found: %s\n";
105 else if (d < min || d > max)
106 error= "The value for %s was %s which is not within %f - %f\n";
107 else if(type == OPT_INT64 && (int64_t)d != d)
108 error= "Expected int64 for %s but found %s\n";
111 fprintf(stderr, error, context, numstr, min, max);
115 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
117 int64_t us = parse_date(timestr, is_duration);
118 if (us == INT64_MIN) {
119 fprintf(stderr, "Invalid %s specification for %s: %s\n",
120 is_duration ? "duration" : "date", context, timestr);
126 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
132 for(po = options; po->name != NULL; po++) {
134 if ((po->flags & mask) == value) {
139 av_strlcpy(buf, po->name, sizeof(buf));
140 if (po->flags & HAS_ARG) {
141 av_strlcat(buf, " ", sizeof(buf));
142 av_strlcat(buf, po->argname, sizeof(buf));
144 printf("-%-17s %s\n", buf, po->help);
149 static const OptionDef* find_option(const OptionDef *po, const char *name){
150 while (po->name != NULL) {
151 if (!strcmp(name, po->name))
158 void parse_options(int argc, char **argv, const OptionDef *options,
159 void (* parse_arg_function)(const char*))
161 const char *opt, *arg;
162 int optindex, handleoptions=1;
167 while (optindex < argc) {
168 opt = argv[optindex++];
170 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
172 if (opt[1] == '-' && opt[2] == '\0') {
177 po= find_option(options, opt);
178 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
179 /* handle 'no' bool option */
180 po = find_option(options, opt + 2);
181 if (!(po->name && (po->flags & OPT_BOOL)))
186 po= find_option(options, "default");
189 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
193 if (po->flags & HAS_ARG) {
194 arg = argv[optindex++];
196 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
200 if (po->flags & OPT_STRING) {
202 str = av_strdup(arg);
203 *po->u.str_arg = str;
204 } else if (po->flags & OPT_BOOL) {
205 *po->u.int_arg = bool_val;
206 } else if (po->flags & OPT_INT) {
207 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
208 } else if (po->flags & OPT_INT64) {
209 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
210 } else if (po->flags & OPT_FLOAT) {
211 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
212 } else if (po->flags & OPT_FUNC2) {
213 if (po->u.func2_arg(opt, arg) < 0) {
214 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
220 if(po->flags & OPT_EXIT)
223 if (parse_arg_function)
224 parse_arg_function(opt);
229 int opt_default(const char *opt, const char *arg){
232 const AVOption *o= NULL;
233 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
235 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
236 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
238 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
240 if(!o && avformat_opts)
241 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
243 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
245 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
246 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
247 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
248 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
249 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
250 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
253 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
258 AVOutputFormat *oformat = NULL;
259 while ((p=av_codec_next(p))){
260 AVClass *c= p->priv_class;
261 if(c && av_find_opt(&c, opt, NULL, 0, 0))
265 while ((oformat = av_oformat_next(oformat))) {
266 const AVClass *c = oformat->priv_class;
267 if (c && av_find_opt(&c, opt, NULL, 0, 0))
272 fprintf(stderr, "Unrecognized option '%s'\n", opt);
277 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avcodec_opts, opt, NULL), (int)av_get_int(avcodec_opts, opt, NULL));
279 //FIXME we should always use avcodec_opts, ... for storing options so there will not be any need to keep track of what i set over this
280 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
281 opt_values[opt_name_count]= o ? NULL : av_strdup(arg);
282 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
283 opt_names[opt_name_count++]= o ? o->name : av_strdup(opt);
285 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
286 av_log_set_level(AV_LOG_DEBUG);
290 int opt_loglevel(const char *opt, const char *arg)
292 const struct { const char *name; int level; } log_levels[] = {
293 { "quiet" , AV_LOG_QUIET },
294 { "panic" , AV_LOG_PANIC },
295 { "fatal" , AV_LOG_FATAL },
296 { "error" , AV_LOG_ERROR },
297 { "warning", AV_LOG_WARNING },
298 { "info" , AV_LOG_INFO },
299 { "verbose", AV_LOG_VERBOSE },
300 { "debug" , AV_LOG_DEBUG },
306 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
307 if (!strcmp(log_levels[i].name, arg)) {
308 av_log_set_level(log_levels[i].level);
313 level = strtol(arg, &tail, 10);
315 fprintf(stderr, "Invalid loglevel \"%s\". "
316 "Possible levels are numbers or:\n", arg);
317 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
318 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
321 av_log_set_level(level);
325 int opt_timelimit(const char *opt, const char *arg)
328 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
329 struct rlimit rl = { lim, lim + 1 };
330 if (setrlimit(RLIMIT_CPU, &rl))
333 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
338 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
342 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
343 AVCodecContext *avctx= ctx;
344 if(codec && codec->priv_class && avctx->priv_data){
345 priv_ctx= avctx->priv_data;
347 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
348 AVFormatContext *avctx = ctx;
349 if (avctx->oformat && avctx->oformat->priv_class) {
350 priv_ctx = avctx->priv_data;
354 for(i=0; i<opt_name_count; i++){
357 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
358 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
359 if(str && ((opt->flags & flags) == flags))
360 av_set_string3(ctx, opt_names[i], str, 1, NULL);
361 /* We need to use a differnt system to pass options to the private context because
362 it is not known which codec and thus context kind that will be when parsing options
363 we thus use opt_values directly instead of opts_ctx */
364 if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){
365 av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL);
370 void print_error(const char *filename, int err)
373 const char *errbuf_ptr = errbuf;
375 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
376 errbuf_ptr = strerror(AVUNERROR(err));
377 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
380 static int warned_cfg = 0;
383 #define SHOW_VERSION 2
384 #define SHOW_CONFIG 4
386 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
387 if (CONFIG_##LIBNAME) { \
388 const char *indent = flags & INDENT? " " : ""; \
389 if (flags & SHOW_VERSION) { \
390 unsigned int version = libname##_version(); \
391 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
393 LIB##LIBNAME##_VERSION_MAJOR, \
394 LIB##LIBNAME##_VERSION_MINOR, \
395 LIB##LIBNAME##_VERSION_MICRO, \
396 version >> 16, version >> 8 & 0xff, version & 0xff); \
398 if (flags & SHOW_CONFIG) { \
399 const char *cfg = libname##_configuration(); \
400 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
403 "%sWARNING: library configuration mismatch\n", \
407 fprintf(stderr, "%s%-11s configuration: %s\n", \
408 indent, #libname, cfg); \
413 static void print_all_libs_info(FILE* outstream, int flags)
415 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
416 PRINT_LIB_INFO(outstream, avcore, AVCORE, flags);
417 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
418 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
419 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
420 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
421 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
422 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
425 void show_banner(void)
427 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
428 program_name, program_birth_year, this_year);
429 fprintf(stderr, " built on %s %s with %s %s\n",
430 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
431 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
432 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
433 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
436 void show_version(void) {
437 printf("%s " FFMPEG_VERSION "\n", program_name);
438 print_all_libs_info(stdout, SHOW_VERSION);
441 void show_license(void)
445 "This version of %s has nonfree parts compiled in.\n"
446 "Therefore it is not legally redistributable.\n",
449 "%s is free software; you can redistribute it and/or modify\n"
450 "it under the terms of the GNU General Public License as published by\n"
451 "the Free Software Foundation; either version 3 of the License, or\n"
452 "(at your option) any later version.\n"
454 "%s is distributed in the hope that it will be useful,\n"
455 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
456 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
457 "GNU General Public License for more details.\n"
459 "You should have received a copy of the GNU General Public License\n"
460 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
461 program_name, program_name, program_name
463 "%s is free software; you can redistribute it and/or modify\n"
464 "it under the terms of the GNU General Public License as published by\n"
465 "the Free Software Foundation; either version 2 of the License, or\n"
466 "(at your option) any later version.\n"
468 "%s is distributed in the hope that it will be useful,\n"
469 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
470 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
471 "GNU General Public License for more details.\n"
473 "You should have received a copy of the GNU General Public License\n"
474 "along with %s; if not, write to the Free Software\n"
475 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\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 Lesser General Public License as published by\n"
480 "the Free Software Foundation; either version 3 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 Lesser General Public License for more details.\n"
488 "You should have received a copy of the GNU Lesser General Public License\n"
489 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
490 program_name, program_name, program_name
492 "%s is free software; you can redistribute it and/or\n"
493 "modify it under the terms of the GNU Lesser General Public\n"
494 "License as published by the Free Software Foundation; either\n"
495 "version 2.1 of the License, or (at your option) any later version.\n"
497 "%s is distributed in the hope that it will be useful,\n"
498 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
499 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
500 "Lesser General Public License for more details.\n"
502 "You should have received a copy of the GNU Lesser General Public\n"
503 "License along with %s; if not, write to the Free Software\n"
504 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
505 program_name, program_name, program_name
510 void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
514 for (i=-1; i < nb_fmts; i++) {
515 get_fmt_string (fmt_str, sizeof(fmt_str), i);
516 fprintf(stdout, "%s\n", fmt_str);
520 void show_formats(void)
522 AVInputFormat *ifmt=NULL;
523 AVOutputFormat *ofmt=NULL;
524 const char *last_name;
528 " D. = Demuxing supported\n"
529 " .E = Muxing supported\n"
535 const char *name=NULL;
536 const char *long_name=NULL;
538 while((ofmt= av_oformat_next(ofmt))) {
539 if((name == NULL || strcmp(ofmt->name, name)<0) &&
540 strcmp(ofmt->name, last_name)>0){
542 long_name= ofmt->long_name;
546 while((ifmt= av_iformat_next(ifmt))) {
547 if((name == NULL || strcmp(ifmt->name, name)<0) &&
548 strcmp(ifmt->name, last_name)>0){
550 long_name= ifmt->long_name;
553 if(name && strcmp(ifmt->name, name)==0)
565 long_name ? long_name:" ");
569 void show_codecs(void)
571 AVCodec *p=NULL, *p2;
572 const char *last_name;
575 " D..... = Decoding supported\n"
576 " .E.... = Encoding supported\n"
577 " ..V... = Video codec\n"
578 " ..A... = Audio codec\n"
579 " ..S... = Subtitle codec\n"
580 " ...S.. = Supports draw_horiz_band\n"
581 " ....D. = Supports direct rendering method 1\n"
582 " .....T = Supports weird frame truncation\n"
589 const char *type_str;
592 while((p= av_codec_next(p))) {
593 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
594 strcmp(p->name, last_name)>0){
596 decode= encode= cap=0;
598 if(p2 && strcmp(p->name, p2->name)==0){
599 if(p->decode) decode=1;
600 if(p->encode) encode=1;
601 cap |= p->capabilities;
609 case AVMEDIA_TYPE_VIDEO:
612 case AVMEDIA_TYPE_AUDIO:
615 case AVMEDIA_TYPE_SUBTITLE:
623 " %s%s%s%s%s%s %-15s %s",
624 decode ? "D": (/*p2->decoder ? "d":*/" "),
627 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
628 cap & CODEC_CAP_DR1 ? "D":" ",
629 cap & CODEC_CAP_TRUNCATED ? "T":" ",
631 p2->long_name ? p2->long_name : "");
632 /* if(p2->decoder && decode==0)
633 printf(" use %s for decoding", p2->decoder->name);*/
638 "Note, the names of encoders and decoders do not always match, so there are\n"
639 "several cases where the above table shows encoder only or decoder only entries\n"
640 "even though both encoding and decoding are supported. For example, the h263\n"
641 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
647 AVBitStreamFilter *bsf=NULL;
649 printf("Bitstream filters:\n");
650 while((bsf = av_bitstream_filter_next(bsf)))
651 printf("%s\n", bsf->name);
655 void show_protocols(void)
657 URLProtocol *up=NULL;
659 printf("Supported file protocols:\n"
660 "I.. = Input supported\n"
661 ".O. = Output supported\n"
662 "..S = Seek supported\n"
665 while((up = av_protocol_next(up)))
666 printf("%c%c%c %s\n",
667 up->url_read ? 'I' : '.',
668 up->url_write ? 'O' : '.',
669 up->url_seek ? 'S' : '.',
673 void show_filters(void)
675 AVFilter av_unused(**filter) = NULL;
677 printf("Filters:\n");
679 while ((filter = av_filter_next(filter)) && *filter)
680 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
684 void show_pix_fmts(void)
686 enum PixelFormat pix_fmt;
690 "I.... = Supported Input format for conversion\n"
691 ".O... = Supported Output format for conversion\n"
692 "..H.. = Hardware accelerated format\n"
693 "...P. = Paletted format\n"
694 "....B = Bitstream format\n"
695 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
699 # define sws_isSupportedInput(x) 0
700 # define sws_isSupportedOutput(x) 0
703 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
704 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
705 printf("%c%c%c%c%c %-16s %d %2d\n",
706 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
707 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
708 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
709 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
710 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
712 pix_desc->nb_components,
713 av_get_bits_per_pixel(pix_desc));
720 int yesno = (toupper(c) == 'Y');
722 while (c != '\n' && c != EOF)
728 int read_file(const char *filename, char **bufptr, size_t *size)
730 FILE *f = fopen(filename, "rb");
733 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
734 return AVERROR(errno);
736 fseek(f, 0, SEEK_END);
738 fseek(f, 0, SEEK_SET);
739 *bufptr = av_malloc(*size + 1);
741 fprintf(stderr, "Could not allocate file buffer\n");
743 return AVERROR(ENOMEM);
745 fread(*bufptr, 1, *size, f);
746 (*bufptr)[*size++] = '\0';
752 void init_pts_correction(PtsCorrectionContext *ctx)
754 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
755 ctx->last_pts = ctx->last_dts = INT64_MIN;
758 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
760 int64_t pts = AV_NOPTS_VALUE;
762 if (dts != AV_NOPTS_VALUE) {
763 ctx->num_faulty_dts += dts <= ctx->last_dts;
766 if (reordered_pts != AV_NOPTS_VALUE) {
767 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
768 ctx->last_pts = reordered_pts;
770 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
771 && reordered_pts != AV_NOPTS_VALUE)
779 FILE *get_preset_file(char *filename, size_t filename_size,
780 const char *preset_name, int is_path, const char *codec_name)
784 const char *base[3]= { getenv("FFMPEG_DATADIR"),
790 av_strlcpy(filename, preset_name, filename_size);
791 f = fopen(filename, "r");
793 for (i = 0; i < 3 && !f; i++) {
796 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
797 f = fopen(filename, "r");
798 if (!f && codec_name) {
799 snprintf(filename, filename_size,
800 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
801 f = fopen(filename, "r");
811 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
813 FFSinkContext *priv = ctx->priv;
816 return AVERROR(EINVAL);
817 *priv = *(FFSinkContext *)opaque;
822 static void null_end_frame(AVFilterLink *inlink) { }
824 static int ffsink_query_formats(AVFilterContext *ctx)
826 FFSinkContext *priv = ctx->priv;
827 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
829 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
835 .priv_size = sizeof(FFSinkContext),
838 .query_formats = ffsink_query_formats,
840 .inputs = (AVFilterPad[]) {{ .name = "default",
841 .type = AVMEDIA_TYPE_VIDEO,
842 .end_frame = null_end_frame,
843 .min_perms = AV_PERM_READ, },
845 .outputs = (AVFilterPad[]) {{ .name = NULL }},
848 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
849 AVFilterBufferRef **picref_ptr, AVRational *tb)
852 AVFilterBufferRef *picref;
854 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
856 if (!(picref = ctx->inputs[0]->cur_buf))
857 return AVERROR(ENOENT);
858 *picref_ptr = picref;
859 ctx->inputs[0]->cur_buf = NULL;
860 *tb = ctx->inputs[0]->time_base;
862 memcpy(frame->data, picref->data, sizeof(frame->data));
863 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
864 frame->interlaced_frame = picref->video->interlaced;
865 frame->top_field_first = picref->video->top_field_first;
870 #endif /* CONFIG_AVFILTER */