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 void parse_options(int argc, char **argv, const OptionDef *options,
157 void (* parse_arg_function)(const char*))
159 const char *opt, *arg;
160 int optindex, handleoptions=1;
165 while (optindex < argc) {
166 opt = argv[optindex++];
168 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
170 if (opt[1] == '-' && opt[2] == '\0') {
175 po= find_option(options, opt);
176 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
177 /* handle 'no' bool option */
178 po = find_option(options, opt + 2);
179 if (!(po->name && (po->flags & OPT_BOOL)))
184 po= find_option(options, "default");
187 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
191 if (po->flags & HAS_ARG) {
192 arg = argv[optindex++];
194 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
198 if (po->flags & OPT_STRING) {
200 str = av_strdup(arg);
201 *po->u.str_arg = str;
202 } else if (po->flags & OPT_BOOL) {
203 *po->u.int_arg = bool_val;
204 } else if (po->flags & OPT_INT) {
205 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
206 } else if (po->flags & OPT_INT64) {
207 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
208 } else if (po->flags & OPT_FLOAT) {
209 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
210 } else if (po->flags & OPT_FUNC2) {
211 if (po->u.func2_arg(opt, arg) < 0) {
212 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
215 } else if (po->flags & OPT_DUMMY) {
216 /* Do nothing for this option */
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 AVOutputFormat *oformat = NULL;
237 while ((p = av_codec_next(p))) {
238 AVClass *c = p->priv_class;
239 if (c && av_find_opt(&c, opt, NULL, 0, 0))
244 while ((oformat = av_oformat_next(oformat))) {
245 const AVClass *c = oformat->priv_class;
246 if (c && av_find_opt(&c, opt, NULL, 0, 0))
252 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
253 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
255 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
257 if(!o && avformat_opts)
258 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
260 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
262 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
263 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
264 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
265 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
266 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
267 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
272 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
276 fprintf(stderr, "Unrecognized option '%s'\n", opt);
281 // 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));
283 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
284 opt_values[opt_name_count] = av_strdup(arg);
285 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
286 opt_names[opt_name_count++] = av_strdup(opt);
288 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
289 av_log_set_level(AV_LOG_DEBUG);
293 int opt_loglevel(const char *opt, const char *arg)
295 const struct { const char *name; int level; } log_levels[] = {
296 { "quiet" , AV_LOG_QUIET },
297 { "panic" , AV_LOG_PANIC },
298 { "fatal" , AV_LOG_FATAL },
299 { "error" , AV_LOG_ERROR },
300 { "warning", AV_LOG_WARNING },
301 { "info" , AV_LOG_INFO },
302 { "verbose", AV_LOG_VERBOSE },
303 { "debug" , AV_LOG_DEBUG },
309 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
310 if (!strcmp(log_levels[i].name, arg)) {
311 av_log_set_level(log_levels[i].level);
316 level = strtol(arg, &tail, 10);
318 fprintf(stderr, "Invalid loglevel \"%s\". "
319 "Possible levels are numbers or:\n", arg);
320 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
321 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
324 av_log_set_level(level);
328 int opt_timelimit(const char *opt, const char *arg)
331 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
332 struct rlimit rl = { lim, lim + 1 };
333 if (setrlimit(RLIMIT_CPU, &rl))
336 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
341 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
345 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
346 AVCodecContext *avctx= ctx;
347 if(codec && codec->priv_class && avctx->priv_data){
348 priv_ctx= avctx->priv_data;
350 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
351 AVFormatContext *avctx = ctx;
352 if (avctx->oformat && avctx->oformat->priv_class) {
353 priv_ctx = avctx->priv_data;
357 for(i=0; i<opt_name_count; i++){
362 if (av_find_opt(priv_ctx, opt_names[i], NULL, flags, flags)) {
363 if (av_set_string3(priv_ctx, opt_names[i], opt_values[i], 0, NULL) < 0) {
364 fprintf(stderr, "Invalid value '%s' for option '%s'\n",
365 opt_names[i], opt_values[i]);
372 str = av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
373 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
374 if (str && ((opt->flags & flags) == flags))
375 av_set_string3(ctx, opt_names[i], str, 1, NULL);
380 void print_error(const char *filename, int err)
383 const char *errbuf_ptr = errbuf;
385 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
386 errbuf_ptr = strerror(AVUNERROR(err));
387 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
390 static int warned_cfg = 0;
393 #define SHOW_VERSION 2
394 #define SHOW_CONFIG 4
396 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
397 if (CONFIG_##LIBNAME) { \
398 const char *indent = flags & INDENT? " " : ""; \
399 if (flags & SHOW_VERSION) { \
400 unsigned int version = libname##_version(); \
401 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
403 LIB##LIBNAME##_VERSION_MAJOR, \
404 LIB##LIBNAME##_VERSION_MINOR, \
405 LIB##LIBNAME##_VERSION_MICRO, \
406 version >> 16, version >> 8 & 0xff, version & 0xff); \
408 if (flags & SHOW_CONFIG) { \
409 const char *cfg = libname##_configuration(); \
410 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
413 "%sWARNING: library configuration mismatch\n", \
417 fprintf(stderr, "%s%-11s configuration: %s\n", \
418 indent, #libname, cfg); \
423 static void print_all_libs_info(FILE* outstream, int flags)
425 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
426 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
427 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
428 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
429 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
430 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
431 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
434 void show_banner(void)
436 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
437 program_name, program_birth_year, this_year);
438 fprintf(stderr, " built on %s %s with %s %s\n",
439 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
440 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
441 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
442 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
445 void show_version(void) {
446 printf("%s " FFMPEG_VERSION "\n", program_name);
447 print_all_libs_info(stdout, SHOW_VERSION);
450 void show_license(void)
454 "This version of %s has nonfree parts compiled in.\n"
455 "Therefore it is not legally redistributable.\n",
458 "%s is free software; you can redistribute it and/or modify\n"
459 "it under the terms of the GNU General Public License as published by\n"
460 "the Free Software Foundation; either version 3 of the License, or\n"
461 "(at your option) any later version.\n"
463 "%s is distributed in the hope that it will be useful,\n"
464 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
465 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
466 "GNU General Public License for more details.\n"
468 "You should have received a copy of the GNU General Public License\n"
469 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
470 program_name, program_name, program_name
472 "%s is free software; you can redistribute it and/or modify\n"
473 "it under the terms of the GNU General Public License as published by\n"
474 "the Free Software Foundation; either version 2 of the License, or\n"
475 "(at your option) any later version.\n"
477 "%s is distributed in the hope that it will be useful,\n"
478 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
479 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
480 "GNU General Public License for more details.\n"
482 "You should have received a copy of the GNU General Public License\n"
483 "along with %s; if not, write to the Free Software\n"
484 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
485 program_name, program_name, program_name
487 "%s is free software; you can redistribute it and/or modify\n"
488 "it under the terms of the GNU Lesser General Public License as published by\n"
489 "the Free Software Foundation; either version 3 of the License, or\n"
490 "(at your option) any later version.\n"
492 "%s is distributed in the hope that it will be useful,\n"
493 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
494 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
495 "GNU Lesser General Public License for more details.\n"
497 "You should have received a copy of the GNU Lesser General Public License\n"
498 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
499 program_name, program_name, program_name
501 "%s is free software; you can redistribute it and/or\n"
502 "modify it under the terms of the GNU Lesser General Public\n"
503 "License as published by the Free Software Foundation; either\n"
504 "version 2.1 of the License, or (at your option) any later version.\n"
506 "%s is distributed in the hope that it will be useful,\n"
507 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
508 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
509 "Lesser General Public License for more details.\n"
511 "You should have received a copy of the GNU Lesser General Public\n"
512 "License along with %s; if not, write to the Free Software\n"
513 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
514 program_name, program_name, program_name
519 void show_formats(void)
521 AVInputFormat *ifmt=NULL;
522 AVOutputFormat *ofmt=NULL;
523 const char *last_name;
527 " D. = Demuxing supported\n"
528 " .E = Muxing supported\n"
534 const char *name=NULL;
535 const char *long_name=NULL;
537 while((ofmt= av_oformat_next(ofmt))) {
538 if((name == NULL || strcmp(ofmt->name, name)<0) &&
539 strcmp(ofmt->name, last_name)>0){
541 long_name= ofmt->long_name;
545 while((ifmt= av_iformat_next(ifmt))) {
546 if((name == NULL || strcmp(ifmt->name, name)<0) &&
547 strcmp(ifmt->name, last_name)>0){
549 long_name= ifmt->long_name;
552 if(name && strcmp(ifmt->name, name)==0)
564 long_name ? long_name:" ");
568 void show_codecs(void)
570 AVCodec *p=NULL, *p2;
571 const char *last_name;
574 " D..... = Decoding supported\n"
575 " .E.... = Encoding supported\n"
576 " ..V... = Video codec\n"
577 " ..A... = Audio codec\n"
578 " ..S... = Subtitle codec\n"
579 " ...S.. = Supports draw_horiz_band\n"
580 " ....D. = Supports direct rendering method 1\n"
581 " .....T = Supports weird frame truncation\n"
588 const char *type_str;
591 while((p= av_codec_next(p))) {
592 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
593 strcmp(p->name, last_name)>0){
595 decode= encode= cap=0;
597 if(p2 && strcmp(p->name, p2->name)==0){
598 if(p->decode) decode=1;
599 if(p->encode) encode=1;
600 cap |= p->capabilities;
608 case AVMEDIA_TYPE_VIDEO:
611 case AVMEDIA_TYPE_AUDIO:
614 case AVMEDIA_TYPE_SUBTITLE:
622 " %s%s%s%s%s%s %-15s %s",
623 decode ? "D": (/*p2->decoder ? "d":*/" "),
626 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
627 cap & CODEC_CAP_DR1 ? "D":" ",
628 cap & CODEC_CAP_TRUNCATED ? "T":" ",
630 p2->long_name ? p2->long_name : "");
631 /* if(p2->decoder && decode==0)
632 printf(" use %s for decoding", p2->decoder->name);*/
637 "Note, the names of encoders and decoders do not always match, so there are\n"
638 "several cases where the above table shows encoder only or decoder only entries\n"
639 "even though both encoding and decoding are supported. For example, the h263\n"
640 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
646 AVBitStreamFilter *bsf=NULL;
648 printf("Bitstream filters:\n");
649 while((bsf = av_bitstream_filter_next(bsf)))
650 printf("%s\n", bsf->name);
654 void show_protocols(void)
656 URLProtocol *up=NULL;
658 printf("Supported file protocols:\n"
659 "I.. = Input supported\n"
660 ".O. = Output supported\n"
661 "..S = Seek supported\n"
664 while((up = av_protocol_next(up)))
665 printf("%c%c%c %s\n",
666 up->url_read ? 'I' : '.',
667 up->url_write ? 'O' : '.',
668 up->url_seek ? 'S' : '.',
672 void show_filters(void)
674 AVFilter av_unused(**filter) = NULL;
676 printf("Filters:\n");
678 while ((filter = av_filter_next(filter)) && *filter)
679 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
683 void show_pix_fmts(void)
685 enum PixelFormat pix_fmt;
689 "I.... = Supported Input format for conversion\n"
690 ".O... = Supported Output format for conversion\n"
691 "..H.. = Hardware accelerated format\n"
692 "...P. = Paletted format\n"
693 "....B = Bitstream format\n"
694 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
698 # define sws_isSupportedInput(x) 0
699 # define sws_isSupportedOutput(x) 0
702 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
703 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
704 printf("%c%c%c%c%c %-16s %d %2d\n",
705 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
706 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
707 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
708 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
709 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
711 pix_desc->nb_components,
712 av_get_bits_per_pixel(pix_desc));
719 int yesno = (toupper(c) == 'Y');
721 while (c != '\n' && c != EOF)
727 int read_file(const char *filename, char **bufptr, size_t *size)
729 FILE *f = fopen(filename, "rb");
732 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
733 return AVERROR(errno);
735 fseek(f, 0, SEEK_END);
737 fseek(f, 0, SEEK_SET);
738 *bufptr = av_malloc(*size + 1);
740 fprintf(stderr, "Could not allocate file buffer\n");
742 return AVERROR(ENOMEM);
744 fread(*bufptr, 1, *size, f);
745 (*bufptr)[*size++] = '\0';
751 FILE *get_preset_file(char *filename, size_t filename_size,
752 const char *preset_name, int is_path, const char *codec_name)
756 const char *base[3]= { getenv("FFMPEG_DATADIR"),
762 av_strlcpy(filename, preset_name, filename_size);
763 f = fopen(filename, "r");
765 for (i = 0; i < 3 && !f; i++) {
768 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
769 f = fopen(filename, "r");
770 if (!f && codec_name) {
771 snprintf(filename, filename_size,
772 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
773 f = fopen(filename, "r");
783 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
785 FFSinkContext *priv = ctx->priv;
788 return AVERROR(EINVAL);
789 *priv = *(FFSinkContext *)opaque;
794 static void null_end_frame(AVFilterLink *inlink) { }
796 static int ffsink_query_formats(AVFilterContext *ctx)
798 FFSinkContext *priv = ctx->priv;
799 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
801 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
807 .priv_size = sizeof(FFSinkContext),
810 .query_formats = ffsink_query_formats,
812 .inputs = (AVFilterPad[]) {{ .name = "default",
813 .type = AVMEDIA_TYPE_VIDEO,
814 .end_frame = null_end_frame,
815 .min_perms = AV_PERM_READ, },
817 .outputs = (AVFilterPad[]) {{ .name = NULL }},
820 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
821 AVFilterBufferRef **picref_ptr, AVRational *tb)
824 AVFilterBufferRef *picref;
826 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
828 if (!(picref = ctx->inputs[0]->cur_buf))
829 return AVERROR(ENOENT);
830 *picref_ptr = picref;
831 ctx->inputs[0]->cur_buf = NULL;
832 *tb = ctx->inputs[0]->time_base;
834 memcpy(frame->data, picref->data, sizeof(frame->data));
835 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
836 frame->interlaced_frame = picref->video->interlaced;
837 frame->top_field_first = picref->video->top_field_first;
838 frame->key_frame = picref->video->key_frame;
839 frame->pict_type = picref->video->pict_type;
844 #endif /* CONFIG_AVFILTER */