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