FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/fftools/cmdutils.c
Date: 2022-01-21 12:56:39
Exec Total Coverage
Lines: 437 1229 35.6%
Branches: 332 1040 31.9%

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 12432 void uninit_opts(void)
84 {
85 12432 av_dict_free(&swr_opts);
86 12432 av_dict_free(&sws_dict);
87 12432 av_dict_free(&format_opts);
88 12432 av_dict_free(&codec_opts);
89 12432 }
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 6271 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 6271 }
120
121 static void (*program_exit)(int ret);
122
123 6271 void register_exit(void (*cb)(int ret))
124 {
125 6271 program_exit = cb;
126 6271 }
127
128 6163 void exit_program(int ret)
129 {
130
1/2
✓ Branch 0 taken 6163 times.
✗ Branch 1 not taken.
6163 if (program_exit)
131 6163 program_exit(ret);
132
133 6163 exit(ret);
134 }
135
136 28793 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 28793 double d = av_strtod(numstr, &tail);
142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28793 times.
28793 if (*tail)
143 error = "Expected number for %s but found: %s\n";
144
2/4
✓ Branch 0 taken 28793 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 28793 times.
28793 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 28536 times.
✓ Branch 1 taken 257 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 28536 times.
28793 else if (type == OPT_INT64 && (int64_t)d != d)
147 error = "Expected int64 for %s but found %s\n";
148
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 28793 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28793 else if (type == OPT_INT && (int)d != d)
149 error = "Expected int for %s but found %s\n";
150 else
151 28793 return d;
152 av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
153 exit_program(1);
154 return 0;
155 }
156
157 182 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 182 times.
182 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 182 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 935007 static const OptionDef *find_option(const OptionDef *po, const char *name)
212 {
213
2/2
✓ Branch 0 taken 127486639 times.
✓ Branch 1 taken 529222 times.
128015861 while (po->name) {
214 const char *end;
215
6/6
✓ Branch 1 taken 948697 times.
✓ Branch 2 taken 126537942 times.
✓ Branch 3 taken 585407 times.
✓ Branch 4 taken 363290 times.
✓ Branch 5 taken 542912 times.
✓ Branch 6 taken 42495 times.
127486639 if (av_strstart(name, po->name, &end) && (!*end || *end == ':'))
216 break;
217 127080854 po++;
218 }
219 935007 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 6271 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
281 {
282 /* nothing to do */
283 6271 }
284 #endif /* HAVE_COMMANDLINETOARGVW */
285
286 74183 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 148366 void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ?
292
2/2
✓ Branch 0 taken 36825 times.
✓ Branch 1 taken 37358 times.
74183 (uint8_t *)optctx + po->u.off : po->u.dst_ptr;
293 int *dstcount;
294
295
2/2
✓ Branch 0 taken 25537 times.
✓ Branch 1 taken 48646 times.
74183 if (po->flags & OPT_SPEC) {
296 25537 SpecifierOpt **so = dst;
297 25537 char *p = strchr(opt, ':');
298 char *str;
299
300 25537 dstcount = (int *)(so + 1);
301 25537 *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
302
2/2
✓ Branch 0 taken 13427 times.
✓ Branch 1 taken 12110 times.
25537 str = av_strdup(p ? p + 1 : "");
303
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25537 times.
25537 if (!str)
304 return AVERROR(ENOMEM);
305 25537 (*so)[*dstcount - 1].specifier = str;
306 25537 dst = &(*so)[*dstcount - 1].u;
307 }
308
309
2/2
✓ Branch 0 taken 29822 times.
✓ Branch 1 taken 44361 times.
74183 if (po->flags & OPT_STRING) {
310 char *str;
311 29822 str = av_strdup(arg);
312 29822 av_freep(dst);
313
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29822 times.
29822 if (!str)
314 return AVERROR(ENOMEM);
315 29822 *(char **)dst = str;
316
4/4
✓ Branch 0 taken 20411 times.
✓ Branch 1 taken 23950 times.
✓ Branch 2 taken 129 times.
✓ Branch 3 taken 20282 times.
44361 } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
317 24079 *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
318
2/2
✓ Branch 0 taken 4457 times.
✓ Branch 1 taken 15825 times.
20282 } else if (po->flags & OPT_INT64) {
319 4457 *(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
320
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 15645 times.
15825 } else if (po->flags & OPT_TIME) {
321 180 *(int64_t *)dst = parse_time_or_die(opt, arg, 1);
322
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 15644 times.
15645 } 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 256 times.
✓ Branch 1 taken 15388 times.
15644 } else if (po->flags & OPT_DOUBLE) {
325 256 *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY);
326
1/2
✓ Branch 0 taken 15388 times.
✗ Branch 1 not taken.
15388 } else if (po->u.func_arg) {
327 15388 int ret = po->u.func_arg(optctx, opt, arg);
328
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15388 times.
15388 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 74182 times.
74183 if (po->flags & OPT_EXIT)
336 1 exit_program(0);
337
338 74182 return 0;
339 }
340
341 8223 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 8223 po = find_option(options, opt);
348
5/6
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 8216 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
8223 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 8159 times.
8222 } else if (po->flags & OPT_BOOL)
354 63 arg = "1";
355
356
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8217 times.
8223 if (!po->name)
357 6 po = find_option(options, "default");
358
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8223 times.
8223 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 8073 times.
✓ Branch 1 taken 150 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8073 times.
8223 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 8223 ret = write_option(optctx, po, opt, arg);
368
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8223 times.
8223 if (ret < 0)
369 return ret;
370
371 8223 return !!(po->flags & HAS_ARG);
372 }
373
374 108 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 108 int optindex, handleoptions = 1, ret;
379
380 /* perform system-dependent conversions for arguments list */
381 108 prepare_app_arguments(&argc, &argv);
382
383 /* parse options */
384 108 optindex = 1;
385
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 108 times.
575 while (optindex < argc) {
386 467 opt = argv[optindex++];
387
388
4/6
✓ Branch 0 taken 467 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 368 times.
✓ Branch 3 taken 99 times.
✓ Branch 4 taken 368 times.
✗ Branch 5 not taken.
467 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 368 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
368 if (opt[1] == '-' && opt[2] == '\0') {
390 handleoptions = 0;
391 continue;
392 }
393 368 opt++;
394
395
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 368 times.
368 if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
396 exit_program(1);
397 368 optindex += ret;
398 } else {
399
1/2
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
99 if (parse_arg_function)
400 99 parse_arg_function(optctx, opt);
401 }
402 }
403 108 }
404
405 18523 int parse_optgroup(void *optctx, OptionGroup *g)
406 {
407 int i, ret;
408
409 18523 av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
410 18523 g->group_def->name, g->arg);
411
412
2/2
✓ Branch 0 taken 65960 times.
✓ Branch 1 taken 18522 times.
84482 for (i = 0; i < g->nb_opts; i++) {
413 65960 Option *o = &g->opts[i];
414
415
2/2
✓ Branch 0 taken 37178 times.
✓ Branch 1 taken 28782 times.
65960 if (g->group_def->flags &&
416
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37178 times.
37178 !(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 65960 av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
426 65960 o->key, o->opt->help, o->val);
427
428 65960 ret = write_option(optctx, o->opt, o->key, o->val);
429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 65959 times.
65959 if (ret < 0)
430 return ret;
431 }
432
433 18522 av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
434
435 18522 return 0;
436 }
437
438 31355 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 707521 times.
✓ Branch 1 taken 31341 times.
738862 for (i = 1; i < argc; i++) {
445 707521 const char *cur_opt = argv[i];
446
447
2/2
✓ Branch 0 taken 19993 times.
✓ Branch 1 taken 687528 times.
707521 if (*cur_opt++ != '-')
448 19993 continue;
449
450 687528 po = find_option(options, cur_opt);
451
5/6
✓ Branch 0 taken 448047 times.
✓ Branch 1 taken 239481 times.
✓ Branch 2 taken 92145 times.
✓ Branch 3 taken 355902 times.
✓ Branch 4 taken 92145 times.
✗ Branch 5 not taken.
687528 if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
452 92145 po = find_option(options, cur_opt + 2);
453
454
3/4
✓ Branch 0 taken 355927 times.
✓ Branch 1 taken 331601 times.
✓ Branch 2 taken 355927 times.
✗ Branch 3 not taken.
687528 if ((!po->name && !strcmp(cur_opt, optname)) ||
455
4/4
✓ Branch 0 taken 331601 times.
✓ Branch 1 taken 355927 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 331587 times.
687528 (po->name && !strcmp(optname, po->name)))
456 14 return i;
457
458
4/4
✓ Branch 0 taken 331587 times.
✓ Branch 1 taken 355927 times.
✓ Branch 2 taken 211402 times.
✓ Branch 3 taken 120185 times.
687514 if (!po->name || po->flags & HAS_ARG)
459 567329 i++;
460 }
461 31341 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 6271 static void check_options(const OptionDef *po)
489 {
490
2/2
✓ Branch 0 taken 1110521 times.
✓ Branch 1 taken 6271 times.
1116792 while (po->name) {
491
2/2
✓ Branch 0 taken 197216 times.
✓ Branch 1 taken 913305 times.
1110521 if (po->flags & OPT_PERFILE)
492
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 197216 times.
197216 av_assert0(po->flags & (OPT_INPUT | OPT_OUTPUT));
493 1110521 po++;
494 }
495 6271 }
496
497 6271 void parse_loglevel(int argc, char **argv, const OptionDef *options)
498 {
499 6271 int idx = locate_option(argc, argv, options, "loglevel");
500 const char *env;
501
502 6271 check_options(options);
503
504
1/2
✓ Branch 0 taken 6271 times.
✗ Branch 1 not taken.
6271 if (!idx)
505 6271 idx = locate_option(argc, argv, options, "v");
506
3/4
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 6257 times.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
6271 if (idx && argv[idx + 1])
507 14 opt_loglevel(NULL, "loglevel", argv[idx + 1]);
508 6271 idx = locate_option(argc, argv, options, "report");
509
2/4
✓ Branch 1 taken 6271 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6271 times.
6271 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 6271 idx = locate_option(argc, argv, options, "hide_banner");
522
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6271 times.
6271 if (idx)
523 hide_banner = 1;
524 6271 }
525
526 220773 static const AVOption *opt_find(void *obj, const char *name, const char *unit,
527 int opt_flags, int search_flags)
528 {
529 220773 const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags);
530
4/4
✓ Branch 0 taken 62801 times.
✓ Branch 1 taken 157972 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 62799 times.
220773 if(o && !o->flags)
531 2 return NULL;
532 220771 return o;
533 }
534
535 #define FLAGS (o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0
536 81151 int opt_default(void *optctx, const char *opt, const char *arg)
537 {
538 const AVOption *o;
539 81151 int consumed = 0;
540 char opt_stripped[128];
541 const char *p;
542 81151 const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
543 #if CONFIG_SWSCALE
544 81151 const AVClass *sc = sws_get_class();
545 #endif
546 #if CONFIG_SWRESAMPLE
547 81151 const AVClass *swr_class = swr_get_class();
548 #endif
549
550
2/4
✓ Branch 0 taken 81151 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 81151 times.
81151 if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
551 av_log_set_level(AV_LOG_DEBUG);
552
553
2/2
✓ Branch 0 taken 81143 times.
✓ Branch 1 taken 8 times.
81151 if (!(p = strchr(opt, ':')))
554 81143 p = opt + strlen(opt);
555 81151 av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
556
557
2/2
✓ Branch 1 taken 39950 times.
✓ Branch 2 taken 41201 times.
81151 if ((o = opt_find(&cc, opt_stripped, NULL, 0,
558 39950 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) ||
559
8/8
✓ Branch 0 taken 39947 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 39937 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10815 times.
✓ Branch 5 taken 29122 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 10827 times.
50778 ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
560 10828 (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
561
5/6
✓ Branch 0 taken 16779 times.
✓ Branch 1 taken 24423 times.
✓ Branch 2 taken 16779 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10746 times.
✓ Branch 5 taken 6033 times.
41202 av_dict_set(&codec_opts, opt, arg, FLAGS);
562 41202 consumed = 1;
563 }
564
2/2
✓ Branch 1 taken 10800 times.
✓ Branch 2 taken 70351 times.
81151 if ((o = opt_find(&fc, opt, NULL, 0,
565 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
566
5/6
✓ Branch 0 taken 10608 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 10608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10597 times.
✓ Branch 5 taken 11 times.
10800 av_dict_set(&format_opts, opt, arg, FLAGS);
567
2/2
✓ Branch 0 taken 71 times.
✓ Branch 1 taken 10729 times.
10800 if (consumed)
568 71 av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
569 10800 consumed = 1;
570 }
571 #if CONFIG_SWSCALE
572
4/4
✓ Branch 0 taken 29220 times.
✓ Branch 1 taken 51931 times.
✓ Branch 3 taken 10797 times.
✓ Branch 4 taken 18423 times.
81151 if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
573 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
574 10797 struct SwsContext *sws = sws_alloc_context();
575 10797 int ret = av_opt_set(sws, opt, arg, 0);
576 10797 sws_freeContext(sws);
577
2/4
✓ Branch 0 taken 10797 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10797 times.
✗ Branch 3 not taken.
10797 if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
578
2/4
✓ Branch 0 taken 10797 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10797 times.
✗ Branch 3 not taken.
10797 !strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
579
2/4
✓ Branch 0 taken 10797 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10797 times.
10797 !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 10797 times.
10797 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 10797 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10797 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10612 times.
✓ Branch 5 taken 185 times.
10797 av_dict_set(&sws_dict, opt, arg, FLAGS);
589
590 10797 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 18423 times.
✓ Branch 1 taken 62728 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18423 times.
81151 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 62728 times.
✓ Branch 1 taken 18423 times.
81151 if (consumed)
614 62728 return 0;
615 18423 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 134879 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 269758 times.
✓ Branch 1 taken 128681 times.
398439 for (i = 0; i < nb_groups; i++) {
629 269758 const OptionGroupDef *p = &groups[i];
630
4/4
✓ Branch 0 taken 134879 times.
✓ Branch 1 taken 134879 times.
✓ Branch 2 taken 6198 times.
✓ Branch 3 taken 128681 times.
269758 if (p->sep && !strcmp(p->sep, opt))
631 6198 return i;
632 }
633
634 128681 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 12361 static void finish_group(OptionParseContext *octx, int group_idx,
644 const char *arg)
645 {
646 12361 OptionGroupList *l = &octx->groups[group_idx];
647 OptionGroup *g;
648
649 12361 GROW_ARRAY(l->groups, l->nb_groups);
650 12361 g = &l->groups[l->nb_groups - 1];
651
652 12361 *g = octx->cur_group;
653 12361 g->arg = arg;
654 12361 g->group_def = l->group_def;
655 12361 g->sws_dict = sws_dict;
656 12361 g->swr_opts = swr_opts;
657 12361 g->codec_opts = codec_opts;
658 12361 g->format_opts = format_opts;
659
660 12361 codec_opts = NULL;
661 12361 format_opts = NULL;
662 12361 sws_dict = NULL;
663 12361 swr_opts = NULL;
664
665 12361 memset(&octx->cur_group, 0, sizeof(octx->cur_group));
666 12361 }
667
668 /*
669 * Add an option instance to currently parsed group.
670 */
671 65961 static void add_opt(OptionParseContext *octx, const OptionDef *opt,
672 const char *key, const char *val)
673 {
674 65961 int global = !(opt->flags & (OPT_PERFILE | OPT_SPEC | OPT_OFFSET));
675
2/2
✓ Branch 0 taken 28782 times.
✓ Branch 1 taken 37179 times.
65961 OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
676
677 65961 GROW_ARRAY(g->opts, g->nb_opts);
678 65961 g->opts[g->nb_opts - 1].opt = opt;
679 65961 g->opts[g->nb_opts - 1].key = key;
680 65961 g->opts[g->nb_opts - 1].val = val;
681 65961 }
682
683 6163 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 6163 memset(octx, 0, sizeof(*octx));
690
691 6163 octx->nb_groups = nb_groups;
692 6163 octx->groups = av_calloc(octx->nb_groups, sizeof(*octx->groups));
693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6163 times.
6163 if (!octx->groups)
694 exit_program(1);
695
696
2/2
✓ Branch 0 taken 12326 times.
✓ Branch 1 taken 6163 times.
18489 for (i = 0; i < octx->nb_groups; i++)
697 12326 octx->groups[i].group_def = &groups[i];
698
699 6163 octx->global_opts.group_def = &global_group;
700 6163 octx->global_opts.arg = "";
701 6163 }
702
703 6161 void uninit_parse_context(OptionParseContext *octx)
704 {
705 int i, j;
706
707
2/2
✓ Branch 0 taken 12322 times.
✓ Branch 1 taken 6161 times.
18483 for (i = 0; i < octx->nb_groups; i++) {
708 12322 OptionGroupList *l = &octx->groups[i];
709
710
2/2
✓ Branch 0 taken 12359 times.
✓ Branch 1 taken 12322 times.
24681 for (j = 0; j < l->nb_groups; j++) {
711 12359 av_freep(&l->groups[j].opts);
712 12359 av_dict_free(&l->groups[j].codec_opts);
713 12359 av_dict_free(&l->groups[j].format_opts);
714
715 12359 av_dict_free(&l->groups[j].sws_dict);
716 12359 av_dict_free(&l->groups[j].swr_opts);
717 }
718 12322 av_freep(&l->groups);
719 }
720 6161 av_freep(&octx->groups);
721
722 6161 av_freep(&octx->cur_group.opts);
723 6161 av_freep(&octx->global_opts.opts);
724
725 6161 uninit_opts();
726 6161 }
727
728 6163 int split_commandline(OptionParseContext *octx, int argc, char *argv[],
729 const OptionDef *options,
730 const OptionGroupDef *groups, int nb_groups)
731 {
732 6163 int optindex = 1;
733 6163 int dashdash = -2;
734
735 /* perform system-dependent conversions for arguments list */
736 6163 prepare_app_arguments(&argc, &argv);
737
738 6163 init_parse_context(octx, groups, nb_groups);
739 6163 av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
740
741
2/2
✓ Branch 0 taken 141042 times.
✓ Branch 1 taken 6163 times.
147205 while (optindex < argc) {
742 141042 const char *opt = argv[optindex++], *arg;
743 const OptionDef *po;
744 int ret;
745
746 141042 av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
747
748
3/6
✓ Branch 0 taken 137142 times.
✓ Branch 1 taken 3900 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 137142 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
141042 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 137142 times.
✓ Branch 1 taken 3900 times.
✓ Branch 2 taken 134879 times.
✓ Branch 3 taken 2263 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 134879 times.
141042 if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
754 6163 finish_group(octx, 0, opt);
755 6163 av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
756 6163 continue;
757 }
758 134879 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 6198 times.
✓ Branch 2 taken 128681 times.
134879 if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) {
771
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6198 times.
6198 GET_ARG(arg);
772 6198 finish_group(octx, ret, arg);
773 6198 av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
774 6198 groups[ret].name, arg);
775 6198 continue;
776 }
777
778 /* normal options */
779 128681 po = find_option(options, opt);
780
2/2
✓ Branch 0 taken 47538 times.
✓ Branch 1 taken 81143 times.
128681 if (po->name) {
781
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 47537 times.
47538 if (po->flags & OPT_EXIT) {
782 /* optional argument, e.g. -h */
783 1 arg = argv[optindex++];
784
2/2
✓ Branch 0 taken 42074 times.
✓ Branch 1 taken 5463 times.
47537 } else if (po->flags & HAS_ARG) {
785
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42074 times.
42074 GET_ARG(arg);
786 } else {
787 5463 arg = "1";
788 }
789
790 47538 add_opt(octx, po, opt, arg);
791 47538 av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
792 47538 "argument '%s'.\n", po->name, po->help, arg);
793 47538 continue;
794 }
795
796 /* AVOptions */
797
1/2
✓ Branch 0 taken 81143 times.
✗ Branch 1 not taken.
81143 if (argv[optindex]) {
798 81143 ret = opt_default(NULL, opt, argv[optindex]);
799
2/2
✓ Branch 0 taken 62720 times.
✓ Branch 1 taken 18423 times.
81143 if (ret >= 0) {
800 62720 av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
801 62720 "argument '%s'.\n", opt, argv[optindex]);
802 62720 optindex++;
803 62720 continue;
804
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18423 times.
18423 } 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 18423 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18423 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18423 times.
✗ Branch 5 not taken.
36846 if (opt[0] == 'n' && opt[1] == 'o' &&
813 18423 (po = find_option(options, opt + 2)) &&
814
2/4
✓ Branch 0 taken 18423 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18423 times.
✗ Branch 3 not taken.
18423 po->name && po->flags & OPT_BOOL) {
815 18423 add_opt(octx, po, opt, "0");
816 18423 av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
817 18423 "argument 0.\n", po->name, po->help);
818 18423 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 6163 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6163 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6163 times.
6163 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 6163 av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
830
831 6163 return 0;
832 }
833
834 6130 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
835 {
836 int ret;
837 6130 unsigned flags = av_get_cpu_flags();
838
839
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6130 times.
6130 if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
840 return ret;
841
842 6130 av_force_cpu_flags(flags);
843 6130 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 12542 static void print_all_libs_info(int flags, int level)
1134 {
1135
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
1136
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
1137
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
1138
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
1139
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
1140
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
1141
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
1142
6/10
✓ Branch 0 taken 12542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6271 times.
✓ Branch 3 taken 6271 times.
✓ Branch 6 taken 6271 times.
✓ Branch 7 taken 6271 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6271 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12542 PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
1143 12542 }
1144
1145 6271 static void print_program_info(int flags, int level)
1146 {
1147
1/2
✓ Branch 0 taken 6271 times.
✗ Branch 1 not taken.
6271 const char *indent = flags & INDENT? " " : "";
1148
1149 6271 av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);
1150
1/2
✓ Branch 0 taken 6271 times.
✗ Branch 1 not taken.
6271 if (flags & SHOW_COPYRIGHT)
1151 6271 av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
1152 program_birth_year, CONFIG_THIS_YEAR);
1153 6271 av_log(NULL, level, "\n");
1154 6271 av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
1155
1156 6271 av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
1157 6271 }
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 6271 void show_banner(int argc, char **argv, const OptionDef *options)
1186 {
1187 6271 int idx = locate_option(argc, argv, options, "version");
1188
2/4
✓ Branch 0 taken 6271 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6271 times.
6271 if (hide_banner || idx)
1189 return;
1190
1191 6271 print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);
1192 6271 print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_INFO);
1193 6271 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 BIT_DEPTHS\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 206 times.
✓ Branch 2 taken 1 times.
207 while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) {
1766 206 enum AVPixelFormat av_unused pix_fmt = av_pix_fmt_desc_get_id(pix_desc);
1767
4/4
✓ Branch 0 taken 170 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 182 times.
✓ Branch 3 taken 24 times.
1030 printf("%c%c%c%c%c %-16s %d %3d %d",
1768 206 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
1769 206 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
1770
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 192 times.
206 pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL ? 'H' : '.',
1771
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 205 times.
206 pix_desc->flags & AV_PIX_FMT_FLAG_PAL ? 'P' : '.',
1772 206 pix_desc->flags & AV_PIX_FMT_FLAG_BITSTREAM ? 'B' : '.',
1773 206 pix_desc->name,
1774
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 202 times.
206 pix_desc->nb_components,
1775 av_get_bits_per_pixel(pix_desc),
1776 206 pix_desc->comp[0].depth);
1777
1778
2/2
✓ Branch 0 taken 393 times.
✓ Branch 1 taken 206 times.
599 for (unsigned i = 1; i < pix_desc->nb_components; i++)
1779 393 printf("-%d", pix_desc->comp[i].depth);
1780 206 printf("\n");
1781 }
1782 1 return 0;
1783 }
1784
1785 int show_layouts(void *optctx, const char *opt, const char *arg)
1786 {
1787 int i = 0;
1788 uint64_t layout, j;
1789 const char *name, *descr;
1790
1791 printf("Individual channels:\n"
1792 "NAME DESCRIPTION\n");
1793 for (i = 0; i < 63; i++) {
1794 name = av_get_channel_name((uint64_t)1 << i);
1795 if (!name)
1796 continue;
1797 descr = av_get_channel_description((uint64_t)1 << i);
1798 printf("%-14s %s\n", name, descr);
1799 }
1800 printf("\nStandard channel layouts:\n"
1801 "NAME DECOMPOSITION\n");
1802 for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
1803 if (name) {
1804 printf("%-14s ", name);
1805 for (j = 1; j; j <<= 1)
1806 if ((layout & j))
1807 printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
1808 printf("\n");
1809 }
1810 }
1811 return 0;
1812 }
1813
1814 int show_sample_fmts(void *optctx, const char *opt, const char *arg)
1815 {
1816 int i;
1817 char fmt_str[128];
1818 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
1819 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
1820 return 0;
1821 }
1822
1823 int show_dispositions(void *optctx, const char *opt, const char *arg)
1824 {
1825 for (int i = 0; i < 32; i++) {
1826 const char *str = av_disposition_to_string(1U << i);
1827 if (str)
1828 printf("%s\n", str);
1829 }
1830 return 0;
1831 }
1832
1833 static void show_help_codec(const char *name, int encoder)
1834 {
1835 const AVCodecDescriptor *desc;
1836 const AVCodec *codec;
1837
1838 if (!name) {
1839 av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n");
1840 return;
1841 }
1842
1843 codec = encoder ? avcodec_find_encoder_by_name(name) :
1844 avcodec_find_decoder_by_name(name);
1845
1846 if (codec)
1847 print_codec(codec);
1848 else if ((desc = avcodec_descriptor_get_by_name(name))) {
1849 void *iter = NULL;
1850 int printed = 0;
1851
1852 while ((codec = next_codec_for_id(desc->id, &iter, encoder))) {
1853 printed = 1;
1854 print_codec(codec);
1855 }
1856
1857 if (!printed) {
1858 av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to FFmpeg, "
1859 "but no %s for it are available. FFmpeg might need to be "
1860 "recompiled with additional external libraries.\n",
1861 name, encoder ? "encoders" : "decoders");
1862 }
1863 } else {
1864 av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by FFmpeg.\n",
1865 name);
1866 }
1867 }
1868
1869 static void show_help_demuxer(const char *name)
1870 {
1871 const AVInputFormat *fmt = av_find_input_format(name);
1872
1873 if (!fmt) {
1874 av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
1875 return;
1876 }
1877
1878 printf("Demuxer %s [%s]:\n", fmt->name, fmt->long_name);
1879
1880 if (fmt->extensions)
1881 printf(" Common extensions: %s.\n", fmt->extensions);
1882
1883 if (fmt->priv_class)
1884 show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM);
1885 }
1886
1887 static void show_help_protocol(const char *name)
1888 {
1889 const AVClass *proto_class;
1890
1891 if (!name) {
1892 av_log(NULL, AV_LOG_ERROR, "No protocol name specified.\n");
1893 return;
1894 }
1895
1896 proto_class = avio_protocol_get_class(name);
1897 if (!proto_class) {
1898 av_log(NULL, AV_LOG_ERROR, "Unknown protocol '%s'.\n", name);
1899 return;
1900 }
1901
1902 show_help_children(proto_class, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
1903 }
1904
1905 static void show_help_muxer(const char *name)
1906 {
1907 const AVCodecDescriptor *desc;
1908 const AVOutputFormat *fmt = av_guess_format(name, NULL, NULL);
1909
1910 if (!fmt) {
1911 av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
1912 return;
1913 }
1914
1915 printf("Muxer %s [%s]:\n", fmt->name, fmt->long_name);
1916
1917 if (fmt->extensions)
1918 printf(" Common extensions: %s.\n", fmt->extensions);
1919 if (fmt->mime_type)
1920 printf(" Mime type: %s.\n", fmt->mime_type);
1921 if (fmt->video_codec != AV_CODEC_ID_NONE &&
1922 (desc = avcodec_descriptor_get(fmt->video_codec))) {
1923 printf(" Default video codec: %s.\n", desc->name);
1924 }
1925 if (fmt->audio_codec != AV_CODEC_ID_NONE &&
1926 (desc = avcodec_descriptor_get(fmt->audio_codec))) {
1927 printf(" Default audio codec: %s.\n", desc->name);
1928 }
1929 if (fmt->subtitle_codec != AV_CODEC_ID_NONE &&
1930 (desc = avcodec_descriptor_get(fmt->subtitle_codec))) {
1931 printf(" Default subtitle codec: %s.\n", desc->name);
1932 }
1933
1934 if (fmt->priv_class)
1935 show_help_children(fmt->priv_class, AV_OPT_FLAG_ENCODING_PARAM);
1936 }
1937
1938 #if CONFIG_AVFILTER
1939 static void show_help_filter(const char *name)
1940 {
1941 #if CONFIG_AVFILTER
1942 const AVFilter *f = avfilter_get_by_name(name);
1943 int i, count;
1944
1945 if (!name) {
1946 av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n");
1947 return;
1948 } else if (!f) {
1949 av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name);
1950 return;
1951 }
1952
1953 printf("Filter %s\n", f->name);
1954 if (f->description)
1955 printf(" %s\n", f->description);
1956
1957 if (f->flags & AVFILTER_FLAG_SLICE_THREADS)
1958 printf(" slice threading supported\n");
1959
1960 printf(" Inputs:\n");
1961 count = avfilter_filter_pad_count(f, 0);
1962 for (i = 0; i < count; i++) {
1963 printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i),
1964 media_type_string(avfilter_pad_get_type(f->inputs, i)));
1965 }
1966 if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)
1967 printf(" dynamic (depending on the options)\n");
1968 else if (!count)
1969 printf(" none (source filter)\n");
1970
1971 printf(" Outputs:\n");
1972 count = avfilter_filter_pad_count(f, 1);
1973 for (i = 0; i < count; i++) {
1974 printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i),
1975 media_type_string(avfilter_pad_get_type(f->outputs, i)));
1976 }
1977 if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS)
1978 printf(" dynamic (depending on the options)\n");
1979 else if (!count)
1980 printf(" none (sink filter)\n");
1981
1982 if (f->priv_class)
1983 show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM |
1984 AV_OPT_FLAG_AUDIO_PARAM);
1985 if (f->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)
1986 printf("This filter has support for timeline through the 'enable' option.\n");
1987 #else
1988 av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; "
1989 "can not to satisfy request\n");
1990 #endif
1991 }
1992 #endif
1993
1994 static void show_help_bsf(const char *name)
1995 {
1996 const AVBitStreamFilter *bsf = av_bsf_get_by_name(name);
1997
1998 if (!name) {
1999 av_log(NULL, AV_LOG_ERROR, "No bitstream filter name specified.\n");
2000 return;
2001 } else if (!bsf) {
2002 av_log(NULL, AV_LOG_ERROR, "Unknown bit stream filter '%s'.\n", name);
2003 return;
2004 }
2005
2006 printf("Bit stream filter %s\n", bsf->name);
2007 PRINT_CODEC_SUPPORTED(bsf, codec_ids, enum AVCodecID, "codecs",
2008 AV_CODEC_ID_NONE, GET_CODEC_NAME);
2009 if (bsf->priv_class)
2010 show_help_children(bsf->priv_class, AV_OPT_FLAG_BSF_PARAM);
2011 }
2012
2013 int show_help(void *optctx, const char *opt, const char *arg)
2014 {
2015 char *topic, *par;
2016 av_log_set_callback(log_callback_help);
2017
2018 topic = av_strdup(arg ? arg : "");
2019 if (!topic)
2020 return AVERROR(ENOMEM);
2021 par = strchr(topic, '=');
2022 if (par)
2023 *par++ = 0;
2024
2025 if (!*topic) {
2026 show_help_default(topic, par);
2027 } else if (!strcmp(topic, "decoder")) {
2028 show_help_codec(par, 0);
2029 } else if (!strcmp(topic, "encoder")) {
2030 show_help_codec(par, 1);
2031 } else if (!strcmp(topic, "demuxer")) {
2032 show_help_demuxer(par);
2033 } else if (!strcmp(topic, "muxer")) {
2034 show_help_muxer(par);
2035 } else if (!strcmp(topic, "protocol")) {
2036 show_help_protocol(par);
2037 #if CONFIG_AVFILTER
2038 } else if (!strcmp(topic, "filter")) {
2039 show_help_filter(par);
2040 #endif
2041 } else if (!strcmp(topic, "bsf")) {
2042 show_help_bsf(par);
2043 } else {
2044 show_help_default(topic, par);
2045 }
2046
2047 av_freep(&topic);
2048 return 0;
2049 }
2050
2051 int read_yesno(void)
2052 {
2053 int c = getchar();
2054 int yesno = (av_toupper(c) == 'Y');
2055
2056 while (c != '\n' && c != EOF)
2057 c = getchar();
2058
2059 return yesno;
2060 }
2061
2062 FILE *get_preset_file(char *filename, size_t filename_size,
2063 const char *preset_name, int is_path,
2064 const char *codec_name)
2065 {
2066 FILE *f = NULL;
2067 int i;
2068 const char *base[3] = { getenv("FFMPEG_DATADIR"),
2069 getenv("HOME"),
2070 FFMPEG_DATADIR, };
2071
2072 if (is_path) {
2073 av_strlcpy(filename, preset_name, filename_size);
2074 f = fopen(filename, "r");
2075 } else {
2076 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
2077 char datadir[MAX_PATH], *ls;
2078 base[2] = NULL;
2079
2080 if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
2081 {
2082 for (ls = datadir; ls < datadir + strlen(datadir); ls++)
2083 if (*ls == '\\') *ls = '/';
2084
2085 if (ls = strrchr(datadir, '/'))
2086 {
2087 *ls = 0;
2088 strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
2089 base[2] = datadir;
2090 }
2091 }
2092 #endif
2093 for (i = 0; i < 3 && !f; i++) {
2094 if (!base[i])
2095 continue;
2096 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
2097 i != 1 ? "" : "/.ffmpeg", preset_name);
2098 f = fopen(filename, "r");
2099 if (!f && codec_name) {
2100 snprintf(filename, filename_size,
2101 "%s%s/%s-%s.ffpreset",
2102 base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
2103 preset_name);
2104 f = fopen(filename, "r");
2105 }
2106 }
2107 }
2108
2109 return f;
2110 }
2111
2112 26800 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
2113 {
2114 26800 int ret = avformat_match_stream_specifier(s, st, spec);
2115
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26800 times.
26800 if (ret < 0)
2116 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
2117 26800 return ret;
2118 }
2119
2120 19817 AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
2121 AVFormatContext *s, AVStream *st, const AVCodec *codec)
2122 {
2123 19817 AVDictionary *ret = NULL;
2124 19817 const AVDictionaryEntry *t = NULL;
2125 39634 int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
2126
2/2
✓ Branch 0 taken 6371 times.
✓ Branch 1 taken 13446 times.
19817 : AV_OPT_FLAG_DECODING_PARAM;
2127 19817 char prefix = 0;
2128 19817 const AVClass *cc = avcodec_get_class();
2129
2130
2/2
✓ Branch 0 taken 7130 times.
✓ Branch 1 taken 12687 times.
19817 if (!codec)
2131 7130 codec = s->oformat ? avcodec_find_encoder(codec_id)
2132
2/2
✓ Branch 0 taken 399 times.
✓ Branch 1 taken 6731 times.
7130 : avcodec_find_decoder(codec_id);
2133
2134
4/4
✓ Branch 0 taken 15196 times.
✓ Branch 1 taken 4303 times.
✓ Branch 2 taken 183 times.
✓ Branch 3 taken 135 times.
19817 switch (st->codecpar->codec_type) {
2135 15196 case AVMEDIA_TYPE_VIDEO:
2136 15196 prefix = 'v';
2137 15196 flags |= AV_OPT_FLAG_VIDEO_PARAM;
2138 15196 break;
2139 4303 case AVMEDIA_TYPE_AUDIO:
2140 4303 prefix = 'a';
2141 4303 flags |= AV_OPT_FLAG_AUDIO_PARAM;
2142 4303 break;
2143 183 case AVMEDIA_TYPE_SUBTITLE:
2144 183 prefix = 's';
2145 183 flags |= AV_OPT_FLAG_SUBTITLE_PARAM;
2146 183 break;
2147 }
2148
2149
2/2
✓ Branch 1 taken 56672 times.
✓ Branch 2 taken 19817 times.
76489 while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
2150 const AVClass *priv_class;
2151 56672 char *p = strchr(t->key, ':');
2152
2153 /* check stream specification in opt name */
2154
2/2
✓ Branch 0 taken 249 times.
✓ Branch 1 taken 56423 times.
56672 if (p)
2155
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)) {
2156 200 case 1: *p = 0; break;
2157 49 case 0: continue;
2158 default: exit_program(1);
2159 }
2160
2161
4/4
✓ Branch 1 taken 1745 times.
✓ Branch 2 taken 54878 times.
✓ Branch 3 taken 1566 times.
✓ Branch 4 taken 179 times.
56623 if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
2162 1566 !codec ||
2163
4/4
✓ Branch 0 taken 533 times.
✓ Branch 1 taken 1033 times.
✓ Branch 2 taken 258 times.
✓ Branch 3 taken 275 times.
2099 ((priv_class = codec->priv_class) &&
2164 533 av_opt_find(&priv_class, t->key, NULL, flags,
2165 AV_OPT_SEARCH_FAKE_OBJ)))
2166 55315 av_dict_set(&ret, t->key, t->value, 0);
2167
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1306 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
1310 else if (t->key[0] == prefix &&
2168 2 av_opt_find(&cc, t->key + 1, NULL, flags,
2169 AV_OPT_SEARCH_FAKE_OBJ))
2170 1 av_dict_set(&ret, t->key + 1, t->value, 0);
2171
2172
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 56423 times.
56623 if (p)
2173 200 *p = ':';
2174 }
2175 19817 return ret;
2176 }
2177
2178 6305 AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
2179 AVDictionary *codec_opts)
2180 {
2181 int i;
2182 AVDictionary **opts;
2183
2184
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 6242 times.
6305 if (!s->nb_streams)
2185 63 return NULL;
2186 6242 opts = av_calloc(s->nb_streams, sizeof(*opts));
2187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6242 times.
6242 if (!opts) {
2188 av_log(NULL, AV_LOG_ERROR,
2189 "Could not alloc memory for stream options.\n");
2190 exit_program(1);
2191 }
2192
2/2
✓ Branch 0 taken 6673 times.
✓ Branch 1 taken 6242 times.
12915 for (i = 0; i < s->nb_streams; i++)
2193 6673 opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codecpar->codec_id,
2194 6673 s, s->streams[i], NULL);
2195 6242 return opts;
2196 }
2197
2198 128791 void *grow_array(void *array, int elem_size, int *size, int new_size)
2199 {
2200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 128791 times.
128791 if (new_size >= INT_MAX / elem_size) {
2201 av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
2202 exit_program(1);
2203 }
2204
1/2
✓ Branch 0 taken 128791 times.
✗ Branch 1 not taken.
128791 if (*size < new_size) {
2205 128791 uint8_t *tmp = av_realloc_array(array, new_size, elem_size);
2206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 128791 times.
128791 if (!tmp) {
2207 av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
2208 exit_program(1);
2209 }
2210 128791 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
2211 128791 *size = new_size;
2212 128791 return tmp;
2213 }
2214 return array;
2215 }
2216
2217 24298 void *allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
2218 {
2219 void *new_elem;
2220
2221
2/4
✓ Branch 1 taken 24298 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24298 times.
48596 if (!(new_elem = av_mallocz(elem_size)) ||
2222 24298 av_dynarray_add_nofree(ptr, nb_elems, new_elem) < 0) {
2223 av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
2224 exit_program(1);
2225 }
2226 24298 return new_elem;
2227 }
2228
2229 4809 double get_rotation(int32_t *displaymatrix)
2230 {
2231 4809 double theta = 0;
2232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4809 times.
4809 if (displaymatrix)
2233 theta = -round(av_display_rotation_get((int32_t*) displaymatrix));
2234
2235 4809 theta -= 360*floor(theta/360 + 0.9/360);
2236
2237
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4809 times.
4809 if (fabs(theta - 90*round(theta/90)) > 2)
2238 av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
2239 "If you want to help, upload a sample "
2240 "of this file to https://streams.videolan.org/upload/ "
2241 "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
2242
2243 4809 return theta;
2244 }
2245
2246 #if CONFIG_AVDEVICE
2247 static void print_device_list(const AVDeviceInfoList *device_list)
2248 {
2249 // print devices
2250 for (int i = 0; i < device_list->nb_devices; i++) {
2251 const AVDeviceInfo *device = device_list->devices[i];
2252 printf("%c %s [%s] (", device_list->default_device == i ? '*' : ' ',
2253 device->device_name, device->device_description);
2254 if (device->nb_media_types > 0) {
2255 for (int j = 0; j < device->nb_media_types; ++j) {
2256 const char* media_type = av_get_media_type_string(device->media_types[j]);
2257 if (j > 0)
2258 printf(", ");
2259 printf("%s", media_type ? media_type : "unknown");
2260 }
2261 } else {
2262 printf("none");
2263 }
2264 printf(")\n");
2265 }
2266 }
2267 static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts)
2268 {
2269 int ret;
2270 AVDeviceInfoList *device_list = NULL;
2271
2272 if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
2273 return AVERROR(EINVAL);
2274
2275 printf("Auto-detected sources for %s:\n", fmt->name);
2276 if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
2277 printf("Cannot list sources: %s\n", av_err2str(ret));
2278 goto fail;
2279 }
2280
2281 print_device_list(device_list);
2282
2283 fail:
2284 avdevice_free_list_devices(&device_list);
2285 return ret;
2286 }
2287
2288 static int print_device_sinks(const AVOutputFormat *fmt, AVDictionary *opts)
2289 {
2290 int ret;
2291 AVDeviceInfoList *device_list = NULL;
2292
2293 if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
2294 return AVERROR(EINVAL);
2295
2296 printf("Auto-detected sinks for %s:\n", fmt->name);
2297 if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) {
2298 printf("Cannot list sinks: %s\n", av_err2str(ret));
2299 goto fail;
2300 }
2301
2302 print_device_list(device_list);
2303
2304 fail:
2305 avdevice_free_list_devices(&device_list);
2306 return ret;
2307 }
2308
2309 static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
2310 {
2311 int ret;
2312 if (arg) {
2313 char *opts_str = NULL;
2314 av_assert0(dev && opts);
2315 *dev = av_strdup(arg);
2316 if (!*dev)
2317 return AVERROR(ENOMEM);
2318 if ((opts_str = strchr(*dev, ','))) {
2319 *(opts_str++) = '\0';
2320 if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
2321 av_freep(dev);
2322 return ret;
2323 }
2324 }
2325 } else
2326 printf("\nDevice name is not provided.\n"
2327 "You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
2328 return 0;
2329 }
2330
2331 int show_sources(void *optctx, const char *opt, const char *arg)
2332 {
2333 const AVInputFormat *fmt = NULL;
2334 char *dev = NULL;
2335 AVDictionary *opts = NULL;
2336 int ret = 0;
2337 int error_level = av_log_get_level();
2338
2339 av_log_set_level(AV_LOG_WARNING);
2340
2341 if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
2342 goto fail;
2343
2344 do {
2345 fmt = av_input_audio_device_next(fmt);
2346 if (fmt) {
2347 if (!strcmp(fmt->name, "lavfi"))
2348 continue; //it's pointless to probe lavfi
2349 if (dev && !av_match_name(dev, fmt->name))
2350 continue;
2351 print_device_sources(fmt, opts);
2352 }
2353 } while (fmt);
2354 do {
2355 fmt = av_input_video_device_next(fmt);
2356 if (fmt) {
2357 if (dev && !av_match_name(dev, fmt->name))
2358 continue;
2359 print_device_sources(fmt, opts);
2360 }
2361 } while (fmt);
2362 fail:
2363 av_dict_free(&opts);
2364 av_free(dev);
2365 av_log_set_level(error_level);
2366 return ret;
2367 }
2368
2369 int show_sinks(void *optctx, const char *opt, const char *arg)
2370 {
2371 const AVOutputFormat *fmt = NULL;
2372 char *dev = NULL;
2373 AVDictionary *opts = NULL;
2374 int ret = 0;
2375 int error_level = av_log_get_level();
2376
2377 av_log_set_level(AV_LOG_WARNING);
2378
2379 if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
2380 goto fail;
2381
2382 do {
2383 fmt = av_output_audio_device_next(fmt);
2384 if (fmt) {
2385 if (dev && !av_match_name(dev, fmt->name))
2386 continue;
2387 print_device_sinks(fmt, opts);
2388 }
2389 } while (fmt);
2390 do {
2391 fmt = av_output_video_device_next(fmt);
2392 if (fmt) {
2393 if (dev && !av_match_name(dev, fmt->name))
2394 continue;
2395 print_device_sinks(fmt, opts);
2396 }
2397 } while (fmt);
2398 fail:
2399 av_dict_free(&opts);
2400 av_free(dev);
2401 av_log_set_level(error_level);
2402 return ret;
2403 }
2404
2405 #endif
2406