FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/fftools/cmdutils.c
Date: 2021-09-23 20:34:37
Exec Total Coverage
Lines: 429 1204 35.6%
Branches: 330 1026 32.2%

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