]> git.sesse.net Git - ffmpeg/blob - cmdutils.c
af_hdcd: add AVOption to set the CDT period
[ffmpeg] / cmdutils.c
1 /*
2  * Various utilities for command line tools
3  * Copyright (c) 2000-2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21
22 #include <string.h>
23 #include <stdint.h>
24 #include <stdlib.h>
25 #include <errno.h>
26 #include <math.h>
27
28 /* Include only the enabled headers since some compilers (namely, Sun
29    Studio) will not omit unused inline functions and create undefined
30    references to libraries that are not being built. */
31
32 #include "config.h"
33 #include "compat/va_copy.h"
34 #include "libavformat/avformat.h"
35 #include "libavfilter/avfilter.h"
36 #include "libavdevice/avdevice.h"
37 #include "libavresample/avresample.h"
38 #include "libswscale/swscale.h"
39 #include "libswresample/swresample.h"
40 #include "libpostproc/postprocess.h"
41 #include "libavutil/avassert.h"
42 #include "libavutil/avstring.h"
43 #include "libavutil/bprint.h"
44 #include "libavutil/display.h"
45 #include "libavutil/mathematics.h"
46 #include "libavutil/imgutils.h"
47 #include "libavutil/libm.h"
48 #include "libavutil/parseutils.h"
49 #include "libavutil/pixdesc.h"
50 #include "libavutil/eval.h"
51 #include "libavutil/dict.h"
52 #include "libavutil/opt.h"
53 #include "libavutil/cpu.h"
54 #include "libavutil/ffversion.h"
55 #include "libavutil/version.h"
56 #include "cmdutils.h"
57 #if CONFIG_NETWORK
58 #include "libavformat/network.h"
59 #endif
60 #if HAVE_SYS_RESOURCE_H
61 #include <sys/time.h>
62 #include <sys/resource.h>
63 #endif
64
65 static int init_report(const char *env);
66
67 AVDictionary *sws_dict;
68 AVDictionary *swr_opts;
69 AVDictionary *format_opts, *codec_opts, *resample_opts;
70
71 static FILE *report_file;
72 static int report_file_level = AV_LOG_DEBUG;
73 int hide_banner = 0;
74
75 void init_opts(void)
76 {
77     av_dict_set(&sws_dict, "flags", "bicubic", 0);
78 }
79
80 void uninit_opts(void)
81 {
82     av_dict_free(&swr_opts);
83     av_dict_free(&sws_dict);
84     av_dict_free(&format_opts);
85     av_dict_free(&codec_opts);
86     av_dict_free(&resample_opts);
87 }
88
89 void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
90 {
91     vfprintf(stdout, fmt, vl);
92 }
93
94 static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
95 {
96     va_list vl2;
97     char line[1024];
98     static int print_prefix = 1;
99
100     va_copy(vl2, vl);
101     av_log_default_callback(ptr, level, fmt, vl);
102     av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
103     va_end(vl2);
104     if (report_file_level >= level) {
105         fputs(line, report_file);
106         fflush(report_file);
107     }
108 }
109
110 void init_dynload(void)
111 {
112 #ifdef _WIN32
113     /* Calling SetDllDirectory with the empty string (but not NULL) removes the
114      * current working directory from the DLL search path as a security pre-caution. */
115     SetDllDirectory("");
116 #endif
117 }
118
119 static void (*program_exit)(int ret);
120
121 void register_exit(void (*cb)(int ret))
122 {
123     program_exit = cb;
124 }
125
126 void exit_program(int ret)
127 {
128     if (program_exit)
129         program_exit(ret);
130
131     exit(ret);
132 }
133
134 double parse_number_or_die(const char *context, const char *numstr, int type,
135                            double min, double max)
136 {
137     char *tail;
138     const char *error;
139     double d = av_strtod(numstr, &tail);
140     if (*tail)
141         error = "Expected number for %s but found: %s\n";
142     else if (d < min || d > max)
143         error = "The value for %s was %s which is not within %f - %f\n";
144     else if (type == OPT_INT64 && (int64_t)d != d)
145         error = "Expected int64 for %s but found %s\n";
146     else if (type == OPT_INT && (int)d != d)
147         error = "Expected int for %s but found %s\n";
148     else
149         return d;
150     av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
151     exit_program(1);
152     return 0;
153 }
154
155 int64_t parse_time_or_die(const char *context, const char *timestr,
156                           int is_duration)
157 {
158     int64_t us;
159     if (av_parse_time(&us, timestr, is_duration) < 0) {
160         av_log(NULL, AV_LOG_FATAL, "Invalid %s specification for %s: %s\n",
161                is_duration ? "duration" : "date", context, timestr);
162         exit_program(1);
163     }
164     return us;
165 }
166
167 void show_help_options(const OptionDef *options, const char *msg, int req_flags,
168                        int rej_flags, int alt_flags)
169 {
170     const OptionDef *po;
171     int first;
172
173     first = 1;
174     for (po = options; po->name; po++) {
175         char buf[64];
176
177         if (((po->flags & req_flags) != req_flags) ||
178             (alt_flags && !(po->flags & alt_flags)) ||
179             (po->flags & rej_flags))
180             continue;
181
182         if (first) {
183             printf("%s\n", msg);
184             first = 0;
185         }
186         av_strlcpy(buf, po->name, sizeof(buf));
187         if (po->argname) {
188             av_strlcat(buf, " ", sizeof(buf));
189             av_strlcat(buf, po->argname, sizeof(buf));
190         }
191         printf("-%-17s  %s\n", buf, po->help);
192     }
193     printf("\n");
194 }
195
196 void show_help_children(const AVClass *class, int flags)
197 {
198     const AVClass *child = NULL;
199     if (class->option) {
200         av_opt_show2(&class, NULL, flags, 0);
201         printf("\n");
202     }
203
204     while (child = av_opt_child_class_next(class, child))
205         show_help_children(child, flags);
206 }
207
208 static const OptionDef *find_option(const OptionDef *po, const char *name)
209 {
210     const char *p = strchr(name, ':');
211     int len = p ? p - name : strlen(name);
212
213     while (po->name) {
214         if (!strncmp(name, po->name, len) && strlen(po->name) == len)
215             break;
216         po++;
217     }
218     return po;
219 }
220
221 /* _WIN32 means using the windows libc - cygwin doesn't define that
222  * by default. HAVE_COMMANDLINETOARGVW is true on cygwin, while
223  * it doesn't provide the actual command line via GetCommandLineW(). */
224 #if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
225 #include <windows.h>
226 #include <shellapi.h>
227 /* Will be leaked on exit */
228 static char** win32_argv_utf8 = NULL;
229 static int win32_argc = 0;
230
231 /**
232  * Prepare command line arguments for executable.
233  * For Windows - perform wide-char to UTF-8 conversion.
234  * Input arguments should be main() function arguments.
235  * @param argc_ptr Arguments number (including executable)
236  * @param argv_ptr Arguments list.
237  */
238 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
239 {
240     char *argstr_flat;
241     wchar_t **argv_w;
242     int i, buffsize = 0, offset = 0;
243
244     if (win32_argv_utf8) {
245         *argc_ptr = win32_argc;
246         *argv_ptr = win32_argv_utf8;
247         return;
248     }
249
250     win32_argc = 0;
251     argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
252     if (win32_argc <= 0 || !argv_w)
253         return;
254
255     /* determine the UTF-8 buffer size (including NULL-termination symbols) */
256     for (i = 0; i < win32_argc; i++)
257         buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
258                                         NULL, 0, NULL, NULL);
259
260     win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
261     argstr_flat     = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
262     if (!win32_argv_utf8) {
263         LocalFree(argv_w);
264         return;
265     }
266
267     for (i = 0; i < win32_argc; i++) {
268         win32_argv_utf8[i] = &argstr_flat[offset];
269         offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
270                                       &argstr_flat[offset],
271                                       buffsize - offset, NULL, NULL);
272     }
273     win32_argv_utf8[i] = NULL;
274     LocalFree(argv_w);
275
276     *argc_ptr = win32_argc;
277     *argv_ptr = win32_argv_utf8;
278 }
279 #else
280 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
281 {
282     /* nothing to do */
283 }
284 #endif /* HAVE_COMMANDLINETOARGVW */
285
286 static int write_option(void *optctx, const OptionDef *po, const char *opt,
287                         const char *arg)
288 {
289     /* new-style options contain an offset into optctx, old-style address of
290      * a global var*/
291     void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ?
292                 (uint8_t *)optctx + po->u.off : po->u.dst_ptr;
293     int *dstcount;
294
295     if (po->flags & OPT_SPEC) {
296         SpecifierOpt **so = dst;
297         char *p = strchr(opt, ':');
298         char *str;
299
300         dstcount = (int *)(so + 1);
301         *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
302         str = av_strdup(p ? p + 1 : "");
303         if (!str)
304             return AVERROR(ENOMEM);
305         (*so)[*dstcount - 1].specifier = str;
306         dst = &(*so)[*dstcount - 1].u;
307     }
308
309     if (po->flags & OPT_STRING) {
310         char *str;
311         str = av_strdup(arg);
312         av_freep(dst);
313         if (!str)
314             return AVERROR(ENOMEM);
315         *(char **)dst = str;
316     } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
317         *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
318     } else if (po->flags & OPT_INT64) {
319         *(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
320     } else if (po->flags & OPT_TIME) {
321         *(int64_t *)dst = parse_time_or_die(opt, arg, 1);
322     } else if (po->flags & OPT_FLOAT) {
323         *(float *)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
324     } else if (po->flags & OPT_DOUBLE) {
325         *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY);
326     } else if (po->u.func_arg) {
327         int ret = po->u.func_arg(optctx, opt, arg);
328         if (ret < 0) {
329             av_log(NULL, AV_LOG_ERROR,
330                    "Failed to set value '%s' for option '%s': %s\n",
331                    arg, opt, av_err2str(ret));
332             return ret;
333         }
334     }
335     if (po->flags & OPT_EXIT)
336         exit_program(0);
337
338     return 0;
339 }
340
341 int parse_option(void *optctx, const char *opt, const char *arg,
342                  const OptionDef *options)
343 {
344     const OptionDef *po;
345     int ret;
346
347     po = find_option(options, opt);
348     if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
349         /* handle 'no' bool option */
350         po = find_option(options, opt + 2);
351         if ((po->name && (po->flags & OPT_BOOL)))
352             arg = "0";
353     } else if (po->flags & OPT_BOOL)
354         arg = "1";
355
356     if (!po->name)
357         po = find_option(options, "default");
358     if (!po->name) {
359         av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
360         return AVERROR(EINVAL);
361     }
362     if (po->flags & HAS_ARG && !arg) {
363         av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
364         return AVERROR(EINVAL);
365     }
366
367     ret = write_option(optctx, po, opt, arg);
368     if (ret < 0)
369         return ret;
370
371     return !!(po->flags & HAS_ARG);
372 }
373
374 void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
375                    void (*parse_arg_function)(void *, const char*))
376 {
377     const char *opt;
378     int optindex, handleoptions = 1, ret;
379
380     /* perform system-dependent conversions for arguments list */
381     prepare_app_arguments(&argc, &argv);
382
383     /* parse options */
384     optindex = 1;
385     while (optindex < argc) {
386         opt = argv[optindex++];
387
388         if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
389             if (opt[1] == '-' && opt[2] == '\0') {
390                 handleoptions = 0;
391                 continue;
392             }
393             opt++;
394
395             if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
396                 exit_program(1);
397             optindex += ret;
398         } else {
399             if (parse_arg_function)
400                 parse_arg_function(optctx, opt);
401         }
402     }
403 }
404
405 int parse_optgroup(void *optctx, OptionGroup *g)
406 {
407     int i, ret;
408
409     av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
410            g->group_def->name, g->arg);
411
412     for (i = 0; i < g->nb_opts; i++) {
413         Option *o = &g->opts[i];
414
415         if (g->group_def->flags &&
416             !(g->group_def->flags & o->opt->flags)) {
417             av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to "
418                    "%s %s -- you are trying to apply an input option to an "
419                    "output file or vice versa. Move this option before the "
420                    "file it belongs to.\n", o->key, o->opt->help,
421                    g->group_def->name, g->arg);
422             return AVERROR(EINVAL);
423         }
424
425         av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
426                o->key, o->opt->help, o->val);
427
428         ret = write_option(optctx, o->opt, o->key, o->val);
429         if (ret < 0)
430             return ret;
431     }
432
433     av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
434
435     return 0;
436 }
437
438 int locate_option(int argc, char **argv, const OptionDef *options,
439                   const char *optname)
440 {
441     const OptionDef *po;
442     int i;
443
444     for (i = 1; i < argc; i++) {
445         const char *cur_opt = argv[i];
446
447         if (*cur_opt++ != '-')
448             continue;
449
450         po = find_option(options, cur_opt);
451         if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
452             po = find_option(options, cur_opt + 2);
453
454         if ((!po->name && !strcmp(cur_opt, optname)) ||
455              (po->name && !strcmp(optname, po->name)))
456             return i;
457
458         if (!po->name || po->flags & HAS_ARG)
459             i++;
460     }
461     return 0;
462 }
463
464 static void dump_argument(const char *a)
465 {
466     const unsigned char *p;
467
468     for (p = a; *p; p++)
469         if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
470               *p == '_' || (*p >= 'a' && *p <= 'z')))
471             break;
472     if (!*p) {
473         fputs(a, report_file);
474         return;
475     }
476     fputc('"', report_file);
477     for (p = a; *p; p++) {
478         if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
479             fprintf(report_file, "\\%c", *p);
480         else if (*p < ' ' || *p > '~')
481             fprintf(report_file, "\\x%02x", *p);
482         else
483             fputc(*p, report_file);
484     }
485     fputc('"', report_file);
486 }
487
488 static void check_options(const OptionDef *po)
489 {
490     while (po->name) {
491         if (po->flags & OPT_PERFILE)
492             av_assert0(po->flags & (OPT_INPUT | OPT_OUTPUT));
493         po++;
494     }
495 }
496
497 void parse_loglevel(int argc, char **argv, const OptionDef *options)
498 {
499     int idx = locate_option(argc, argv, options, "loglevel");
500     const char *env;
501
502     check_options(options);
503
504     if (!idx)
505         idx = locate_option(argc, argv, options, "v");
506     if (idx && argv[idx + 1])
507         opt_loglevel(NULL, "loglevel", argv[idx + 1]);
508     idx = locate_option(argc, argv, options, "report");
509     if ((env = getenv("FFREPORT")) || idx) {
510         init_report(env);
511         if (report_file) {
512             int i;
513             fprintf(report_file, "Command line:\n");
514             for (i = 0; i < argc; i++) {
515                 dump_argument(argv[i]);
516                 fputc(i < argc - 1 ? ' ' : '\n', report_file);
517             }
518             fflush(report_file);
519         }
520     }
521     idx = locate_option(argc, argv, options, "hide_banner");
522     if (idx)
523         hide_banner = 1;
524 }
525
526 static const AVOption *opt_find(void *obj, const char *name, const char *unit,
527                             int opt_flags, int search_flags)
528 {
529     const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags);
530     if(o && !o->flags)
531         return NULL;
532     return o;
533 }
534
535 #define FLAGS (o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0
536 int opt_default(void *optctx, const char *opt, const char *arg)
537 {
538     const AVOption *o;
539     int consumed = 0;
540     char opt_stripped[128];
541     const char *p;
542     const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
543 #if CONFIG_AVRESAMPLE
544     const AVClass *rc = avresample_get_class();
545 #endif
546 #if CONFIG_SWSCALE
547     const AVClass *sc = sws_get_class();
548 #endif
549 #if CONFIG_SWRESAMPLE
550     const AVClass *swr_class = swr_get_class();
551 #endif
552
553     if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
554         av_log_set_level(AV_LOG_DEBUG);
555
556     if (!(p = strchr(opt, ':')))
557         p = opt + strlen(opt);
558     av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
559
560     if ((o = opt_find(&cc, opt_stripped, NULL, 0,
561                          AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) ||
562         ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
563          (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
564         av_dict_set(&codec_opts, opt, arg, FLAGS);
565         consumed = 1;
566     }
567     if ((o = opt_find(&fc, opt, NULL, 0,
568                          AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
569         av_dict_set(&format_opts, opt, arg, FLAGS);
570         if (consumed)
571             av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
572         consumed = 1;
573     }
574 #if CONFIG_SWSCALE
575     if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
576                          AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
577         struct SwsContext *sws = sws_alloc_context();
578         int ret = av_opt_set(sws, opt, arg, 0);
579         sws_freeContext(sws);
580         if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
581             !strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
582             !strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) {
583             av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n");
584             return AVERROR(EINVAL);
585         }
586         if (ret < 0) {
587             av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
588             return ret;
589         }
590
591         av_dict_set(&sws_dict, opt, arg, FLAGS);
592
593         consumed = 1;
594     }
595 #else
596     if (!consumed && !strcmp(opt, "sws_flags")) {
597         av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg);
598         consumed = 1;
599     }
600 #endif
601 #if CONFIG_SWRESAMPLE
602     if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
603                                     AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
604         struct SwrContext *swr = swr_alloc();
605         int ret = av_opt_set(swr, opt, arg, 0);
606         swr_free(&swr);
607         if (ret < 0) {
608             av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
609             return ret;
610         }
611         av_dict_set(&swr_opts, opt, arg, FLAGS);
612         consumed = 1;
613     }
614 #endif
615 #if CONFIG_AVRESAMPLE
616     if ((o=opt_find(&rc, opt, NULL, 0,
617                        AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
618         av_dict_set(&resample_opts, opt, arg, FLAGS);
619         consumed = 1;
620     }
621 #endif
622
623     if (consumed)
624         return 0;
625     return AVERROR_OPTION_NOT_FOUND;
626 }
627
628 /*
629  * Check whether given option is a group separator.
630  *
631  * @return index of the group definition that matched or -1 if none
632  */
633 static int match_group_separator(const OptionGroupDef *groups, int nb_groups,
634                                  const char *opt)
635 {
636     int i;
637
638     for (i = 0; i < nb_groups; i++) {
639         const OptionGroupDef *p = &groups[i];
640         if (p->sep && !strcmp(p->sep, opt))
641             return i;
642     }
643
644     return -1;
645 }
646
647 /*
648  * Finish parsing an option group.
649  *
650  * @param group_idx which group definition should this group belong to
651  * @param arg argument of the group delimiting option
652  */
653 static void finish_group(OptionParseContext *octx, int group_idx,
654                          const char *arg)
655 {
656     OptionGroupList *l = &octx->groups[group_idx];
657     OptionGroup *g;
658
659     GROW_ARRAY(l->groups, l->nb_groups);
660     g = &l->groups[l->nb_groups - 1];
661
662     *g             = octx->cur_group;
663     g->arg         = arg;
664     g->group_def   = l->group_def;
665     g->sws_dict    = sws_dict;
666     g->swr_opts    = swr_opts;
667     g->codec_opts  = codec_opts;
668     g->format_opts = format_opts;
669     g->resample_opts = resample_opts;
670
671     codec_opts  = NULL;
672     format_opts = NULL;
673     resample_opts = NULL;
674     sws_dict    = NULL;
675     swr_opts    = NULL;
676     init_opts();
677
678     memset(&octx->cur_group, 0, sizeof(octx->cur_group));
679 }
680
681 /*
682  * Add an option instance to currently parsed group.
683  */
684 static void add_opt(OptionParseContext *octx, const OptionDef *opt,
685                     const char *key, const char *val)
686 {
687     int global = !(opt->flags & (OPT_PERFILE | OPT_SPEC | OPT_OFFSET));
688     OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
689
690     GROW_ARRAY(g->opts, g->nb_opts);
691     g->opts[g->nb_opts - 1].opt = opt;
692     g->opts[g->nb_opts - 1].key = key;
693     g->opts[g->nb_opts - 1].val = val;
694 }
695
696 static void init_parse_context(OptionParseContext *octx,
697                                const OptionGroupDef *groups, int nb_groups)
698 {
699     static const OptionGroupDef global_group = { "global" };
700     int i;
701
702     memset(octx, 0, sizeof(*octx));
703
704     octx->nb_groups = nb_groups;
705     octx->groups    = av_mallocz_array(octx->nb_groups, sizeof(*octx->groups));
706     if (!octx->groups)
707         exit_program(1);
708
709     for (i = 0; i < octx->nb_groups; i++)
710         octx->groups[i].group_def = &groups[i];
711
712     octx->global_opts.group_def = &global_group;
713     octx->global_opts.arg       = "";
714
715     init_opts();
716 }
717
718 void uninit_parse_context(OptionParseContext *octx)
719 {
720     int i, j;
721
722     for (i = 0; i < octx->nb_groups; i++) {
723         OptionGroupList *l = &octx->groups[i];
724
725         for (j = 0; j < l->nb_groups; j++) {
726             av_freep(&l->groups[j].opts);
727             av_dict_free(&l->groups[j].codec_opts);
728             av_dict_free(&l->groups[j].format_opts);
729             av_dict_free(&l->groups[j].resample_opts);
730
731             av_dict_free(&l->groups[j].sws_dict);
732             av_dict_free(&l->groups[j].swr_opts);
733         }
734         av_freep(&l->groups);
735     }
736     av_freep(&octx->groups);
737
738     av_freep(&octx->cur_group.opts);
739     av_freep(&octx->global_opts.opts);
740
741     uninit_opts();
742 }
743
744 int split_commandline(OptionParseContext *octx, int argc, char *argv[],
745                       const OptionDef *options,
746                       const OptionGroupDef *groups, int nb_groups)
747 {
748     int optindex = 1;
749     int dashdash = -2;
750
751     /* perform system-dependent conversions for arguments list */
752     prepare_app_arguments(&argc, &argv);
753
754     init_parse_context(octx, groups, nb_groups);
755     av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
756
757     while (optindex < argc) {
758         const char *opt = argv[optindex++], *arg;
759         const OptionDef *po;
760         int ret;
761
762         av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
763
764         if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
765             dashdash = optindex;
766             continue;
767         }
768         /* unnamed group separators, e.g. output filename */
769         if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
770             finish_group(octx, 0, opt);
771             av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
772             continue;
773         }
774         opt++;
775
776 #define GET_ARG(arg)                                                           \
777 do {                                                                           \
778     arg = argv[optindex++];                                                    \
779     if (!arg) {                                                                \
780         av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
781         return AVERROR(EINVAL);                                                \
782     }                                                                          \
783 } while (0)
784
785         /* named group separators, e.g. -i */
786         if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) {
787             GET_ARG(arg);
788             finish_group(octx, ret, arg);
789             av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
790                    groups[ret].name, arg);
791             continue;
792         }
793
794         /* normal options */
795         po = find_option(options, opt);
796         if (po->name) {
797             if (po->flags & OPT_EXIT) {
798                 /* optional argument, e.g. -h */
799                 arg = argv[optindex++];
800             } else if (po->flags & HAS_ARG) {
801                 GET_ARG(arg);
802             } else {
803                 arg = "1";
804             }
805
806             add_opt(octx, po, opt, arg);
807             av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
808                    "argument '%s'.\n", po->name, po->help, arg);
809             continue;
810         }
811
812         /* AVOptions */
813         if (argv[optindex]) {
814             ret = opt_default(NULL, opt, argv[optindex]);
815             if (ret >= 0) {
816                 av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
817                        "argument '%s'.\n", opt, argv[optindex]);
818                 optindex++;
819                 continue;
820             } else if (ret != AVERROR_OPTION_NOT_FOUND) {
821                 av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' "
822                        "with argument '%s'.\n", opt, argv[optindex]);
823                 return ret;
824             }
825         }
826
827         /* boolean -nofoo options */
828         if (opt[0] == 'n' && opt[1] == 'o' &&
829             (po = find_option(options, opt + 2)) &&
830             po->name && po->flags & OPT_BOOL) {
831             add_opt(octx, po, opt, "0");
832             av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
833                    "argument 0.\n", po->name, po->help);
834             continue;
835         }
836
837         av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt);
838         return AVERROR_OPTION_NOT_FOUND;
839     }
840
841     if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
842         av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
843                "commandline.\n");
844
845     av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
846
847     return 0;
848 }
849
850 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
851 {
852     int ret;
853     unsigned flags = av_get_cpu_flags();
854
855     if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
856         return ret;
857
858     av_force_cpu_flags(flags);
859     return 0;
860 }
861
862 int opt_loglevel(void *optctx, const char *opt, const char *arg)
863 {
864     const struct { const char *name; int level; } log_levels[] = {
865         { "quiet"  , AV_LOG_QUIET   },
866         { "panic"  , AV_LOG_PANIC   },
867         { "fatal"  , AV_LOG_FATAL   },
868         { "error"  , AV_LOG_ERROR   },
869         { "warning", AV_LOG_WARNING },
870         { "info"   , AV_LOG_INFO    },
871         { "verbose", AV_LOG_VERBOSE },
872         { "debug"  , AV_LOG_DEBUG   },
873         { "trace"  , AV_LOG_TRACE   },
874     };
875     char *tail;
876     int level;
877     int flags;
878     int i;
879
880     flags = av_log_get_flags();
881     tail = strstr(arg, "repeat");
882     if (tail)
883         flags &= ~AV_LOG_SKIP_REPEATED;
884     else
885         flags |= AV_LOG_SKIP_REPEATED;
886
887     av_log_set_flags(flags);
888     if (tail == arg)
889         arg += 6 + (arg[6]=='+');
890     if(tail && !*arg)
891         return 0;
892
893     for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
894         if (!strcmp(log_levels[i].name, arg)) {
895             av_log_set_level(log_levels[i].level);
896             return 0;
897         }
898     }
899
900     level = strtol(arg, &tail, 10);
901     if (*tail) {
902         av_log(NULL, AV_LOG_FATAL, "Invalid loglevel \"%s\". "
903                "Possible levels are numbers or:\n", arg);
904         for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
905             av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
906         exit_program(1);
907     }
908     av_log_set_level(level);
909     return 0;
910 }
911
912 static void expand_filename_template(AVBPrint *bp, const char *template,
913                                      struct tm *tm)
914 {
915     int c;
916
917     while ((c = *(template++))) {
918         if (c == '%') {
919             if (!(c = *(template++)))
920                 break;
921             switch (c) {
922             case 'p':
923                 av_bprintf(bp, "%s", program_name);
924                 break;
925             case 't':
926                 av_bprintf(bp, "%04d%02d%02d-%02d%02d%02d",
927                            tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
928                            tm->tm_hour, tm->tm_min, tm->tm_sec);
929                 break;
930             case '%':
931                 av_bprint_chars(bp, c, 1);
932                 break;
933             }
934         } else {
935             av_bprint_chars(bp, c, 1);
936         }
937     }
938 }
939
940 static int init_report(const char *env)
941 {
942     char *filename_template = NULL;
943     char *key, *val;
944     int ret, count = 0;
945     time_t now;
946     struct tm *tm;
947     AVBPrint filename;
948
949     if (report_file) /* already opened */
950         return 0;
951     time(&now);
952     tm = localtime(&now);
953
954     while (env && *env) {
955         if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) {
956             if (count)
957                 av_log(NULL, AV_LOG_ERROR,
958                        "Failed to parse FFREPORT environment variable: %s\n",
959                        av_err2str(ret));
960             break;
961         }
962         if (*env)
963             env++;
964         count++;
965         if (!strcmp(key, "file")) {
966             av_free(filename_template);
967             filename_template = val;
968             val = NULL;
969         } else if (!strcmp(key, "level")) {
970             char *tail;
971             report_file_level = strtol(val, &tail, 10);
972             if (*tail) {
973                 av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n");
974                 exit_program(1);
975             }
976         } else {
977             av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
978         }
979         av_free(val);
980         av_free(key);
981     }
982
983     av_bprint_init(&filename, 0, 1);
984     expand_filename_template(&filename,
985                              av_x_if_null(filename_template, "%p-%t.log"), tm);
986     av_free(filename_template);
987     if (!av_bprint_is_complete(&filename)) {
988         av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n");
989         return AVERROR(ENOMEM);
990     }
991
992     report_file = fopen(filename.str, "w");
993     if (!report_file) {
994         int ret = AVERROR(errno);
995         av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
996                filename.str, strerror(errno));
997         return ret;
998     }
999     av_log_set_callback(log_callback_report);
1000     av_log(NULL, AV_LOG_INFO,
1001            "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
1002            "Report written to \"%s\"\n",
1003            program_name,
1004            tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
1005            tm->tm_hour, tm->tm_min, tm->tm_sec,
1006            filename.str);
1007     av_bprint_finalize(&filename, NULL);
1008     return 0;
1009 }
1010
1011 int opt_report(const char *opt)
1012 {
1013     return init_report(NULL);
1014 }
1015
1016 int opt_max_alloc(void *optctx, const char *opt, const char *arg)
1017 {
1018     char *tail;
1019     size_t max;
1020
1021     max = strtol(arg, &tail, 10);
1022     if (*tail) {
1023         av_log(NULL, AV_LOG_FATAL, "Invalid max_alloc \"%s\".\n", arg);
1024         exit_program(1);
1025     }
1026     av_max_alloc(max);
1027     return 0;
1028 }
1029
1030 int opt_timelimit(void *optctx, const char *opt, const char *arg)
1031 {
1032 #if HAVE_SETRLIMIT
1033     int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
1034     struct rlimit rl = { lim, lim + 1 };
1035     if (setrlimit(RLIMIT_CPU, &rl))
1036         perror("setrlimit");
1037 #else
1038     av_log(NULL, AV_LOG_WARNING, "-%s not implemented on this OS\n", opt);
1039 #endif
1040     return 0;
1041 }
1042
1043 void print_error(const char *filename, int err)
1044 {
1045     char errbuf[128];
1046     const char *errbuf_ptr = errbuf;
1047
1048     if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
1049         errbuf_ptr = strerror(AVUNERROR(err));
1050     av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr);
1051 }
1052
1053 static int warned_cfg = 0;
1054
1055 #define INDENT        1
1056 #define SHOW_VERSION  2
1057 #define SHOW_CONFIG   4
1058 #define SHOW_COPYRIGHT 8
1059
1060 #define PRINT_LIB_INFO(libname, LIBNAME, flags, level)                  \
1061     if (CONFIG_##LIBNAME) {                                             \
1062         const char *indent = flags & INDENT? "  " : "";                 \
1063         if (flags & SHOW_VERSION) {                                     \
1064             unsigned int version = libname##_version();                 \
1065             av_log(NULL, level,                                         \
1066                    "%slib%-11s %2d.%3d.%3d / %2d.%3d.%3d\n",            \
1067                    indent, #libname,                                    \
1068                    LIB##LIBNAME##_VERSION_MAJOR,                        \
1069                    LIB##LIBNAME##_VERSION_MINOR,                        \
1070                    LIB##LIBNAME##_VERSION_MICRO,                        \
1071                    AV_VERSION_MAJOR(version), AV_VERSION_MINOR(version),\
1072                    AV_VERSION_MICRO(version));                          \
1073         }                                                               \
1074         if (flags & SHOW_CONFIG) {                                      \
1075             const char *cfg = libname##_configuration();                \
1076             if (strcmp(FFMPEG_CONFIGURATION, cfg)) {                    \
1077                 if (!warned_cfg) {                                      \
1078                     av_log(NULL, level,                                 \
1079                             "%sWARNING: library configuration mismatch\n", \
1080                             indent);                                    \
1081                     warned_cfg = 1;                                     \
1082                 }                                                       \
1083                 av_log(NULL, level, "%s%-11s configuration: %s\n",      \
1084                         indent, #libname, cfg);                         \
1085             }                                                           \
1086         }                                                               \
1087     }                                                                   \
1088
1089 static void print_all_libs_info(int flags, int level)
1090 {
1091     PRINT_LIB_INFO(avutil,     AVUTIL,     flags, level);
1092     PRINT_LIB_INFO(avcodec,    AVCODEC,    flags, level);
1093     PRINT_LIB_INFO(avformat,   AVFORMAT,   flags, level);
1094     PRINT_LIB_INFO(avdevice,   AVDEVICE,   flags, level);
1095     PRINT_LIB_INFO(avfilter,   AVFILTER,   flags, level);
1096     PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
1097     PRINT_LIB_INFO(swscale,    SWSCALE,    flags, level);
1098     PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
1099     PRINT_LIB_INFO(postproc,   POSTPROC,   flags, level);
1100 }
1101
1102 static void print_program_info(int flags, int level)
1103 {
1104     const char *indent = flags & INDENT? "  " : "";
1105
1106     av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);
1107     if (flags & SHOW_COPYRIGHT)
1108         av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
1109                program_birth_year, CONFIG_THIS_YEAR);
1110     av_log(NULL, level, "\n");
1111     av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
1112
1113     av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
1114 }
1115
1116 static void print_buildconf(int flags, int level)
1117 {
1118     const char *indent = flags & INDENT ? "  " : "";
1119     char str[] = { FFMPEG_CONFIGURATION };
1120     char *conflist, *remove_tilde, *splitconf;
1121
1122     // Change all the ' --' strings to '~--' so that
1123     // they can be identified as tokens.
1124     while ((conflist = strstr(str, " --")) != NULL) {
1125         strncpy(conflist, "~--", 3);
1126     }
1127
1128     // Compensate for the weirdness this would cause
1129     // when passing 'pkg-config --static'.
1130     while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) {
1131         strncpy(remove_tilde, "pkg-config ", 11);
1132     }
1133
1134     splitconf = strtok(str, "~");
1135     av_log(NULL, level, "\n%sconfiguration:\n", indent);
1136     while (splitconf != NULL) {
1137         av_log(NULL, level, "%s%s%s\n", indent, indent, splitconf);
1138         splitconf = strtok(NULL, "~");
1139     }
1140 }
1141
1142 void show_banner(int argc, char **argv, const OptionDef *options)
1143 {
1144     int idx = locate_option(argc, argv, options, "version");
1145     if (hide_banner || idx)
1146         return;
1147
1148     print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);
1149     print_all_libs_info(INDENT|SHOW_CONFIG,  AV_LOG_INFO);
1150     print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO);
1151 }
1152
1153 int show_version(void *optctx, const char *opt, const char *arg)
1154 {
1155     av_log_set_callback(log_callback_help);
1156     print_program_info (SHOW_COPYRIGHT, AV_LOG_INFO);
1157     print_all_libs_info(SHOW_VERSION, AV_LOG_INFO);
1158
1159     return 0;
1160 }
1161
1162 int show_buildconf(void *optctx, const char *opt, const char *arg)
1163 {
1164     av_log_set_callback(log_callback_help);
1165     print_buildconf      (INDENT|0, AV_LOG_INFO);
1166
1167     return 0;
1168 }
1169
1170 int show_license(void *optctx, const char *opt, const char *arg)
1171 {
1172 #if CONFIG_NONFREE
1173     printf(
1174     "This version of %s has nonfree parts compiled in.\n"
1175     "Therefore it is not legally redistributable.\n",
1176     program_name );
1177 #elif CONFIG_GPLV3
1178     printf(
1179     "%s is free software; you can redistribute it and/or modify\n"
1180     "it under the terms of the GNU General Public License as published by\n"
1181     "the Free Software Foundation; either version 3 of the License, or\n"
1182     "(at your option) any later version.\n"
1183     "\n"
1184     "%s is distributed in the hope that it will be useful,\n"
1185     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1186     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
1187     "GNU General Public License for more details.\n"
1188     "\n"
1189     "You should have received a copy of the GNU General Public License\n"
1190     "along with %s.  If not, see <http://www.gnu.org/licenses/>.\n",
1191     program_name, program_name, program_name );
1192 #elif CONFIG_GPL
1193     printf(
1194     "%s is free software; you can redistribute it and/or modify\n"
1195     "it under the terms of the GNU General Public License as published by\n"
1196     "the Free Software Foundation; either version 2 of the License, or\n"
1197     "(at your option) any later version.\n"
1198     "\n"
1199     "%s is distributed in the hope that it will be useful,\n"
1200     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1201     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
1202     "GNU General Public License for more details.\n"
1203     "\n"
1204     "You should have received a copy of the GNU General Public License\n"
1205     "along with %s; if not, write to the Free Software\n"
1206     "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
1207     program_name, program_name, program_name );
1208 #elif CONFIG_LGPLV3
1209     printf(
1210     "%s is free software; you can redistribute it and/or modify\n"
1211     "it under the terms of the GNU Lesser General Public License as published by\n"
1212     "the Free Software Foundation; either version 3 of the License, or\n"
1213     "(at your option) any later version.\n"
1214     "\n"
1215     "%s is distributed in the hope that it will be useful,\n"
1216     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1217     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
1218     "GNU Lesser General Public License for more details.\n"
1219     "\n"
1220     "You should have received a copy of the GNU Lesser General Public License\n"
1221     "along with %s.  If not, see <http://www.gnu.org/licenses/>.\n",
1222     program_name, program_name, program_name );
1223 #else
1224     printf(
1225     "%s is free software; you can redistribute it and/or\n"
1226     "modify it under the terms of the GNU Lesser General Public\n"
1227     "License as published by the Free Software Foundation; either\n"
1228     "version 2.1 of the License, or (at your option) any later version.\n"
1229     "\n"
1230     "%s is distributed in the hope that it will be useful,\n"
1231     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1232     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
1233     "Lesser General Public License for more details.\n"
1234     "\n"
1235     "You should have received a copy of the GNU Lesser General Public\n"
1236     "License along with %s; if not, write to the Free Software\n"
1237     "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
1238     program_name, program_name, program_name );
1239 #endif
1240
1241     return 0;
1242 }
1243
1244 static int is_device(const AVClass *avclass)
1245 {
1246     if (!avclass)
1247         return 0;
1248     return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category);
1249 }
1250
1251 static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only)
1252 {
1253     AVInputFormat *ifmt  = NULL;
1254     AVOutputFormat *ofmt = NULL;
1255     const char *last_name;
1256     int is_dev;
1257
1258     printf("%s\n"
1259            " D. = Demuxing supported\n"
1260            " .E = Muxing supported\n"
1261            " --\n", device_only ? "Devices:" : "File formats:");
1262     last_name = "000";
1263     for (;;) {
1264         int decode = 0;
1265         int encode = 0;
1266         const char *name      = NULL;
1267         const char *long_name = NULL;
1268
1269         while ((ofmt = av_oformat_next(ofmt))) {
1270             is_dev = is_device(ofmt->priv_class);
1271             if (!is_dev && device_only)
1272                 continue;
1273             if ((!name || strcmp(ofmt->name, name) < 0) &&
1274                 strcmp(ofmt->name, last_name) > 0) {
1275                 name      = ofmt->name;
1276                 long_name = ofmt->long_name;
1277                 encode    = 1;
1278             }
1279         }
1280         while ((ifmt = av_iformat_next(ifmt))) {
1281             is_dev = is_device(ifmt->priv_class);
1282             if (!is_dev && device_only)
1283                 continue;
1284             if ((!name || strcmp(ifmt->name, name) < 0) &&
1285                 strcmp(ifmt->name, last_name) > 0) {
1286                 name      = ifmt->name;
1287                 long_name = ifmt->long_name;
1288                 encode    = 0;
1289             }
1290             if (name && strcmp(ifmt->name, name) == 0)
1291                 decode = 1;
1292         }
1293         if (!name)
1294             break;
1295         last_name = name;
1296
1297         printf(" %s%s %-15s %s\n",
1298                decode ? "D" : " ",
1299                encode ? "E" : " ",
1300                name,
1301             long_name ? long_name:" ");
1302     }
1303     return 0;
1304 }
1305
1306 int show_formats(void *optctx, const char *opt, const char *arg)
1307 {
1308     return show_formats_devices(optctx, opt, arg, 0);
1309 }
1310
1311 int show_devices(void *optctx, const char *opt, const char *arg)
1312 {
1313     return show_formats_devices(optctx, opt, arg, 1);
1314 }
1315
1316 #define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
1317     if (codec->field) {                                                      \
1318         const type *p = codec->field;                                        \
1319                                                                              \
1320         printf("    Supported " list_name ":");                              \
1321         while (*p != term) {                                                 \
1322             get_name(*p);                                                    \
1323             printf(" %s", name);                                             \
1324             p++;                                                             \
1325         }                                                                    \
1326         printf("\n");                                                        \
1327     }                                                                        \
1328
1329 static void print_codec(const AVCodec *c)
1330 {
1331     int encoder = av_codec_is_encoder(c);
1332
1333     printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
1334            c->long_name ? c->long_name : "");
1335
1336     printf("    General capabilities: ");
1337     if (c->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)
1338         printf("horizband ");
1339     if (c->capabilities & AV_CODEC_CAP_DR1)
1340         printf("dr1 ");
1341     if (c->capabilities & AV_CODEC_CAP_TRUNCATED)
1342         printf("trunc ");
1343     if (c->capabilities & AV_CODEC_CAP_DELAY)
1344         printf("delay ");
1345     if (c->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME)
1346         printf("small ");
1347     if (c->capabilities & AV_CODEC_CAP_SUBFRAMES)
1348         printf("subframes ");
1349     if (c->capabilities & AV_CODEC_CAP_EXPERIMENTAL)
1350         printf("exp ");
1351     if (c->capabilities & AV_CODEC_CAP_CHANNEL_CONF)
1352         printf("chconf ");
1353     if (c->capabilities & AV_CODEC_CAP_PARAM_CHANGE)
1354         printf("paramchange ");
1355     if (c->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
1356         printf("variable ");
1357     if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
1358                            AV_CODEC_CAP_SLICE_THREADS |
1359                            AV_CODEC_CAP_AUTO_THREADS))
1360         printf("threads ");
1361     if (!c->capabilities)
1362         printf("none");
1363     printf("\n");
1364
1365     if (c->type == AVMEDIA_TYPE_VIDEO ||
1366         c->type == AVMEDIA_TYPE_AUDIO) {
1367         printf("    Threading capabilities: ");
1368         switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
1369                                    AV_CODEC_CAP_SLICE_THREADS |
1370                                    AV_CODEC_CAP_AUTO_THREADS)) {
1371         case AV_CODEC_CAP_FRAME_THREADS |
1372              AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
1373         case AV_CODEC_CAP_FRAME_THREADS: printf("frame");           break;
1374         case AV_CODEC_CAP_SLICE_THREADS: printf("slice");           break;
1375         case AV_CODEC_CAP_AUTO_THREADS : printf("auto");            break;
1376         default:                         printf("none");            break;
1377         }
1378         printf("\n");
1379     }
1380
1381     if (c->supported_framerates) {
1382         const AVRational *fps = c->supported_framerates;
1383
1384         printf("    Supported framerates:");
1385         while (fps->num) {
1386             printf(" %d/%d", fps->num, fps->den);
1387             fps++;
1388         }
1389         printf("\n");
1390     }
1391     PRINT_CODEC_SUPPORTED(c, pix_fmts, enum AVPixelFormat, "pixel formats",
1392                           AV_PIX_FMT_NONE, GET_PIX_FMT_NAME);
1393     PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0,
1394                           GET_SAMPLE_RATE_NAME);
1395     PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats",
1396                           AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME);
1397     PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts",
1398                           0, GET_CH_LAYOUT_DESC);
1399
1400     if (c->priv_class) {
1401         show_help_children(c->priv_class,
1402                            AV_OPT_FLAG_ENCODING_PARAM |
1403                            AV_OPT_FLAG_DECODING_PARAM);
1404     }
1405 }
1406
1407 static char get_media_type_char(enum AVMediaType type)
1408 {
1409     switch (type) {
1410         case AVMEDIA_TYPE_VIDEO:    return 'V';
1411         case AVMEDIA_TYPE_AUDIO:    return 'A';
1412         case AVMEDIA_TYPE_DATA:     return 'D';
1413         case AVMEDIA_TYPE_SUBTITLE: return 'S';
1414         case AVMEDIA_TYPE_ATTACHMENT:return 'T';
1415         default:                    return '?';
1416     }
1417 }
1418
1419 static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev,
1420                                         int encoder)
1421 {
1422     while ((prev = av_codec_next(prev))) {
1423         if (prev->id == id &&
1424             (encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev)))
1425             return prev;
1426     }
1427     return NULL;
1428 }
1429
1430 static int compare_codec_desc(const void *a, const void *b)
1431 {
1432     const AVCodecDescriptor * const *da = a;
1433     const AVCodecDescriptor * const *db = b;
1434
1435     return (*da)->type != (*db)->type ? FFDIFFSIGN((*da)->type, (*db)->type) :
1436            strcmp((*da)->name, (*db)->name);
1437 }
1438
1439 static unsigned get_codecs_sorted(const AVCodecDescriptor ***rcodecs)
1440 {
1441     const AVCodecDescriptor *desc = NULL;
1442     const AVCodecDescriptor **codecs;
1443     unsigned nb_codecs = 0, i = 0;
1444
1445     while ((desc = avcodec_descriptor_next(desc)))
1446         nb_codecs++;
1447     if (!(codecs = av_calloc(nb_codecs, sizeof(*codecs)))) {
1448         av_log(NULL, AV_LOG_ERROR, "Out of memory\n");
1449         exit_program(1);
1450     }
1451     desc = NULL;
1452     while ((desc = avcodec_descriptor_next(desc)))
1453         codecs[i++] = desc;
1454     av_assert0(i == nb_codecs);
1455     qsort(codecs, nb_codecs, sizeof(*codecs), compare_codec_desc);
1456     *rcodecs = codecs;
1457     return nb_codecs;
1458 }
1459
1460 static void print_codecs_for_id(enum AVCodecID id, int encoder)
1461 {
1462     const AVCodec *codec = NULL;
1463
1464     printf(" (%s: ", encoder ? "encoders" : "decoders");
1465
1466     while ((codec = next_codec_for_id(id, codec, encoder)))
1467         printf("%s ", codec->name);
1468
1469     printf(")");
1470 }
1471
1472 int show_codecs(void *optctx, const char *opt, const char *arg)
1473 {
1474     const AVCodecDescriptor **codecs;
1475     unsigned i, nb_codecs = get_codecs_sorted(&codecs);
1476
1477     printf("Codecs:\n"
1478            " D..... = Decoding supported\n"
1479            " .E.... = Encoding supported\n"
1480            " ..V... = Video codec\n"
1481            " ..A... = Audio codec\n"
1482            " ..S... = Subtitle codec\n"
1483            " ...I.. = Intra frame-only codec\n"
1484            " ....L. = Lossy compression\n"
1485            " .....S = Lossless compression\n"
1486            " -------\n");
1487     for (i = 0; i < nb_codecs; i++) {
1488         const AVCodecDescriptor *desc = codecs[i];
1489         const AVCodec *codec = NULL;
1490
1491         if (strstr(desc->name, "_deprecated"))
1492             continue;
1493
1494         printf(" ");
1495         printf(avcodec_find_decoder(desc->id) ? "D" : ".");
1496         printf(avcodec_find_encoder(desc->id) ? "E" : ".");
1497
1498         printf("%c", get_media_type_char(desc->type));
1499         printf((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : ".");
1500         printf((desc->props & AV_CODEC_PROP_LOSSY)      ? "L" : ".");
1501         printf((desc->props & AV_CODEC_PROP_LOSSLESS)   ? "S" : ".");
1502
1503         printf(" %-20s %s", desc->name, desc->long_name ? desc->long_name : "");
1504
1505         /* print decoders/encoders when there's more than one or their
1506          * names are different from codec name */
1507         while ((codec = next_codec_for_id(desc->id, codec, 0))) {
1508             if (strcmp(codec->name, desc->name)) {
1509                 print_codecs_for_id(desc->id, 0);
1510                 break;
1511             }
1512         }
1513         codec = NULL;
1514         while ((codec = next_codec_for_id(desc->id, codec, 1))) {
1515             if (strcmp(codec->name, desc->name)) {
1516                 print_codecs_for_id(desc->id, 1);
1517                 break;
1518             }
1519         }
1520
1521         printf("\n");
1522     }
1523     av_free(codecs);
1524     return 0;
1525 }
1526
1527 static void print_codecs(int encoder)
1528 {
1529     const AVCodecDescriptor **codecs;
1530     unsigned i, nb_codecs = get_codecs_sorted(&codecs);
1531
1532     printf("%s:\n"
1533            " V..... = Video\n"
1534            " A..... = Audio\n"
1535            " S..... = Subtitle\n"
1536            " .F.... = Frame-level multithreading\n"
1537            " ..S... = Slice-level multithreading\n"
1538            " ...X.. = Codec is experimental\n"
1539            " ....B. = Supports draw_horiz_band\n"
1540            " .....D = Supports direct rendering method 1\n"
1541            " ------\n",
1542            encoder ? "Encoders" : "Decoders");
1543     for (i = 0; i < nb_codecs; i++) {
1544         const AVCodecDescriptor *desc = codecs[i];
1545         const AVCodec *codec = NULL;
1546
1547         while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
1548             printf(" %c", get_media_type_char(desc->type));
1549             printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : ".");
1550             printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : ".");
1551             printf((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL)  ? "X" : ".");
1552             printf((codec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
1553             printf((codec->capabilities & AV_CODEC_CAP_DR1)           ? "D" : ".");
1554
1555             printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
1556             if (strcmp(codec->name, desc->name))
1557                 printf(" (codec %s)", desc->name);
1558
1559             printf("\n");
1560         }
1561     }
1562     av_free(codecs);
1563 }
1564
1565 int show_decoders(void *optctx, const char *opt, const char *arg)
1566 {
1567     print_codecs(0);
1568     return 0;
1569 }
1570
1571 int show_encoders(void *optctx, const char *opt, const char *arg)
1572 {
1573     print_codecs(1);
1574     return 0;
1575 }
1576
1577 int show_bsfs(void *optctx, const char *opt, const char *arg)
1578 {
1579     AVBitStreamFilter *bsf = NULL;
1580
1581     printf("Bitstream filters:\n");
1582     while ((bsf = av_bitstream_filter_next(bsf)))
1583         printf("%s\n", bsf->name);
1584     printf("\n");
1585     return 0;
1586 }
1587
1588 int show_protocols(void *optctx, const char *opt, const char *arg)
1589 {
1590     void *opaque = NULL;
1591     const char *name;
1592
1593     printf("Supported file protocols:\n"
1594            "Input:\n");
1595     while ((name = avio_enum_protocols(&opaque, 0)))
1596         printf("  %s\n", name);
1597     printf("Output:\n");
1598     while ((name = avio_enum_protocols(&opaque, 1)))
1599         printf("  %s\n", name);
1600     return 0;
1601 }
1602
1603 int show_filters(void *optctx, const char *opt, const char *arg)
1604 {
1605 #if CONFIG_AVFILTER
1606     const AVFilter *filter = NULL;
1607     char descr[64], *descr_cur;
1608     int i, j;
1609     const AVFilterPad *pad;
1610
1611     printf("Filters:\n"
1612            "  T.. = Timeline support\n"
1613            "  .S. = Slice threading\n"
1614            "  ..C = Command support\n"
1615            "  A = Audio input/output\n"
1616            "  V = Video input/output\n"
1617            "  N = Dynamic number and/or type of input/output\n"
1618            "  | = Source or sink filter\n");
1619     while ((filter = avfilter_next(filter))) {
1620         descr_cur = descr;
1621         for (i = 0; i < 2; i++) {
1622             if (i) {
1623                 *(descr_cur++) = '-';
1624                 *(descr_cur++) = '>';
1625             }
1626             pad = i ? filter->outputs : filter->inputs;
1627             for (j = 0; pad && avfilter_pad_get_name(pad, j); j++) {
1628                 if (descr_cur >= descr + sizeof(descr) - 4)
1629                     break;
1630                 *(descr_cur++) = get_media_type_char(avfilter_pad_get_type(pad, j));
1631             }
1632             if (!j)
1633                 *(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
1634                                   ( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|';
1635         }
1636         *descr_cur = 0;
1637         printf(" %c%c%c %-17s %-10s %s\n",
1638                filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE ? 'T' : '.',
1639                filter->flags & AVFILTER_FLAG_SLICE_THREADS    ? 'S' : '.',
1640                filter->process_command                        ? 'C' : '.',
1641                filter->name, descr, filter->description);
1642     }
1643 #else
1644     printf("No filters available: libavfilter disabled\n");
1645 #endif
1646     return 0;
1647 }
1648
1649 int show_colors(void *optctx, const char *opt, const char *arg)
1650 {
1651     const char *name;
1652     const uint8_t *rgb;
1653     int i;
1654
1655     printf("%-32s #RRGGBB\n", "name");
1656
1657     for (i = 0; name = av_get_known_color_name(i, &rgb); i++)
1658         printf("%-32s #%02x%02x%02x\n", name, rgb[0], rgb[1], rgb[2]);
1659
1660     return 0;
1661 }
1662
1663 int show_pix_fmts(void *optctx, const char *opt, const char *arg)
1664 {
1665     const AVPixFmtDescriptor *pix_desc = NULL;
1666
1667     printf("Pixel formats:\n"
1668            "I.... = Supported Input  format for conversion\n"
1669            ".O... = Supported Output format for conversion\n"
1670            "..H.. = Hardware accelerated format\n"
1671            "...P. = Paletted format\n"
1672            "....B = Bitstream format\n"
1673            "FLAGS NAME            NB_COMPONENTS BITS_PER_PIXEL\n"
1674            "-----\n");
1675
1676 #if !CONFIG_SWSCALE
1677 #   define sws_isSupportedInput(x)  0
1678 #   define sws_isSupportedOutput(x) 0
1679 #endif
1680
1681     while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) {
1682         enum AVPixelFormat pix_fmt = av_pix_fmt_desc_get_id(pix_desc);
1683         printf("%c%c%c%c%c %-16s       %d            %2d\n",
1684                sws_isSupportedInput (pix_fmt)              ? 'I' : '.',
1685                sws_isSupportedOutput(pix_fmt)              ? 'O' : '.',
1686                pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL   ? 'H' : '.',
1687                pix_desc->flags & AV_PIX_FMT_FLAG_PAL       ? 'P' : '.',
1688                pix_desc->flags & AV_PIX_FMT_FLAG_BITSTREAM ? 'B' : '.',
1689                pix_desc->name,
1690                pix_desc->nb_components,
1691                av_get_bits_per_pixel(pix_desc));
1692     }
1693     return 0;
1694 }
1695
1696 int show_layouts(void *optctx, const char *opt, const char *arg)
1697 {
1698     int i = 0;
1699     uint64_t layout, j;
1700     const char *name, *descr;
1701
1702     printf("Individual channels:\n"
1703            "NAME           DESCRIPTION\n");
1704     for (i = 0; i < 63; i++) {
1705         name = av_get_channel_name((uint64_t)1 << i);
1706         if (!name)
1707             continue;
1708         descr = av_get_channel_description((uint64_t)1 << i);
1709         printf("%-14s %s\n", name, descr);
1710     }
1711     printf("\nStandard channel layouts:\n"
1712            "NAME           DECOMPOSITION\n");
1713     for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
1714         if (name) {
1715             printf("%-14s ", name);
1716             for (j = 1; j; j <<= 1)
1717                 if ((layout & j))
1718                     printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
1719             printf("\n");
1720         }
1721     }
1722     return 0;
1723 }
1724
1725 int show_sample_fmts(void *optctx, const char *opt, const char *arg)
1726 {
1727     int i;
1728     char fmt_str[128];
1729     for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
1730         printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
1731     return 0;
1732 }
1733
1734 static void show_help_codec(const char *name, int encoder)
1735 {
1736     const AVCodecDescriptor *desc;
1737     const AVCodec *codec;
1738
1739     if (!name) {
1740         av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n");
1741         return;
1742     }
1743
1744     codec = encoder ? avcodec_find_encoder_by_name(name) :
1745                       avcodec_find_decoder_by_name(name);
1746
1747     if (codec)
1748         print_codec(codec);
1749     else if ((desc = avcodec_descriptor_get_by_name(name))) {
1750         int printed = 0;
1751
1752         while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
1753             printed = 1;
1754             print_codec(codec);
1755         }
1756
1757         if (!printed) {
1758             av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to FFmpeg, "
1759                    "but no %s for it are available. FFmpeg might need to be "
1760                    "recompiled with additional external libraries.\n",
1761                    name, encoder ? "encoders" : "decoders");
1762         }
1763     } else {
1764         av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by FFmpeg.\n",
1765                name);
1766     }
1767 }
1768
1769 static void show_help_demuxer(const char *name)
1770 {
1771     const AVInputFormat *fmt = av_find_input_format(name);
1772
1773     if (!fmt) {
1774         av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
1775         return;
1776     }
1777
1778     printf("Demuxer %s [%s]:\n", fmt->name, fmt->long_name);
1779
1780     if (fmt->extensions)
1781         printf("    Common extensions: %s.\n", fmt->extensions);
1782
1783     if (fmt->priv_class)
1784         show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM);
1785 }
1786
1787 static void show_help_muxer(const char *name)
1788 {
1789     const AVCodecDescriptor *desc;
1790     const AVOutputFormat *fmt = av_guess_format(name, NULL, NULL);
1791
1792     if (!fmt) {
1793         av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
1794         return;
1795     }
1796
1797     printf("Muxer %s [%s]:\n", fmt->name, fmt->long_name);
1798
1799     if (fmt->extensions)
1800         printf("    Common extensions: %s.\n", fmt->extensions);
1801     if (fmt->mime_type)
1802         printf("    Mime type: %s.\n", fmt->mime_type);
1803     if (fmt->video_codec != AV_CODEC_ID_NONE &&
1804         (desc = avcodec_descriptor_get(fmt->video_codec))) {
1805         printf("    Default video codec: %s.\n", desc->name);
1806     }
1807     if (fmt->audio_codec != AV_CODEC_ID_NONE &&
1808         (desc = avcodec_descriptor_get(fmt->audio_codec))) {
1809         printf("    Default audio codec: %s.\n", desc->name);
1810     }
1811     if (fmt->subtitle_codec != AV_CODEC_ID_NONE &&
1812         (desc = avcodec_descriptor_get(fmt->subtitle_codec))) {
1813         printf("    Default subtitle codec: %s.\n", desc->name);
1814     }
1815
1816     if (fmt->priv_class)
1817         show_help_children(fmt->priv_class, AV_OPT_FLAG_ENCODING_PARAM);
1818 }
1819
1820 #if CONFIG_AVFILTER
1821 static void show_help_filter(const char *name)
1822 {
1823 #if CONFIG_AVFILTER
1824     const AVFilter *f = avfilter_get_by_name(name);
1825     int i, count;
1826
1827     if (!name) {
1828         av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n");
1829         return;
1830     } else if (!f) {
1831         av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name);
1832         return;
1833     }
1834
1835     printf("Filter %s\n", f->name);
1836     if (f->description)
1837         printf("  %s\n", f->description);
1838
1839     if (f->flags & AVFILTER_FLAG_SLICE_THREADS)
1840         printf("    slice threading supported\n");
1841
1842     printf("    Inputs:\n");
1843     count = avfilter_pad_count(f->inputs);
1844     for (i = 0; i < count; i++) {
1845         printf("       #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i),
1846                media_type_string(avfilter_pad_get_type(f->inputs, i)));
1847     }
1848     if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)
1849         printf("        dynamic (depending on the options)\n");
1850     else if (!count)
1851         printf("        none (source filter)\n");
1852
1853     printf("    Outputs:\n");
1854     count = avfilter_pad_count(f->outputs);
1855     for (i = 0; i < count; i++) {
1856         printf("       #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i),
1857                media_type_string(avfilter_pad_get_type(f->outputs, i)));
1858     }
1859     if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS)
1860         printf("        dynamic (depending on the options)\n");
1861     else if (!count)
1862         printf("        none (sink filter)\n");
1863
1864     if (f->priv_class)
1865         show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM |
1866                                           AV_OPT_FLAG_AUDIO_PARAM);
1867     if (f->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)
1868         printf("This filter has support for timeline through the 'enable' option.\n");
1869 #else
1870     av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; "
1871            "can not to satisfy request\n");
1872 #endif
1873 }
1874 #endif
1875
1876 int show_help(void *optctx, const char *opt, const char *arg)
1877 {
1878     char *topic, *par;
1879     av_log_set_callback(log_callback_help);
1880
1881     topic = av_strdup(arg ? arg : "");
1882     if (!topic)
1883         return AVERROR(ENOMEM);
1884     par = strchr(topic, '=');
1885     if (par)
1886         *par++ = 0;
1887
1888     if (!*topic) {
1889         show_help_default(topic, par);
1890     } else if (!strcmp(topic, "decoder")) {
1891         show_help_codec(par, 0);
1892     } else if (!strcmp(topic, "encoder")) {
1893         show_help_codec(par, 1);
1894     } else if (!strcmp(topic, "demuxer")) {
1895         show_help_demuxer(par);
1896     } else if (!strcmp(topic, "muxer")) {
1897         show_help_muxer(par);
1898 #if CONFIG_AVFILTER
1899     } else if (!strcmp(topic, "filter")) {
1900         show_help_filter(par);
1901 #endif
1902     } else {
1903         show_help_default(topic, par);
1904     }
1905
1906     av_freep(&topic);
1907     return 0;
1908 }
1909
1910 int read_yesno(void)
1911 {
1912     int c = getchar();
1913     int yesno = (av_toupper(c) == 'Y');
1914
1915     while (c != '\n' && c != EOF)
1916         c = getchar();
1917
1918     return yesno;
1919 }
1920
1921 FILE *get_preset_file(char *filename, size_t filename_size,
1922                       const char *preset_name, int is_path,
1923                       const char *codec_name)
1924 {
1925     FILE *f = NULL;
1926     int i;
1927     const char *base[3] = { getenv("FFMPEG_DATADIR"),
1928                             getenv("HOME"),
1929                             FFMPEG_DATADIR, };
1930
1931     if (is_path) {
1932         av_strlcpy(filename, preset_name, filename_size);
1933         f = fopen(filename, "r");
1934     } else {
1935 #ifdef _WIN32
1936         char datadir[MAX_PATH], *ls;
1937         base[2] = NULL;
1938
1939         if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
1940         {
1941             for (ls = datadir; ls < datadir + strlen(datadir); ls++)
1942                 if (*ls == '\\') *ls = '/';
1943
1944             if (ls = strrchr(datadir, '/'))
1945             {
1946                 *ls = 0;
1947                 strncat(datadir, "/ffpresets",  sizeof(datadir) - 1 - strlen(datadir));
1948                 base[2] = datadir;
1949             }
1950         }
1951 #endif
1952         for (i = 0; i < 3 && !f; i++) {
1953             if (!base[i])
1954                 continue;
1955             snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
1956                      i != 1 ? "" : "/.ffmpeg", preset_name);
1957             f = fopen(filename, "r");
1958             if (!f && codec_name) {
1959                 snprintf(filename, filename_size,
1960                          "%s%s/%s-%s.ffpreset",
1961                          base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
1962                          preset_name);
1963                 f = fopen(filename, "r");
1964             }
1965         }
1966     }
1967
1968     return f;
1969 }
1970
1971 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
1972 {
1973     int ret = avformat_match_stream_specifier(s, st, spec);
1974     if (ret < 0)
1975         av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
1976     return ret;
1977 }
1978
1979 AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
1980                                 AVFormatContext *s, AVStream *st, AVCodec *codec)
1981 {
1982     AVDictionary    *ret = NULL;
1983     AVDictionaryEntry *t = NULL;
1984     int            flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
1985                                       : AV_OPT_FLAG_DECODING_PARAM;
1986     char          prefix = 0;
1987     const AVClass    *cc = avcodec_get_class();
1988
1989     if (!codec)
1990         codec            = s->oformat ? avcodec_find_encoder(codec_id)
1991                                       : avcodec_find_decoder(codec_id);
1992
1993     switch (st->codec->codec_type) {
1994     case AVMEDIA_TYPE_VIDEO:
1995         prefix  = 'v';
1996         flags  |= AV_OPT_FLAG_VIDEO_PARAM;
1997         break;
1998     case AVMEDIA_TYPE_AUDIO:
1999         prefix  = 'a';
2000         flags  |= AV_OPT_FLAG_AUDIO_PARAM;
2001         break;
2002     case AVMEDIA_TYPE_SUBTITLE:
2003         prefix  = 's';
2004         flags  |= AV_OPT_FLAG_SUBTITLE_PARAM;
2005         break;
2006     }
2007
2008     while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
2009         char *p = strchr(t->key, ':');
2010
2011         /* check stream specification in opt name */
2012         if (p)
2013             switch (check_stream_specifier(s, st, p + 1)) {
2014             case  1: *p = 0; break;
2015             case  0:         continue;
2016             default:         exit_program(1);
2017             }
2018
2019         if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
2020             !codec ||
2021             (codec->priv_class &&
2022              av_opt_find(&codec->priv_class, t->key, NULL, flags,
2023                          AV_OPT_SEARCH_FAKE_OBJ)))
2024             av_dict_set(&ret, t->key, t->value, 0);
2025         else if (t->key[0] == prefix &&
2026                  av_opt_find(&cc, t->key + 1, NULL, flags,
2027                              AV_OPT_SEARCH_FAKE_OBJ))
2028             av_dict_set(&ret, t->key + 1, t->value, 0);
2029
2030         if (p)
2031             *p = ':';
2032     }
2033     return ret;
2034 }
2035
2036 AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
2037                                            AVDictionary *codec_opts)
2038 {
2039     int i;
2040     AVDictionary **opts;
2041
2042     if (!s->nb_streams)
2043         return NULL;
2044     opts = av_mallocz_array(s->nb_streams, sizeof(*opts));
2045     if (!opts) {
2046         av_log(NULL, AV_LOG_ERROR,
2047                "Could not alloc memory for stream options.\n");
2048         return NULL;
2049     }
2050     for (i = 0; i < s->nb_streams; i++)
2051         opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id,
2052                                     s, s->streams[i], NULL);
2053     return opts;
2054 }
2055
2056 void *grow_array(void *array, int elem_size, int *size, int new_size)
2057 {
2058     if (new_size >= INT_MAX / elem_size) {
2059         av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
2060         exit_program(1);
2061     }
2062     if (*size < new_size) {
2063         uint8_t *tmp = av_realloc_array(array, new_size, elem_size);
2064         if (!tmp) {
2065             av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
2066             exit_program(1);
2067         }
2068         memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
2069         *size = new_size;
2070         return tmp;
2071     }
2072     return array;
2073 }
2074
2075 double get_rotation(AVStream *st)
2076 {
2077     AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0);
2078     uint8_t* displaymatrix = av_stream_get_side_data(st,
2079                                                      AV_PKT_DATA_DISPLAYMATRIX, NULL);
2080     double theta = 0;
2081
2082     if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) {
2083         char *tail;
2084         theta = av_strtod(rotate_tag->value, &tail);
2085         if (*tail)
2086             theta = 0;
2087     }
2088     if (displaymatrix && !theta)
2089         theta = -av_display_rotation_get((int32_t*) displaymatrix);
2090
2091     theta -= 360*floor(theta/360 + 0.9/360);
2092
2093     if (fabs(theta - 90*round(theta/90)) > 2)
2094         av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
2095                "If you want to help, upload a sample "
2096                "of this file to ftp://upload.ffmpeg.org/incoming/ "
2097                "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
2098
2099     return theta;
2100 }
2101
2102 #if CONFIG_AVDEVICE
2103 static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
2104 {
2105     int ret, i;
2106     AVDeviceInfoList *device_list = NULL;
2107
2108     if (!fmt || !fmt->priv_class  || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
2109         return AVERROR(EINVAL);
2110
2111     printf("Audo-detected sources for %s:\n", fmt->name);
2112     if (!fmt->get_device_list) {
2113         ret = AVERROR(ENOSYS);
2114         printf("Cannot list sources. Not implemented.\n");
2115         goto fail;
2116     }
2117
2118     if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
2119         printf("Cannot list sources.\n");
2120         goto fail;
2121     }
2122
2123     for (i = 0; i < device_list->nb_devices; i++) {
2124         printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
2125                device_list->devices[i]->device_name, device_list->devices[i]->device_description);
2126     }
2127
2128   fail:
2129     avdevice_free_list_devices(&device_list);
2130     return ret;
2131 }
2132
2133 static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
2134 {
2135     int ret, i;
2136     AVDeviceInfoList *device_list = NULL;
2137
2138     if (!fmt || !fmt->priv_class  || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
2139         return AVERROR(EINVAL);
2140
2141     printf("Audo-detected sinks for %s:\n", fmt->name);
2142     if (!fmt->get_device_list) {
2143         ret = AVERROR(ENOSYS);
2144         printf("Cannot list sinks. Not implemented.\n");
2145         goto fail;
2146     }
2147
2148     if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) {
2149         printf("Cannot list sinks.\n");
2150         goto fail;
2151     }
2152
2153     for (i = 0; i < device_list->nb_devices; i++) {
2154         printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
2155                device_list->devices[i]->device_name, device_list->devices[i]->device_description);
2156     }
2157
2158   fail:
2159     avdevice_free_list_devices(&device_list);
2160     return ret;
2161 }
2162
2163 static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
2164 {
2165     int ret;
2166     if (arg) {
2167         char *opts_str = NULL;
2168         av_assert0(dev && opts);
2169         *dev = av_strdup(arg);
2170         if (!*dev)
2171             return AVERROR(ENOMEM);
2172         if ((opts_str = strchr(*dev, ','))) {
2173             *(opts_str++) = '\0';
2174             if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
2175                 av_freep(dev);
2176                 return ret;
2177             }
2178         }
2179     } else
2180         printf("\nDevice name is not provided.\n"
2181                 "You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
2182     return 0;
2183 }
2184
2185 int show_sources(void *optctx, const char *opt, const char *arg)
2186 {
2187     AVInputFormat *fmt = NULL;
2188     char *dev = NULL;
2189     AVDictionary *opts = NULL;
2190     int ret = 0;
2191     int error_level = av_log_get_level();
2192
2193     av_log_set_level(AV_LOG_ERROR);
2194
2195     if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
2196         goto fail;
2197
2198     do {
2199         fmt = av_input_audio_device_next(fmt);
2200         if (fmt) {
2201             if (!strcmp(fmt->name, "lavfi"))
2202                 continue; //it's pointless to probe lavfi
2203             if (dev && !av_match_name(dev, fmt->name))
2204                 continue;
2205             print_device_sources(fmt, opts);
2206         }
2207     } while (fmt);
2208     do {
2209         fmt = av_input_video_device_next(fmt);
2210         if (fmt) {
2211             if (dev && !av_match_name(dev, fmt->name))
2212                 continue;
2213             print_device_sources(fmt, opts);
2214         }
2215     } while (fmt);
2216   fail:
2217     av_dict_free(&opts);
2218     av_free(dev);
2219     av_log_set_level(error_level);
2220     return ret;
2221 }
2222
2223 int show_sinks(void *optctx, const char *opt, const char *arg)
2224 {
2225     AVOutputFormat *fmt = NULL;
2226     char *dev = NULL;
2227     AVDictionary *opts = NULL;
2228     int ret = 0;
2229     int error_level = av_log_get_level();
2230
2231     av_log_set_level(AV_LOG_ERROR);
2232
2233     if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
2234         goto fail;
2235
2236     do {
2237         fmt = av_output_audio_device_next(fmt);
2238         if (fmt) {
2239             if (dev && !av_match_name(dev, fmt->name))
2240                 continue;
2241             print_device_sinks(fmt, opts);
2242         }
2243     } while (fmt);
2244     do {
2245         fmt = av_output_video_device_next(fmt);
2246         if (fmt) {
2247             if (dev && !av_match_name(dev, fmt->name))
2248                 continue;
2249             print_device_sinks(fmt, opts);
2250         }
2251     } while (fmt);
2252   fail:
2253     av_dict_free(&opts);
2254     av_free(dev);
2255     av_log_set_level(error_level);
2256     return ret;
2257 }
2258
2259 #endif