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 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();
66 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL);
69 void uninit_opts(void)
72 for (i = 0; i < AVMEDIA_TYPE_NB; i++)
73 av_freep(&avcodec_opts[i]);
74 av_freep(&avformat_opts->key);
75 av_freep(&avformat_opts);
79 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
81 vfprintf(stdout, fmt, vl);
84 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
88 double d = av_strtod(numstr, &tail);
90 error= "Expected number for %s but found: %s\n";
91 else if (d < min || d > max)
92 error= "The value for %s was %s which is not within %f - %f\n";
93 else if(type == OPT_INT64 && (int64_t)d != d)
94 error= "Expected int64 for %s but found %s\n";
97 fprintf(stderr, error, context, numstr, min, max);
101 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
103 int64_t us = parse_date(timestr, is_duration);
104 if (us == INT64_MIN) {
105 fprintf(stderr, "Invalid %s specification for %s: %s\n",
106 is_duration ? "duration" : "date", context, timestr);
112 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
118 for(po = options; po->name != NULL; po++) {
120 if ((po->flags & mask) == value) {
125 av_strlcpy(buf, po->name, sizeof(buf));
126 if (po->flags & HAS_ARG) {
127 av_strlcat(buf, " ", sizeof(buf));
128 av_strlcat(buf, po->argname, sizeof(buf));
130 printf("-%-17s %s\n", buf, po->help);
135 static const OptionDef* find_option(const OptionDef *po, const char *name){
136 while (po->name != NULL) {
137 if (!strcmp(name, po->name))
144 void parse_options(int argc, char **argv, const OptionDef *options,
145 void (* parse_arg_function)(const char*))
147 const char *opt, *arg;
148 int optindex, handleoptions=1;
153 while (optindex < argc) {
154 opt = argv[optindex++];
156 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
158 if (opt[1] == '-' && opt[2] == '\0') {
163 po= find_option(options, opt);
164 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
165 /* handle 'no' bool option */
166 po = find_option(options, opt + 2);
167 if (!(po->name && (po->flags & OPT_BOOL)))
172 po= find_option(options, "default");
175 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
179 if (po->flags & HAS_ARG) {
180 arg = argv[optindex++];
182 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
186 if (po->flags & OPT_STRING) {
188 str = av_strdup(arg);
189 *po->u.str_arg = str;
190 } else if (po->flags & OPT_BOOL) {
191 *po->u.int_arg = bool_val;
192 } else if (po->flags & OPT_INT) {
193 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
194 } else if (po->flags & OPT_INT64) {
195 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
196 } else if (po->flags & OPT_FLOAT) {
197 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
198 } else if (po->flags & OPT_FUNC2) {
199 if (po->u.func2_arg(opt, arg) < 0) {
200 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
206 if(po->flags & OPT_EXIT)
209 if (parse_arg_function)
210 parse_arg_function(opt);
215 int opt_default(const char *opt, const char *arg){
218 const AVOption *o= NULL;
219 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
221 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
222 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
224 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
226 if(!o && avformat_opts)
227 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
229 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
231 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
232 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
233 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
234 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
235 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
236 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
239 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
244 AVOutputFormat *oformat = NULL;
245 while ((p=av_codec_next(p))){
246 AVClass *c= p->priv_class;
247 if(c && av_find_opt(&c, opt, NULL, 0, 0))
251 while ((oformat = av_oformat_next(oformat))) {
252 const AVClass *c = oformat->priv_class;
253 if (c && av_find_opt(&c, opt, NULL, 0, 0))
258 fprintf(stderr, "Unrecognized option '%s'\n", opt);
263 // 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));
265 //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
266 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
267 opt_values[opt_name_count]= o ? NULL : arg;
268 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
269 opt_names[opt_name_count++]= o ? o->name : opt;
271 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
272 av_log_set_level(AV_LOG_DEBUG);
276 int opt_loglevel(const char *opt, const char *arg)
278 const struct { const char *name; int level; } log_levels[] = {
279 { "quiet" , AV_LOG_QUIET },
280 { "panic" , AV_LOG_PANIC },
281 { "fatal" , AV_LOG_FATAL },
282 { "error" , AV_LOG_ERROR },
283 { "warning", AV_LOG_WARNING },
284 { "info" , AV_LOG_INFO },
285 { "verbose", AV_LOG_VERBOSE },
286 { "debug" , AV_LOG_DEBUG },
292 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
293 if (!strcmp(log_levels[i].name, arg)) {
294 av_log_set_level(log_levels[i].level);
299 level = strtol(arg, &tail, 10);
301 fprintf(stderr, "Invalid loglevel \"%s\". "
302 "Possible levels are numbers or:\n", arg);
303 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
304 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
307 av_log_set_level(level);
311 int opt_timelimit(const char *opt, const char *arg)
314 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
315 struct rlimit rl = { lim, lim + 1 };
316 if (setrlimit(RLIMIT_CPU, &rl))
319 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
324 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
328 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
329 AVCodecContext *avctx= ctx;
330 if(codec && codec->priv_class && avctx->priv_data){
331 priv_ctx= avctx->priv_data;
333 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
334 AVFormatContext *avctx = ctx;
335 if (avctx->oformat && avctx->oformat->priv_class) {
336 priv_ctx = avctx->priv_data;
340 for(i=0; i<opt_name_count; i++){
343 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
344 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
345 if(str && ((opt->flags & flags) == flags))
346 av_set_string3(ctx, opt_names[i], str, 1, NULL);
347 /* We need to use a differnt system to pass options to the private context because
348 it is not known which codec and thus context kind that will be when parsing options
349 we thus use opt_values directly instead of opts_ctx */
350 if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){
351 av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL);
356 void print_error(const char *filename, int err)
359 const char *errbuf_ptr = errbuf;
361 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
362 errbuf_ptr = strerror(AVUNERROR(err));
363 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
366 static int warned_cfg = 0;
369 #define SHOW_VERSION 2
370 #define SHOW_CONFIG 4
372 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
373 if (CONFIG_##LIBNAME) { \
374 const char *indent = flags & INDENT? " " : ""; \
375 if (flags & SHOW_VERSION) { \
376 unsigned int version = libname##_version(); \
377 fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", \
379 LIB##LIBNAME##_VERSION_MAJOR, \
380 LIB##LIBNAME##_VERSION_MINOR, \
381 LIB##LIBNAME##_VERSION_MICRO, \
382 version >> 16, version >> 8 & 0xff, version & 0xff); \
384 if (flags & SHOW_CONFIG) { \
385 const char *cfg = libname##_configuration(); \
386 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
389 "%sWARNING: library configuration mismatch\n", \
393 fprintf(stderr, "%s%-11s configuration: %s\n", \
394 indent, #libname, cfg); \
399 static void print_all_libs_info(FILE* outstream, int flags)
401 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
402 PRINT_LIB_INFO(outstream, avcore, AVCORE, flags);
403 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
404 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
405 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
406 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
407 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
408 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
411 void show_banner(void)
413 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
414 program_name, program_birth_year, this_year);
415 fprintf(stderr, " built on %s %s with %s %s\n",
416 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
417 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
418 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
419 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
422 void show_version(void) {
423 printf("%s " FFMPEG_VERSION "\n", program_name);
424 print_all_libs_info(stdout, SHOW_VERSION);
427 void show_license(void)
431 "This version of %s has nonfree parts compiled in.\n"
432 "Therefore it is not legally redistributable.\n",
435 "%s is free software; you can redistribute it and/or modify\n"
436 "it under the terms of the GNU General Public License as published by\n"
437 "the Free Software Foundation; either version 3 of the License, or\n"
438 "(at your option) any later version.\n"
440 "%s is distributed in the hope that it will be useful,\n"
441 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
442 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
443 "GNU General Public License for more details.\n"
445 "You should have received a copy of the GNU General Public License\n"
446 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
447 program_name, program_name, program_name
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 2 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, write to the Free Software\n"
461 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
462 program_name, program_name, program_name
464 "%s is free software; you can redistribute it and/or modify\n"
465 "it under the terms of the GNU Lesser 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 Lesser General Public License for more details.\n"
474 "You should have received a copy of the GNU Lesser 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\n"
479 "modify it under the terms of the GNU Lesser General Public\n"
480 "License as published by the Free Software Foundation; either\n"
481 "version 2.1 of the License, or (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 GNU\n"
486 "Lesser General Public License for more details.\n"
488 "You should have received a copy of the GNU Lesser General Public\n"
489 "License 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
496 void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
500 for (i=-1; i < nb_fmts; i++) {
501 get_fmt_string (fmt_str, sizeof(fmt_str), i);
502 fprintf(stdout, "%s\n", fmt_str);
506 void show_formats(void)
508 AVInputFormat *ifmt=NULL;
509 AVOutputFormat *ofmt=NULL;
510 const char *last_name;
514 " D. = Demuxing supported\n"
515 " .E = Muxing supported\n"
521 const char *name=NULL;
522 const char *long_name=NULL;
524 while((ofmt= av_oformat_next(ofmt))) {
525 if((name == NULL || strcmp(ofmt->name, name)<0) &&
526 strcmp(ofmt->name, last_name)>0){
528 long_name= ofmt->long_name;
532 while((ifmt= av_iformat_next(ifmt))) {
533 if((name == NULL || strcmp(ifmt->name, name)<0) &&
534 strcmp(ifmt->name, last_name)>0){
536 long_name= ifmt->long_name;
539 if(name && strcmp(ifmt->name, name)==0)
551 long_name ? long_name:" ");
555 void show_codecs(void)
557 AVCodec *p=NULL, *p2;
558 const char *last_name;
561 " D..... = Decoding supported\n"
562 " .E.... = Encoding supported\n"
563 " ..V... = Video codec\n"
564 " ..A... = Audio codec\n"
565 " ..S... = Subtitle codec\n"
566 " ...S.. = Supports draw_horiz_band\n"
567 " ....D. = Supports direct rendering method 1\n"
568 " .....T = Supports weird frame truncation\n"
575 const char *type_str;
578 while((p= av_codec_next(p))) {
579 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
580 strcmp(p->name, last_name)>0){
582 decode= encode= cap=0;
584 if(p2 && strcmp(p->name, p2->name)==0){
585 if(p->decode) decode=1;
586 if(p->encode) encode=1;
587 cap |= p->capabilities;
595 case AVMEDIA_TYPE_VIDEO:
598 case AVMEDIA_TYPE_AUDIO:
601 case AVMEDIA_TYPE_SUBTITLE:
609 " %s%s%s%s%s%s %-15s %s",
610 decode ? "D": (/*p2->decoder ? "d":*/" "),
613 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
614 cap & CODEC_CAP_DR1 ? "D":" ",
615 cap & CODEC_CAP_TRUNCATED ? "T":" ",
617 p2->long_name ? p2->long_name : "");
618 /* if(p2->decoder && decode==0)
619 printf(" use %s for decoding", p2->decoder->name);*/
624 "Note, the names of encoders and decoders do not always match, so there are\n"
625 "several cases where the above table shows encoder only or decoder only entries\n"
626 "even though both encoding and decoding are supported. For example, the h263\n"
627 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
633 AVBitStreamFilter *bsf=NULL;
635 printf("Bitstream filters:\n");
636 while((bsf = av_bitstream_filter_next(bsf)))
637 printf("%s\n", bsf->name);
641 void show_protocols(void)
643 URLProtocol *up=NULL;
645 printf("Supported file protocols:\n"
646 "I.. = Input supported\n"
647 ".O. = Output supported\n"
648 "..S = Seek supported\n"
651 while((up = av_protocol_next(up)))
652 printf("%c%c%c %s\n",
653 up->url_read ? 'I' : '.',
654 up->url_write ? 'O' : '.',
655 up->url_seek ? 'S' : '.',
659 void show_filters(void)
661 AVFilter av_unused(**filter) = NULL;
663 printf("Filters:\n");
665 while ((filter = av_filter_next(filter)) && *filter)
666 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
670 void show_pix_fmts(void)
672 enum PixelFormat pix_fmt;
676 "I.... = Supported Input format for conversion\n"
677 ".O... = Supported Output format for conversion\n"
678 "..H.. = Hardware accelerated format\n"
679 "...P. = Paletted format\n"
680 "....B = Bitstream format\n"
681 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
685 # define sws_isSupportedInput(x) 0
686 # define sws_isSupportedOutput(x) 0
689 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
690 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
691 printf("%c%c%c%c%c %-16s %d %2d\n",
692 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
693 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
694 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
695 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
696 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
698 pix_desc->nb_components,
699 av_get_bits_per_pixel(pix_desc));
706 int yesno = (toupper(c) == 'Y');
708 while (c != '\n' && c != EOF)
714 int read_file(const char *filename, char **bufptr, size_t *size)
716 FILE *f = fopen(filename, "rb");
719 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
720 return AVERROR(errno);
722 fseek(f, 0, SEEK_END);
724 fseek(f, 0, SEEK_SET);
725 *bufptr = av_malloc(*size + 1);
727 fprintf(stderr, "Could not allocate file buffer\n");
729 return AVERROR(ENOMEM);
731 fread(*bufptr, 1, *size, f);
732 (*bufptr)[*size++] = '\0';
738 void init_pts_correction(PtsCorrectionContext *ctx)
740 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
741 ctx->last_pts = ctx->last_dts = INT64_MIN;
744 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
746 int64_t pts = AV_NOPTS_VALUE;
748 if (dts != AV_NOPTS_VALUE) {
749 ctx->num_faulty_dts += dts <= ctx->last_dts;
752 if (reordered_pts != AV_NOPTS_VALUE) {
753 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
754 ctx->last_pts = reordered_pts;
756 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
757 && reordered_pts != AV_NOPTS_VALUE)
765 FILE *get_preset_file(char *filename, size_t filename_size,
766 const char *preset_name, int is_path, const char *codec_name)
770 const char *base[3]= { getenv("FFMPEG_DATADIR"),
776 av_strlcpy(filename, preset_name, filename_size);
777 f = fopen(filename, "r");
779 for (i = 0; i < 3 && !f; i++) {
782 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
783 f = fopen(filename, "r");
784 if (!f && codec_name) {
785 snprintf(filename, filename_size,
786 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
787 f = fopen(filename, "r");
797 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
799 FFSinkContext *priv = ctx->priv;
802 return AVERROR(EINVAL);
803 *priv = *(FFSinkContext *)opaque;
808 static void null_end_frame(AVFilterLink *inlink) { }
810 static int ffsink_query_formats(AVFilterContext *ctx)
812 FFSinkContext *priv = ctx->priv;
813 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
815 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
821 .priv_size = sizeof(FFSinkContext),
824 .query_formats = ffsink_query_formats,
826 .inputs = (AVFilterPad[]) {{ .name = "default",
827 .type = AVMEDIA_TYPE_VIDEO,
828 .end_frame = null_end_frame,
829 .min_perms = AV_PERM_READ, },
831 .outputs = (AVFilterPad[]) {{ .name = NULL }},
834 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
835 AVFilterBufferRef **picref_ptr, AVRational *tb)
838 AVFilterBufferRef *picref;
840 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
842 if (!(picref = ctx->inputs[0]->cur_buf))
843 return AVERROR(ENOENT);
844 *picref_ptr = picref;
845 ctx->inputs[0]->cur_buf = NULL;
846 *tb = ctx->inputs[0]->time_base;
848 memcpy(frame->data, picref->data, sizeof(frame->data));
849 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
850 frame->interlaced_frame = picref->video->interlaced;
851 frame->top_field_first = picref->video->top_field_first;
856 #endif /* CONFIG_AVFILTER */