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);
79 sws_freeContext(sws_opts);
82 for (i = 0; i < opt_name_count; i++) {
83 //opt_values are only stored for codec-specific options in which case
84 //both the name and value are dup'd
86 av_freep(&opt_names[i]);
87 av_freep(&opt_values[i]);
91 av_freep(&opt_values);
95 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
97 vfprintf(stdout, fmt, vl);
100 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
104 double d = av_strtod(numstr, &tail);
106 error= "Expected number for %s but found: %s\n";
107 else if (d < min || d > max)
108 error= "The value for %s was %s which is not within %f - %f\n";
109 else if(type == OPT_INT64 && (int64_t)d != d)
110 error= "Expected int64 for %s but found %s\n";
111 else if (type == OPT_INT && (int)d != d)
112 error= "Expected int for %s but found %s\n";
115 fprintf(stderr, error, context, numstr, min, max);
119 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
122 if (av_parse_time(&us, timestr, is_duration) < 0) {
123 fprintf(stderr, "Invalid %s specification for %s: %s\n",
124 is_duration ? "duration" : "date", context, timestr);
130 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
136 for(po = options; po->name != NULL; po++) {
138 if ((po->flags & mask) == value) {
143 av_strlcpy(buf, po->name, sizeof(buf));
144 if (po->flags & HAS_ARG) {
145 av_strlcat(buf, " ", sizeof(buf));
146 av_strlcat(buf, po->argname, sizeof(buf));
148 printf("-%-17s %s\n", buf, po->help);
153 static const OptionDef* find_option(const OptionDef *po, const char *name){
154 while (po->name != NULL) {
155 if (!strcmp(name, po->name))
162 #if defined(_WIN32) && !defined(__MINGW32CE__)
164 /* Will be leaked on exit */
165 static char** win32_argv_utf8 = NULL;
166 static int win32_argc = 0;
169 * Prepare command line arguments for executable.
170 * For Windows - perform wide-char to UTF-8 conversion.
171 * Input arguments should be main() function arguments.
172 * @param argc_ptr Arguments number (including executable)
173 * @param argv_ptr Arguments list.
175 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
179 int i, buffsize = 0, offset = 0;
181 if (win32_argv_utf8) {
182 *argc_ptr = win32_argc;
183 *argv_ptr = win32_argv_utf8;
188 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
189 if (win32_argc <= 0 || !argv_w)
192 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
193 for (i = 0; i < win32_argc; i++)
194 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
195 NULL, 0, NULL, NULL);
197 win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize);
198 argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1);
199 if (win32_argv_utf8 == NULL) {
204 for (i = 0; i < win32_argc; i++) {
205 win32_argv_utf8[i] = &argstr_flat[offset];
206 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
207 &argstr_flat[offset],
208 buffsize - offset, NULL, NULL);
210 win32_argv_utf8[i] = NULL;
213 *argc_ptr = win32_argc;
214 *argv_ptr = win32_argv_utf8;
217 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
221 #endif /* WIN32 && !__MINGW32CE__ */
223 void parse_options(int argc, char **argv, const OptionDef *options,
224 void (* parse_arg_function)(const char*))
226 const char *opt, *arg;
227 int optindex, handleoptions=1;
230 /* perform system-dependent conversions for arguments list */
231 prepare_app_arguments(&argc, &argv);
235 while (optindex < argc) {
236 opt = argv[optindex++];
238 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
240 if (opt[1] == '-' && opt[2] == '\0') {
245 po= find_option(options, opt);
246 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
247 /* handle 'no' bool option */
248 po = find_option(options, opt + 2);
249 if (!(po->name && (po->flags & OPT_BOOL)))
254 po= find_option(options, "default");
257 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
261 if (po->flags & HAS_ARG) {
262 arg = argv[optindex++];
264 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
268 if (po->flags & OPT_STRING) {
270 str = av_strdup(arg);
271 *po->u.str_arg = str;
272 } else if (po->flags & OPT_BOOL) {
273 *po->u.int_arg = bool_val;
274 } else if (po->flags & OPT_INT) {
275 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
276 } else if (po->flags & OPT_INT64) {
277 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
278 } else if (po->flags & OPT_FLOAT) {
279 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
280 } else if (po->flags & OPT_FUNC2) {
281 if (po->u.func2_arg(opt, arg) < 0) {
282 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
285 } else if (po->u.func_arg) {
288 if(po->flags & OPT_EXIT)
291 if (parse_arg_function)
292 parse_arg_function(opt);
297 int opt_default(const char *opt, const char *arg){
300 const AVOption *o= NULL;
301 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
303 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
304 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
306 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
308 if(!o && avformat_opts)
309 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
311 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
313 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
314 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
315 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
316 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
317 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
318 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
321 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
326 AVOutputFormat *oformat = NULL;
327 while ((p=av_codec_next(p))){
328 AVClass *c= p->priv_class;
329 if(c && av_find_opt(&c, opt, NULL, 0, 0))
333 while ((oformat = av_oformat_next(oformat))) {
334 const AVClass *c = oformat->priv_class;
335 if (c && av_find_opt(&c, opt, NULL, 0, 0))
340 fprintf(stderr, "Unrecognized option '%s'\n", opt);
345 // 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));
347 //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
348 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
349 opt_values[opt_name_count]= o ? NULL : av_strdup(arg);
350 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
351 opt_names[opt_name_count++]= o ? o->name : av_strdup(opt);
353 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
354 av_log_set_level(AV_LOG_DEBUG);
358 int opt_loglevel(const char *opt, const char *arg)
360 const struct { const char *name; int level; } log_levels[] = {
361 { "quiet" , AV_LOG_QUIET },
362 { "panic" , AV_LOG_PANIC },
363 { "fatal" , AV_LOG_FATAL },
364 { "error" , AV_LOG_ERROR },
365 { "warning", AV_LOG_WARNING },
366 { "info" , AV_LOG_INFO },
367 { "verbose", AV_LOG_VERBOSE },
368 { "debug" , AV_LOG_DEBUG },
374 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
375 if (!strcmp(log_levels[i].name, arg)) {
376 av_log_set_level(log_levels[i].level);
381 level = strtol(arg, &tail, 10);
383 fprintf(stderr, "Invalid loglevel \"%s\". "
384 "Possible levels are numbers or:\n", arg);
385 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
386 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
389 av_log_set_level(level);
393 int opt_timelimit(const char *opt, const char *arg)
396 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
397 struct rlimit rl = { lim, lim + 1 };
398 if (setrlimit(RLIMIT_CPU, &rl))
401 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
406 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
410 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
411 AVCodecContext *avctx= ctx;
412 if(codec && codec->priv_class && avctx->priv_data){
413 priv_ctx= avctx->priv_data;
415 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
416 AVFormatContext *avctx = ctx;
417 if (avctx->oformat && avctx->oformat->priv_class) {
418 priv_ctx = avctx->priv_data;
422 for(i=0; i<opt_name_count; i++){
425 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
426 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
427 if(str && ((opt->flags & flags) == flags))
428 av_set_string3(ctx, opt_names[i], str, 1, NULL);
429 /* We need to use a differnt system to pass options to the private context because
430 it is not known which codec and thus context kind that will be when parsing options
431 we thus use opt_values directly instead of opts_ctx */
432 if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){
433 av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL);
438 void print_error(const char *filename, int err)
441 const char *errbuf_ptr = errbuf;
443 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
444 errbuf_ptr = strerror(AVUNERROR(err));
445 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
448 static int warned_cfg = 0;
451 #define SHOW_VERSION 2
452 #define SHOW_CONFIG 4
454 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
455 if (CONFIG_##LIBNAME) { \
456 const char *indent = flags & INDENT? " " : ""; \
457 if (flags & SHOW_VERSION) { \
458 unsigned int version = libname##_version(); \
459 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
461 LIB##LIBNAME##_VERSION_MAJOR, \
462 LIB##LIBNAME##_VERSION_MINOR, \
463 LIB##LIBNAME##_VERSION_MICRO, \
464 version >> 16, version >> 8 & 0xff, version & 0xff); \
466 if (flags & SHOW_CONFIG) { \
467 const char *cfg = libname##_configuration(); \
468 if (strcmp(LIBAV_CONFIGURATION, cfg)) { \
471 "%sWARNING: library configuration mismatch\n", \
475 fprintf(stderr, "%s%-11s configuration: %s\n", \
476 indent, #libname, cfg); \
481 static void print_all_libs_info(FILE* outstream, int flags)
483 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
484 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
485 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
486 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
487 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
488 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
489 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
492 void show_banner(void)
494 fprintf(stderr, "%s version " LIBAV_VERSION ", Copyright (c) %d-%d the Libav developers\n",
495 program_name, program_birth_year, this_year);
496 fprintf(stderr, " built on %s %s with %s %s\n",
497 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
498 fprintf(stderr, " configuration: " LIBAV_CONFIGURATION "\n");
499 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
500 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
503 void show_version(void) {
504 printf("%s " LIBAV_VERSION "\n", program_name);
505 print_all_libs_info(stdout, SHOW_VERSION);
508 void show_license(void)
512 "This version of %s has nonfree parts compiled in.\n"
513 "Therefore it is not legally redistributable.\n",
516 "%s is free software; you can redistribute it and/or modify\n"
517 "it under the terms of the GNU General Public License as published by\n"
518 "the Free Software Foundation; either version 3 of the License, or\n"
519 "(at your option) any later version.\n"
521 "%s is distributed in the hope that it will be useful,\n"
522 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
523 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
524 "GNU General Public License for more details.\n"
526 "You should have received a copy of the GNU General Public License\n"
527 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
528 program_name, program_name, program_name
530 "%s is free software; you can redistribute it and/or modify\n"
531 "it under the terms of the GNU General Public License as published by\n"
532 "the Free Software Foundation; either version 2 of the License, or\n"
533 "(at your option) any later version.\n"
535 "%s is distributed in the hope that it will be useful,\n"
536 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
537 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
538 "GNU General Public License for more details.\n"
540 "You should have received a copy of the GNU General Public License\n"
541 "along with %s; if not, write to the Free Software\n"
542 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
543 program_name, program_name, program_name
545 "%s is free software; you can redistribute it and/or modify\n"
546 "it under the terms of the GNU Lesser General Public License as published by\n"
547 "the Free Software Foundation; either version 3 of the License, or\n"
548 "(at your option) any later version.\n"
550 "%s is distributed in the hope that it will be useful,\n"
551 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
552 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
553 "GNU Lesser General Public License for more details.\n"
555 "You should have received a copy of the GNU Lesser General Public License\n"
556 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
557 program_name, program_name, program_name
559 "%s is free software; you can redistribute it and/or\n"
560 "modify it under the terms of the GNU Lesser General Public\n"
561 "License as published by the Free Software Foundation; either\n"
562 "version 2.1 of the License, or (at your option) any later version.\n"
564 "%s is distributed in the hope that it will be useful,\n"
565 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
566 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
567 "Lesser General Public License for more details.\n"
569 "You should have received a copy of the GNU Lesser General Public\n"
570 "License along with %s; if not, write to the Free Software\n"
571 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
572 program_name, program_name, program_name
577 void show_formats(void)
579 AVInputFormat *ifmt=NULL;
580 AVOutputFormat *ofmt=NULL;
581 const char *last_name;
585 " D. = Demuxing supported\n"
586 " .E = Muxing supported\n"
592 const char *name=NULL;
593 const char *long_name=NULL;
595 while((ofmt= av_oformat_next(ofmt))) {
596 if((name == NULL || strcmp(ofmt->name, name)<0) &&
597 strcmp(ofmt->name, last_name)>0){
599 long_name= ofmt->long_name;
603 while((ifmt= av_iformat_next(ifmt))) {
604 if((name == NULL || strcmp(ifmt->name, name)<0) &&
605 strcmp(ifmt->name, last_name)>0){
607 long_name= ifmt->long_name;
610 if(name && strcmp(ifmt->name, name)==0)
622 long_name ? long_name:" ");
626 void show_codecs(void)
628 AVCodec *p=NULL, *p2;
629 const char *last_name;
632 " D..... = Decoding supported\n"
633 " .E.... = Encoding supported\n"
634 " ..V... = Video codec\n"
635 " ..A... = Audio codec\n"
636 " ..S... = Subtitle codec\n"
637 " ...S.. = Supports draw_horiz_band\n"
638 " ....D. = Supports direct rendering method 1\n"
639 " .....T = Supports weird frame truncation\n"
646 const char *type_str;
649 while((p= av_codec_next(p))) {
650 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
651 strcmp(p->name, last_name)>0){
653 decode= encode= cap=0;
655 if(p2 && strcmp(p->name, p2->name)==0){
656 if(p->decode) decode=1;
657 if(p->encode) encode=1;
658 cap |= p->capabilities;
666 case AVMEDIA_TYPE_VIDEO:
669 case AVMEDIA_TYPE_AUDIO:
672 case AVMEDIA_TYPE_SUBTITLE:
680 " %s%s%s%s%s%s %-15s %s",
681 decode ? "D": (/*p2->decoder ? "d":*/" "),
684 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
685 cap & CODEC_CAP_DR1 ? "D":" ",
686 cap & CODEC_CAP_TRUNCATED ? "T":" ",
688 p2->long_name ? p2->long_name : "");
689 /* if(p2->decoder && decode==0)
690 printf(" use %s for decoding", p2->decoder->name);*/
695 "Note, the names of encoders and decoders do not always match, so there are\n"
696 "several cases where the above table shows encoder only or decoder only entries\n"
697 "even though both encoding and decoding are supported. For example, the h263\n"
698 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
704 AVBitStreamFilter *bsf=NULL;
706 printf("Bitstream filters:\n");
707 while((bsf = av_bitstream_filter_next(bsf)))
708 printf("%s\n", bsf->name);
712 void show_protocols(void)
717 printf("Supported file protocols:\n"
719 while ((name = avio_enum_protocols(&opaque, 0)))
720 printf("%s\n", name);
722 while ((name = avio_enum_protocols(&opaque, 1)))
723 printf("%s\n", name);
726 void show_filters(void)
728 AVFilter av_unused(**filter) = NULL;
730 printf("Filters:\n");
732 while ((filter = av_filter_next(filter)) && *filter)
733 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
737 void show_pix_fmts(void)
739 enum PixelFormat pix_fmt;
743 "I.... = Supported Input format for conversion\n"
744 ".O... = Supported Output format for conversion\n"
745 "..H.. = Hardware accelerated format\n"
746 "...P. = Paletted format\n"
747 "....B = Bitstream format\n"
748 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
752 # define sws_isSupportedInput(x) 0
753 # define sws_isSupportedOutput(x) 0
756 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
757 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
758 printf("%c%c%c%c%c %-16s %d %2d\n",
759 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
760 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
761 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
762 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
763 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
765 pix_desc->nb_components,
766 av_get_bits_per_pixel(pix_desc));
773 int yesno = (toupper(c) == 'Y');
775 while (c != '\n' && c != EOF)
781 int read_file(const char *filename, char **bufptr, size_t *size)
783 FILE *f = fopen(filename, "rb");
786 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
787 return AVERROR(errno);
789 fseek(f, 0, SEEK_END);
791 fseek(f, 0, SEEK_SET);
792 *bufptr = av_malloc(*size + 1);
794 fprintf(stderr, "Could not allocate file buffer\n");
796 return AVERROR(ENOMEM);
798 fread(*bufptr, 1, *size, f);
799 (*bufptr)[*size++] = '\0';
805 void init_pts_correction(PtsCorrectionContext *ctx)
807 ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
808 ctx->last_pts = ctx->last_dts = INT64_MIN;
811 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
813 int64_t pts = AV_NOPTS_VALUE;
815 if (dts != AV_NOPTS_VALUE) {
816 ctx->num_faulty_dts += dts <= ctx->last_dts;
819 if (reordered_pts != AV_NOPTS_VALUE) {
820 ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
821 ctx->last_pts = reordered_pts;
823 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
824 && reordered_pts != AV_NOPTS_VALUE)
832 FILE *get_preset_file(char *filename, size_t filename_size,
833 const char *preset_name, int is_path, const char *codec_name)
837 const char *base[3]= { getenv("FFMPEG_DATADIR"),
843 av_strlcpy(filename, preset_name, filename_size);
844 f = fopen(filename, "r");
846 for (i = 0; i < 3 && !f; i++) {
849 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
850 f = fopen(filename, "r");
851 if (!f && codec_name) {
852 snprintf(filename, filename_size,
853 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
854 f = fopen(filename, "r");
864 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
866 FFSinkContext *priv = ctx->priv;
869 return AVERROR(EINVAL);
870 *priv = *(FFSinkContext *)opaque;
875 static void null_end_frame(AVFilterLink *inlink) { }
877 static int ffsink_query_formats(AVFilterContext *ctx)
879 FFSinkContext *priv = ctx->priv;
880 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
882 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
888 .priv_size = sizeof(FFSinkContext),
891 .query_formats = ffsink_query_formats,
893 .inputs = (AVFilterPad[]) {{ .name = "default",
894 .type = AVMEDIA_TYPE_VIDEO,
895 .end_frame = null_end_frame,
896 .min_perms = AV_PERM_READ, },
898 .outputs = (AVFilterPad[]) {{ .name = NULL }},
901 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
902 AVFilterBufferRef **picref_ptr, AVRational *tb)
905 AVFilterBufferRef *picref;
907 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
909 if (!(picref = ctx->inputs[0]->cur_buf))
910 return AVERROR(ENOENT);
911 *picref_ptr = picref;
912 ctx->inputs[0]->cur_buf = NULL;
913 *tb = ctx->inputs[0]->time_base;
915 memcpy(frame->data, picref->data, sizeof(frame->data));
916 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
917 frame->interlaced_frame = picref->video->interlaced;
918 frame->top_field_first = picref->video->top_field_first;
919 frame->key_frame = picref->video->key_frame;
920 frame->pict_type = picref->video->pict_type;
925 #endif /* CONFIG_AVFILTER */