2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; 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 //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);
94 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
96 vfprintf(stdout, fmt, vl);
99 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
103 double d = av_strtod(numstr, &tail);
105 error= "Expected number for %s but found: %s\n";
106 else if (d < min || d > max)
107 error= "The value for %s was %s which is not within %f - %f\n";
108 else if(type == OPT_INT64 && (int64_t)d != d)
109 error= "Expected int64 for %s but found %s\n";
112 fprintf(stderr, error, context, numstr, min, max);
116 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
119 if (av_parse_time(&us, timestr, is_duration) < 0) {
120 fprintf(stderr, "Invalid %s specification for %s: %s\n",
121 is_duration ? "duration" : "date", context, timestr);
127 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
133 for(po = options; po->name != NULL; po++) {
135 if ((po->flags & mask) == value) {
140 av_strlcpy(buf, po->name, sizeof(buf));
141 if (po->flags & HAS_ARG) {
142 av_strlcat(buf, " ", sizeof(buf));
143 av_strlcat(buf, po->argname, sizeof(buf));
145 printf("-%-17s %s\n", buf, po->help);
150 static const OptionDef* find_option(const OptionDef *po, const char *name){
151 while (po->name != NULL) {
152 if (!strcmp(name, po->name))
159 #if defined(_WIN32) && !defined(__MINGW32CE__)
161 /* Will be leaked on exit */
162 static char** win32_argv_utf8 = NULL;
163 static int win32_argc = 0;
166 * Prepare command line arguments for executable.
167 * For Windows - perform wide-char to UTF-8 conversion.
168 * Input arguments should be main() function arguments.
169 * @param argc_ptr Arguments number (including executable)
170 * @param argv_ptr Arguments list.
172 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
176 int i, buffsize = 0, offset = 0;
178 if (win32_argv_utf8) {
179 *argc_ptr = win32_argc;
180 *argv_ptr = win32_argv_utf8;
185 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
186 if (win32_argc <= 0 || !argv_w)
189 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
190 for (i = 0; i < win32_argc; i++)
191 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
192 NULL, 0, NULL, NULL);
194 win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize);
195 argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1);
196 if (win32_argv_utf8 == NULL) {
201 for (i = 0; i < win32_argc; i++) {
202 win32_argv_utf8[i] = &argstr_flat[offset];
203 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
204 &argstr_flat[offset],
205 buffsize - offset, NULL, NULL);
207 win32_argv_utf8[i] = NULL;
210 *argc_ptr = win32_argc;
211 *argv_ptr = win32_argv_utf8;
214 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
218 #endif /* WIN32 && !__MINGW32CE__ */
220 void parse_options(int argc, char **argv, const OptionDef *options,
221 void (* parse_arg_function)(const char*))
223 const char *opt, *arg;
224 int optindex, handleoptions=1;
227 /* perform system-dependent conversions for arguments list */
228 prepare_app_arguments(&argc, &argv);
232 while (optindex < argc) {
233 opt = argv[optindex++];
235 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
237 if (opt[1] == '-' && opt[2] == '\0') {
242 po= find_option(options, opt);
243 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
244 /* handle 'no' bool option */
245 po = find_option(options, opt + 2);
246 if (!(po->name && (po->flags & OPT_BOOL)))
251 po= find_option(options, "default");
254 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
258 if (po->flags & HAS_ARG) {
259 arg = argv[optindex++];
261 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
265 if (po->flags & OPT_STRING) {
267 str = av_strdup(arg);
268 *po->u.str_arg = str;
269 } else if (po->flags & OPT_BOOL) {
270 *po->u.int_arg = bool_val;
271 } else if (po->flags & OPT_INT) {
272 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
273 } else if (po->flags & OPT_INT64) {
274 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
275 } else if (po->flags & OPT_FLOAT) {
276 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
277 } else if (po->flags & OPT_FUNC2) {
278 if (po->u.func2_arg(opt, arg) < 0) {
279 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
285 if(po->flags & OPT_EXIT)
288 if (parse_arg_function)
289 parse_arg_function(opt);
294 int opt_default(const char *opt, const char *arg){
297 const AVOption *o= NULL;
298 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
300 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
301 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
303 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
305 if(!o && avformat_opts)
306 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
308 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
310 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
311 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
312 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
313 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
314 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
315 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
318 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
323 AVOutputFormat *oformat = NULL;
324 while ((p=av_codec_next(p))){
325 AVClass *c= p->priv_class;
326 if(c && av_find_opt(&c, opt, NULL, 0, 0))
330 while ((oformat = av_oformat_next(oformat))) {
331 const AVClass *c = oformat->priv_class;
332 if (c && av_find_opt(&c, opt, NULL, 0, 0))
337 fprintf(stderr, "Unrecognized option '%s'\n", opt);
342 // 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));
344 //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
345 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
346 opt_values[opt_name_count]= o ? NULL : av_strdup(arg);
347 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
348 opt_names[opt_name_count++]= o ? o->name : av_strdup(opt);
350 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
351 av_log_set_level(AV_LOG_DEBUG);
355 int opt_loglevel(const char *opt, const char *arg)
357 const struct { const char *name; int level; } log_levels[] = {
358 { "quiet" , AV_LOG_QUIET },
359 { "panic" , AV_LOG_PANIC },
360 { "fatal" , AV_LOG_FATAL },
361 { "error" , AV_LOG_ERROR },
362 { "warning", AV_LOG_WARNING },
363 { "info" , AV_LOG_INFO },
364 { "verbose", AV_LOG_VERBOSE },
365 { "debug" , AV_LOG_DEBUG },
371 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
372 if (!strcmp(log_levels[i].name, arg)) {
373 av_log_set_level(log_levels[i].level);
378 level = strtol(arg, &tail, 10);
380 fprintf(stderr, "Invalid loglevel \"%s\". "
381 "Possible levels are numbers or:\n", arg);
382 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
383 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
386 av_log_set_level(level);
390 int opt_timelimit(const char *opt, const char *arg)
393 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
394 struct rlimit rl = { lim, lim + 1 };
395 if (setrlimit(RLIMIT_CPU, &rl))
398 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
403 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
407 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
408 AVCodecContext *avctx= ctx;
409 if(codec && codec->priv_class && avctx->priv_data){
410 priv_ctx= avctx->priv_data;
412 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
413 AVFormatContext *avctx = ctx;
414 if (avctx->oformat && avctx->oformat->priv_class) {
415 priv_ctx = avctx->priv_data;
419 for(i=0; i<opt_name_count; i++){
422 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
423 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
424 if(str && ((opt->flags & flags) == flags))
425 av_set_string3(ctx, opt_names[i], str, 1, NULL);
426 /* We need to use a differnt system to pass options to the private context because
427 it is not known which codec and thus context kind that will be when parsing options
428 we thus use opt_values directly instead of opts_ctx */
429 if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){
430 av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL);
435 void print_error(const char *filename, int err)
438 const char *errbuf_ptr = errbuf;
440 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
441 errbuf_ptr = strerror(AVUNERROR(err));
442 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
445 static int warned_cfg = 0;
448 #define SHOW_VERSION 2
449 #define SHOW_CONFIG 4
451 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
452 if (CONFIG_##LIBNAME) { \
453 const char *indent = flags & INDENT? " " : ""; \
454 if (flags & SHOW_VERSION) { \
455 unsigned int version = libname##_version(); \
456 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
458 LIB##LIBNAME##_VERSION_MAJOR, \
459 LIB##LIBNAME##_VERSION_MINOR, \
460 LIB##LIBNAME##_VERSION_MICRO, \
461 version >> 16, version >> 8 & 0xff, version & 0xff); \
463 if (flags & SHOW_CONFIG) { \
464 const char *cfg = libname##_configuration(); \
465 if (strcmp(LIBAV_CONFIGURATION, cfg)) { \
468 "%sWARNING: library configuration mismatch\n", \
472 fprintf(stderr, "%s%-11s configuration: %s\n", \
473 indent, #libname, cfg); \
478 static void print_all_libs_info(FILE* outstream, int flags)
480 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
481 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
482 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
483 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
484 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
485 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
486 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
489 void show_banner(void)
491 fprintf(stderr, "%s version " LIBAV_VERSION ", Copyright (c) %d-%d the Libav developers\n",
492 program_name, program_birth_year, this_year);
493 fprintf(stderr, " built on %s %s with %s %s\n",
494 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
495 fprintf(stderr, " configuration: " LIBAV_CONFIGURATION "\n");
496 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
497 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
500 void show_version(void) {
501 printf("%s " LIBAV_VERSION "\n", program_name);
502 print_all_libs_info(stdout, SHOW_VERSION);
505 void show_license(void)
509 "This version of %s has nonfree parts compiled in.\n"
510 "Therefore it is not legally redistributable.\n",
513 "%s is free software; you can redistribute it and/or modify\n"
514 "it under the terms of the GNU General Public License as published by\n"
515 "the Free Software Foundation; either version 3 of the License, or\n"
516 "(at your option) any later version.\n"
518 "%s is distributed in the hope that it will be useful,\n"
519 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
520 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
521 "GNU General Public License for more details.\n"
523 "You should have received a copy of the GNU General Public License\n"
524 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
525 program_name, program_name, program_name
527 "%s is free software; you can redistribute it and/or modify\n"
528 "it under the terms of the GNU General Public License as published by\n"
529 "the Free Software Foundation; either version 2 of the License, or\n"
530 "(at your option) any later version.\n"
532 "%s is distributed in the hope that it will be useful,\n"
533 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
534 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
535 "GNU General Public License for more details.\n"
537 "You should have received a copy of the GNU General Public License\n"
538 "along with %s; if not, write to the Free Software\n"
539 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
540 program_name, program_name, program_name
542 "%s is free software; you can redistribute it and/or modify\n"
543 "it under the terms of the GNU Lesser General Public License as published by\n"
544 "the Free Software Foundation; either version 3 of the License, or\n"
545 "(at your option) any later version.\n"
547 "%s is distributed in the hope that it will be useful,\n"
548 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
549 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
550 "GNU Lesser General Public License for more details.\n"
552 "You should have received a copy of the GNU Lesser General Public License\n"
553 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
554 program_name, program_name, program_name
556 "%s is free software; you can redistribute it and/or\n"
557 "modify it under the terms of the GNU Lesser General Public\n"
558 "License as published by the Free Software Foundation; either\n"
559 "version 2.1 of the License, or (at your option) any later version.\n"
561 "%s is distributed in the hope that it will be useful,\n"
562 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
563 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
564 "Lesser General Public License for more details.\n"
566 "You should have received a copy of the GNU Lesser General Public\n"
567 "License along with %s; if not, write to the Free Software\n"
568 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
569 program_name, program_name, program_name
574 void show_formats(void)
576 AVInputFormat *ifmt=NULL;
577 AVOutputFormat *ofmt=NULL;
578 const char *last_name;
582 " D. = Demuxing supported\n"
583 " .E = Muxing supported\n"
589 const char *name=NULL;
590 const char *long_name=NULL;
592 while((ofmt= av_oformat_next(ofmt))) {
593 if((name == NULL || strcmp(ofmt->name, name)<0) &&
594 strcmp(ofmt->name, last_name)>0){
596 long_name= ofmt->long_name;
600 while((ifmt= av_iformat_next(ifmt))) {
601 if((name == NULL || strcmp(ifmt->name, name)<0) &&
602 strcmp(ifmt->name, last_name)>0){
604 long_name= ifmt->long_name;
607 if(name && strcmp(ifmt->name, name)==0)
619 long_name ? long_name:" ");
623 void show_codecs(void)
625 AVCodec *p=NULL, *p2;
626 const char *last_name;
629 " D..... = Decoding supported\n"
630 " .E.... = Encoding supported\n"
631 " ..V... = Video codec\n"
632 " ..A... = Audio codec\n"
633 " ..S... = Subtitle codec\n"
634 " ...S.. = Supports draw_horiz_band\n"
635 " ....D. = Supports direct rendering method 1\n"
636 " .....T = Supports weird frame truncation\n"
643 const char *type_str;
646 while((p= av_codec_next(p))) {
647 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
648 strcmp(p->name, last_name)>0){
650 decode= encode= cap=0;
652 if(p2 && strcmp(p->name, p2->name)==0){
653 if(p->decode) decode=1;
654 if(p->encode) encode=1;
655 cap |= p->capabilities;
663 case AVMEDIA_TYPE_VIDEO:
666 case AVMEDIA_TYPE_AUDIO:
669 case AVMEDIA_TYPE_SUBTITLE:
677 " %s%s%s%s%s%s %-15s %s",
678 decode ? "D": (/*p2->decoder ? "d":*/" "),
681 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
682 cap & CODEC_CAP_DR1 ? "D":" ",
683 cap & CODEC_CAP_TRUNCATED ? "T":" ",
685 p2->long_name ? p2->long_name : "");
686 /* if(p2->decoder && decode==0)
687 printf(" use %s for decoding", p2->decoder->name);*/
692 "Note, the names of encoders and decoders do not always match, so there are\n"
693 "several cases where the above table shows encoder only or decoder only entries\n"
694 "even though both encoding and decoding are supported. For example, the h263\n"
695 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
701 AVBitStreamFilter *bsf=NULL;
703 printf("Bitstream filters:\n");
704 while((bsf = av_bitstream_filter_next(bsf)))
705 printf("%s\n", bsf->name);
709 void show_protocols(void)
714 printf("Supported file protocols:\n"
716 while ((name = avio_enum_protocols(&opaque, 0)))
717 printf("%s\n", name);
719 while ((name = avio_enum_protocols(&opaque, 1)))
720 printf("%s\n", name);
723 void show_filters(void)
725 AVFilter av_unused(**filter) = NULL;
727 printf("Filters:\n");
729 while ((filter = av_filter_next(filter)) && *filter)
730 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
734 void show_pix_fmts(void)
736 enum PixelFormat pix_fmt;
740 "I.... = Supported Input format for conversion\n"
741 ".O... = Supported Output format for conversion\n"
742 "..H.. = Hardware accelerated format\n"
743 "...P. = Paletted format\n"
744 "....B = Bitstream format\n"
745 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
749 # define sws_isSupportedInput(x) 0
750 # define sws_isSupportedOutput(x) 0
753 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
754 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
755 printf("%c%c%c%c%c %-16s %d %2d\n",
756 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
757 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
758 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
759 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
760 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
762 pix_desc->nb_components,
763 av_get_bits_per_pixel(pix_desc));
770 int yesno = (toupper(c) == 'Y');
772 while (c != '\n' && c != EOF)
778 int read_file(const char *filename, char **bufptr, size_t *size)
780 FILE *f = fopen(filename, "rb");
783 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
784 return AVERROR(errno);
786 fseek(f, 0, SEEK_END);
788 fseek(f, 0, SEEK_SET);
789 *bufptr = av_malloc(*size + 1);
791 fprintf(stderr, "Could not allocate file buffer\n");
793 return AVERROR(ENOMEM);
795 fread(*bufptr, 1, *size, f);
796 (*bufptr)[*size++] = '\0';
802 void init_pts_correction(PtsCorrectionContext *ctx)
804 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
805 ctx->last_pts = ctx->last_dts = INT64_MIN;
808 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
810 int64_t pts = AV_NOPTS_VALUE;
812 if (dts != AV_NOPTS_VALUE) {
813 ctx->num_faulty_dts += dts <= ctx->last_dts;
816 if (reordered_pts != AV_NOPTS_VALUE) {
817 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
818 ctx->last_pts = reordered_pts;
820 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
821 && reordered_pts != AV_NOPTS_VALUE)
829 FILE *get_preset_file(char *filename, size_t filename_size,
830 const char *preset_name, int is_path, const char *codec_name)
834 const char *base[3]= { getenv("FFMPEG_DATADIR"),
840 av_strlcpy(filename, preset_name, filename_size);
841 f = fopen(filename, "r");
843 for (i = 0; i < 3 && !f; i++) {
846 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
847 f = fopen(filename, "r");
848 if (!f && codec_name) {
849 snprintf(filename, filename_size,
850 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
851 f = fopen(filename, "r");
861 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
863 FFSinkContext *priv = ctx->priv;
866 return AVERROR(EINVAL);
867 *priv = *(FFSinkContext *)opaque;
872 static void null_end_frame(AVFilterLink *inlink) { }
874 static int ffsink_query_formats(AVFilterContext *ctx)
876 FFSinkContext *priv = ctx->priv;
877 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
879 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
885 .priv_size = sizeof(FFSinkContext),
888 .query_formats = ffsink_query_formats,
890 .inputs = (AVFilterPad[]) {{ .name = "default",
891 .type = AVMEDIA_TYPE_VIDEO,
892 .end_frame = null_end_frame,
893 .min_perms = AV_PERM_READ, },
895 .outputs = (AVFilterPad[]) {{ .name = NULL }},
898 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
899 AVFilterBufferRef **picref_ptr, AVRational *tb)
902 AVFilterBufferRef *picref;
904 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
906 if (!(picref = ctx->inputs[0]->cur_buf))
907 return AVERROR(ENOENT);
908 *picref_ptr = picref;
909 ctx->inputs[0]->cur_buf = NULL;
910 *tb = ctx->inputs[0]->time_base;
912 memcpy(frame->data, picref->data, sizeof(frame->data));
913 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
914 frame->interlaced_frame = picref->video->interlaced;
915 frame->top_field_first = picref->video->top_field_first;
916 frame->key_frame = picref->video->key_frame;
917 frame->pict_type = picref->video->pict_type;
922 #endif /* CONFIG_AVFILTER */