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);
82 av_freep(&opt_values);
85 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
87 vfprintf(stdout, fmt, vl);
90 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
94 double d = av_strtod(numstr, &tail);
96 error= "Expected number for %s but found: %s\n";
97 else if (d < min || d > max)
98 error= "The value for %s was %s which is not within %f - %f\n";
99 else if(type == OPT_INT64 && (int64_t)d != d)
100 error= "Expected int64 for %s but found %s\n";
103 fprintf(stderr, error, context, numstr, min, max);
107 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
109 int64_t us = parse_date(timestr, is_duration);
110 if (us == INT64_MIN) {
111 fprintf(stderr, "Invalid %s specification for %s: %s\n",
112 is_duration ? "duration" : "date", context, timestr);
118 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
124 for(po = options; po->name != NULL; po++) {
126 if ((po->flags & mask) == value) {
131 av_strlcpy(buf, po->name, sizeof(buf));
132 if (po->flags & HAS_ARG) {
133 av_strlcat(buf, " ", sizeof(buf));
134 av_strlcat(buf, po->argname, sizeof(buf));
136 printf("-%-17s %s\n", buf, po->help);
141 static const OptionDef* find_option(const OptionDef *po, const char *name){
142 while (po->name != NULL) {
143 if (!strcmp(name, po->name))
150 void parse_options(int argc, char **argv, const OptionDef *options,
151 void (* parse_arg_function)(const char*))
153 const char *opt, *arg;
154 int optindex, handleoptions=1;
159 while (optindex < argc) {
160 opt = argv[optindex++];
162 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
164 if (opt[1] == '-' && opt[2] == '\0') {
169 po= find_option(options, opt);
170 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
171 /* handle 'no' bool option */
172 po = find_option(options, opt + 2);
173 if (!(po->name && (po->flags & OPT_BOOL)))
178 po= find_option(options, "default");
181 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
185 if (po->flags & HAS_ARG) {
186 arg = argv[optindex++];
188 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
192 if (po->flags & OPT_STRING) {
194 str = av_strdup(arg);
195 *po->u.str_arg = str;
196 } else if (po->flags & OPT_BOOL) {
197 *po->u.int_arg = bool_val;
198 } else if (po->flags & OPT_INT) {
199 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
200 } else if (po->flags & OPT_INT64) {
201 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
202 } else if (po->flags & OPT_FLOAT) {
203 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
204 } else if (po->flags & OPT_FUNC2) {
205 if (po->u.func2_arg(opt, arg) < 0) {
206 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
212 if(po->flags & OPT_EXIT)
215 if (parse_arg_function)
216 parse_arg_function(opt);
221 int opt_default(const char *opt, const char *arg){
224 const AVOption *o= NULL;
225 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
227 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
228 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
230 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
232 if(!o && avformat_opts)
233 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
235 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
237 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
238 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
239 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
240 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
241 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
242 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
245 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
250 AVOutputFormat *oformat = NULL;
251 while ((p=av_codec_next(p))){
252 AVClass *c= p->priv_class;
253 if(c && av_find_opt(&c, opt, NULL, 0, 0))
257 while ((oformat = av_oformat_next(oformat))) {
258 const AVClass *c = oformat->priv_class;
259 if (c && av_find_opt(&c, opt, NULL, 0, 0))
264 fprintf(stderr, "Unrecognized option '%s'\n", opt);
269 // 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));
271 //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
272 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
273 opt_values[opt_name_count]= o ? NULL : arg;
274 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
275 opt_names[opt_name_count++]= o ? o->name : opt;
277 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
278 av_log_set_level(AV_LOG_DEBUG);
282 int opt_loglevel(const char *opt, const char *arg)
284 const struct { const char *name; int level; } log_levels[] = {
285 { "quiet" , AV_LOG_QUIET },
286 { "panic" , AV_LOG_PANIC },
287 { "fatal" , AV_LOG_FATAL },
288 { "error" , AV_LOG_ERROR },
289 { "warning", AV_LOG_WARNING },
290 { "info" , AV_LOG_INFO },
291 { "verbose", AV_LOG_VERBOSE },
292 { "debug" , AV_LOG_DEBUG },
298 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
299 if (!strcmp(log_levels[i].name, arg)) {
300 av_log_set_level(log_levels[i].level);
305 level = strtol(arg, &tail, 10);
307 fprintf(stderr, "Invalid loglevel \"%s\". "
308 "Possible levels are numbers or:\n", arg);
309 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
310 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
313 av_log_set_level(level);
317 int opt_timelimit(const char *opt, const char *arg)
320 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
321 struct rlimit rl = { lim, lim + 1 };
322 if (setrlimit(RLIMIT_CPU, &rl))
325 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
330 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
334 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
335 AVCodecContext *avctx= ctx;
336 if(codec && codec->priv_class && avctx->priv_data){
337 priv_ctx= avctx->priv_data;
339 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
340 AVFormatContext *avctx = ctx;
341 if (avctx->oformat && avctx->oformat->priv_class) {
342 priv_ctx = avctx->priv_data;
346 for(i=0; i<opt_name_count; i++){
349 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
350 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
351 if(str && ((opt->flags & flags) == flags))
352 av_set_string3(ctx, opt_names[i], str, 1, NULL);
353 /* We need to use a differnt system to pass options to the private context because
354 it is not known which codec and thus context kind that will be when parsing options
355 we thus use opt_values directly instead of opts_ctx */
356 if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){
357 av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL);
362 void print_error(const char *filename, int err)
365 const char *errbuf_ptr = errbuf;
367 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
368 errbuf_ptr = strerror(AVUNERROR(err));
369 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
372 static int warned_cfg = 0;
375 #define SHOW_VERSION 2
376 #define SHOW_CONFIG 4
378 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
379 if (CONFIG_##LIBNAME) { \
380 const char *indent = flags & INDENT? " " : ""; \
381 if (flags & SHOW_VERSION) { \
382 unsigned int version = libname##_version(); \
383 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
385 LIB##LIBNAME##_VERSION_MAJOR, \
386 LIB##LIBNAME##_VERSION_MINOR, \
387 LIB##LIBNAME##_VERSION_MICRO, \
388 version >> 16, version >> 8 & 0xff, version & 0xff); \
390 if (flags & SHOW_CONFIG) { \
391 const char *cfg = libname##_configuration(); \
392 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
395 "%sWARNING: library configuration mismatch\n", \
399 fprintf(stderr, "%s%-11s configuration: %s\n", \
400 indent, #libname, cfg); \
405 static void print_all_libs_info(FILE* outstream, int flags)
407 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
408 PRINT_LIB_INFO(outstream, avcore, AVCORE, flags);
409 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
410 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
411 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
412 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
413 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
414 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
417 void show_banner(void)
419 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
420 program_name, program_birth_year, this_year);
421 fprintf(stderr, " built on %s %s with %s %s\n",
422 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
423 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
424 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
425 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
428 void show_version(void) {
429 printf("%s " FFMPEG_VERSION "\n", program_name);
430 print_all_libs_info(stdout, SHOW_VERSION);
433 void show_license(void)
437 "This version of %s has nonfree parts compiled in.\n"
438 "Therefore it is not legally redistributable.\n",
441 "%s is free software; you can redistribute it and/or modify\n"
442 "it under the terms of the GNU General Public License as published by\n"
443 "the Free Software Foundation; either version 3 of the License, or\n"
444 "(at your option) any later version.\n"
446 "%s is distributed in the hope that it will be useful,\n"
447 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
448 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
449 "GNU General Public License for more details.\n"
451 "You should have received a copy of the GNU General Public License\n"
452 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
453 program_name, program_name, program_name
455 "%s is free software; you can redistribute it and/or modify\n"
456 "it under the terms of the GNU General Public License as published by\n"
457 "the Free Software Foundation; either version 2 of the License, or\n"
458 "(at your option) any later version.\n"
460 "%s is distributed in the hope that it will be useful,\n"
461 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
462 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
463 "GNU General Public License for more details.\n"
465 "You should have received a copy of the GNU General Public License\n"
466 "along with %s; if not, write to the Free Software\n"
467 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
468 program_name, program_name, program_name
470 "%s is free software; you can redistribute it and/or modify\n"
471 "it under the terms of the GNU Lesser General Public License as published by\n"
472 "the Free Software Foundation; either version 3 of the License, or\n"
473 "(at your option) any later version.\n"
475 "%s is distributed in the hope that it will be useful,\n"
476 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
477 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
478 "GNU Lesser General Public License for more details.\n"
480 "You should have received a copy of the GNU Lesser General Public License\n"
481 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
482 program_name, program_name, program_name
484 "%s is free software; you can redistribute it and/or\n"
485 "modify it under the terms of the GNU Lesser General Public\n"
486 "License as published by the Free Software Foundation; either\n"
487 "version 2.1 of the License, or (at your option) any later version.\n"
489 "%s is distributed in the hope that it will be useful,\n"
490 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
491 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
492 "Lesser General Public License for more details.\n"
494 "You should have received a copy of the GNU Lesser General Public\n"
495 "License along with %s; if not, write to the Free Software\n"
496 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
497 program_name, program_name, program_name
502 void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
506 for (i=-1; i < nb_fmts; i++) {
507 get_fmt_string (fmt_str, sizeof(fmt_str), i);
508 fprintf(stdout, "%s\n", fmt_str);
512 void show_formats(void)
514 AVInputFormat *ifmt=NULL;
515 AVOutputFormat *ofmt=NULL;
516 const char *last_name;
520 " D. = Demuxing supported\n"
521 " .E = Muxing supported\n"
527 const char *name=NULL;
528 const char *long_name=NULL;
530 while((ofmt= av_oformat_next(ofmt))) {
531 if((name == NULL || strcmp(ofmt->name, name)<0) &&
532 strcmp(ofmt->name, last_name)>0){
534 long_name= ofmt->long_name;
538 while((ifmt= av_iformat_next(ifmt))) {
539 if((name == NULL || strcmp(ifmt->name, name)<0) &&
540 strcmp(ifmt->name, last_name)>0){
542 long_name= ifmt->long_name;
545 if(name && strcmp(ifmt->name, name)==0)
557 long_name ? long_name:" ");
561 void show_codecs(void)
563 AVCodec *p=NULL, *p2;
564 const char *last_name;
567 " D..... = Decoding supported\n"
568 " .E.... = Encoding supported\n"
569 " ..V... = Video codec\n"
570 " ..A... = Audio codec\n"
571 " ..S... = Subtitle codec\n"
572 " ...S.. = Supports draw_horiz_band\n"
573 " ....D. = Supports direct rendering method 1\n"
574 " .....T = Supports weird frame truncation\n"
581 const char *type_str;
584 while((p= av_codec_next(p))) {
585 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
586 strcmp(p->name, last_name)>0){
588 decode= encode= cap=0;
590 if(p2 && strcmp(p->name, p2->name)==0){
591 if(p->decode) decode=1;
592 if(p->encode) encode=1;
593 cap |= p->capabilities;
601 case AVMEDIA_TYPE_VIDEO:
604 case AVMEDIA_TYPE_AUDIO:
607 case AVMEDIA_TYPE_SUBTITLE:
615 " %s%s%s%s%s%s %-15s %s",
616 decode ? "D": (/*p2->decoder ? "d":*/" "),
619 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
620 cap & CODEC_CAP_DR1 ? "D":" ",
621 cap & CODEC_CAP_TRUNCATED ? "T":" ",
623 p2->long_name ? p2->long_name : "");
624 /* if(p2->decoder && decode==0)
625 printf(" use %s for decoding", p2->decoder->name);*/
630 "Note, the names of encoders and decoders do not always match, so there are\n"
631 "several cases where the above table shows encoder only or decoder only entries\n"
632 "even though both encoding and decoding are supported. For example, the h263\n"
633 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
639 AVBitStreamFilter *bsf=NULL;
641 printf("Bitstream filters:\n");
642 while((bsf = av_bitstream_filter_next(bsf)))
643 printf("%s\n", bsf->name);
647 void show_protocols(void)
649 URLProtocol *up=NULL;
651 printf("Supported file protocols:\n"
652 "I.. = Input supported\n"
653 ".O. = Output supported\n"
654 "..S = Seek supported\n"
657 while((up = av_protocol_next(up)))
658 printf("%c%c%c %s\n",
659 up->url_read ? 'I' : '.',
660 up->url_write ? 'O' : '.',
661 up->url_seek ? 'S' : '.',
665 void show_filters(void)
667 AVFilter av_unused(**filter) = NULL;
669 printf("Filters:\n");
671 while ((filter = av_filter_next(filter)) && *filter)
672 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
676 void show_pix_fmts(void)
678 enum PixelFormat pix_fmt;
682 "I.... = Supported Input format for conversion\n"
683 ".O... = Supported Output format for conversion\n"
684 "..H.. = Hardware accelerated format\n"
685 "...P. = Paletted format\n"
686 "....B = Bitstream format\n"
687 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
691 # define sws_isSupportedInput(x) 0
692 # define sws_isSupportedOutput(x) 0
695 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
696 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
697 printf("%c%c%c%c%c %-16s %d %2d\n",
698 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
699 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
700 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
701 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
702 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
704 pix_desc->nb_components,
705 av_get_bits_per_pixel(pix_desc));
712 int yesno = (toupper(c) == 'Y');
714 while (c != '\n' && c != EOF)
720 int read_file(const char *filename, char **bufptr, size_t *size)
722 FILE *f = fopen(filename, "rb");
725 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
726 return AVERROR(errno);
728 fseek(f, 0, SEEK_END);
730 fseek(f, 0, SEEK_SET);
731 *bufptr = av_malloc(*size + 1);
733 fprintf(stderr, "Could not allocate file buffer\n");
735 return AVERROR(ENOMEM);
737 fread(*bufptr, 1, *size, f);
738 (*bufptr)[*size++] = '\0';
744 void init_pts_correction(PtsCorrectionContext *ctx)
746 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
747 ctx->last_pts = ctx->last_dts = INT64_MIN;
750 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
752 int64_t pts = AV_NOPTS_VALUE;
754 if (dts != AV_NOPTS_VALUE) {
755 ctx->num_faulty_dts += dts <= ctx->last_dts;
758 if (reordered_pts != AV_NOPTS_VALUE) {
759 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
760 ctx->last_pts = reordered_pts;
762 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
763 && reordered_pts != AV_NOPTS_VALUE)
771 FILE *get_preset_file(char *filename, size_t filename_size,
772 const char *preset_name, int is_path, const char *codec_name)
776 const char *base[3]= { getenv("FFMPEG_DATADIR"),
782 av_strlcpy(filename, preset_name, filename_size);
783 f = fopen(filename, "r");
785 for (i = 0; i < 3 && !f; i++) {
788 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
789 f = fopen(filename, "r");
790 if (!f && codec_name) {
791 snprintf(filename, filename_size,
792 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
793 f = fopen(filename, "r");
803 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
805 FFSinkContext *priv = ctx->priv;
808 return AVERROR(EINVAL);
809 *priv = *(FFSinkContext *)opaque;
814 static void null_end_frame(AVFilterLink *inlink) { }
816 static int ffsink_query_formats(AVFilterContext *ctx)
818 FFSinkContext *priv = ctx->priv;
819 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
821 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
827 .priv_size = sizeof(FFSinkContext),
830 .query_formats = ffsink_query_formats,
832 .inputs = (AVFilterPad[]) {{ .name = "default",
833 .type = AVMEDIA_TYPE_VIDEO,
834 .end_frame = null_end_frame,
835 .min_perms = AV_PERM_READ, },
837 .outputs = (AVFilterPad[]) {{ .name = NULL }},
840 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
841 AVFilterBufferRef **picref_ptr, AVRational *tb)
844 AVFilterBufferRef *picref;
846 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
848 if (!(picref = ctx->inputs[0]->cur_buf))
849 return AVERROR(ENOENT);
850 *picref_ptr = picref;
851 ctx->inputs[0]->cur_buf = NULL;
852 *tb = ctx->inputs[0]->time_base;
854 memcpy(frame->data, picref->data, sizeof(frame->data));
855 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
856 frame->interlaced_frame = picref->video->interlaced;
857 frame->top_field_first = picref->video->top_field_first;
862 #endif /* CONFIG_AVFILTER */