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) {
355  if ((strcmp(opt, "init_hw_device") != 0) || (strcmp(arg, "list") != 0)) {
357  "Failed to set value '%s' for option '%s': %s\n",
358  arg, opt, av_err2str(ret));
359  }
360  goto finish;
361  }
362  }
363  if (po->flags & OPT_EXIT) {
364  ret = AVERROR_EXIT;
365  goto finish;
366  }
367 
368  if (sol) {
369  sol->type = so_type;
370  sol->opt_canon = (po->flags & OPT_HAS_CANON) ?
371  find_option(defs, po->u1.name_canon) : po;
372  }
373 
374 finish:
375  av_freep(&arg_allocated);
376  return ret;
377 }
378 
379 int parse_option(void *optctx, const char *opt, const char *arg,
380  const OptionDef *options)
381 {
382  static const OptionDef opt_avoptions = {
383  .name = "AVOption passthrough",
384  .type = OPT_TYPE_FUNC,
385  .flags = OPT_FUNC_ARG,
386  .u.func_arg = opt_default,
387  };
388 
389  const OptionDef *po;
390  int ret;
391 
392  po = find_option(options, opt);
393  if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
394  /* handle 'no' bool option */
395  po = find_option(options, opt + 2);
396  if ((po->name && po->type == OPT_TYPE_BOOL))
397  arg = "0";
398  } else if (po->type == OPT_TYPE_BOOL)
399  arg = "1";
400 
401  if (!po->name)
402  po = &opt_avoptions;
403  if (!po->name) {
404  av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
405  return AVERROR(EINVAL);
406  }
407  if (opt_has_arg(po) && !arg) {
408  av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
409  return AVERROR(EINVAL);
410  }
411 
412  ret = write_option(optctx, po, opt, arg, options);
413  if (ret < 0)
414  return ret;
415 
416  return opt_has_arg(po);
417 }
418 
419 int parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
420  int (*parse_arg_function)(void *, const char*))
421 {
422  const char *opt;
423  int optindex, handleoptions = 1, ret;
424 
425  /* perform system-dependent conversions for arguments list */
426  prepare_app_arguments(&argc, &argv);
427 
428  /* parse options */
429  optindex = 1;
430  while (optindex < argc) {
431  opt = argv[optindex++];
432 
433  if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
434  if (opt[1] == '-' && opt[2] == '\0') {
435  handleoptions = 0;
436  continue;
437  }
438  opt++;
439 
440  if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
441  return ret;
442  optindex += ret;
443  } else {
444  if (parse_arg_function) {
445  ret = parse_arg_function(optctx, opt);
446  if (ret < 0)
447  return ret;
448  }
449  }
450  }
451 
452  return 0;
453 }
454 
455 int parse_optgroup(void *optctx, OptionGroup *g, const OptionDef *defs)
456 {
457  int i, ret;
458 
459  av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
460  g->group_def->name, g->arg);
461 
462  for (i = 0; i < g->nb_opts; i++) {
463  Option *o = &g->opts[i];
464 
465  if (g->group_def->flags &&
466  !(g->group_def->flags & o->opt->flags)) {
467  av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to "
468  "%s %s -- you are trying to apply an input option to an "
469  "output file or vice versa. Move this option before the "
470  "file it belongs to.\n", o->key, o->opt->help,
471  g->group_def->name, g->arg);
472  return AVERROR(EINVAL);
473  }
474 
475  av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
476  o->key, o->opt->help, o->val);
477 
478  ret = write_option(optctx, o->opt, o->key, o->val, defs);
479  if (ret < 0)
480  return ret;
481  }
482 
483  av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
484 
485  return 0;
486 }
487 
488 int locate_option(int argc, char **argv, const OptionDef *options,
489  const char *optname)
490 {
491  const OptionDef *po;
492  int i;
493 
494  for (i = 1; i < argc; i++) {
495  const char *cur_opt = argv[i];
496 
497  if (!(cur_opt[0] == '-' && cur_opt[1]))
498  continue;
499  cur_opt++;
500 
501  po = find_option(options, cur_opt);
502  if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
503  po = find_option(options, cur_opt + 2);
504 
505  if ((!po->name && !strcmp(cur_opt, optname)) ||
506  (po->name && !strcmp(optname, po->name)))
507  return i;
508 
509  if (!po->name || opt_has_arg(po))
510  i++;
511  }
512  return 0;
513 }
514 
515 static void dump_argument(FILE *report_file, const char *a)
516 {
517  const unsigned char *p;
518 
519  for (p = a; *p; p++)
520  if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
521  *p == '_' || (*p >= 'a' && *p <= 'z')))
522  break;
523  if (!*p) {
524  fputs(a, report_file);
525  return;
526  }
527  fputc('"', report_file);
528  for (p = a; *p; p++) {
529  if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
530  fprintf(report_file, "\\%c", *p);
531  else if (*p < ' ' || *p > '~')
532  fprintf(report_file, "\\x%02x", *p);
533  else
534  fputc(*p, report_file);
535  }
536  fputc('"', report_file);
537 }
538 
539 static void check_options(const OptionDef *po)
540 {
541  while (po->name) {
542  if (po->flags & OPT_PERFILE)
544 
545  if (po->type == OPT_TYPE_FUNC)
547 
548  // OPT_FUNC_ARG can only be ser for OPT_TYPE_FUNC
549  av_assert0((po->type == OPT_TYPE_FUNC) || !(po->flags & OPT_FUNC_ARG));
550 
551  po++;
552  }
553 }
554 
555 void parse_loglevel(int argc, char **argv, const OptionDef *options)
556 {
557  int idx;
558  char *env;
559 
561 
562  idx = locate_option(argc, argv, options, "loglevel");
563  if (!idx)
564  idx = locate_option(argc, argv, options, "v");
565  if (idx && argv[idx + 1])
566  opt_loglevel(NULL, "loglevel", argv[idx + 1]);
567  idx = locate_option(argc, argv, options, "report");
568  env = getenv_utf8("FFREPORT");
569  if (env || idx) {
570  FILE *report_file = NULL;
571  init_report(env, &report_file);
572  if (report_file) {
573  int i;
574  fprintf(report_file, "Command line:\n");
575  for (i = 0; i < argc; i++) {
576  dump_argument(report_file, argv[i]);
577  fputc(i < argc - 1 ? ' ' : '\n', report_file);
578  }
579  fflush(report_file);
580  }
581  }
582  freeenv_utf8(env);
583  idx = locate_option(argc, argv, options, "hide_banner");
584  if (idx)
585  hide_banner = 1;
586 }
587 
588 static const AVOption *opt_find(void *obj, const char *name, const char *unit,
589  int opt_flags, int search_flags)
590 {
591  const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags);
592  if(o && !o->flags)
593  return NULL;
594  return o;
595 }
596 
597 #define FLAGS ((o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0)
598 int opt_default(void *optctx, const char *opt, const char *arg)
599 {
600  const AVOption *o;
601  int consumed = 0;
602  char opt_stripped[128];
603  const char *p;
604  const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
605 #if CONFIG_SWSCALE
606  const AVClass *sc = sws_get_class();
607 #endif
608 #if CONFIG_SWRESAMPLE
609  const AVClass *swr_class = swr_get_class();
610 #endif
611 
612  if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
614 
615  if (!(p = strchr(opt, ':')))
616  p = opt + strlen(opt);
617  av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
618 
619  if ((o = opt_find(&cc, opt_stripped, NULL, 0,
621  ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
622  (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
623  av_dict_set(&codec_opts, opt, arg, FLAGS);
624  consumed = 1;
625  }
626  if ((o = opt_find(&fc, opt, NULL, 0,
628  av_dict_set(&format_opts, opt, arg, FLAGS);
629  if (consumed)
630  av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
631  consumed = 1;
632  }
633 #if CONFIG_SWSCALE
634  if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
636  if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
637  !strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
638  !strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) {
639  av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n");
640  return AVERROR(EINVAL);
641  }
642  av_dict_set(&sws_dict, opt, arg, FLAGS);
643 
644  consumed = 1;
645  }
646 #else
647  if (!consumed && !strcmp(opt, "sws_flags")) {
648  av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg);
649  consumed = 1;
650  }
651 #endif
652 #if CONFIG_SWRESAMPLE
653  if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
655  av_dict_set(&swr_opts, opt, arg, FLAGS);
656  consumed = 1;
657  }
658 #endif
659 
660  if (consumed)
661  return 0;
663 }
664 
665 /*
666  * Check whether given option is a group separator.
667  *
668  * @return index of the group definition that matched or -1 if none
669  */
670 static int match_group_separator(const OptionGroupDef *groups, int nb_groups,
671  const char *opt)
672 {
673  int i;
674 
675  for (i = 0; i < nb_groups; i++) {
676  const OptionGroupDef *p = &groups[i];
677  if (p->sep && !strcmp(p->sep, opt))
678  return i;
679  }
680 
681  return -1;
682 }
683 
684 /*
685  * Finish parsing an option group.
686  *
687  * @param group_idx which group definition should this group belong to
688  * @param arg argument of the group delimiting option
689  */
690 static int finish_group(OptionParseContext *octx, int group_idx,
691  const char *arg)
692 {
693  OptionGroupList *l = &octx->groups[group_idx];
694  OptionGroup *g;
695  int ret;
696 
697  ret = GROW_ARRAY(l->groups, l->nb_groups);
698  if (ret < 0)
699  return ret;
700 
701  g = &l->groups[l->nb_groups - 1];
702 
703  *g = octx->cur_group;
704  g->arg = arg;
705  g->group_def = l->group_def;
706  g->sws_dict = sws_dict;
707  g->swr_opts = swr_opts;
708  g->codec_opts = codec_opts;
709  g->format_opts = format_opts;
710 
711  codec_opts = NULL;
712  format_opts = NULL;
713  sws_dict = NULL;
714  swr_opts = NULL;
715 
716  memset(&octx->cur_group, 0, sizeof(octx->cur_group));
717 
718  return ret;
719 }
720 
721 /*
722  * Add an option instance to currently parsed group.
723  */
724 static int add_opt(OptionParseContext *octx, const OptionDef *opt,
725  const char *key, const char *val)
726 {
727  int global = !(opt->flags & OPT_PERFILE);
728  OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
729  int ret;
730 
731  ret = GROW_ARRAY(g->opts, g->nb_opts);
732  if (ret < 0)
733  return ret;
734 
735  g->opts[g->nb_opts - 1].opt = opt;
736  g->opts[g->nb_opts - 1].key = key;
737  g->opts[g->nb_opts - 1].val = val;
738 
739  return 0;
740 }
741 
743  const OptionGroupDef *groups, int nb_groups)
744 {
745  static const OptionGroupDef global_group = { "global" };
746  int i;
747 
748  memset(octx, 0, sizeof(*octx));
749 
750  octx->groups = av_calloc(nb_groups, sizeof(*octx->groups));
751  if (!octx->groups)
752  return AVERROR(ENOMEM);
753  octx->nb_groups = nb_groups;
754 
755  for (i = 0; i < octx->nb_groups; i++)
756  octx->groups[i].group_def = &groups[i];
757 
758  octx->global_opts.group_def = &global_group;
759  octx->global_opts.arg = "";
760 
761  return 0;
762 }
763 
765 {
766  int i, j;
767 
768  for (i = 0; i < octx->nb_groups; i++) {
769  OptionGroupList *l = &octx->groups[i];
770 
771  for (j = 0; j < l->nb_groups; j++) {
772  av_freep(&l->groups[j].opts);
775 
776  av_dict_free(&l->groups[j].sws_dict);
777  av_dict_free(&l->groups[j].swr_opts);
778  }
779  av_freep(&l->groups);
780  }
781  av_freep(&octx->groups);
782 
783  av_freep(&octx->cur_group.opts);
784  av_freep(&octx->global_opts.opts);
785 
786  uninit_opts();
787 }
788 
789 int split_commandline(OptionParseContext *octx, int argc, char *argv[],
790  const OptionDef *options,
791  const OptionGroupDef *groups, int nb_groups)
792 {
793  int ret;
794  int optindex = 1;
795  int dashdash = -2;
796 
797  /* perform system-dependent conversions for arguments list */
798  prepare_app_arguments(&argc, &argv);
799 
800  ret = init_parse_context(octx, groups, nb_groups);
801  if (ret < 0)
802  return ret;
803 
804  av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
805 
806  while (optindex < argc) {
807  const char *opt = argv[optindex++], *arg;
808  const OptionDef *po;
809  int group_idx;
810 
811  av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
812 
813  if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
814  dashdash = optindex;
815  continue;
816  }
817  /* unnamed group separators, e.g. output filename */
818  if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
819  ret = finish_group(octx, 0, opt);
820  if (ret < 0)
821  return ret;
822 
823  av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
824  continue;
825  }
826  opt++;
827 
828 #define GET_ARG(arg) \
829 do { \
830  arg = argv[optindex++]; \
831  if (!arg) { \
832  av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
833  return AVERROR(EINVAL); \
834  } \
835 } while (0)
836 
837  /* named group separators, e.g. -i */
838  group_idx = match_group_separator(groups, nb_groups, opt);
839  if (group_idx >= 0) {
840  GET_ARG(arg);
841  ret = finish_group(octx, group_idx, arg);
842  if (ret < 0)
843  return ret;
844 
845  av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
846  groups[group_idx].name, arg);
847  continue;
848  }
849 
850  /* normal options */
851  po = find_option(options, opt);
852  if (po->name) {
853  if (po->flags & OPT_EXIT) {
854  /* optional argument, e.g. -h */
855  arg = argv[optindex++];
856  } else if (opt_has_arg(po)) {
857  GET_ARG(arg);
858  } else {
859  arg = "1";
860  }
861 
862  ret = add_opt(octx, po, opt, arg);
863  if (ret < 0)
864  return ret;
865 
866  av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
867  "argument '%s'.\n", po->name, po->help, arg);
868  continue;
869  }
870 
871  /* AVOptions */
872  if (argv[optindex]) {
873  ret = opt_default(NULL, opt, argv[optindex]);
874  if (ret >= 0) {
875  av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
876  "argument '%s'.\n", opt, argv[optindex]);
877  optindex++;
878  continue;
879  } else if (ret != AVERROR_OPTION_NOT_FOUND) {
880  av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' "
881  "with argument '%s'.\n", opt, argv[optindex]);
882  return ret;
883  }
884  }
885 
886  /* boolean -nofoo options */
887  if (opt[0] == 'n' && opt[1] == 'o' &&
888  (po = find_option(options, opt + 2)) &&
889  po->name && po->type == OPT_TYPE_BOOL) {
890  ret = add_opt(octx, po, opt, "0");
891  if (ret < 0)
892  return ret;
893 
894  av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
895  "argument 0.\n", po->name, po->help);
896  continue;
897  }
898 
899  av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt);
901  }
902 
903  if (octx->cur_group.nb_opts || codec_opts || format_opts)
904  av_log(NULL, AV_LOG_WARNING, "Trailing option(s) found in the "
905  "command: may be ignored.\n");
906 
907  av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
908 
909  return 0;
910 }
911 
912 int read_yesno(void)
913 {
914  int c = getchar();
915  int yesno = (av_toupper(c) == 'Y');
916 
917  while (c != '\n' && c != EOF)
918  c = getchar();
919 
920  return yesno;
921 }
922 
923 FILE *get_preset_file(char *filename, size_t filename_size,
924  const char *preset_name, int is_path,
925  const char *codec_name)
926 {
927  FILE *f = NULL;
928  int i;
929 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
930  char *datadir = NULL;
931 #endif
932  char *env_home = getenv_utf8("HOME");
933  char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR");
934  const char *base[3] = { env_ffmpeg_datadir,
935  env_home, /* index=1(HOME) is special: search in a .ffmpeg subfolder */
936  FFMPEG_DATADIR, };
937 
938  if (is_path) {
939  av_strlcpy(filename, preset_name, filename_size);
940  f = fopen_utf8(filename, "r");
941  } else {
942 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
943  wchar_t *datadir_w = get_module_filename(NULL);
944  base[2] = NULL;
945 
946  if (wchartoutf8(datadir_w, &datadir))
947  datadir = NULL;
948  av_free(datadir_w);
949 
950  if (datadir)
951  {
952  char *ls;
953  for (ls = datadir; *ls; ls++)
954  if (*ls == '\\') *ls = '/';
955 
956  if (ls = strrchr(datadir, '/'))
957  {
958  ptrdiff_t datadir_len = ls - datadir;
959  size_t desired_size = datadir_len + strlen("/ffpresets") + 1;
960  char *new_datadir = av_realloc_array(
961  datadir, desired_size, sizeof *datadir);
962  if (new_datadir) {
963  datadir = new_datadir;
964  datadir[datadir_len] = 0;
965  strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
966  base[2] = datadir;
967  }
968  }
969  }
970 #endif
971  for (i = 0; i < 3 && !f; i++) {
972  if (!base[i])
973  continue;
974  snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
975  i != 1 ? "" : "/.ffmpeg", preset_name);
976  f = fopen_utf8(filename, "r");
977  if (!f && codec_name) {
978  snprintf(filename, filename_size,
979  "%s%s/%s-%s.ffpreset",
980  base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
981  preset_name);
982  f = fopen_utf8(filename, "r");
983  }
984  }
985  }
986 
987 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
988  av_free(datadir);
989 #endif
990  freeenv_utf8(env_ffmpeg_datadir);
991  freeenv_utf8(env_home);
992  return f;
993 }
994 
996 {
997  return (c >= '0' && c <= '9') ||
998  (c >= 'A' && c <= 'Z') ||
999  (c >= 'a' && c <= 'z');
1000 }
1001 
1003 {
1004  av_freep(&ss->meta_key);
1005  av_freep(&ss->meta_val);
1006  av_freep(&ss->remainder);
1007 
1008  memset(ss, 0, sizeof(*ss));
1009 }
1010 
1012  int allow_remainder, void *logctx)
1013 {
1014  char *endptr;
1015  int ret;
1016 
1017  memset(ss, 0, sizeof(*ss));
1018 
1019  ss->idx = -1;
1020  ss->media_type = AVMEDIA_TYPE_UNKNOWN;
1021  ss->stream_list = STREAM_LIST_ALL;
1022 
1023  av_log(logctx, AV_LOG_TRACE, "Parsing stream specifier: %s\n", spec);
1024 
1025  while (*spec) {
1026  if (*spec <= '9' && *spec >= '0') { /* opt:index */
1027  ss->idx = strtol(spec, &endptr, 0);
1028 
1029  av_assert0(endptr > spec);
1030  spec = endptr;
1031 
1032  av_log(logctx, AV_LOG_TRACE,
1033  "Parsed index: %d; remainder: %s\n", ss->idx, spec);
1034 
1035  // this terminates the specifier
1036  break;
1037  } else if ((*spec == 'v' || *spec == 'a' || *spec == 's' ||
1038  *spec == 'd' || *spec == 't' || *spec == 'V') &&
1039  !cmdutils_isalnum(*(spec + 1))) { /* opt:[vasdtV] */
1040  if (ss->media_type != AVMEDIA_TYPE_UNKNOWN) {
1041  av_log(logctx, AV_LOG_ERROR, "Stream type specified multiple times\n");
1042  ret = AVERROR(EINVAL);
1043  goto fail;
1044  }
1045 
1046  switch (*spec++) {
1047  case 'v': ss->media_type = AVMEDIA_TYPE_VIDEO; break;
1048  case 'a': ss->media_type = AVMEDIA_TYPE_AUDIO; break;
1049  case 's': ss->media_type = AVMEDIA_TYPE_SUBTITLE; break;
1050  case 'd': ss->media_type = AVMEDIA_TYPE_DATA; break;
1051  case 't': ss->media_type = AVMEDIA_TYPE_ATTACHMENT; break;
1052  case 'V': ss->media_type = AVMEDIA_TYPE_VIDEO;
1053  ss->no_apic = 1; break;
1054  default: av_assert0(0);
1055  }
1056 
1057  av_log(logctx, AV_LOG_TRACE, "Parsed media type: %s; remainder: %s\n",
1058  av_get_media_type_string(ss->media_type), spec);
1059  } else if (*spec == 'g' && *(spec + 1) == ':') {
1060  if (ss->stream_list != STREAM_LIST_ALL)
1061  goto multiple_stream_lists;
1062 
1063  spec += 2;
1064  if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
1065  ss->stream_list = STREAM_LIST_GROUP_ID;
1066 
1067  spec += 1 + (*spec == 'i');
1068  } else
1069  ss->stream_list = STREAM_LIST_GROUP_IDX;
1070 
1071  ss->list_id = strtol(spec, &endptr, 0);
1072  if (spec == endptr) {
1073  av_log(logctx, AV_LOG_ERROR, "Expected stream group idx/ID, got: %s\n", spec);
1074  ret = AVERROR(EINVAL);
1075  goto fail;
1076  }
1077  spec = endptr;
1078 
1079  av_log(logctx, AV_LOG_TRACE, "Parsed stream group %s: %"PRId64"; remainder: %s\n",
1080  ss->stream_list == STREAM_LIST_GROUP_ID ? "ID" : "index", ss->list_id, spec);
1081  } else if (*spec == 'p' && *(spec + 1) == ':') {
1082  if (ss->stream_list != STREAM_LIST_ALL)
1083  goto multiple_stream_lists;
1084 
1085  ss->stream_list = STREAM_LIST_PROGRAM;
1086 
1087  spec += 2;
1088  ss->list_id = strtol(spec, &endptr, 0);
1089  if (spec == endptr) {
1090  av_log(logctx, AV_LOG_ERROR, "Expected program ID, got: %s\n", spec);
1091  ret = AVERROR(EINVAL);
1092  goto fail;
1093  }
1094  spec = endptr;
1095 
1096  av_log(logctx, AV_LOG_TRACE,
1097  "Parsed program ID: %"PRId64"; remainder: %s\n", ss->list_id, spec);
1098  } else if (!strncmp(spec, "disp:", 5)) {
1099  const AVClass *st_class = av_stream_get_class();
1100  const AVOption *o = av_opt_find(&st_class, "disposition", NULL, 0, AV_OPT_SEARCH_FAKE_OBJ);
1101  char *disp = NULL;
1102  size_t len;
1103 
1104  av_assert0(o);
1105 
1106  if (ss->disposition) {
1107  av_log(logctx, AV_LOG_ERROR, "Multiple disposition specifiers\n");
1108  ret = AVERROR(EINVAL);
1109  goto fail;
1110  }
1111 
1112  spec += 5;
1113 
1114  for (len = 0; cmdutils_isalnum(spec[len]) ||
1115  spec[len] == '_' || spec[len] == '+'; len++)
1116  continue;
1117 
1118  disp = av_strndup(spec, len);
1119  if (!disp) {
1120  ret = AVERROR(ENOMEM);
1121  goto fail;
1122  }
1123 
1124  ret = av_opt_eval_flags(&st_class, o, disp, &ss->disposition);
1125  av_freep(&disp);
1126  if (ret < 0) {
1127  av_log(logctx, AV_LOG_ERROR, "Invalid disposition specifier\n");
1128  goto fail;
1129  }
1130 
1131  spec += len;
1132 
1133  av_log(logctx, AV_LOG_TRACE,
1134  "Parsed disposition: 0x%x; remainder: %s\n", ss->disposition, spec);
1135  } else if (*spec == '#' ||
1136  (*spec == 'i' && *(spec + 1) == ':')) {
1137  if (ss->stream_list != STREAM_LIST_ALL)
1138  goto multiple_stream_lists;
1139 
1140  ss->stream_list = STREAM_LIST_STREAM_ID;
1141 
1142  spec += 1 + (*spec == 'i');
1143  ss->list_id = strtol(spec, &endptr, 0);
1144  if (spec == endptr) {
1145  av_log(logctx, AV_LOG_ERROR, "Expected stream ID, got: %s\n", spec);
1146  ret = AVERROR(EINVAL);
1147  goto fail;
1148  }
1149  spec = endptr;
1150 
1151  av_log(logctx, AV_LOG_TRACE,
1152  "Parsed stream ID: %"PRId64"; remainder: %s\n", ss->list_id, spec);
1153 
1154  // this terminates the specifier
1155  break;
1156  } else if (*spec == 'm' && *(spec + 1) == ':') {
1157  av_assert0(!ss->meta_key && !ss->meta_val);
1158 
1159  spec += 2;
1160  ss->meta_key = av_get_token(&spec, ":");
1161  if (!ss->meta_key) {
1162  ret = AVERROR(ENOMEM);
1163  goto fail;
1164  }
1165  if (*spec == ':') {
1166  spec++;
1167  ss->meta_val = av_get_token(&spec, ":");
1168  if (!ss->meta_val) {
1169  ret = AVERROR(ENOMEM);
1170  goto fail;
1171  }
1172  }
1173 
1174  av_log(logctx, AV_LOG_TRACE,
1175  "Parsed metadata: %s:%s; remainder: %s", ss->meta_key,
1176  ss->meta_val ? ss->meta_val : "<any value>", spec);
1177 
1178  // this terminates the specifier
1179  break;
1180  } else if (*spec == 'u' && (*(spec + 1) == '\0' || *(spec + 1) == ':')) {
1181  ss->usable_only = 1;
1182  spec++;
1183  av_log(logctx, AV_LOG_ERROR, "Parsed 'usable only'\n");
1184 
1185  // this terminates the specifier
1186  break;
1187  } else
1188  break;
1189 
1190  if (*spec == ':')
1191  spec++;
1192  }
1193 
1194  if (*spec) {
1195  if (!allow_remainder) {
1196  av_log(logctx, AV_LOG_ERROR,
1197  "Trailing garbage at the end of a stream specifier: %s\n",
1198  spec);
1199  ret = AVERROR(EINVAL);
1200  goto fail;
1201  }
1202 
1203  if (*spec == ':')
1204  spec++;
1205 
1206  ss->remainder = av_strdup(spec);
1207  if (!ss->remainder) {
1208  ret = AVERROR(EINVAL);
1209  goto fail;
1210  }
1211  }
1212 
1213  return 0;
1214 
1215 multiple_stream_lists:
1216  av_log(logctx, AV_LOG_ERROR,
1217  "Cannot combine multiple program/group designators in a "
1218  "single stream specifier");
1219  ret = AVERROR(EINVAL);
1220 
1221 fail:
1223  return ret;
1224 }
1225 
1227  const AVFormatContext *s, const AVStream *st,
1228  void *logctx)
1229 {
1230  const AVStreamGroup *g = NULL;
1231  const AVProgram *p = NULL;
1232  int start_stream = 0, nb_streams;
1233  int nb_matched = 0;
1234 
1235  switch (ss->stream_list) {
1236  case STREAM_LIST_STREAM_ID:
1237  // <n-th> stream with given ID makes no sense and should be impossible to request
1238  av_assert0(ss->idx < 0);
1239  // return early if we know for sure the stream does not match
1240  if (st->id != ss->list_id)
1241  return 0;
1242  start_stream = st->index;
1243  nb_streams = st->index + 1;
1244  break;
1245  case STREAM_LIST_ALL:
1246  start_stream = ss->idx >= 0 ? 0 : st->index;
1247  nb_streams = st->index + 1;
1248  break;
1249  case STREAM_LIST_PROGRAM:
1250  for (unsigned i = 0; i < s->nb_programs; i++) {
1251  if (s->programs[i]->id == ss->list_id) {
1252  p = s->programs[i];
1253  break;
1254  }
1255  }
1256  if (!p) {
1257  av_log(logctx, AV_LOG_WARNING, "No program with ID %"PRId64" exists,"
1258  " stream specifier can never match\n", ss->list_id);
1259  return 0;
1260  }
1262  break;
1263  case STREAM_LIST_GROUP_ID:
1264  for (unsigned i = 0; i < s->nb_stream_groups; i++) {
1265  if (ss->list_id == s->stream_groups[i]->id) {
1266  g = s->stream_groups[i];
1267  break;
1268  }
1269  }
1270  // fall-through
1271  case STREAM_LIST_GROUP_IDX:
1272  if (ss->stream_list == STREAM_LIST_GROUP_IDX &&
1273  ss->list_id >= 0 && ss->list_id < s->nb_stream_groups)
1274  g = s->stream_groups[ss->list_id];
1275 
1276  if (!g) {
1277  av_log(logctx, AV_LOG_WARNING, "No stream group with group %s %"
1278  PRId64" exists, stream specifier can never match\n",
1279  ss->stream_list == STREAM_LIST_GROUP_ID ? "ID" : "index",
1280  ss->list_id);
1281  return 0;
1282  }
1283  nb_streams = g->nb_streams;
1284  break;
1285  default: av_assert0(0);
1286  }
1287 
1288  for (int i = start_stream; i < nb_streams; i++) {
1289  const AVStream *candidate = s->streams[g ? g->streams[i]->index :
1290  p ? p->stream_index[i] : i];
1291 
1292  if (ss->media_type != AVMEDIA_TYPE_UNKNOWN &&
1293  (ss->media_type != candidate->codecpar->codec_type ||
1294  (ss->no_apic && (candidate->disposition & AV_DISPOSITION_ATTACHED_PIC))))
1295  continue;
1296 
1297  if (ss->meta_key) {
1298  const AVDictionaryEntry *tag = av_dict_get(candidate->metadata,
1299  ss->meta_key, NULL, 0);
1300 
1301  if (!tag)
1302  continue;
1303  if (ss->meta_val && strcmp(tag->value, ss->meta_val))
1304  continue;
1305  }
1306 
1307  if (ss->usable_only) {
1308  const AVCodecParameters *par = candidate->codecpar;
1309 
1310  switch (par->codec_type) {
1311  case AVMEDIA_TYPE_AUDIO:
1312  if (!par->sample_rate || !par->ch_layout.nb_channels ||
1313  par->format == AV_SAMPLE_FMT_NONE)
1314  continue;
1315  break;
1316  case AVMEDIA_TYPE_VIDEO:
1317  if (!par->width || !par->height || par->format == AV_PIX_FMT_NONE)
1318  continue;
1319  break;
1320  case AVMEDIA_TYPE_UNKNOWN:
1321  continue;
1322  }
1323  }
1324 
1325  if (ss->disposition &&
1326  (candidate->disposition & ss->disposition) != ss->disposition)
1327  continue;
1328 
1329  if (st == candidate)
1330  return ss->idx < 0 || ss->idx == nb_matched;
1331 
1332  nb_matched++;
1333  }
1334 
1335  return 0;
1336 }
1337 
1338 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
1339 {
1341  int ret;
1342 
1343  ret = stream_specifier_parse(&ss, spec, 0, NULL);
1344  if (ret < 0)
1345  return ret;
1346 
1347  ret = stream_specifier_match(&ss, s, st, NULL);
1349  return ret;
1350 }
1351 
1353  AVFormatContext *s, AVStream *st, const AVCodec *codec,
1354  AVDictionary **dst, AVDictionary **opts_used)
1355 {
1356  AVDictionary *ret = NULL;
1357  const AVDictionaryEntry *t = NULL;
1358  int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
1360  char prefix = 0;
1361  const AVClass *cc = avcodec_get_class();
1362 
1363  switch (st->codecpar->codec_type) {
1364  case AVMEDIA_TYPE_VIDEO:
1365  prefix = 'v';
1367  break;
1368  case AVMEDIA_TYPE_AUDIO:
1369  prefix = 'a';
1371  break;
1372  case AVMEDIA_TYPE_SUBTITLE:
1373  prefix = 's';
1375  break;
1376  }
1377 
1378  while (t = av_dict_iterate(opts, t)) {
1379  const AVClass *priv_class;
1380  char *p = strchr(t->key, ':');
1381  int used = 0;
1382 
1383  /* check stream specification in opt name */
1384  if (p) {
1385  int err = check_stream_specifier(s, st, p + 1);
1386  if (err < 0) {
1387  av_dict_free(&ret);
1388  return err;
1389  } else if (!err)
1390  continue;
1391 
1392  *p = 0;
1393  }
1394 
1395  if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
1396  !codec ||
1397  ((priv_class = codec->priv_class) &&
1398  av_opt_find(&priv_class, t->key, NULL, flags,
1400  av_dict_set(&ret, t->key, t->value, 0);
1401  used = 1;
1402  } else if (t->key[0] == prefix &&
1403  av_opt_find(&cc, t->key + 1, NULL, flags,
1405  av_dict_set(&ret, t->key + 1, t->value, 0);
1406  used = 1;
1407  }
1408 
1409  if (p)
1410  *p = ':';
1411 
1412  if (used && opts_used)
1413  av_dict_set(opts_used, t->key, "", 0);
1414  }
1415 
1416  *dst = ret;
1417  return 0;
1418 }
1419 
1421  AVDictionary *local_codec_opts,
1422  AVDictionary ***dst)
1423 {
1424  int ret;
1425  AVDictionary **opts;
1426 
1427  *dst = NULL;
1428 
1429  if (!s->nb_streams)
1430  return 0;
1431 
1432  opts = av_calloc(s->nb_streams, sizeof(*opts));
1433  if (!opts)
1434  return AVERROR(ENOMEM);
1435 
1436  for (int i = 0; i < s->nb_streams; i++) {
1437  ret = filter_codec_opts(local_codec_opts, s->streams[i]->codecpar->codec_id,
1438  s, s->streams[i], NULL, &opts[i], NULL);
1439  if (ret < 0)
1440  goto fail;
1441  }
1442  *dst = opts;
1443  return 0;
1444 fail:
1445  for (int i = 0; i < s->nb_streams; i++)
1446  av_dict_free(&opts[i]);
1447  av_freep(&opts);
1448  return ret;
1449 }
1450 
1451 int grow_array(void **array, int elem_size, int *size, int new_size)
1452 {
1453  if (new_size >= INT_MAX / elem_size) {
1454  av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
1455  return AVERROR(ERANGE);
1456  }
1457  if (*size < new_size) {
1458  uint8_t *tmp = av_realloc_array(*array, new_size, elem_size);
1459  if (!tmp)
1460  return AVERROR(ENOMEM);
1461  memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
1462  *size = new_size;
1463  *array = tmp;
1464  return 0;
1465  }
1466  return 0;
1467 }
1468 
1469 void *allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
1470 {
1471  void *new_elem;
1472 
1473  if (!(new_elem = av_mallocz(elem_size)) ||
1474  av_dynarray_add_nofree(ptr, nb_elems, new_elem) < 0)
1475  return NULL;
1476  return new_elem;
1477 }
1478 
1479 double get_rotation(const int32_t *displaymatrix)
1480 {
1481  double theta = 0;
1482  if (displaymatrix)
1483  theta = -round(av_display_rotation_get(displaymatrix));
1484 
1485  theta -= 360*floor(theta/360 + 0.9/360);
1486 
1487  if (fabs(theta - 90*round(theta/90)) > 2)
1488  av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
1489  "If you want to help, upload a sample "
1490  "of this file to https://streams.videolan.org/upload/ "
1491  "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
1492 
1493  return theta;
1494 }
1495 
1496 /* read file contents into a string */
1497 char *file_read(const char *filename)
1498 {
1499  AVIOContext *pb = NULL;
1500  int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1501  AVBPrint bprint;
1502  char *str;
1503 
1504  if (ret < 0) {
1505  av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1506  return NULL;
1507  }
1508 
1510  ret = avio_read_to_bprint(pb, &bprint, SIZE_MAX);
1511  avio_closep(&pb);
1512  if (ret < 0) {
1513  av_bprint_finalize(&bprint, NULL);
1514  return NULL;
1515  }
1516  ret = av_bprint_finalize(&bprint, &str);
1517  if (ret < 0)
1518  return NULL;
1519  return str;
1520 }
1521 
1523 {
1524  const AVDictionaryEntry *t = NULL;
1525 
1526  while ((t = av_dict_iterate(b, t))) {
1528  }
1529 }
1530 
1532 {
1533  const AVDictionaryEntry *t = av_dict_iterate(m, NULL);
1534  if (t) {
1535  av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1536  return AVERROR_OPTION_NOT_FOUND;
1537  }
1538 
1539  return 0;
1540 }
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
flags
const SwsFlags flags[]
Definition: swscale.c:61
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:172
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:1479
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:1194
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1531
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:206
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:671
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:1011
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:190
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:42
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:1451
FLAGS
#define FLAGS
Definition: cmdutils.c:597
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
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:32
finish_group
static int finish_group(OptionParseContext *octx, int group_idx, const char *arg)
Definition: cmdutils.c:690
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:1002
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:194
OptionParseContext
Definition: cmdutils.h:360
init_parse_context
static int init_parse_context(OptionParseContext *octx, const OptionGroupDef *groups, int nb_groups)
Definition: cmdutils.c:742
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:1338
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:539
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:60
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:789
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:91
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
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:493
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:336
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:1265
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:768
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:724
prepare_app_arguments
static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
Definition: cmdutils.c:225
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
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:1352
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:43
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1193
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:825
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:1226
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:1497
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:488
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:923
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:1469
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:233
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:473
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:446
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:1420
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:419
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:1189
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:995
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:555
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:814
array
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:116
tag
uint32_t tag
Definition: movenc.c:1911
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:757
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:745
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:912
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:764
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:1522
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:1099
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:751
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:379
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:455
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:598
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:34
AVDictionaryEntry
Definition: dict.h:90
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:35
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:86
cmdutils.h
int32_t
int32_t
Definition: audioconvert.c:56
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:92
avstring.h
av_stream_get_class
const AVClass * av_stream_get_class(void)
Get the AVClass for AVStream.
Definition: options.c:239
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:42
dump_argument
static void dump_argument(FILE *report_file, const char *a)
Definition: cmdutils.c:515
swscale.h
match_group_separator
static int match_group_separator(const OptionGroupDef *groups, int nb_groups, const char *opt)
Definition: cmdutils.c:670
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:588
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