FFmpeg
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 "libswscale/swscale.h"
37 #include "libavutil/avassert.h"
38 #include "libavutil/avstring.h"
39 #include "libavutil/bprint.h"
40 #include "libavutil/display.h"
41 #include "libavutil/getenv_utf8.h"
42 #include "libavutil/libm.h"
43 #include "libavutil/mem.h"
44 #include "libavutil/parseutils.h"
45 #include "libavutil/eval.h"
46 #include "libavutil/dict.h"
47 #include "libavutil/opt.h"
48 #include "cmdutils.h"
49 #include "fopen_utf8.h"
50 #include "opt_common.h"
51 #ifdef _WIN32
52 #include <windows.h>
53 #include "compat/w32dlfcn.h"
54 #endif
55 
59 
60 int hide_banner = 0;
61 
62 void uninit_opts(void)
63 {
68 }
69 
70 void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
71 {
72  vfprintf(stdout, fmt, vl);
73 }
74 
75 void init_dynload(void)
76 {
77 #if HAVE_SETDLLDIRECTORY && defined(_WIN32)
78  /* Calling SetDllDirectory with the empty string (but not NULL) removes the
79  * current working directory from the DLL search path as a security pre-caution. */
80  SetDllDirectory("");
81 #endif
82 }
83 
84 int parse_number(const char *context, const char *numstr, enum OptionType type,
85  double min, double max, double *dst)
86 {
87  char *tail;
88  const char *error;
89  double d = av_strtod(numstr, &tail);
90  if (*tail)
91  error = "Expected number for %s but found: %s\n";
92  else if (d < min || d > max)
93  error = "The value for %s was %s which is not within %f - %f\n";
94  else if (type == OPT_TYPE_INT64 && (int64_t)d != d)
95  error = "Expected int64 for %s but found %s\n";
96  else if (type == OPT_TYPE_INT && (int)d != d)
97  error = "Expected int for %s but found %s\n";
98  else {
99  *dst = d;
100  return 0;
101  }
102 
103  av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
104  return AVERROR(EINVAL);
105 }
106 
107 void show_help_options(const OptionDef *options, const char *msg, int req_flags,
108  int rej_flags)
109 {
110  const OptionDef *po;
111  int first;
112 
113  first = 1;
114  for (po = options; po->name; po++) {
115  char buf[128];
116 
117  if (((po->flags & req_flags) != req_flags) ||
118  (po->flags & rej_flags))
119  continue;
120 
121  if (first) {
122  printf("%s\n", msg);
123  first = 0;
124  }
125  av_strlcpy(buf, po->name, sizeof(buf));
126 
127  if (po->flags & OPT_FLAG_PERSTREAM)
128  av_strlcat(buf, "[:<stream_spec>]", sizeof(buf));
129  else if (po->flags & OPT_FLAG_SPEC)
130  av_strlcat(buf, "[:<spec>]", sizeof(buf));
131 
132  if (po->argname)
133  av_strlcatf(buf, sizeof(buf), " <%s>", po->argname);
134 
135  printf("-%-17s %s\n", buf, po->help);
136  }
137  printf("\n");
138 }
139 
140 void show_help_children(const AVClass *class, int flags)
141 {
142  void *iter = NULL;
143  const AVClass *child;
144  if (class->option) {
145  av_opt_show2(&class, NULL, flags, 0);
146  printf("\n");
147  }
148 
149  while (child = av_opt_child_class_iterate(class, &iter))
150  show_help_children(child, flags);
151 }
152 
153 static const OptionDef *find_option(const OptionDef *po, const char *name)
154 {
155  if (*name == '/')
156  name++;
157 
158  while (po->name) {
159  const char *end;
160  if (av_strstart(name, po->name, &end) && (!*end || *end == ':'))
161  break;
162  po++;
163  }
164  return po;
165 }
166 
167 /* _WIN32 means using the windows libc - cygwin doesn't define that
168  * by default. HAVE_COMMANDLINETOARGVW is true on cygwin, while
169  * it doesn't provide the actual command line via GetCommandLineW(). */
170 #if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
171 #include <shellapi.h>
172 /* Will be leaked on exit */
173 static char** win32_argv_utf8 = NULL;
174 static int win32_argc = 0;
175 
176 /**
177  * Prepare command line arguments for executable.
178  * For Windows - perform wide-char to UTF-8 conversion.
179  * Input arguments should be main() function arguments.
180  * @param argc_ptr Arguments number (including executable)
181  * @param argv_ptr Arguments list.
182  */
183 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
184 {
185  char *argstr_flat;
186  wchar_t **argv_w;
187  int i, buffsize = 0, offset = 0;
188 
189  if (win32_argv_utf8) {
190  *argc_ptr = win32_argc;
191  *argv_ptr = win32_argv_utf8;
192  return;
193  }
194 
195  win32_argc = 0;
196  argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
197  if (win32_argc <= 0 || !argv_w)
198  return;
199 
200  /* determine the UTF-8 buffer size (including NULL-termination symbols) */
201  for (i = 0; i < win32_argc; i++)
202  buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
203  NULL, 0, NULL, NULL);
204 
205  win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
206  argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
207  if (!win32_argv_utf8) {
208  LocalFree(argv_w);
209  return;
210  }
211 
212  for (i = 0; i < win32_argc; i++) {
213  win32_argv_utf8[i] = &argstr_flat[offset];
214  offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
215  &argstr_flat[offset],
216  buffsize - offset, NULL, NULL);
217  }
218  win32_argv_utf8[i] = NULL;
219  LocalFree(argv_w);
220 
221  *argc_ptr = win32_argc;
222  *argv_ptr = win32_argv_utf8;
223 }
224 #else
225 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
226 {
227  /* nothing to do */
228 }
229 #endif /* HAVE_COMMANDLINETOARGVW */
230 
231 static int opt_has_arg(const OptionDef *o)
232 {
233  if (o->type == OPT_TYPE_BOOL)
234  return 0;
235  if (o->type == OPT_TYPE_FUNC)
236  return !!(o->flags & OPT_FUNC_ARG);
237  return 1;
238 }
239 
240 static int write_option(void *optctx, const OptionDef *po, const char *opt,
241  const char *arg, const OptionDef *defs)
242 {
243  /* new-style options contain an offset into optctx, old-style address of
244  * a global var*/
245  void *dst = po->flags & OPT_FLAG_OFFSET ?
246  (uint8_t *)optctx + po->u.off : po->u.dst_ptr;
247  char *arg_allocated = NULL;
248 
249  enum OptionType so_type = po->type;
250 
251  SpecifierOptList *sol = NULL;
252  double num;
253  int ret = 0;
254 
255  if (*opt == '/') {
256  opt++;
257 
258  if (po->type == OPT_TYPE_BOOL) {
260  "Requested to load an argument from file for a bool option '%s'\n",
261  po->name);
262  return AVERROR(EINVAL);
263  }
264 
265  arg_allocated = file_read(arg);
266  if (!arg_allocated) {
268  "Error reading the value for option '%s' from file: %s\n",
269  opt, arg);
270  return AVERROR(EINVAL);
271  }
272 
273  arg = arg_allocated;
274  }
275 
276  if (po->flags & OPT_FLAG_SPEC) {
277  char *p = strchr(opt, ':');
278  char *str;
279 
280  sol = dst;
281  ret = GROW_ARRAY(sol->opt, sol->nb_opt);
282  if (ret < 0)
283  goto finish;
284 
285  str = av_strdup(p ? p + 1 : "");
286  if (!str) {
287  ret = AVERROR(ENOMEM);
288  goto finish;
289  }
290  sol->opt[sol->nb_opt - 1].specifier = str;
291 
292  if (po->flags & OPT_FLAG_PERSTREAM) {
293  ret = stream_specifier_parse(&sol->opt[sol->nb_opt - 1].stream_spec,
294  str, 0, NULL);
295  if (ret < 0)
296  goto finish;
297  }
298 
299  dst = &sol->opt[sol->nb_opt - 1].u;
300  }
301 
302  if (po->type == OPT_TYPE_STRING) {
303  char *str;
304  if (arg_allocated) {
305  str = arg_allocated;
306  arg_allocated = NULL;
307  } else
308  str = av_strdup(arg);
309  av_freep(dst);
310 
311  if (!str) {
312  ret = AVERROR(ENOMEM);
313  goto finish;
314  }
315 
316  *(char **)dst = str;
317  } else if (po->type == OPT_TYPE_BOOL || po->type == OPT_TYPE_INT) {
318  ret = parse_number(opt, arg, OPT_TYPE_INT64, INT_MIN, INT_MAX, &num);
319  if (ret < 0)
320  goto finish;
321 
322  *(int *)dst = num;
323  so_type = OPT_TYPE_INT;
324  } else if (po->type == OPT_TYPE_INT64) {
325  ret = parse_number(opt, arg, OPT_TYPE_INT64, INT64_MIN, (double)INT64_MAX, &num);
326  if (ret < 0)
327  goto finish;
328 
329  *(int64_t *)dst = num;
330  } else if (po->type == OPT_TYPE_TIME) {
331  ret = av_parse_time(dst, arg, 1);
332  if (ret < 0) {
333  av_log(NULL, AV_LOG_ERROR, "Invalid duration for option %s: %s\n",
334  opt, arg);
335  goto finish;
336  }
337  so_type = OPT_TYPE_INT64;
338  } else if (po->type == OPT_TYPE_FLOAT) {
340  if (ret < 0)
341  goto finish;
342 
343  *(float *)dst = num;
344  } else if (po->type == OPT_TYPE_DOUBLE) {
346  if (ret < 0)
347  goto finish;
348 
349  *(double *)dst = num;
350  } else {
351  av_assert0(po->type == OPT_TYPE_FUNC && po->u.func_arg);
352 
353  ret = po->u.func_arg(optctx, opt, arg);
354  if (ret < 0) {
356  "Failed to set value '%s' for option '%s': %s\n",
357  arg, opt, av_err2str(ret));
358  goto finish;
359  }
360  }
361  if (po->flags & OPT_EXIT) {
362  ret = AVERROR_EXIT;
363  goto finish;
364  }
365 
366  if (sol) {
367  sol->type = so_type;
368  sol->opt_canon = (po->flags & OPT_HAS_CANON) ?
369  find_option(defs, po->u1.name_canon) : po;
370  }
371 
372 finish:
373  av_freep(&arg_allocated);
374  return ret;
375 }
376 
377 int parse_option(void *optctx, const char *opt, const char *arg,
378  const OptionDef *options)
379 {
380  static const OptionDef opt_avoptions = {
381  .name = "AVOption passthrough",
382  .type = OPT_TYPE_FUNC,
383  .flags = OPT_FUNC_ARG,
384  .u.func_arg = opt_default,
385  };
386 
387  const OptionDef *po;
388  int ret;
389 
390  po = find_option(options, opt);
391  if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
392  /* handle 'no' bool option */
393  po = find_option(options, opt + 2);
394  if ((po->name && po->type == OPT_TYPE_BOOL))
395  arg = "0";
396  } else if (po->type == OPT_TYPE_BOOL)
397  arg = "1";
398 
399  if (!po->name)
400  po = &opt_avoptions;
401  if (!po->name) {
402  av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
403  return AVERROR(EINVAL);
404  }
405  if (opt_has_arg(po) && !arg) {
406  av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
407  return AVERROR(EINVAL);
408  }
409 
410  ret = write_option(optctx, po, opt, arg, options);
411  if (ret < 0)
412  return ret;
413 
414  return opt_has_arg(po);
415 }
416 
417 int parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
418  int (*parse_arg_function)(void *, const char*))
419 {
420  const char *opt;
421  int optindex, handleoptions = 1, ret;
422 
423  /* perform system-dependent conversions for arguments list */
424  prepare_app_arguments(&argc, &argv);
425 
426  /* parse options */
427  optindex = 1;
428  while (optindex < argc) {
429  opt = argv[optindex++];
430 
431  if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
432  if (opt[1] == '-' && opt[2] == '\0') {
433  handleoptions = 0;
434  continue;
435  }
436  opt++;
437 
438  if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
439  return ret;
440  optindex += ret;
441  } else {
442  if (parse_arg_function) {
443  ret = parse_arg_function(optctx, opt);
444  if (ret < 0)
445  return ret;
446  }
447  }
448  }
449 
450  return 0;
451 }
452 
453 int parse_optgroup(void *optctx, OptionGroup *g, const OptionDef *defs)
454 {
455  int i, ret;
456 
457  av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
458  g->group_def->name, g->arg);
459 
460  for (i = 0; i < g->nb_opts; i++) {
461  Option *o = &g->opts[i];
462 
463  if (g->group_def->flags &&
464  !(g->group_def->flags & o->opt->flags)) {
465  av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to "
466  "%s %s -- you are trying to apply an input option to an "
467  "output file or vice versa. Move this option before the "
468  "file it belongs to.\n", o->key, o->opt->help,
469  g->group_def->name, g->arg);
470  return AVERROR(EINVAL);
471  }
472 
473  av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
474  o->key, o->opt->help, o->val);
475 
476  ret = write_option(optctx, o->opt, o->key, o->val, defs);
477  if (ret < 0)
478  return ret;
479  }
480 
481  av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
482 
483  return 0;
484 }
485 
486 int locate_option(int argc, char **argv, const OptionDef *options,
487  const char *optname)
488 {
489  const OptionDef *po;
490  int i;
491 
492  for (i = 1; i < argc; i++) {
493  const char *cur_opt = argv[i];
494 
495  if (!(cur_opt[0] == '-' && cur_opt[1]))
496  continue;
497  cur_opt++;
498 
499  po = find_option(options, cur_opt);
500  if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
501  po = find_option(options, cur_opt + 2);
502 
503  if ((!po->name && !strcmp(cur_opt, optname)) ||
504  (po->name && !strcmp(optname, po->name)))
505  return i;
506 
507  if (!po->name || opt_has_arg(po))
508  i++;
509  }
510  return 0;
511 }
512 
513 static void dump_argument(FILE *report_file, const char *a)
514 {
515  const unsigned char *p;
516 
517  for (p = a; *p; p++)
518  if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
519  *p == '_' || (*p >= 'a' && *p <= 'z')))
520  break;
521  if (!*p) {
522  fputs(a, report_file);
523  return;
524  }
525  fputc('"', report_file);
526  for (p = a; *p; p++) {
527  if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
528  fprintf(report_file, "\\%c", *p);
529  else if (*p < ' ' || *p > '~')
530  fprintf(report_file, "\\x%02x", *p);
531  else
532  fputc(*p, report_file);
533  }
534  fputc('"', report_file);
535 }
536 
537 static void check_options(const OptionDef *po)
538 {
539  while (po->name) {
540  if (po->flags & OPT_PERFILE)
542 
543  if (po->type == OPT_TYPE_FUNC)
545 
546  // OPT_FUNC_ARG can only be ser for OPT_TYPE_FUNC
547  av_assert0((po->type == OPT_TYPE_FUNC) || !(po->flags & OPT_FUNC_ARG));
548 
549  po++;
550  }
551 }
552 
553 void parse_loglevel(int argc, char **argv, const OptionDef *options)
554 {
555  int idx;
556  char *env;
557 
559 
560  idx = locate_option(argc, argv, options, "loglevel");
561  if (!idx)
562  idx = locate_option(argc, argv, options, "v");
563  if (idx && argv[idx + 1])
564  opt_loglevel(NULL, "loglevel", argv[idx + 1]);
565  idx = locate_option(argc, argv, options, "report");
566  env = getenv_utf8("FFREPORT");
567  if (env || idx) {
568  FILE *report_file = NULL;
569  init_report(env, &report_file);
570  if (report_file) {
571  int i;
572  fprintf(report_file, "Command line:\n");
573  for (i = 0; i < argc; i++) {
574  dump_argument(report_file, argv[i]);
575  fputc(i < argc - 1 ? ' ' : '\n', report_file);
576  }
577  fflush(report_file);
578  }
579  }
580  freeenv_utf8(env);
581  idx = locate_option(argc, argv, options, "hide_banner");
582  if (idx)
583  hide_banner = 1;
584 }
585 
586 static const AVOption *opt_find(void *obj, const char *name, const char *unit,
587  int opt_flags, int search_flags)
588 {
589  const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags);
590  if(o && !o->flags)
591  return NULL;
592  return o;
593 }
594 
595 #define FLAGS ((o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0)
596 int opt_default(void *optctx, const char *opt, const char *arg)
597 {
598  const AVOption *o;
599  int consumed = 0;
600  char opt_stripped[128];
601  const char *p;
602  const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
603 #if CONFIG_SWSCALE
604  const AVClass *sc = sws_get_class();
605 #endif
606 #if CONFIG_SWRESAMPLE
607  const AVClass *swr_class = swr_get_class();
608 #endif
609 
610  if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
612 
613  if (!(p = strchr(opt, ':')))
614  p = opt + strlen(opt);
615  av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
616 
617  if ((o = opt_find(&cc, opt_stripped, NULL, 0,
619  ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
620  (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
621  av_dict_set(&codec_opts, opt, arg, FLAGS);
622  consumed = 1;
623  }
624  if ((o = opt_find(&fc, opt, NULL, 0,
626  av_dict_set(&format_opts, opt, arg, FLAGS);
627  if (consumed)
628  av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
629  consumed = 1;
630  }
631 #if CONFIG_SWSCALE
632  if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
634  if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
635  !strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
636  !strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) {
637  av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n");
638  return AVERROR(EINVAL);
639  }
640  av_dict_set(&sws_dict, opt, arg, FLAGS);
641 
642  consumed = 1;
643  }
644 #else
645  if (!consumed && !strcmp(opt, "sws_flags")) {
646  av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg);
647  consumed = 1;
648  }
649 #endif
650 #if CONFIG_SWRESAMPLE
651  if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
653  av_dict_set(&swr_opts, opt, arg, FLAGS);
654  consumed = 1;
655  }
656 #endif
657 
658  if (consumed)
659  return 0;
661 }
662 
663 /*
664  * Check whether given option is a group separator.
665  *
666  * @return index of the group definition that matched or -1 if none
667  */
668 static int match_group_separator(const OptionGroupDef *groups, int nb_groups,
669  const char *opt)
670 {
671  int i;
672 
673  for (i = 0; i < nb_groups; i++) {
674  const OptionGroupDef *p = &groups[i];
675  if (p->sep && !strcmp(p->sep, opt))
676  return i;
677  }
678 
679  return -1;
680 }
681 
682 /*
683  * Finish parsing an option group.
684  *
685  * @param group_idx which group definition should this group belong to
686  * @param arg argument of the group delimiting option
687  */
688 static int finish_group(OptionParseContext *octx, int group_idx,
689  const char *arg)
690 {
691  OptionGroupList *l = &octx->groups[group_idx];
692  OptionGroup *g;
693  int ret;
694 
695  ret = GROW_ARRAY(l->groups, l->nb_groups);
696  if (ret < 0)
697  return ret;
698 
699  g = &l->groups[l->nb_groups - 1];
700 
701  *g = octx->cur_group;
702  g->arg = arg;
703  g->group_def = l->group_def;
704  g->sws_dict = sws_dict;
705  g->swr_opts = swr_opts;
706  g->codec_opts = codec_opts;
707  g->format_opts = format_opts;
708 
709  codec_opts = NULL;
710  format_opts = NULL;
711  sws_dict = NULL;
712  swr_opts = NULL;
713 
714  memset(&octx->cur_group, 0, sizeof(octx->cur_group));
715 
716  return ret;
717 }
718 
719 /*
720  * Add an option instance to currently parsed group.
721  */
722 static int add_opt(OptionParseContext *octx, const OptionDef *opt,
723  const char *key, const char *val)
724 {
725  int global = !(opt->flags & OPT_PERFILE);
726  OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
727  int ret;
728 
729  ret = GROW_ARRAY(g->opts, g->nb_opts);
730  if (ret < 0)
731  return ret;
732 
733  g->opts[g->nb_opts - 1].opt = opt;
734  g->opts[g->nb_opts - 1].key = key;
735  g->opts[g->nb_opts - 1].val = val;
736 
737  return 0;
738 }
739 
741  const OptionGroupDef *groups, int nb_groups)
742 {
743  static const OptionGroupDef global_group = { "global" };
744  int i;
745 
746  memset(octx, 0, sizeof(*octx));
747 
748  octx->groups = av_calloc(nb_groups, sizeof(*octx->groups));
749  if (!octx->groups)
750  return AVERROR(ENOMEM);
751  octx->nb_groups = nb_groups;
752 
753  for (i = 0; i < octx->nb_groups; i++)
754  octx->groups[i].group_def = &groups[i];
755 
756  octx->global_opts.group_def = &global_group;
757  octx->global_opts.arg = "";
758 
759  return 0;
760 }
761 
763 {
764  int i, j;
765 
766  for (i = 0; i < octx->nb_groups; i++) {
767  OptionGroupList *l = &octx->groups[i];
768 
769  for (j = 0; j < l->nb_groups; j++) {
770  av_freep(&l->groups[j].opts);
773 
774  av_dict_free(&l->groups[j].sws_dict);
775  av_dict_free(&l->groups[j].swr_opts);
776  }
777  av_freep(&l->groups);
778  }
779  av_freep(&octx->groups);
780 
781  av_freep(&octx->cur_group.opts);
782  av_freep(&octx->global_opts.opts);
783 
784  uninit_opts();
785 }
786 
787 int split_commandline(OptionParseContext *octx, int argc, char *argv[],
788  const OptionDef *options,
789  const OptionGroupDef *groups, int nb_groups)
790 {
791  int ret;
792  int optindex = 1;
793  int dashdash = -2;
794 
795  /* perform system-dependent conversions for arguments list */
796  prepare_app_arguments(&argc, &argv);
797 
798  ret = init_parse_context(octx, groups, nb_groups);
799  if (ret < 0)
800  return ret;
801 
802  av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
803 
804  while (optindex < argc) {
805  const char *opt = argv[optindex++], *arg;
806  const OptionDef *po;
807  int group_idx;
808 
809  av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
810 
811  if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
812  dashdash = optindex;
813  continue;
814  }
815  /* unnamed group separators, e.g. output filename */
816  if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
817  ret = finish_group(octx, 0, opt);
818  if (ret < 0)
819  return ret;
820 
821  av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
822  continue;
823  }
824  opt++;
825 
826 #define GET_ARG(arg) \
827 do { \
828  arg = argv[optindex++]; \
829  if (!arg) { \
830  av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
831  return AVERROR(EINVAL); \
832  } \
833 } while (0)
834 
835  /* named group separators, e.g. -i */
836  group_idx = match_group_separator(groups, nb_groups, opt);
837  if (group_idx >= 0) {
838  GET_ARG(arg);
839  ret = finish_group(octx, group_idx, arg);
840  if (ret < 0)
841  return ret;
842 
843  av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
844  groups[group_idx].name, arg);
845  continue;
846  }
847 
848  /* normal options */
849  po = find_option(options, opt);
850  if (po->name) {
851  if (po->flags & OPT_EXIT) {
852  /* optional argument, e.g. -h */
853  arg = argv[optindex++];
854  } else if (opt_has_arg(po)) {
855  GET_ARG(arg);
856  } else {
857  arg = "1";
858  }
859 
860  ret = add_opt(octx, po, opt, arg);
861  if (ret < 0)
862  return ret;
863 
864  av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
865  "argument '%s'.\n", po->name, po->help, arg);
866  continue;
867  }
868 
869  /* AVOptions */
870  if (argv[optindex]) {
871  ret = opt_default(NULL, opt, argv[optindex]);
872  if (ret >= 0) {
873  av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
874  "argument '%s'.\n", opt, argv[optindex]);
875  optindex++;
876  continue;
877  } else if (ret != AVERROR_OPTION_NOT_FOUND) {
878  av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' "
879  "with argument '%s'.\n", opt, argv[optindex]);
880  return ret;
881  }
882  }
883 
884  /* boolean -nofoo options */
885  if (opt[0] == 'n' && opt[1] == 'o' &&
886  (po = find_option(options, opt + 2)) &&
887  po->name && po->type == OPT_TYPE_BOOL) {
888  ret = add_opt(octx, po, opt, "0");
889  if (ret < 0)
890  return ret;
891 
892  av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
893  "argument 0.\n", po->name, po->help);
894  continue;
895  }
896 
897  av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt);
899  }
900 
901  if (octx->cur_group.nb_opts || codec_opts || format_opts)
902  av_log(NULL, AV_LOG_WARNING, "Trailing option(s) found in the "
903  "command: may be ignored.\n");
904 
905  av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
906 
907  return 0;
908 }
909 
910 int read_yesno(void)
911 {
912  int c = getchar();
913  int yesno = (av_toupper(c) == 'Y');
914 
915  while (c != '\n' && c != EOF)
916  c = getchar();
917 
918  return yesno;
919 }
920 
921 FILE *get_preset_file(char *filename, size_t filename_size,
922  const char *preset_name, int is_path,
923  const char *codec_name)
924 {
925  FILE *f = NULL;
926  int i;
927 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
928  char *datadir = NULL;
929 #endif
930  char *env_home = getenv_utf8("HOME");
931  char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR");
932  const char *base[3] = { env_ffmpeg_datadir,
933  env_home, /* index=1(HOME) is special: search in a .ffmpeg subfolder */
934  FFMPEG_DATADIR, };
935 
936  if (is_path) {
937  av_strlcpy(filename, preset_name, filename_size);
938  f = fopen_utf8(filename, "r");
939  } else {
940 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
941  wchar_t *datadir_w = get_module_filename(NULL);
942  base[2] = NULL;
943 
944  if (wchartoutf8(datadir_w, &datadir))
945  datadir = NULL;
946  av_free(datadir_w);
947 
948  if (datadir)
949  {
950  char *ls;
951  for (ls = datadir; *ls; ls++)
952  if (*ls == '\\') *ls = '/';
953 
954  if (ls = strrchr(datadir, '/'))
955  {
956  ptrdiff_t datadir_len = ls - datadir;
957  size_t desired_size = datadir_len + strlen("/ffpresets") + 1;
958  char *new_datadir = av_realloc_array(
959  datadir, desired_size, sizeof *datadir);
960  if (new_datadir) {
961  datadir = new_datadir;
962  datadir[datadir_len] = 0;
963  strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
964  base[2] = datadir;
965  }
966  }
967  }
968 #endif
969  for (i = 0; i < 3 && !f; i++) {
970  if (!base[i])
971  continue;
972  snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
973  i != 1 ? "" : "/.ffmpeg", preset_name);
974  f = fopen_utf8(filename, "r");
975  if (!f && codec_name) {
976  snprintf(filename, filename_size,
977  "%s%s/%s-%s.ffpreset",
978  base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
979  preset_name);
980  f = fopen_utf8(filename, "r");
981  }
982  }
983  }
984 
985 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
986  av_free(datadir);
987 #endif
988  freeenv_utf8(env_ffmpeg_datadir);
989  freeenv_utf8(env_home);
990  return f;
991 }
992 
994 {
995  return (c >= '0' && c <= '9') ||
996  (c >= 'A' && c <= 'Z') ||
997  (c >= 'a' && c <= 'z');
998 }
999 
1001 {
1002  av_freep(&ss->meta_key);
1003  av_freep(&ss->meta_val);
1004  av_freep(&ss->remainder);
1005 
1006  memset(ss, 0, sizeof(*ss));
1007 }
1008 
1010  int allow_remainder, void *logctx)
1011 {
1012  char *endptr;
1013  int ret;
1014 
1015  memset(ss, 0, sizeof(*ss));
1016 
1017  ss->idx = -1;
1018  ss->media_type = AVMEDIA_TYPE_UNKNOWN;
1019  ss->stream_list = STREAM_LIST_ALL;
1020 
1021  av_log(logctx, AV_LOG_TRACE, "Parsing stream specifier: %s\n", spec);
1022 
1023  while (*spec) {
1024  if (*spec <= '9' && *spec >= '0') { /* opt:index */
1025  ss->idx = strtol(spec, &endptr, 0);
1026 
1027  av_assert0(endptr > spec);
1028  spec = endptr;
1029 
1030  av_log(logctx, AV_LOG_TRACE,
1031  "Parsed index: %d; remainder: %s\n", ss->idx, spec);
1032 
1033  // this terminates the specifier
1034  break;
1035  } else if ((*spec == 'v' || *spec == 'a' || *spec == 's' ||
1036  *spec == 'd' || *spec == 't' || *spec == 'V') &&
1037  !cmdutils_isalnum(*(spec + 1))) { /* opt:[vasdtV] */
1038  if (ss->media_type != AVMEDIA_TYPE_UNKNOWN) {
1039  av_log(logctx, AV_LOG_ERROR, "Stream type specified multiple times\n");
1040  ret = AVERROR(EINVAL);
1041  goto fail;
1042  }
1043 
1044  switch (*spec++) {
1045  case 'v': ss->media_type = AVMEDIA_TYPE_VIDEO; break;
1046  case 'a': ss->media_type = AVMEDIA_TYPE_AUDIO; break;
1047  case 's': ss->media_type = AVMEDIA_TYPE_SUBTITLE; break;
1048  case 'd': ss->media_type = AVMEDIA_TYPE_DATA; break;
1049  case 't': ss->media_type = AVMEDIA_TYPE_ATTACHMENT; break;
1050  case 'V': ss->media_type = AVMEDIA_TYPE_VIDEO;
1051  ss->no_apic = 1; break;
1052  default: av_assert0(0);
1053  }
1054 
1055  av_log(logctx, AV_LOG_TRACE, "Parsed media type: %s; remainder: %s\n",
1056  av_get_media_type_string(ss->media_type), spec);
1057  } else if (*spec == 'g' && *(spec + 1) == ':') {
1058  if (ss->stream_list != STREAM_LIST_ALL)
1059  goto multiple_stream_lists;
1060 
1061  spec += 2;
1062  if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
1063  ss->stream_list = STREAM_LIST_GROUP_ID;
1064 
1065  spec += 1 + (*spec == 'i');
1066  } else
1067  ss->stream_list = STREAM_LIST_GROUP_IDX;
1068 
1069  ss->list_id = strtol(spec, &endptr, 0);
1070  if (spec == endptr) {
1071  av_log(logctx, AV_LOG_ERROR, "Expected stream group idx/ID, got: %s\n", spec);
1072  ret = AVERROR(EINVAL);
1073  goto fail;
1074  }
1075  spec = endptr;
1076 
1077  av_log(logctx, AV_LOG_TRACE, "Parsed stream group %s: %"PRId64"; remainder: %s\n",
1078  ss->stream_list == STREAM_LIST_GROUP_ID ? "ID" : "index", ss->list_id, spec);
1079  } else if (*spec == 'p' && *(spec + 1) == ':') {
1080  if (ss->stream_list != STREAM_LIST_ALL)
1081  goto multiple_stream_lists;
1082 
1083  ss->stream_list = STREAM_LIST_PROGRAM;
1084 
1085  spec += 2;
1086  ss->list_id = strtol(spec, &endptr, 0);
1087  if (spec == endptr) {
1088  av_log(logctx, AV_LOG_ERROR, "Expected program ID, got: %s\n", spec);
1089  ret = AVERROR(EINVAL);
1090  goto fail;
1091  }
1092  spec = endptr;
1093 
1094  av_log(logctx, AV_LOG_TRACE,
1095  "Parsed program ID: %"PRId64"; remainder: %s\n", ss->list_id, spec);
1096  } else if (!strncmp(spec, "disp:", 5)) {
1097  const AVClass *st_class = av_stream_get_class();
1098  const AVOption *o = av_opt_find(&st_class, "disposition", NULL, 0, AV_OPT_SEARCH_FAKE_OBJ);
1099  char *disp = NULL;
1100  size_t len;
1101 
1102  av_assert0(o);
1103 
1104  if (ss->disposition) {
1105  av_log(logctx, AV_LOG_ERROR, "Multiple disposition specifiers\n");
1106  ret = AVERROR(EINVAL);
1107  goto fail;
1108  }
1109 
1110  spec += 5;
1111 
1112  for (len = 0; cmdutils_isalnum(spec[len]) ||
1113  spec[len] == '_' || spec[len] == '+'; len++)
1114  continue;
1115 
1116  disp = av_strndup(spec, len);
1117  if (!disp) {
1118  ret = AVERROR(ENOMEM);
1119  goto fail;
1120  }
1121 
1122  ret = av_opt_eval_flags(&st_class, o, disp, &ss->disposition);
1123  av_freep(&disp);
1124  if (ret < 0) {
1125  av_log(logctx, AV_LOG_ERROR, "Invalid disposition specifier\n");
1126  goto fail;
1127  }
1128 
1129  spec += len;
1130 
1131  av_log(logctx, AV_LOG_TRACE,
1132  "Parsed disposition: 0x%x; remainder: %s\n", ss->disposition, spec);
1133  } else if (*spec == '#' ||
1134  (*spec == 'i' && *(spec + 1) == ':')) {
1135  if (ss->stream_list != STREAM_LIST_ALL)
1136  goto multiple_stream_lists;
1137 
1138  ss->stream_list = STREAM_LIST_STREAM_ID;
1139 
1140  spec += 1 + (*spec == 'i');
1141  ss->list_id = strtol(spec, &endptr, 0);
1142  if (spec == endptr) {
1143  av_log(logctx, AV_LOG_ERROR, "Expected stream ID, got: %s\n", spec);
1144  ret = AVERROR(EINVAL);
1145  goto fail;
1146  }
1147  spec = endptr;
1148 
1149  av_log(logctx, AV_LOG_TRACE,
1150  "Parsed stream ID: %"PRId64"; remainder: %s\n", ss->list_id, spec);
1151 
1152  // this terminates the specifier
1153  break;
1154  } else if (*spec == 'm' && *(spec + 1) == ':') {
1155  av_assert0(!ss->meta_key && !ss->meta_val);
1156 
1157  spec += 2;
1158  ss->meta_key = av_get_token(&spec, ":");
1159  if (!ss->meta_key) {
1160  ret = AVERROR(ENOMEM);
1161  goto fail;
1162  }
1163  if (*spec == ':') {
1164  spec++;
1165  ss->meta_val = av_get_token(&spec, ":");
1166  if (!ss->meta_val) {
1167  ret = AVERROR(ENOMEM);
1168  goto fail;
1169  }
1170  }
1171 
1172  av_log(logctx, AV_LOG_TRACE,
1173  "Parsed metadata: %s:%s; remainder: %s", ss->meta_key,
1174  ss->meta_val ? ss->meta_val : "<any value>", spec);
1175 
1176  // this terminates the specifier
1177  break;
1178  } else if (*spec == 'u' && (*(spec + 1) == '\0' || *(spec + 1) == ':')) {
1179  ss->usable_only = 1;
1180  spec++;
1181  av_log(logctx, AV_LOG_ERROR, "Parsed 'usable only'\n");
1182 
1183  // this terminates the specifier
1184  break;
1185  } else
1186  break;
1187 
1188  if (*spec == ':')
1189  spec++;
1190  }
1191 
1192  if (*spec) {
1193  if (!allow_remainder) {
1194  av_log(logctx, AV_LOG_ERROR,
1195  "Trailing garbage at the end of a stream specifier: %s\n",
1196  spec);
1197  ret = AVERROR(EINVAL);
1198  goto fail;
1199  }
1200 
1201  if (*spec == ':')
1202  spec++;
1203 
1204  ss->remainder = av_strdup(spec);
1205  if (!ss->remainder) {
1206  ret = AVERROR(EINVAL);
1207  goto fail;
1208  }
1209  }
1210 
1211  return 0;
1212 
1213 multiple_stream_lists:
1214  av_log(logctx, AV_LOG_ERROR,
1215  "Cannot combine multiple program/group designators in a "
1216  "single stream specifier");
1217  ret = AVERROR(EINVAL);
1218 
1219 fail:
1221  return ret;
1222 }
1223 
1225  const AVFormatContext *s, const AVStream *st,
1226  void *logctx)
1227 {
1228  const AVStreamGroup *g = NULL;
1229  const AVProgram *p = NULL;
1230  int start_stream = 0, nb_streams;
1231  int nb_matched = 0;
1232 
1233  switch (ss->stream_list) {
1234  case STREAM_LIST_STREAM_ID:
1235  // <n-th> stream with given ID makes no sense and should be impossible to request
1236  av_assert0(ss->idx < 0);
1237  // return early if we know for sure the stream does not match
1238  if (st->id != ss->list_id)
1239  return 0;
1240  start_stream = st->index;
1241  nb_streams = st->index + 1;
1242  break;
1243  case STREAM_LIST_ALL:
1244  start_stream = ss->idx >= 0 ? 0 : st->index;
1245  nb_streams = st->index + 1;
1246  break;
1247  case STREAM_LIST_PROGRAM:
1248  for (unsigned i = 0; i < s->nb_programs; i++) {
1249  if (s->programs[i]->id == ss->list_id) {
1250  p = s->programs[i];
1251  break;
1252  }
1253  }
1254  if (!p) {
1255  av_log(logctx, AV_LOG_WARNING, "No program with ID %"PRId64" exists,"
1256  " stream specifier can never match\n", ss->list_id);
1257  return 0;
1258  }
1260  break;
1261  case STREAM_LIST_GROUP_ID:
1262  for (unsigned i = 0; i < s->nb_stream_groups; i++) {
1263  if (ss->list_id == s->stream_groups[i]->id) {
1264  g = s->stream_groups[i];
1265  break;
1266  }
1267  }
1268  // fall-through
1269  case STREAM_LIST_GROUP_IDX:
1270  if (ss->stream_list == STREAM_LIST_GROUP_IDX &&
1271  ss->list_id >= 0 && ss->list_id < s->nb_stream_groups)
1272  g = s->stream_groups[ss->list_id];
1273 
1274  if (!g) {
1275  av_log(logctx, AV_LOG_WARNING, "No stream group with group %s %"
1276  PRId64" exists, stream specifier can never match\n",
1277  ss->stream_list == STREAM_LIST_GROUP_ID ? "ID" : "index",
1278  ss->list_id);
1279  return 0;
1280  }
1281  nb_streams = g->nb_streams;
1282  break;
1283  default: av_assert0(0);
1284  }
1285 
1286  for (int i = start_stream; i < nb_streams; i++) {
1287  const AVStream *candidate = s->streams[g ? g->streams[i]->index :
1288  p ? p->stream_index[i] : i];
1289 
1290  if (ss->media_type != AVMEDIA_TYPE_UNKNOWN &&
1291  (ss->media_type != candidate->codecpar->codec_type ||
1292  (ss->no_apic && (candidate->disposition & AV_DISPOSITION_ATTACHED_PIC))))
1293  continue;
1294 
1295  if (ss->meta_key) {
1296  const AVDictionaryEntry *tag = av_dict_get(candidate->metadata,
1297  ss->meta_key, NULL, 0);
1298 
1299  if (!tag)
1300  continue;
1301  if (ss->meta_val && strcmp(tag->value, ss->meta_val))
1302  continue;
1303  }
1304 
1305  if (ss->usable_only) {
1306  const AVCodecParameters *par = candidate->codecpar;
1307 
1308  switch (par->codec_type) {
1309  case AVMEDIA_TYPE_AUDIO:
1310  if (!par->sample_rate || !par->ch_layout.nb_channels ||
1311  par->format == AV_SAMPLE_FMT_NONE)
1312  continue;
1313  break;
1314  case AVMEDIA_TYPE_VIDEO:
1315  if (!par->width || !par->height || par->format == AV_PIX_FMT_NONE)
1316  continue;
1317  break;
1318  case AVMEDIA_TYPE_UNKNOWN:
1319  continue;
1320  }
1321  }
1322 
1323  if (ss->disposition &&
1324  (candidate->disposition & ss->disposition) != ss->disposition)
1325  continue;
1326 
1327  if (st == candidate)
1328  return ss->idx < 0 || ss->idx == nb_matched;
1329 
1330  nb_matched++;
1331  }
1332 
1333  return 0;
1334 }
1335 
1336 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
1337 {
1339  int ret;
1340 
1341  ret = stream_specifier_parse(&ss, spec, 0, NULL);
1342  if (ret < 0)
1343  return ret;
1344 
1345  ret = stream_specifier_match(&ss, s, st, NULL);
1347  return ret;
1348 }
1349 
1351  AVFormatContext *s, AVStream *st, const AVCodec *codec,
1352  AVDictionary **dst, AVDictionary **opts_used)
1353 {
1354  AVDictionary *ret = NULL;
1355  const AVDictionaryEntry *t = NULL;
1356  int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
1358  char prefix = 0;
1359  const AVClass *cc = avcodec_get_class();
1360 
1361  switch (st->codecpar->codec_type) {
1362  case AVMEDIA_TYPE_VIDEO:
1363  prefix = 'v';
1365  break;
1366  case AVMEDIA_TYPE_AUDIO:
1367  prefix = 'a';
1369  break;
1370  case AVMEDIA_TYPE_SUBTITLE:
1371  prefix = 's';
1373  break;
1374  }
1375 
1376  while (t = av_dict_iterate(opts, t)) {
1377  const AVClass *priv_class;
1378  char *p = strchr(t->key, ':');
1379  int used = 0;
1380 
1381  /* check stream specification in opt name */
1382  if (p) {
1383  int err = check_stream_specifier(s, st, p + 1);
1384  if (err < 0) {
1385  av_dict_free(&ret);
1386  return err;
1387  } else if (!err)
1388  continue;
1389 
1390  *p = 0;
1391  }
1392 
1393  if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
1394  !codec ||
1395  ((priv_class = codec->priv_class) &&
1396  av_opt_find(&priv_class, t->key, NULL, flags,
1398  av_dict_set(&ret, t->key, t->value, 0);
1399  used = 1;
1400  } else if (t->key[0] == prefix &&
1401  av_opt_find(&cc, t->key + 1, NULL, flags,
1403  av_dict_set(&ret, t->key + 1, t->value, 0);
1404  used = 1;
1405  }
1406 
1407  if (p)
1408  *p = ':';
1409 
1410  if (used && opts_used)
1411  av_dict_set(opts_used, t->key, "", 0);
1412  }
1413 
1414  *dst = ret;
1415  return 0;
1416 }
1417 
1419  AVDictionary *local_codec_opts,
1420  AVDictionary ***dst)
1421 {
1422  int ret;
1423  AVDictionary **opts;
1424 
1425  *dst = NULL;
1426 
1427  if (!s->nb_streams)
1428  return 0;
1429 
1430  opts = av_calloc(s->nb_streams, sizeof(*opts));
1431  if (!opts)
1432  return AVERROR(ENOMEM);
1433 
1434  for (int i = 0; i < s->nb_streams; i++) {
1435  ret = filter_codec_opts(local_codec_opts, s->streams[i]->codecpar->codec_id,
1436  s, s->streams[i], NULL, &opts[i], NULL);
1437  if (ret < 0)
1438  goto fail;
1439  }
1440  *dst = opts;
1441  return 0;
1442 fail:
1443  for (int i = 0; i < s->nb_streams; i++)
1444  av_dict_free(&opts[i]);
1445  av_freep(&opts);
1446  return ret;
1447 }
1448 
1449 int grow_array(void **array, int elem_size, int *size, int new_size)
1450 {
1451  if (new_size >= INT_MAX / elem_size) {
1452  av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
1453  return AVERROR(ERANGE);
1454  }
1455  if (*size < new_size) {
1456  uint8_t *tmp = av_realloc_array(*array, new_size, elem_size);
1457  if (!tmp)
1458  return AVERROR(ENOMEM);
1459  memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
1460  *size = new_size;
1461  *array = tmp;
1462  return 0;
1463  }
1464  return 0;
1465 }
1466 
1467 void *allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
1468 {
1469  void *new_elem;
1470 
1471  if (!(new_elem = av_mallocz(elem_size)) ||
1472  av_dynarray_add_nofree(ptr, nb_elems, new_elem) < 0)
1473  return NULL;
1474  return new_elem;
1475 }
1476 
1477 double get_rotation(const int32_t *displaymatrix)
1478 {
1479  double theta = 0;
1480  if (displaymatrix)
1481  theta = -round(av_display_rotation_get(displaymatrix));
1482 
1483  theta -= 360*floor(theta/360 + 0.9/360);
1484 
1485  if (fabs(theta - 90*round(theta/90)) > 2)
1486  av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
1487  "If you want to help, upload a sample "
1488  "of this file to https://streams.videolan.org/upload/ "
1489  "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
1490 
1491  return theta;
1492 }
1493 
1494 /* read file contents into a string */
1495 char *file_read(const char *filename)
1496 {
1497  AVIOContext *pb = NULL;
1498  int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1499  AVBPrint bprint;
1500  char *str;
1501 
1502  if (ret < 0) {
1503  av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1504  return NULL;
1505  }
1506 
1508  ret = avio_read_to_bprint(pb, &bprint, SIZE_MAX);
1509  avio_closep(&pb);
1510  if (ret < 0) {
1511  av_bprint_finalize(&bprint, NULL);
1512  return NULL;
1513  }
1514  ret = av_bprint_finalize(&bprint, &str);
1515  if (ret < 0)
1516  return NULL;
1517  return str;
1518 }
1519 
1521 {
1522  const AVDictionaryEntry *t = NULL;
1523 
1524  while ((t = av_dict_iterate(b, t))) {
1526  }
1527 }
1528 
1530 {
1531  const AVDictionaryEntry *t = av_dict_iterate(m, NULL);
1532  if (t) {
1533  av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1534  return AVERROR_OPTION_NOT_FOUND;
1535  }
1536 
1537  return 0;
1538 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
fopen_utf8
static FILE * fopen_utf8(const char *path, const char *mode)
Definition: fopen_utf8.h:66
GET_ARG
#define GET_ARG(arg)
OPT_EXIT
#define OPT_EXIT
Definition: cmdutils.h:203
show_help_options
void show_help_options(const OptionDef *options, const char *msg, int req_flags, int rej_flags)
Print help for all options matching specified flags.
Definition: cmdutils.c:107
AVCodec
AVCodec.
Definition: codec.h:187
OptionGroup::group_def
const OptionGroupDef * group_def
Definition: cmdutils.h:337
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
level
uint8_t level
Definition: svq3.c:205
INFINITY
#define INFINITY
Definition: mathematics.h:118
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
get_rotation
double get_rotation(const int32_t *displaymatrix)
Definition: cmdutils.c:1477
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
OptionDef::off
size_t off
Definition: cmdutils.h:249
libm.h
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1229
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1529
av_opt_child_class_iterate
const AVClass * av_opt_child_class_iterate(const AVClass *parent, void **iter)
Iterate over potential AVOptions-enabled children of parent.
Definition: opt.c:2050
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
AVCodec::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: codec.h:221
va_copy.h
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:674
stream_specifier_parse
int stream_specifier_parse(StreamSpecifier *ss, const char *spec, int allow_remainder, void *logctx)
Parse a stream specifier string into a form suitable for matching.
Definition: cmdutils.c:1009
sws_dict
AVDictionary * sws_dict
Definition: cmdutils.c:56
int64_t
long long int64_t
Definition: coverity.c:34
avformat_get_class
const AVClass * avformat_get_class(void)
Get the AVClass for AVFormatContext.
Definition: options.c:201
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
OPT_FLAG_OFFSET
#define OPT_FLAG_OFFSET
Definition: cmdutils.h:219
init_report
int init_report(const char *env, FILE **file)
Definition: opt_common.c:1149
OPT_INPUT
#define OPT_INPUT
Definition: cmdutils.h:233
parse_number
int parse_number(const char *context, const char *numstr, enum OptionType type, double min, double max, double *dst)
Parse a string and return its corresponding value as a double.
Definition: cmdutils.c:84
StreamSpecifier
Definition: cmdutils.h:113
AVOption
AVOption.
Definition: opt.h:429
OptionGroupList::groups
OptionGroup * groups
Definition: cmdutils.h:356
b
#define b
Definition: input.c:41
OptionDef::dst_ptr
void * dst_ptr
Definition: cmdutils.h:247
OptionGroupList::nb_groups
int nb_groups
Definition: cmdutils.h:357
avio_open
int avio_open(AVIOContext **s, const char *filename, int flags)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: avio.c:497
format_opts
AVDictionary * format_opts
Definition: cmdutils.c:58
OptionDef::type
enum OptionType type
Definition: cmdutils.h:193
grow_array
int 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:1449
FLAGS
#define FLAGS
Definition: cmdutils.c:595
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
base
uint8_t base
Definition: vp3data.h:128
freeenv_utf8
static void freeenv_utf8(char *var)
Definition: getenv_utf8.h:72
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:472
OptionGroup::swr_opts
AVDictionary * swr_opts
Definition: cmdutils.h:346
show_help_children
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:140
AVOption::flags
int flags
A combination of AV_OPT_FLAG_*.
Definition: opt.h:472
max
#define max(a, b)
Definition: cuda_runtime.h:33
AVDictionary
Definition: dict.c:34
finish_group
static int finish_group(OptionParseContext *octx, int group_idx, const char *arg)
Definition: cmdutils.c:688
hide_banner
int hide_banner
Definition: cmdutils.c:60
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:103
STREAM_LIST_GROUP_ID
@ STREAM_LIST_GROUP_ID
Definition: cmdutils.h:109
opt_has_arg
static int opt_has_arg(const OptionDef *o)
Definition: cmdutils.c:231
OptionDef
Definition: cmdutils.h:191
stream_specifier_uninit
void stream_specifier_uninit(StreamSpecifier *ss)
Definition: cmdutils.c:1000
finish
static void finish(void)
Definition: movenc.c:374
fopen_utf8.h
OptionGroupList
A list of option groups that all have the same group type (e.g.
Definition: cmdutils.h:353
fail
#define fail()
Definition: checkasm.h:193
OptionParseContext
Definition: cmdutils.h:360
init_parse_context
static int init_parse_context(OptionParseContext *octx, const OptionGroupDef *groups, int nb_groups)
Definition: cmdutils.c:740
AVERROR_OPTION_NOT_FOUND
#define AVERROR_OPTION_NOT_FOUND
Option not found.
Definition: error.h:63
Option
An option extracted from the commandline.
Definition: cmdutils.h:315
val
static double val(void *priv, double ch)
Definition: aeval.c:77
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
sws_get_class
const AVClass * sws_get_class(void)
Get the AVClass for SwsContext.
Definition: options.c:106
OPT_TYPE_FLOAT
@ OPT_TYPE_FLOAT
Definition: cmdutils.h:86
OptionGroup::nb_opts
int nb_opts
Definition: cmdutils.h:341
OptionGroupList::group_def
const OptionGroupDef * group_def
Definition: cmdutils.h:354
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
OptionDef::help
const char * help
Definition: cmdutils.h:251
OptionGroupDef
Definition: cmdutils.h:321
AV_OPT_FLAG_AUDIO_PARAM
#define AV_OPT_FLAG_AUDIO_PARAM
Definition: opt.h:357
check_stream_specifier
int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the given stream matches a stream specifier.
Definition: cmdutils.c:1336
first
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
Definition: rate_distortion.txt:12
avassert.h
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:235
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
OptionGroup::codec_opts
AVDictionary * codec_opts
Definition: cmdutils.h:343
check_options
static void check_options(const OptionDef *po)
Definition: cmdutils.c:537
av_dict_get
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:62
class
#define class
Definition: math.h:25
report_file
static FILE * report_file
Definition: opt_common.c:72
s
#define s(width, name)
Definition: cbs_vp9.c:198
OptionDef::argname
const char * argname
Definition: cmdutils.h:252
split_commandline
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:787
avio_read_to_bprint
int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size)
Read contents of h into print buffer, up to max_size bytes, or up to EOF.
Definition: aviobuf.c:1251
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
floor
static __device__ float floor(float a)
Definition: cuda_runtime.h:173
g
const char * g
Definition: vf_curves.c:128
AVDictionaryEntry::key
char * key
Definition: dict.h:90
Option::key
const char * key
Definition: cmdutils.h:317
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
OPT_TYPE_DOUBLE
@ OPT_TYPE_DOUBLE
Definition: cmdutils.h:87
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
nb_streams
static int nb_streams
Definition: ffprobe.c:385
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
key
const char * key
Definition: hwcontext_opencl.c:189
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
arg
const char * arg
Definition: jacosubdec.c:67
if
if(ret)
Definition: filter_design.txt:179
context
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
Definition: writing_filters.txt:91
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
init_dynload
void init_dynload(void)
Initialize dynamic library loading.
Definition: cmdutils.c:75
opts
AVDictionary * opts
Definition: movenc.c:51
OptionGroup::format_opts
AVDictionary * format_opts
Definition: cmdutils.h:344
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:771
STREAM_LIST_PROGRAM
@ STREAM_LIST_PROGRAM
Definition: cmdutils.h:108
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
avcodec_get_class
const AVClass * avcodec_get_class(void)
Get the AVClass for AVCodecContext.
Definition: options.c:184
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
NULL
#define NULL
Definition: coverity.c:32
OptionParseContext::global_opts
OptionGroup global_opts
Definition: cmdutils.h:361
Option::opt
const OptionDef * opt
Definition: cmdutils.h:316
add_opt
static int add_opt(OptionParseContext *octx, const OptionDef *opt, const char *key, const char *val)
Definition: cmdutils.c:722
prepare_app_arguments
static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
Definition: cmdutils.c:225
swr_get_class
const AVClass * swr_get_class(void)
Get the AVClass for SwrContext.
Definition: options.c:143
filter_codec_opts
int filter_codec_opts(const AVDictionary *opts, enum AVCodecID codec_id, AVFormatContext *s, AVStream *st, const AVCodec *codec, AVDictionary **dst, AVDictionary **opts_used)
Filter out options for given codec.
Definition: cmdutils.c:1350
parseutils.h
opt_loglevel
int opt_loglevel(void *optctx, const char *opt, const char *arg)
Set the libav* libraries log level.
Definition: opt_common.c:1253
STREAM_LIST_STREAM_ID
@ STREAM_LIST_STREAM_ID
Definition: cmdutils.h:107
getenv_utf8
static char * getenv_utf8(const char *varname)
Definition: getenv_utf8.h:67
options
Definition: swscale.c:42
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1228
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:828
AV_OPT_SEARCH_FAKE_OBJ
#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:613
av_parse_time
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:592
stream_specifier_match
unsigned stream_specifier_match(const StreamSpecifier *ss, const AVFormatContext *s, const AVStream *st, void *logctx)
Definition: cmdutils.c:1224
STREAM_LIST_GROUP_IDX
@ STREAM_LIST_GROUP_IDX
Definition: cmdutils.h:110
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
OptionGroup::opts
Option * opts
Definition: cmdutils.h:340
OptionGroup
Definition: cmdutils.h:336
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
swresample.h
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
file_read
char * file_read(const char *filename)
Definition: cmdutils.c:1495
locate_option
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:486
codec_opts
AVDictionary * codec_opts
Definition: cmdutils.c:58
eval.h
av_opt_find
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:1991
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
OPT_TYPE_INT
@ OPT_TYPE_INT
Definition: cmdutils.h:84
SpecifierOptList
Definition: cmdutils.h:179
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:240
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
get_preset_file
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:921
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
uninit_opts
void uninit_opts(void)
Uninitialize the cmdutils option system, in particular free the *_opts contexts and their contents.
Definition: cmdutils.c:62
size
int size
Definition: twinvq_data.h:10344
OPT_TYPE_INT64
@ OPT_TYPE_INT64
Definition: cmdutils.h:85
printf
printf("static const uint8_t my_array[100] = {\n")
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
OptionType
OptionType
Definition: cmdutils.h:80
allocate_array_elem
void * allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
Atomically add a new element to an array of pointers, i.e.
Definition: cmdutils.c:1467
getenv_utf8.h
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
OPT_FLAG_SPEC
#define OPT_FLAG_SPEC
Definition: cmdutils.h:224
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:223
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:36
OPT_TYPE_FUNC
@ OPT_TYPE_FUNC
Definition: cmdutils.h:81
av_opt_show2
int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags)
Show the obj options.
Definition: opt.c:1666
OPT_DECODER
#define OPT_DECODER
Definition: cmdutils.h:244
OPT_TYPE_BOOL
@ OPT_TYPE_BOOL
Definition: cmdutils.h:82
OPT_HAS_CANON
#define OPT_HAS_CANON
Definition: cmdutils.h:241
OptionDef::u1
union OptionDef::@2 u1
av_log_set_level
void av_log_set_level(int level)
Set the log level.
Definition: log.c:447
bprint.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
round
static av_always_inline av_const double round(double x)
Definition: libm.h:444
OPT_TYPE_TIME
@ OPT_TYPE_TIME
Definition: cmdutils.h:88
setup_find_stream_info_opts
int setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *local_codec_opts, AVDictionary ***dst)
Setup AVCodecContext options for avformat_find_stream_info().
Definition: cmdutils.c:1418
swr_opts
AVDictionary * swr_opts
Definition: cmdutils.c:57
AVCodecParameters::height
int height
Definition: codec_par.h:135
AV_OPT_FLAG_SUBTITLE_PARAM
#define AV_OPT_FLAG_SUBTITLE_PARAM
Definition: opt.h:359
display.h
parse_options
int parse_options(void *optctx, int argc, char **argv, const OptionDef *options, int(*parse_arg_function)(void *, const char *))
Definition: cmdutils.c:417
av_toupper
static av_const int av_toupper(int c)
Locale-independent conversion of ASCII characters to uppercase.
Definition: avstring.h:227
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_OPT_FLAG_VIDEO_PARAM
#define AV_OPT_FLAG_VIDEO_PARAM
Definition: opt.h:358
OPT_FUNC_ARG
#define OPT_FUNC_ARG
Definition: cmdutils.h:201
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1224
OPT_OUTPUT
#define OPT_OUTPUT
Definition: cmdutils.h:234
len
int len
Definition: vorbis_enc_data.h:426
cmdutils_isalnum
int cmdutils_isalnum(char c)
Definition: cmdutils.c:993
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
OptionParseContext::groups
OptionGroupList * groups
Definition: cmdutils.h:363
OptionDef::u
union OptionDef::@1 u
parse_loglevel
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:553
OptionGroup::sws_dict
AVDictionary * sws_dict
Definition: cmdutils.h:345
av_opt_eval_flags
int av_opt_eval_flags(void *obj, const AVOption *o, const char *val, int *flags_out)
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:817
array
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:116
tag
uint32_t tag
Definition: movenc.c:1879
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:760
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:203
read_yesno
int read_yesno(void)
Return a positive value if a line read from standard input starts with [yY], otherwise return 0.
Definition: cmdutils.c:910
av_strtod
double av_strtod(const char *numstr, char **tail)
Parse the string in numstr and return its value as a double.
Definition: eval.c:107
av_strlcat
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:95
OptionGroup::arg
const char * arg
Definition: cmdutils.h:338
uninit_parse_context
void uninit_parse_context(OptionParseContext *octx)
Free all allocated memory in an OptionParseContext.
Definition: cmdutils.c:762
log_callback_help
void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
Trivial log callback.
Definition: cmdutils.c:70
OPT_PERFILE
#define OPT_PERFILE
Definition: cmdutils.h:215
avformat.h
dict.h
remove_avoptions
void remove_avoptions(AVDictionary **a, AVDictionary *b)
Definition: cmdutils.c:1520
AV_DICT_MATCH_CASE
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
Definition: dict.h:74
av_dynarray_add_nofree
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition: mem.c:315
AVStreamGroup
Definition: avformat.h:1134
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:754
OPT_FLAG_PERSTREAM
#define OPT_FLAG_PERSTREAM
Definition: cmdutils.h:228
parse_option
int parse_option(void *optctx, const char *opt, const char *arg, const OptionDef *options)
Parse one given option.
Definition: cmdutils.c:377
opt_common.h
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
av_get_token
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
Definition: avstring.c:143
write_option
static int write_option(void *optctx, const OptionDef *po, const char *opt, const char *arg, const OptionDef *defs)
Definition: cmdutils.c:240
Option::val
const char * val
Definition: cmdutils.h:318
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:532
OptionDef::name_canon
const char * name_canon
Definition: cmdutils.h:257
parse_optgroup
int parse_optgroup(void *optctx, OptionGroup *g, const OptionDef *defs)
Parse an options group and write results into optctx.
Definition: cmdutils.c:453
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:617
opt_default
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:596
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVCodecParameters::format
int format
Definition: codec_par.h:92
OptionDef::name
const char * name
Definition: cmdutils.h:192
STREAM_LIST_ALL
@ STREAM_LIST_ALL
Definition: cmdutils.h:106
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDictionaryEntry
Definition: dict.h:89
OPT_TYPE_STRING
@ OPT_TYPE_STRING
Definition: cmdutils.h:83
OptionGroupDef::sep
const char * sep
Option to be used as group separator.
Definition: cmdutils.h:328
avio_closep
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
Definition: avio.c:649
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
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:88
cmdutils.h
int32_t
int32_t
Definition: audioconvert.c:56
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
av_strlcpy
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:85
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
OptionParseContext::nb_groups
int nb_groups
Definition: cmdutils.h:364
find_option
static const OptionDef * find_option(const OptionDef *po, const char *name)
Definition: cmdutils.c:153
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
AVDictionaryEntry::value
char * value
Definition: dict.h:91
avstring.h
av_stream_get_class
const AVClass * av_stream_get_class(void)
Get the AVClass for AVStream.
Definition: options.c:250
av_strndup
char * av_strndup(const char *s, size_t len)
Duplicate a substring of a string.
Definition: mem.c:284
snprintf
#define snprintf
Definition: snprintf.h:34
OptionParseContext::cur_group
OptionGroup cur_group
Definition: cmdutils.h:367
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:44
dump_argument
static void dump_argument(FILE *report_file, const char *a)
Definition: cmdutils.c:513
swscale.h
match_group_separator
static int match_group_separator(const OptionGroupDef *groups, int nb_groups, const char *opt)
Definition: cmdutils.c:668
w32dlfcn.h
OptionDef::func_arg
int(* func_arg)(void *, const char *, const char *)
Definition: cmdutils.h:248
opt_find
static const AVOption * opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Definition: cmdutils.c:586
av_display_rotation_get
double av_display_rotation_get(const int32_t matrix[9])
Extract the rotation component of the transformation matrix.
Definition: display.c:35
min
float min
Definition: vorbis_enc_data.h:429
OptionDef::flags
int flags
Definition: cmdutils.h:194