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