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