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);
79 sws_freeContext(sws_opts);
82 for (i = 0; i < opt_name_count; i++) {
83 av_freep(&opt_names[i]);
84 av_freep(&opt_values[i]);
87 av_freep(&opt_values);
91 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
93 vfprintf(stdout, fmt, vl);
96 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
100 double d = av_strtod(numstr, &tail);
102 error= "Expected number for %s but found: %s\n";
103 else if (d < min || d > max)
104 error= "The value for %s was %s which is not within %f - %f\n";
105 else if(type == OPT_INT64 && (int64_t)d != d)
106 error= "Expected int64 for %s but found %s\n";
107 else if (type == OPT_INT && (int)d != d)
108 error= "Expected int for %s but found %s\n";
111 fprintf(stderr, error, context, numstr, min, max);
115 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
118 if (av_parse_time(&us, timestr, is_duration) < 0) {
119 fprintf(stderr, "Invalid %s specification for %s: %s\n",
120 is_duration ? "duration" : "date", context, timestr);
126 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
132 for(po = options; po->name != NULL; po++) {
134 if ((po->flags & mask) == value) {
139 av_strlcpy(buf, po->name, sizeof(buf));
140 if (po->flags & HAS_ARG) {
141 av_strlcat(buf, " ", sizeof(buf));
142 av_strlcat(buf, po->argname, sizeof(buf));
144 printf("-%-17s %s\n", buf, po->help);
149 static const OptionDef* find_option(const OptionDef *po, const char *name){
150 while (po->name != NULL) {
151 if (!strcmp(name, po->name))
158 #if defined(_WIN32) && !defined(__MINGW32CE__)
160 /* Will be leaked on exit */
161 static char** win32_argv_utf8 = NULL;
162 static int win32_argc = 0;
165 * Prepare command line arguments for executable.
166 * For Windows - perform wide-char to UTF-8 conversion.
167 * Input arguments should be main() function arguments.
168 * @param argc_ptr Arguments number (including executable)
169 * @param argv_ptr Arguments list.
171 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
175 int i, buffsize = 0, offset = 0;
177 if (win32_argv_utf8) {
178 *argc_ptr = win32_argc;
179 *argv_ptr = win32_argv_utf8;
184 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
185 if (win32_argc <= 0 || !argv_w)
188 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
189 for (i = 0; i < win32_argc; i++)
190 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
191 NULL, 0, NULL, NULL);
193 win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize);
194 argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1);
195 if (win32_argv_utf8 == NULL) {
200 for (i = 0; i < win32_argc; i++) {
201 win32_argv_utf8[i] = &argstr_flat[offset];
202 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
203 &argstr_flat[offset],
204 buffsize - offset, NULL, NULL);
206 win32_argv_utf8[i] = NULL;
209 *argc_ptr = win32_argc;
210 *argv_ptr = win32_argv_utf8;
213 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
217 #endif /* WIN32 && !__MINGW32CE__ */
219 void parse_options(int argc, char **argv, const OptionDef *options,
220 int (* parse_arg_function)(const char *opt, const char *arg))
222 const char *opt, *arg;
223 int optindex, handleoptions=1;
226 /* perform system-dependent conversions for arguments list */
227 prepare_app_arguments(&argc, &argv);
231 while (optindex < argc) {
232 opt = argv[optindex++];
234 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
236 if (opt[1] == '-' && opt[2] == '\0') {
241 po= find_option(options, opt);
242 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
243 /* handle 'no' bool option */
244 po = find_option(options, opt + 2);
245 if (!(po->name && (po->flags & OPT_BOOL)))
250 po= find_option(options, "default");
253 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
257 if (po->flags & HAS_ARG) {
258 arg = argv[optindex++];
260 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
264 if (po->flags & OPT_STRING) {
266 str = av_strdup(arg);
267 *po->u.str_arg = str;
268 } else if (po->flags & OPT_BOOL) {
269 *po->u.int_arg = bool_val;
270 } else if (po->flags & OPT_INT) {
271 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
272 } else if (po->flags & OPT_INT64) {
273 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
274 } else if (po->flags & OPT_FLOAT) {
275 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
276 } else if (po->u.func_arg) {
277 if (po->u.func_arg(opt, arg) < 0) {
278 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
282 if(po->flags & OPT_EXIT)
285 if (parse_arg_function) {
286 if (parse_arg_function(NULL, opt) < 0)
293 int opt_default(const char *opt, const char *arg){
296 const AVOption *o= NULL;
297 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
299 AVOutputFormat *oformat = NULL;
300 AVInputFormat *iformat = NULL;
302 while ((p = av_codec_next(p))) {
303 const AVClass *c = p->priv_class;
304 if (c && av_find_opt(&c, opt, NULL, 0, 0))
309 while ((oformat = av_oformat_next(oformat))) {
310 const AVClass *c = oformat->priv_class;
311 if (c && av_find_opt(&c, opt, NULL, 0, 0))
316 while ((iformat = av_iformat_next(iformat))) {
317 const AVClass *c = iformat->priv_class;
318 if (c && av_find_opt(&c, opt, NULL, 0, 0))
324 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
325 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
327 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
329 if(!o && avformat_opts)
330 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
332 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
334 if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO])
335 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
336 else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO])
337 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
338 else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE])
339 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
344 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
348 fprintf(stderr, "Unrecognized option '%s'\n", opt);
353 // 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));
355 opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1));
356 opt_values[opt_name_count] = av_strdup(arg);
357 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
358 opt_names[opt_name_count++] = av_strdup(opt);
360 if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug))
361 av_log_set_level(AV_LOG_DEBUG);
365 int opt_loglevel(const char *opt, const char *arg)
367 const struct { const char *name; int level; } log_levels[] = {
368 { "quiet" , AV_LOG_QUIET },
369 { "panic" , AV_LOG_PANIC },
370 { "fatal" , AV_LOG_FATAL },
371 { "error" , AV_LOG_ERROR },
372 { "warning", AV_LOG_WARNING },
373 { "info" , AV_LOG_INFO },
374 { "verbose", AV_LOG_VERBOSE },
375 { "debug" , AV_LOG_DEBUG },
381 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
382 if (!strcmp(log_levels[i].name, arg)) {
383 av_log_set_level(log_levels[i].level);
388 level = strtol(arg, &tail, 10);
390 fprintf(stderr, "Invalid loglevel \"%s\". "
391 "Possible levels are numbers or:\n", arg);
392 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
393 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
396 av_log_set_level(level);
400 int opt_timelimit(const char *opt, const char *arg)
403 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
404 struct rlimit rl = { lim, lim + 1 };
405 if (setrlimit(RLIMIT_CPU, &rl))
408 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
413 static void *alloc_priv_context(int size, const AVClass *class)
415 void *p = av_mallocz(size);
417 *(const AVClass **)p = class;
418 av_opt_set_defaults(p);
423 void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
427 if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){
428 AVCodecContext *avctx= ctx;
429 if(codec && codec->priv_class){
430 if(!avctx->priv_data && codec->priv_data_size)
431 avctx->priv_data= alloc_priv_context(codec->priv_data_size, codec->priv_class);
432 priv_ctx= avctx->priv_data;
434 } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
435 AVFormatContext *avctx = ctx;
436 if (avctx->oformat && avctx->oformat->priv_class) {
437 priv_ctx = avctx->priv_data;
438 } else if (avctx->iformat && avctx->iformat->priv_class) {
439 priv_ctx = avctx->priv_data;
443 for(i=0; i<opt_name_count; i++){
448 if (av_find_opt(priv_ctx, opt_names[i], NULL, flags, flags)) {
449 if (av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL) < 0) {
450 fprintf(stderr, "Invalid value '%s' for option '%s'\n",
451 opt_names[i], opt_values[i]);
458 str = av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
459 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
460 if (str && ((opt->flags & flags) == flags))
461 av_set_string3(ctx, opt_names[i], str, 1, NULL);
466 void print_error(const char *filename, int err)
469 const char *errbuf_ptr = errbuf;
471 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
472 errbuf_ptr = strerror(AVUNERROR(err));
473 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
476 static int warned_cfg = 0;
479 #define SHOW_VERSION 2
480 #define SHOW_CONFIG 4
482 #define PRINT_LIB_INFO(outstream,libname,LIBNAME,flags) \
483 if (CONFIG_##LIBNAME) { \
484 const char *indent = flags & INDENT? " " : ""; \
485 if (flags & SHOW_VERSION) { \
486 unsigned int version = libname##_version(); \
487 fprintf(outstream, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n", \
489 LIB##LIBNAME##_VERSION_MAJOR, \
490 LIB##LIBNAME##_VERSION_MINOR, \
491 LIB##LIBNAME##_VERSION_MICRO, \
492 version >> 16, version >> 8 & 0xff, version & 0xff); \
494 if (flags & SHOW_CONFIG) { \
495 const char *cfg = libname##_configuration(); \
496 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
499 "%sWARNING: library configuration mismatch\n", \
503 fprintf(stderr, "%s%-11s configuration: %s\n", \
504 indent, #libname, cfg); \
509 static void print_all_libs_info(FILE* outstream, int flags)
511 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags);
512 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags);
513 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags);
514 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags);
515 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags);
516 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags);
517 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags);
520 void show_banner(void)
522 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
523 program_name, program_birth_year, this_year);
524 fprintf(stderr, " built on %s %s with %s %s\n",
525 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
526 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
527 print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
528 print_all_libs_info(stderr, INDENT|SHOW_VERSION);
531 void show_version(void) {
532 printf("%s " FFMPEG_VERSION "\n", program_name);
533 print_all_libs_info(stdout, SHOW_VERSION);
536 void show_license(void)
540 "This version of %s has nonfree parts compiled in.\n"
541 "Therefore it is not legally redistributable.\n",
544 "%s is free software; you can redistribute it and/or modify\n"
545 "it under the terms of the GNU General Public License as published by\n"
546 "the Free Software Foundation; either version 3 of the License, or\n"
547 "(at your option) any later version.\n"
549 "%s is distributed in the hope that it will be useful,\n"
550 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
551 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
552 "GNU General Public License for more details.\n"
554 "You should have received a copy of the GNU General Public License\n"
555 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
556 program_name, program_name, program_name
558 "%s is free software; you can redistribute it and/or modify\n"
559 "it under the terms of the GNU General Public License as published by\n"
560 "the Free Software Foundation; either version 2 of the License, or\n"
561 "(at your option) any later version.\n"
563 "%s is distributed in the hope that it will be useful,\n"
564 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
565 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
566 "GNU General Public License for more details.\n"
568 "You should have received a copy of the GNU General Public License\n"
569 "along with %s; if not, write to the Free Software\n"
570 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
571 program_name, program_name, program_name
573 "%s is free software; you can redistribute it and/or modify\n"
574 "it under the terms of the GNU Lesser General Public License as published by\n"
575 "the Free Software Foundation; either version 3 of the License, or\n"
576 "(at your option) any later version.\n"
578 "%s is distributed in the hope that it will be useful,\n"
579 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
580 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
581 "GNU Lesser General Public License for more details.\n"
583 "You should have received a copy of the GNU Lesser General Public License\n"
584 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
585 program_name, program_name, program_name
587 "%s is free software; you can redistribute it and/or\n"
588 "modify it under the terms of the GNU Lesser General Public\n"
589 "License as published by the Free Software Foundation; either\n"
590 "version 2.1 of the License, or (at your option) any later version.\n"
592 "%s is distributed in the hope that it will be useful,\n"
593 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
594 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
595 "Lesser General Public License for more details.\n"
597 "You should have received a copy of the GNU Lesser General Public\n"
598 "License along with %s; if not, write to the Free Software\n"
599 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
600 program_name, program_name, program_name
605 void show_formats(void)
607 AVInputFormat *ifmt=NULL;
608 AVOutputFormat *ofmt=NULL;
609 const char *last_name;
613 " D. = Demuxing supported\n"
614 " .E = Muxing supported\n"
620 const char *name=NULL;
621 const char *long_name=NULL;
623 while((ofmt= av_oformat_next(ofmt))) {
624 if((name == NULL || strcmp(ofmt->name, name)<0) &&
625 strcmp(ofmt->name, last_name)>0){
627 long_name= ofmt->long_name;
631 while((ifmt= av_iformat_next(ifmt))) {
632 if((name == NULL || strcmp(ifmt->name, name)<0) &&
633 strcmp(ifmt->name, last_name)>0){
635 long_name= ifmt->long_name;
638 if(name && strcmp(ifmt->name, name)==0)
650 long_name ? long_name:" ");
654 void show_codecs(void)
656 AVCodec *p=NULL, *p2;
657 const char *last_name;
660 " D..... = Decoding supported\n"
661 " .E.... = Encoding supported\n"
662 " ..V... = Video codec\n"
663 " ..A... = Audio codec\n"
664 " ..S... = Subtitle codec\n"
665 " ...S.. = Supports draw_horiz_band\n"
666 " ....D. = Supports direct rendering method 1\n"
667 " .....T = Supports weird frame truncation\n"
674 const char *type_str;
677 while((p= av_codec_next(p))) {
678 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
679 strcmp(p->name, last_name)>0){
681 decode= encode= cap=0;
683 if(p2 && strcmp(p->name, p2->name)==0){
684 if(p->decode) decode=1;
685 if(p->encode) encode=1;
686 cap |= p->capabilities;
694 case AVMEDIA_TYPE_VIDEO:
697 case AVMEDIA_TYPE_AUDIO:
700 case AVMEDIA_TYPE_SUBTITLE:
708 " %s%s%s%s%s%s %-15s %s",
709 decode ? "D": (/*p2->decoder ? "d":*/" "),
712 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
713 cap & CODEC_CAP_DR1 ? "D":" ",
714 cap & CODEC_CAP_TRUNCATED ? "T":" ",
716 p2->long_name ? p2->long_name : "");
717 /* if(p2->decoder && decode==0)
718 printf(" use %s for decoding", p2->decoder->name);*/
723 "Note, the names of encoders and decoders do not always match, so there are\n"
724 "several cases where the above table shows encoder only or decoder only entries\n"
725 "even though both encoding and decoding are supported. For example, the h263\n"
726 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
732 AVBitStreamFilter *bsf=NULL;
734 printf("Bitstream filters:\n");
735 while((bsf = av_bitstream_filter_next(bsf)))
736 printf("%s\n", bsf->name);
740 void show_protocols(void)
742 URLProtocol *up=NULL;
744 printf("Supported file protocols:\n"
745 "I.. = Input supported\n"
746 ".O. = Output supported\n"
747 "..S = Seek supported\n"
750 while((up = av_protocol_next(up)))
751 printf("%c%c%c %s\n",
752 up->url_read ? 'I' : '.',
753 up->url_write ? 'O' : '.',
754 up->url_seek ? 'S' : '.',
758 void show_filters(void)
760 AVFilter av_unused(**filter) = NULL;
762 printf("Filters:\n");
764 while ((filter = av_filter_next(filter)) && *filter)
765 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
769 void show_pix_fmts(void)
771 enum PixelFormat pix_fmt;
775 "I.... = Supported Input format for conversion\n"
776 ".O... = Supported Output format for conversion\n"
777 "..H.. = Hardware accelerated format\n"
778 "...P. = Paletted format\n"
779 "....B = Bitstream format\n"
780 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
784 # define sws_isSupportedInput(x) 0
785 # define sws_isSupportedOutput(x) 0
788 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
789 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
790 printf("%c%c%c%c%c %-16s %d %2d\n",
791 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
792 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
793 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
794 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
795 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
797 pix_desc->nb_components,
798 av_get_bits_per_pixel(pix_desc));
805 int yesno = (toupper(c) == 'Y');
807 while (c != '\n' && c != EOF)
813 int read_file(const char *filename, char **bufptr, size_t *size)
815 FILE *f = fopen(filename, "rb");
818 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
819 return AVERROR(errno);
821 fseek(f, 0, SEEK_END);
823 fseek(f, 0, SEEK_SET);
824 *bufptr = av_malloc(*size + 1);
826 fprintf(stderr, "Could not allocate file buffer\n");
828 return AVERROR(ENOMEM);
830 fread(*bufptr, 1, *size, f);
831 (*bufptr)[*size++] = '\0';
837 FILE *get_preset_file(char *filename, size_t filename_size,
838 const char *preset_name, int is_path, const char *codec_name)
842 const char *base[3]= { getenv("FFMPEG_DATADIR"),
848 av_strlcpy(filename, preset_name, filename_size);
849 f = fopen(filename, "r");
852 char datadir[MAX_PATH], *ls;
855 if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
857 for (ls = datadir; ls < datadir + strlen(datadir); ls++)
858 if (*ls == '\\') *ls = '/';
860 if (ls = strrchr(datadir, '/'))
863 strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
868 for (i = 0; i < 3 && !f; i++) {
871 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name);
872 f = fopen(filename, "r");
873 if (!f && codec_name) {
874 snprintf(filename, filename_size,
875 "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name);
876 f = fopen(filename, "r");
886 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
888 FFSinkContext *priv = ctx->priv;
891 return AVERROR(EINVAL);
892 *priv = *(FFSinkContext *)opaque;
897 static void null_end_frame(AVFilterLink *inlink) { }
899 static int ffsink_query_formats(AVFilterContext *ctx)
901 FFSinkContext *priv = ctx->priv;
902 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
904 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
910 .priv_size = sizeof(FFSinkContext),
913 .query_formats = ffsink_query_formats,
915 .inputs = (AVFilterPad[]) {{ .name = "default",
916 .type = AVMEDIA_TYPE_VIDEO,
917 .end_frame = null_end_frame,
918 .min_perms = AV_PERM_READ, },
920 .outputs = (AVFilterPad[]) {{ .name = NULL }},
923 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
924 AVFilterBufferRef **picref_ptr, AVRational *tb)
927 AVFilterBufferRef *picref;
930 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
932 if (!(picref = ctx->inputs[0]->cur_buf))
933 return AVERROR(ENOENT);
934 *picref_ptr = picref;
935 ctx->inputs[0]->cur_buf = NULL;
936 *tb = ctx->inputs[0]->time_base;
938 memcpy(frame->data, picref->data, sizeof(frame->data));
939 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
940 frame->pkt_pos = picref->pos;
941 frame->interlaced_frame = picref->video->interlaced;
942 frame->top_field_first = picref->video->top_field_first;
943 frame->key_frame = picref->video->key_frame;
944 frame->pict_type = picref->video->pict_type;
945 frame->sample_aspect_ratio = picref->video->sample_aspect_ratio;
950 #endif /* CONFIG_AVFILTER */