annotate ffmpeg/cmdutils.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Various utilities for command line tools
yading@10 3 * Copyright (c) 2000-2003 Fabrice Bellard
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include <string.h>
yading@10 23 #include <stdlib.h>
yading@10 24 #include <errno.h>
yading@10 25 #include <math.h>
yading@10 26
yading@10 27 /* Include only the enabled headers since some compilers (namely, Sun
yading@10 28 Studio) will not omit unused inline functions and create undefined
yading@10 29 references to libraries that are not being built. */
yading@10 30
yading@10 31 #include "config.h"
yading@10 32 #include "compat/va_copy.h"
yading@10 33 #include "libavformat/avformat.h"
yading@10 34 #include "libavfilter/avfilter.h"
yading@10 35 #include "libavdevice/avdevice.h"
yading@10 36 #include "libavresample/avresample.h"
yading@10 37 #include "libswscale/swscale.h"
yading@10 38 #include "libswresample/swresample.h"
yading@10 39 #include "libpostproc/postprocess.h"
yading@10 40 #include "libavutil/avassert.h"
yading@10 41 #include "libavutil/avstring.h"
yading@10 42 #include "libavutil/bprint.h"
yading@10 43 #include "libavutil/mathematics.h"
yading@10 44 #include "libavutil/imgutils.h"
yading@10 45 #include "libavutil/parseutils.h"
yading@10 46 #include "libavutil/pixdesc.h"
yading@10 47 #include "libavutil/eval.h"
yading@10 48 #include "libavutil/dict.h"
yading@10 49 #include "libavutil/opt.h"
yading@10 50 #include "cmdutils.h"
yading@10 51 #include "version.h"
yading@10 52 #if CONFIG_NETWORK
yading@10 53 #include "libavformat/network.h"
yading@10 54 #endif
yading@10 55 #if HAVE_SYS_RESOURCE_H
yading@10 56 #include <sys/time.h>
yading@10 57 #include <sys/resource.h>
yading@10 58 #endif
yading@10 59 #if CONFIG_OPENCL
yading@10 60 #include "libavutil/opencl.h"
yading@10 61 #endif
yading@10 62
yading@10 63
yading@10 64 static int init_report(const char *env);
yading@10 65
yading@10 66 struct SwsContext *sws_opts;
yading@10 67 AVDictionary *swr_opts;
yading@10 68 AVDictionary *format_opts, *codec_opts, *resample_opts;
yading@10 69
yading@10 70 const int this_year = 2013;
yading@10 71
yading@10 72 static FILE *report_file;
yading@10 73
yading@10 74 void init_opts(void)
yading@10 75 {
yading@10 76
yading@10 77 if(CONFIG_SWSCALE)
yading@10 78 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC,
yading@10 79 NULL, NULL, NULL);
yading@10 80 }
yading@10 81
yading@10 82 void uninit_opts(void)
yading@10 83 {
yading@10 84 #if CONFIG_SWSCALE
yading@10 85 sws_freeContext(sws_opts);
yading@10 86 sws_opts = NULL;
yading@10 87 #endif
yading@10 88
yading@10 89 av_dict_free(&swr_opts);
yading@10 90 av_dict_free(&format_opts);
yading@10 91 av_dict_free(&codec_opts);
yading@10 92 av_dict_free(&resample_opts);
yading@10 93 }
yading@10 94
yading@10 95 void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
yading@10 96 {
yading@10 97 vfprintf(stdout, fmt, vl);
yading@10 98 }
yading@10 99
yading@10 100 static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
yading@10 101 {
yading@10 102 va_list vl2;
yading@10 103 char line[1024];
yading@10 104 static int print_prefix = 1;
yading@10 105
yading@10 106 va_copy(vl2, vl);
yading@10 107 av_log_default_callback(ptr, level, fmt, vl);
yading@10 108 av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
yading@10 109 va_end(vl2);
yading@10 110 fputs(line, report_file);
yading@10 111 fflush(report_file);
yading@10 112 }
yading@10 113
yading@10 114 double parse_number_or_die(const char *context, const char *numstr, int type,
yading@10 115 double min, double max)
yading@10 116 {
yading@10 117 char *tail;
yading@10 118 const char *error;
yading@10 119 double d = av_strtod(numstr, &tail);
yading@10 120 if (*tail)
yading@10 121 error = "Expected number for %s but found: %s\n";
yading@10 122 else if (d < min || d > max)
yading@10 123 error = "The value for %s was %s which is not within %f - %f\n";
yading@10 124 else if (type == OPT_INT64 && (int64_t)d != d)
yading@10 125 error = "Expected int64 for %s but found %s\n";
yading@10 126 else if (type == OPT_INT && (int)d != d)
yading@10 127 error = "Expected int for %s but found %s\n";
yading@10 128 else
yading@10 129 return d;
yading@10 130 av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
yading@10 131 exit(1);
yading@10 132 return 0;
yading@10 133 }
yading@10 134
yading@10 135 int64_t parse_time_or_die(const char *context, const char *timestr,
yading@10 136 int is_duration)
yading@10 137 {
yading@10 138 int64_t us;
yading@10 139 if (av_parse_time(&us, timestr, is_duration) < 0) {
yading@10 140 av_log(NULL, AV_LOG_FATAL, "Invalid %s specification for %s: %s\n",
yading@10 141 is_duration ? "duration" : "date", context, timestr);
yading@10 142 exit(1);
yading@10 143 }
yading@10 144 return us;
yading@10 145 }
yading@10 146
yading@10 147 void show_help_options(const OptionDef *options, const char *msg, int req_flags,
yading@10 148 int rej_flags, int alt_flags)
yading@10 149 {
yading@10 150 const OptionDef *po;
yading@10 151 int first;
yading@10 152
yading@10 153 first = 1;
yading@10 154 for (po = options; po->name != NULL; po++) {
yading@10 155 char buf[64];
yading@10 156
yading@10 157 if (((po->flags & req_flags) != req_flags) ||
yading@10 158 (alt_flags && !(po->flags & alt_flags)) ||
yading@10 159 (po->flags & rej_flags))
yading@10 160 continue;
yading@10 161
yading@10 162 if (first) {
yading@10 163 printf("%s\n", msg);
yading@10 164 first = 0;
yading@10 165 }
yading@10 166 av_strlcpy(buf, po->name, sizeof(buf));
yading@10 167 if (po->argname) {
yading@10 168 av_strlcat(buf, " ", sizeof(buf));
yading@10 169 av_strlcat(buf, po->argname, sizeof(buf));
yading@10 170 }
yading@10 171 printf("-%-17s %s\n", buf, po->help);
yading@10 172 }
yading@10 173 printf("\n");
yading@10 174 }
yading@10 175
yading@10 176 void show_help_children(const AVClass *class, int flags)
yading@10 177 {
yading@10 178 const AVClass *child = NULL;
yading@10 179 if (class->option) {
yading@10 180 av_opt_show2(&class, NULL, flags, 0);
yading@10 181 printf("\n");
yading@10 182 }
yading@10 183
yading@10 184 while (child = av_opt_child_class_next(class, child))
yading@10 185 show_help_children(child, flags);
yading@10 186 }
yading@10 187
yading@10 188 static const OptionDef *find_option(const OptionDef *po, const char *name)
yading@10 189 {
yading@10 190 const char *p = strchr(name, ':');
yading@10 191 int len = p ? p - name : strlen(name);
yading@10 192
yading@10 193 while (po->name != NULL) {
yading@10 194 if (!strncmp(name, po->name, len) && strlen(po->name) == len)
yading@10 195 break;
yading@10 196 po++;
yading@10 197 }
yading@10 198 return po;
yading@10 199 }
yading@10 200
yading@10 201 #if HAVE_COMMANDLINETOARGVW
yading@10 202 #include <windows.h>
yading@10 203 #include <shellapi.h>
yading@10 204 /* Will be leaked on exit */
yading@10 205 static char** win32_argv_utf8 = NULL;
yading@10 206 static int win32_argc = 0;
yading@10 207
yading@10 208 /**
yading@10 209 * Prepare command line arguments for executable.
yading@10 210 * For Windows - perform wide-char to UTF-8 conversion.
yading@10 211 * Input arguments should be main() function arguments.
yading@10 212 * @param argc_ptr Arguments number (including executable)
yading@10 213 * @param argv_ptr Arguments list.
yading@10 214 */
yading@10 215 static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
yading@10 216 {
yading@10 217 char *argstr_flat;
yading@10 218 wchar_t **argv_w;
yading@10 219 int i, buffsize = 0, offset = 0;
yading@10 220
yading@10 221 if (win32_argv_utf8) {
yading@10 222 *argc_ptr = win32_argc;
yading@10 223 *argv_ptr = win32_argv_utf8;
yading@10 224 return;
yading@10 225 }
yading@10 226
yading@10 227 win32_argc = 0;
yading@10 228 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
yading@10 229 if (win32_argc <= 0 || !argv_w)
yading@10 230 return;
yading@10 231
yading@10 232 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
yading@10 233 for (i = 0; i < win32_argc; i++)
yading@10 234 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
yading@10 235 NULL, 0, NULL, NULL);
yading@10 236
yading@10 237 win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
yading@10 238 argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
yading@10 239 if (win32_argv_utf8 == NULL) {
yading@10 240 LocalFree(argv_w);
yading@10 241 return;
yading@10 242 }
yading@10 243
yading@10 244 for (i = 0; i < win32_argc; i++) {
yading@10 245 win32_argv_utf8[i] = &argstr_flat[offset];
yading@10 246 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
yading@10 247 &argstr_flat[offset],
yading@10 248 buffsize - offset, NULL, NULL);
yading@10 249 }
yading@10 250 win32_argv_utf8[i] = NULL;
yading@10 251 LocalFree(argv_w);
yading@10 252
yading@10 253 *argc_ptr = win32_argc;
yading@10 254 *argv_ptr = win32_argv_utf8;
yading@10 255 }
yading@10 256 #else
yading@10 257 static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
yading@10 258 {
yading@10 259 /* nothing to do */
yading@10 260 }
yading@10 261 #endif /* HAVE_COMMANDLINETOARGVW */
yading@10 262
yading@10 263 static int write_option(void *optctx, const OptionDef *po, const char *opt,
yading@10 264 const char *arg)
yading@10 265 {
yading@10 266 /* new-style options contain an offset into optctx, old-style address of
yading@10 267 * a global var*/
yading@10 268 void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ?
yading@10 269 (uint8_t *)optctx + po->u.off : po->u.dst_ptr;
yading@10 270 int *dstcount;
yading@10 271
yading@10 272 if (po->flags & OPT_SPEC) {
yading@10 273 SpecifierOpt **so = dst;
yading@10 274 char *p = strchr(opt, ':');
yading@10 275
yading@10 276 dstcount = (int *)(so + 1);
yading@10 277 *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
yading@10 278 (*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : "");
yading@10 279 dst = &(*so)[*dstcount - 1].u;
yading@10 280 }
yading@10 281
yading@10 282 if (po->flags & OPT_STRING) {
yading@10 283 char *str;
yading@10 284 str = av_strdup(arg);
yading@10 285 av_freep(dst);
yading@10 286 *(char **)dst = str;
yading@10 287 } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
yading@10 288 *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
yading@10 289 } else if (po->flags & OPT_INT64) {
yading@10 290 *(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
yading@10 291 } else if (po->flags & OPT_TIME) {
yading@10 292 *(int64_t *)dst = parse_time_or_die(opt, arg, 1);
yading@10 293 } else if (po->flags & OPT_FLOAT) {
yading@10 294 *(float *)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
yading@10 295 } else if (po->flags & OPT_DOUBLE) {
yading@10 296 *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY);
yading@10 297 } else if (po->u.func_arg) {
yading@10 298 int ret = po->u.func_arg(optctx, opt, arg);
yading@10 299 if (ret < 0) {
yading@10 300 av_log(NULL, AV_LOG_ERROR,
yading@10 301 "Failed to set value '%s' for option '%s': %s\n",
yading@10 302 arg, opt, av_err2str(ret));
yading@10 303 return ret;
yading@10 304 }
yading@10 305 }
yading@10 306 if (po->flags & OPT_EXIT)
yading@10 307 exit(0);
yading@10 308
yading@10 309 return 0;
yading@10 310 }
yading@10 311
yading@10 312 int parse_option(void *optctx, const char *opt, const char *arg,
yading@10 313 const OptionDef *options)
yading@10 314 {
yading@10 315 const OptionDef *po;
yading@10 316 int ret;
yading@10 317
yading@10 318 po = find_option(options, opt);
yading@10 319 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
yading@10 320 /* handle 'no' bool option */
yading@10 321 po = find_option(options, opt + 2);
yading@10 322 if ((po->name && (po->flags & OPT_BOOL)))
yading@10 323 arg = "0";
yading@10 324 } else if (po->flags & OPT_BOOL)
yading@10 325 arg = "1";
yading@10 326
yading@10 327 if (!po->name)
yading@10 328 po = find_option(options, "default");
yading@10 329 if (!po->name) {
yading@10 330 av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
yading@10 331 return AVERROR(EINVAL);
yading@10 332 }
yading@10 333 if (po->flags & HAS_ARG && !arg) {
yading@10 334 av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
yading@10 335 return AVERROR(EINVAL);
yading@10 336 }
yading@10 337
yading@10 338 ret = write_option(optctx, po, opt, arg);
yading@10 339 if (ret < 0)
yading@10 340 return ret;
yading@10 341
yading@10 342 return !!(po->flags & HAS_ARG);
yading@10 343 }
yading@10 344
yading@10 345 void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
yading@10 346 void (*parse_arg_function)(void *, const char*))
yading@10 347 {
yading@10 348 const char *opt;
yading@10 349 int optindex, handleoptions = 1, ret;
yading@10 350
yading@10 351 /* perform system-dependent conversions for arguments list */
yading@10 352 prepare_app_arguments(&argc, &argv);
yading@10 353
yading@10 354 /* parse options */
yading@10 355 optindex = 1;
yading@10 356 while (optindex < argc) {
yading@10 357 opt = argv[optindex++];
yading@10 358
yading@10 359 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
yading@10 360 if (opt[1] == '-' && opt[2] == '\0') {
yading@10 361 handleoptions = 0;
yading@10 362 continue;
yading@10 363 }
yading@10 364 opt++;
yading@10 365
yading@10 366 if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
yading@10 367 exit(1);
yading@10 368 optindex += ret;
yading@10 369 } else {
yading@10 370 if (parse_arg_function)
yading@10 371 parse_arg_function(optctx, opt);
yading@10 372 }
yading@10 373 }
yading@10 374 }
yading@10 375
yading@10 376 int parse_optgroup(void *optctx, OptionGroup *g)
yading@10 377 {
yading@10 378 int i, ret;
yading@10 379
yading@10 380 av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
yading@10 381 g->group_def->name, g->arg);
yading@10 382
yading@10 383 for (i = 0; i < g->nb_opts; i++) {
yading@10 384 Option *o = &g->opts[i];
yading@10 385
yading@10 386 if (g->group_def->flags &&
yading@10 387 !(g->group_def->flags & o->opt->flags)) {
yading@10 388 av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to "
yading@10 389 "%s %s -- you are trying to apply an input option to an "
yading@10 390 "output file or vice versa. Move this option before the "
yading@10 391 "file it belongs to.\n", o->key, o->opt->help,
yading@10 392 g->group_def->name, g->arg);
yading@10 393 return AVERROR(EINVAL);
yading@10 394 }
yading@10 395
yading@10 396 av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
yading@10 397 o->key, o->opt->help, o->val);
yading@10 398
yading@10 399 ret = write_option(optctx, o->opt, o->key, o->val);
yading@10 400 if (ret < 0)
yading@10 401 return ret;
yading@10 402 }
yading@10 403
yading@10 404 av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
yading@10 405
yading@10 406 return 0;
yading@10 407 }
yading@10 408
yading@10 409 int locate_option(int argc, char **argv, const OptionDef *options,
yading@10 410 const char *optname)
yading@10 411 {
yading@10 412 const OptionDef *po;
yading@10 413 int i;
yading@10 414
yading@10 415 for (i = 1; i < argc; i++) {
yading@10 416 const char *cur_opt = argv[i];
yading@10 417
yading@10 418 if (*cur_opt++ != '-')
yading@10 419 continue;
yading@10 420
yading@10 421 po = find_option(options, cur_opt);
yading@10 422 if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
yading@10 423 po = find_option(options, cur_opt + 2);
yading@10 424
yading@10 425 if ((!po->name && !strcmp(cur_opt, optname)) ||
yading@10 426 (po->name && !strcmp(optname, po->name)))
yading@10 427 return i;
yading@10 428
yading@10 429 if (po->flags & HAS_ARG)
yading@10 430 i++;
yading@10 431 }
yading@10 432 return 0;
yading@10 433 }
yading@10 434
yading@10 435 static void dump_argument(const char *a)
yading@10 436 {
yading@10 437 const unsigned char *p;
yading@10 438
yading@10 439 for (p = a; *p; p++)
yading@10 440 if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
yading@10 441 *p == '_' || (*p >= 'a' && *p <= 'z')))
yading@10 442 break;
yading@10 443 if (!*p) {
yading@10 444 fputs(a, report_file);
yading@10 445 return;
yading@10 446 }
yading@10 447 fputc('"', report_file);
yading@10 448 for (p = a; *p; p++) {
yading@10 449 if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
yading@10 450 fprintf(report_file, "\\%c", *p);
yading@10 451 else if (*p < ' ' || *p > '~')
yading@10 452 fprintf(report_file, "\\x%02x", *p);
yading@10 453 else
yading@10 454 fputc(*p, report_file);
yading@10 455 }
yading@10 456 fputc('"', report_file);
yading@10 457 }
yading@10 458
yading@10 459 void parse_loglevel(int argc, char **argv, const OptionDef *options)
yading@10 460 {
yading@10 461 int idx = locate_option(argc, argv, options, "loglevel");
yading@10 462 const char *env;
yading@10 463 if (!idx)
yading@10 464 idx = locate_option(argc, argv, options, "v");
yading@10 465 if (idx && argv[idx + 1])
yading@10 466 opt_loglevel(NULL, "loglevel", argv[idx + 1]);
yading@10 467 idx = locate_option(argc, argv, options, "report");
yading@10 468 if ((env = getenv("FFREPORT")) || idx) {
yading@10 469 init_report(env);
yading@10 470 if (report_file) {
yading@10 471 int i;
yading@10 472 fprintf(report_file, "Command line:\n");
yading@10 473 for (i = 0; i < argc; i++) {
yading@10 474 dump_argument(argv[i]);
yading@10 475 fputc(i < argc - 1 ? ' ' : '\n', report_file);
yading@10 476 }
yading@10 477 fflush(report_file);
yading@10 478 }
yading@10 479 }
yading@10 480 }
yading@10 481
yading@10 482 #define FLAGS (o->type == AV_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
yading@10 483 int opt_default(void *optctx, const char *opt, const char *arg)
yading@10 484 {
yading@10 485 const AVOption *o;
yading@10 486 int consumed = 0;
yading@10 487 char opt_stripped[128];
yading@10 488 const char *p;
yading@10 489 const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
yading@10 490 #if CONFIG_AVRESAMPLE
yading@10 491 const AVClass *rc = avresample_get_class();
yading@10 492 #endif
yading@10 493 const AVClass *sc, *swr_class;
yading@10 494
yading@10 495 if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
yading@10 496 av_log_set_level(AV_LOG_DEBUG);
yading@10 497
yading@10 498 if (!(p = strchr(opt, ':')))
yading@10 499 p = opt + strlen(opt);
yading@10 500 av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
yading@10 501
yading@10 502 if ((o = av_opt_find(&cc, opt_stripped, NULL, 0,
yading@10 503 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) ||
yading@10 504 ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
yading@10 505 (o = av_opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
yading@10 506 av_dict_set(&codec_opts, opt, arg, FLAGS);
yading@10 507 consumed = 1;
yading@10 508 }
yading@10 509 if ((o = av_opt_find(&fc, opt, NULL, 0,
yading@10 510 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
yading@10 511 av_dict_set(&format_opts, opt, arg, FLAGS);
yading@10 512 if (consumed)
yading@10 513 av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
yading@10 514 consumed = 1;
yading@10 515 }
yading@10 516 #if CONFIG_SWSCALE
yading@10 517 sc = sws_get_class();
yading@10 518 if (!consumed && av_opt_find(&sc, opt, NULL, 0,
yading@10 519 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) {
yading@10 520 // XXX we only support sws_flags, not arbitrary sws options
yading@10 521 int ret = av_opt_set(sws_opts, opt, arg, 0);
yading@10 522 if (ret < 0) {
yading@10 523 av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
yading@10 524 return ret;
yading@10 525 }
yading@10 526 consumed = 1;
yading@10 527 }
yading@10 528 #endif
yading@10 529 #if CONFIG_SWRESAMPLE
yading@10 530 swr_class = swr_get_class();
yading@10 531 if (!consumed && (o=av_opt_find(&swr_class, opt, NULL, 0,
yading@10 532 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
yading@10 533 struct SwrContext *swr = swr_alloc();
yading@10 534 int ret = av_opt_set(swr, opt, arg, 0);
yading@10 535 swr_free(&swr);
yading@10 536 if (ret < 0) {
yading@10 537 av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
yading@10 538 return ret;
yading@10 539 }
yading@10 540 av_dict_set(&swr_opts, opt, arg, FLAGS);
yading@10 541 consumed = 1;
yading@10 542 }
yading@10 543 #endif
yading@10 544 #if CONFIG_AVRESAMPLE
yading@10 545 if ((o=av_opt_find(&rc, opt, NULL, 0,
yading@10 546 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
yading@10 547 av_dict_set(&resample_opts, opt, arg, FLAGS);
yading@10 548 consumed = 1;
yading@10 549 }
yading@10 550 #endif
yading@10 551
yading@10 552 if (consumed)
yading@10 553 return 0;
yading@10 554 return AVERROR_OPTION_NOT_FOUND;
yading@10 555 }
yading@10 556
yading@10 557 /*
yading@10 558 * Check whether given option is a group separator.
yading@10 559 *
yading@10 560 * @return index of the group definition that matched or -1 if none
yading@10 561 */
yading@10 562 static int match_group_separator(const OptionGroupDef *groups, int nb_groups,
yading@10 563 const char *opt)
yading@10 564 {
yading@10 565 int i;
yading@10 566
yading@10 567 for (i = 0; i < nb_groups; i++) {
yading@10 568 const OptionGroupDef *p = &groups[i];
yading@10 569 if (p->sep && !strcmp(p->sep, opt))
yading@10 570 return i;
yading@10 571 }
yading@10 572
yading@10 573 return -1;
yading@10 574 }
yading@10 575
yading@10 576 /*
yading@10 577 * Finish parsing an option group.
yading@10 578 *
yading@10 579 * @param group_idx which group definition should this group belong to
yading@10 580 * @param arg argument of the group delimiting option
yading@10 581 */
yading@10 582 static void finish_group(OptionParseContext *octx, int group_idx,
yading@10 583 const char *arg)
yading@10 584 {
yading@10 585 OptionGroupList *l = &octx->groups[group_idx];
yading@10 586 OptionGroup *g;
yading@10 587
yading@10 588 GROW_ARRAY(l->groups, l->nb_groups);
yading@10 589 g = &l->groups[l->nb_groups - 1];
yading@10 590
yading@10 591 *g = octx->cur_group;
yading@10 592 g->arg = arg;
yading@10 593 g->group_def = l->group_def;
yading@10 594 #if CONFIG_SWSCALE
yading@10 595 g->sws_opts = sws_opts;
yading@10 596 #endif
yading@10 597 g->swr_opts = swr_opts;
yading@10 598 g->codec_opts = codec_opts;
yading@10 599 g->format_opts = format_opts;
yading@10 600 g->resample_opts = resample_opts;
yading@10 601
yading@10 602 codec_opts = NULL;
yading@10 603 format_opts = NULL;
yading@10 604 resample_opts = NULL;
yading@10 605 #if CONFIG_SWSCALE
yading@10 606 sws_opts = NULL;
yading@10 607 #endif
yading@10 608 swr_opts = NULL;
yading@10 609 init_opts();
yading@10 610
yading@10 611 memset(&octx->cur_group, 0, sizeof(octx->cur_group));
yading@10 612 }
yading@10 613
yading@10 614 /*
yading@10 615 * Add an option instance to currently parsed group.
yading@10 616 */
yading@10 617 static void add_opt(OptionParseContext *octx, const OptionDef *opt,
yading@10 618 const char *key, const char *val)
yading@10 619 {
yading@10 620 int global = !(opt->flags & (OPT_PERFILE | OPT_SPEC | OPT_OFFSET));
yading@10 621 OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
yading@10 622
yading@10 623 GROW_ARRAY(g->opts, g->nb_opts);
yading@10 624 g->opts[g->nb_opts - 1].opt = opt;
yading@10 625 g->opts[g->nb_opts - 1].key = key;
yading@10 626 g->opts[g->nb_opts - 1].val = val;
yading@10 627 }
yading@10 628
yading@10 629 static void init_parse_context(OptionParseContext *octx,
yading@10 630 const OptionGroupDef *groups, int nb_groups)
yading@10 631 {
yading@10 632 static const OptionGroupDef global_group = { "global" };
yading@10 633 int i;
yading@10 634
yading@10 635 memset(octx, 0, sizeof(*octx));
yading@10 636
yading@10 637 octx->nb_groups = nb_groups;
yading@10 638 octx->groups = av_mallocz(sizeof(*octx->groups) * octx->nb_groups);
yading@10 639 if (!octx->groups)
yading@10 640 exit(1);
yading@10 641
yading@10 642 for (i = 0; i < octx->nb_groups; i++)
yading@10 643 octx->groups[i].group_def = &groups[i];
yading@10 644
yading@10 645 octx->global_opts.group_def = &global_group;
yading@10 646 octx->global_opts.arg = "";
yading@10 647
yading@10 648 init_opts();
yading@10 649 }
yading@10 650
yading@10 651 void uninit_parse_context(OptionParseContext *octx)
yading@10 652 {
yading@10 653 int i, j;
yading@10 654
yading@10 655 for (i = 0; i < octx->nb_groups; i++) {
yading@10 656 OptionGroupList *l = &octx->groups[i];
yading@10 657
yading@10 658 for (j = 0; j < l->nb_groups; j++) {
yading@10 659 av_freep(&l->groups[j].opts);
yading@10 660 av_dict_free(&l->groups[j].codec_opts);
yading@10 661 av_dict_free(&l->groups[j].format_opts);
yading@10 662 av_dict_free(&l->groups[j].resample_opts);
yading@10 663 #if CONFIG_SWSCALE
yading@10 664 sws_freeContext(l->groups[j].sws_opts);
yading@10 665 #endif
yading@10 666 av_dict_free(&l->groups[j].swr_opts);
yading@10 667 }
yading@10 668 av_freep(&l->groups);
yading@10 669 }
yading@10 670 av_freep(&octx->groups);
yading@10 671
yading@10 672 av_freep(&octx->cur_group.opts);
yading@10 673 av_freep(&octx->global_opts.opts);
yading@10 674
yading@10 675 uninit_opts();
yading@10 676 }
yading@10 677
yading@10 678 int split_commandline(OptionParseContext *octx, int argc, char *argv[],
yading@10 679 const OptionDef *options,
yading@10 680 const OptionGroupDef *groups, int nb_groups)
yading@10 681 {
yading@10 682 int optindex = 1;
yading@10 683 int dashdash = -2;
yading@10 684
yading@10 685 /* perform system-dependent conversions for arguments list */
yading@10 686 prepare_app_arguments(&argc, &argv);
yading@10 687
yading@10 688 init_parse_context(octx, groups, nb_groups);
yading@10 689 av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
yading@10 690
yading@10 691 while (optindex < argc) {
yading@10 692 const char *opt = argv[optindex++], *arg;
yading@10 693 const OptionDef *po;
yading@10 694 int ret;
yading@10 695
yading@10 696 av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
yading@10 697
yading@10 698 if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
yading@10 699 dashdash = optindex;
yading@10 700 continue;
yading@10 701 }
yading@10 702 /* unnamed group separators, e.g. output filename */
yading@10 703 if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
yading@10 704 finish_group(octx, 0, opt);
yading@10 705 av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
yading@10 706 continue;
yading@10 707 }
yading@10 708 opt++;
yading@10 709
yading@10 710 #define GET_ARG(arg) \
yading@10 711 do { \
yading@10 712 arg = argv[optindex++]; \
yading@10 713 if (!arg) { \
yading@10 714 av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
yading@10 715 return AVERROR(EINVAL); \
yading@10 716 } \
yading@10 717 } while (0)
yading@10 718
yading@10 719 /* named group separators, e.g. -i */
yading@10 720 if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) {
yading@10 721 GET_ARG(arg);
yading@10 722 finish_group(octx, ret, arg);
yading@10 723 av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
yading@10 724 groups[ret].name, arg);
yading@10 725 continue;
yading@10 726 }
yading@10 727
yading@10 728 /* normal options */
yading@10 729 po = find_option(options, opt);
yading@10 730 if (po->name) {
yading@10 731 if (po->flags & OPT_EXIT) {
yading@10 732 /* optional argument, e.g. -h */
yading@10 733 arg = argv[optindex++];
yading@10 734 } else if (po->flags & HAS_ARG) {
yading@10 735 GET_ARG(arg);
yading@10 736 } else {
yading@10 737 arg = "1";
yading@10 738 }
yading@10 739
yading@10 740 add_opt(octx, po, opt, arg);
yading@10 741 av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
yading@10 742 "argument '%s'.\n", po->name, po->help, arg);
yading@10 743 continue;
yading@10 744 }
yading@10 745
yading@10 746 /* AVOptions */
yading@10 747 if (argv[optindex]) {
yading@10 748 ret = opt_default(NULL, opt, argv[optindex]);
yading@10 749 if (ret >= 0) {
yading@10 750 av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
yading@10 751 "argument '%s'.\n", opt, argv[optindex]);
yading@10 752 optindex++;
yading@10 753 continue;
yading@10 754 } else if (ret != AVERROR_OPTION_NOT_FOUND) {
yading@10 755 av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' "
yading@10 756 "with argument '%s'.\n", opt, argv[optindex]);
yading@10 757 return ret;
yading@10 758 }
yading@10 759 }
yading@10 760
yading@10 761 /* boolean -nofoo options */
yading@10 762 if (opt[0] == 'n' && opt[1] == 'o' &&
yading@10 763 (po = find_option(options, opt + 2)) &&
yading@10 764 po->name && po->flags & OPT_BOOL) {
yading@10 765 add_opt(octx, po, opt, "0");
yading@10 766 av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
yading@10 767 "argument 0.\n", po->name, po->help);
yading@10 768 continue;
yading@10 769 }
yading@10 770
yading@10 771 av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt);
yading@10 772 return AVERROR_OPTION_NOT_FOUND;
yading@10 773 }
yading@10 774
yading@10 775 if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
yading@10 776 av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
yading@10 777 "commandline.\n");
yading@10 778
yading@10 779 av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
yading@10 780
yading@10 781 return 0;
yading@10 782 }
yading@10 783
yading@10 784 int opt_loglevel(void *optctx, const char *opt, const char *arg)
yading@10 785 {
yading@10 786 const struct { const char *name; int level; } log_levels[] = {
yading@10 787 { "quiet" , AV_LOG_QUIET },
yading@10 788 { "panic" , AV_LOG_PANIC },
yading@10 789 { "fatal" , AV_LOG_FATAL },
yading@10 790 { "error" , AV_LOG_ERROR },
yading@10 791 { "warning", AV_LOG_WARNING },
yading@10 792 { "info" , AV_LOG_INFO },
yading@10 793 { "verbose", AV_LOG_VERBOSE },
yading@10 794 { "debug" , AV_LOG_DEBUG },
yading@10 795 };
yading@10 796 char *tail;
yading@10 797 int level;
yading@10 798 int i;
yading@10 799
yading@10 800 tail = strstr(arg, "repeat");
yading@10 801 av_log_set_flags(tail ? 0 : AV_LOG_SKIP_REPEATED);
yading@10 802 if (tail == arg)
yading@10 803 arg += 6 + (arg[6]=='+');
yading@10 804 if(tail && !*arg)
yading@10 805 return 0;
yading@10 806
yading@10 807 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
yading@10 808 if (!strcmp(log_levels[i].name, arg)) {
yading@10 809 av_log_set_level(log_levels[i].level);
yading@10 810 return 0;
yading@10 811 }
yading@10 812 }
yading@10 813
yading@10 814 level = strtol(arg, &tail, 10);
yading@10 815 if (*tail) {
yading@10 816 av_log(NULL, AV_LOG_FATAL, "Invalid loglevel \"%s\". "
yading@10 817 "Possible levels are numbers or:\n", arg);
yading@10 818 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
yading@10 819 av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
yading@10 820 exit(1);
yading@10 821 }
yading@10 822 av_log_set_level(level);
yading@10 823 return 0;
yading@10 824 }
yading@10 825
yading@10 826 static void expand_filename_template(AVBPrint *bp, const char *template,
yading@10 827 struct tm *tm)
yading@10 828 {
yading@10 829 int c;
yading@10 830
yading@10 831 while ((c = *(template++))) {
yading@10 832 if (c == '%') {
yading@10 833 if (!(c = *(template++)))
yading@10 834 break;
yading@10 835 switch (c) {
yading@10 836 case 'p':
yading@10 837 av_bprintf(bp, "%s", program_name);
yading@10 838 break;
yading@10 839 case 't':
yading@10 840 av_bprintf(bp, "%04d%02d%02d-%02d%02d%02d",
yading@10 841 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
yading@10 842 tm->tm_hour, tm->tm_min, tm->tm_sec);
yading@10 843 break;
yading@10 844 case '%':
yading@10 845 av_bprint_chars(bp, c, 1);
yading@10 846 break;
yading@10 847 }
yading@10 848 } else {
yading@10 849 av_bprint_chars(bp, c, 1);
yading@10 850 }
yading@10 851 }
yading@10 852 }
yading@10 853
yading@10 854 static int init_report(const char *env)
yading@10 855 {
yading@10 856 char *filename_template = NULL;
yading@10 857 char *key, *val;
yading@10 858 int ret, count = 0;
yading@10 859 time_t now;
yading@10 860 struct tm *tm;
yading@10 861 AVBPrint filename;
yading@10 862
yading@10 863 if (report_file) /* already opened */
yading@10 864 return 0;
yading@10 865 time(&now);
yading@10 866 tm = localtime(&now);
yading@10 867
yading@10 868 while (env && *env) {
yading@10 869 if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) {
yading@10 870 if (count)
yading@10 871 av_log(NULL, AV_LOG_ERROR,
yading@10 872 "Failed to parse FFREPORT environment variable: %s\n",
yading@10 873 av_err2str(ret));
yading@10 874 break;
yading@10 875 }
yading@10 876 if (*env)
yading@10 877 env++;
yading@10 878 count++;
yading@10 879 if (!strcmp(key, "file")) {
yading@10 880 av_free(filename_template);
yading@10 881 filename_template = val;
yading@10 882 val = NULL;
yading@10 883 } else {
yading@10 884 av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
yading@10 885 }
yading@10 886 av_free(val);
yading@10 887 av_free(key);
yading@10 888 }
yading@10 889
yading@10 890 av_bprint_init(&filename, 0, 1);
yading@10 891 expand_filename_template(&filename,
yading@10 892 av_x_if_null(filename_template, "%p-%t.log"), tm);
yading@10 893 av_free(filename_template);
yading@10 894 if (!av_bprint_is_complete(&filename)) {
yading@10 895 av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n");
yading@10 896 return AVERROR(ENOMEM);
yading@10 897 }
yading@10 898
yading@10 899 report_file = fopen(filename.str, "w");
yading@10 900 if (!report_file) {
yading@10 901 av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
yading@10 902 filename.str, strerror(errno));
yading@10 903 return AVERROR(errno);
yading@10 904 }
yading@10 905 av_log_set_callback(log_callback_report);
yading@10 906 av_log(NULL, AV_LOG_INFO,
yading@10 907 "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
yading@10 908 "Report written to \"%s\"\n",
yading@10 909 program_name,
yading@10 910 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
yading@10 911 tm->tm_hour, tm->tm_min, tm->tm_sec,
yading@10 912 filename.str);
yading@10 913 av_log_set_level(FFMAX(av_log_get_level(), AV_LOG_VERBOSE));
yading@10 914 av_bprint_finalize(&filename, NULL);
yading@10 915 return 0;
yading@10 916 }
yading@10 917
yading@10 918 int opt_report(const char *opt)
yading@10 919 {
yading@10 920 return init_report(NULL);
yading@10 921 }
yading@10 922
yading@10 923 int opt_max_alloc(void *optctx, const char *opt, const char *arg)
yading@10 924 {
yading@10 925 char *tail;
yading@10 926 size_t max;
yading@10 927
yading@10 928 max = strtol(arg, &tail, 10);
yading@10 929 if (*tail) {
yading@10 930 av_log(NULL, AV_LOG_FATAL, "Invalid max_alloc \"%s\".\n", arg);
yading@10 931 exit(1);
yading@10 932 }
yading@10 933 av_max_alloc(max);
yading@10 934 return 0;
yading@10 935 }
yading@10 936
yading@10 937 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
yading@10 938 {
yading@10 939 int ret;
yading@10 940 unsigned flags = av_get_cpu_flags();
yading@10 941
yading@10 942 if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
yading@10 943 return ret;
yading@10 944
yading@10 945 av_force_cpu_flags(flags);
yading@10 946 return 0;
yading@10 947 }
yading@10 948
yading@10 949 int opt_timelimit(void *optctx, const char *opt, const char *arg)
yading@10 950 {
yading@10 951 #if HAVE_SETRLIMIT
yading@10 952 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
yading@10 953 struct rlimit rl = { lim, lim + 1 };
yading@10 954 if (setrlimit(RLIMIT_CPU, &rl))
yading@10 955 perror("setrlimit");
yading@10 956 #else
yading@10 957 av_log(NULL, AV_LOG_WARNING, "-%s not implemented on this OS\n", opt);
yading@10 958 #endif
yading@10 959 return 0;
yading@10 960 }
yading@10 961
yading@10 962 #if CONFIG_OPENCL
yading@10 963 int opt_opencl(void *optctx, const char *opt, const char *arg)
yading@10 964 {
yading@10 965 char *key, *value;
yading@10 966 const char *opts = arg;
yading@10 967 int ret = 0;
yading@10 968 while (*opts) {
yading@10 969 ret = av_opt_get_key_value(&opts, "=", ":", 0, &key, &value);
yading@10 970 if (ret < 0)
yading@10 971 return ret;
yading@10 972 ret = av_opencl_set_option(key, value);
yading@10 973 if (ret < 0)
yading@10 974 return ret;
yading@10 975 if (*opts)
yading@10 976 opts++;
yading@10 977 }
yading@10 978 return ret;
yading@10 979 }
yading@10 980 #endif
yading@10 981
yading@10 982 void print_error(const char *filename, int err)
yading@10 983 {
yading@10 984 char errbuf[128];
yading@10 985 const char *errbuf_ptr = errbuf;
yading@10 986
yading@10 987 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
yading@10 988 errbuf_ptr = strerror(AVUNERROR(err));
yading@10 989 av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr);
yading@10 990 }
yading@10 991
yading@10 992 static int warned_cfg = 0;
yading@10 993
yading@10 994 #define INDENT 1
yading@10 995 #define SHOW_VERSION 2
yading@10 996 #define SHOW_CONFIG 4
yading@10 997 #define SHOW_COPYRIGHT 8
yading@10 998
yading@10 999 #define PRINT_LIB_INFO(libname, LIBNAME, flags, level) \
yading@10 1000 if (CONFIG_##LIBNAME) { \
yading@10 1001 const char *indent = flags & INDENT? " " : ""; \
yading@10 1002 if (flags & SHOW_VERSION) { \
yading@10 1003 unsigned int version = libname##_version(); \
yading@10 1004 av_log(NULL, level, \
yading@10 1005 "%slib%-11s %2d.%3d.%3d / %2d.%3d.%3d\n", \
yading@10 1006 indent, #libname, \
yading@10 1007 LIB##LIBNAME##_VERSION_MAJOR, \
yading@10 1008 LIB##LIBNAME##_VERSION_MINOR, \
yading@10 1009 LIB##LIBNAME##_VERSION_MICRO, \
yading@10 1010 version >> 16, version >> 8 & 0xff, version & 0xff); \
yading@10 1011 } \
yading@10 1012 if (flags & SHOW_CONFIG) { \
yading@10 1013 const char *cfg = libname##_configuration(); \
yading@10 1014 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
yading@10 1015 if (!warned_cfg) { \
yading@10 1016 av_log(NULL, level, \
yading@10 1017 "%sWARNING: library configuration mismatch\n", \
yading@10 1018 indent); \
yading@10 1019 warned_cfg = 1; \
yading@10 1020 } \
yading@10 1021 av_log(NULL, level, "%s%-11s configuration: %s\n", \
yading@10 1022 indent, #libname, cfg); \
yading@10 1023 } \
yading@10 1024 } \
yading@10 1025 } \
yading@10 1026
yading@10 1027 static void print_all_libs_info(int flags, int level)
yading@10 1028 {
yading@10 1029 PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
yading@10 1030 PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
yading@10 1031 PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
yading@10 1032 PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
yading@10 1033 PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
yading@10 1034 PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
yading@10 1035 PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
yading@10 1036 PRINT_LIB_INFO(swresample,SWRESAMPLE, flags, level);
yading@10 1037 PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
yading@10 1038 }
yading@10 1039
yading@10 1040 static void print_program_info(int flags, int level)
yading@10 1041 {
yading@10 1042 const char *indent = flags & INDENT? " " : "";
yading@10 1043
yading@10 1044 av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);
yading@10 1045 if (flags & SHOW_COPYRIGHT)
yading@10 1046 av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
yading@10 1047 program_birth_year, this_year);
yading@10 1048 av_log(NULL, level, "\n");
yading@10 1049 av_log(NULL, level, "%sbuilt on %s %s with %s\n",
yading@10 1050 indent, __DATE__, __TIME__, CC_IDENT);
yading@10 1051
yading@10 1052 av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
yading@10 1053 }
yading@10 1054
yading@10 1055 void show_banner(int argc, char **argv, const OptionDef *options)
yading@10 1056 {
yading@10 1057 int idx = locate_option(argc, argv, options, "version");
yading@10 1058 if (idx)
yading@10 1059 return;
yading@10 1060
yading@10 1061 print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);
yading@10 1062 print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_INFO);
yading@10 1063 print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO);
yading@10 1064 }
yading@10 1065
yading@10 1066 int show_version(void *optctx, const char *opt, const char *arg)
yading@10 1067 {
yading@10 1068 av_log_set_callback(log_callback_help);
yading@10 1069 print_program_info (0 , AV_LOG_INFO);
yading@10 1070 print_all_libs_info(SHOW_VERSION, AV_LOG_INFO);
yading@10 1071
yading@10 1072 return 0;
yading@10 1073 }
yading@10 1074
yading@10 1075 int show_license(void *optctx, const char *opt, const char *arg)
yading@10 1076 {
yading@10 1077 #if CONFIG_NONFREE
yading@10 1078 printf(
yading@10 1079 "This version of %s has nonfree parts compiled in.\n"
yading@10 1080 "Therefore it is not legally redistributable.\n",
yading@10 1081 program_name );
yading@10 1082 #elif CONFIG_GPLV3
yading@10 1083 printf(
yading@10 1084 "%s is free software; you can redistribute it and/or modify\n"
yading@10 1085 "it under the terms of the GNU General Public License as published by\n"
yading@10 1086 "the Free Software Foundation; either version 3 of the License, or\n"
yading@10 1087 "(at your option) any later version.\n"
yading@10 1088 "\n"
yading@10 1089 "%s is distributed in the hope that it will be useful,\n"
yading@10 1090 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
yading@10 1091 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
yading@10 1092 "GNU General Public License for more details.\n"
yading@10 1093 "\n"
yading@10 1094 "You should have received a copy of the GNU General Public License\n"
yading@10 1095 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
yading@10 1096 program_name, program_name, program_name );
yading@10 1097 #elif CONFIG_GPL
yading@10 1098 printf(
yading@10 1099 "%s is free software; you can redistribute it and/or modify\n"
yading@10 1100 "it under the terms of the GNU General Public License as published by\n"
yading@10 1101 "the Free Software Foundation; either version 2 of the License, or\n"
yading@10 1102 "(at your option) any later version.\n"
yading@10 1103 "\n"
yading@10 1104 "%s is distributed in the hope that it will be useful,\n"
yading@10 1105 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
yading@10 1106 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
yading@10 1107 "GNU General Public License for more details.\n"
yading@10 1108 "\n"
yading@10 1109 "You should have received a copy of the GNU General Public License\n"
yading@10 1110 "along with %s; if not, write to the Free Software\n"
yading@10 1111 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
yading@10 1112 program_name, program_name, program_name );
yading@10 1113 #elif CONFIG_LGPLV3
yading@10 1114 printf(
yading@10 1115 "%s is free software; you can redistribute it and/or modify\n"
yading@10 1116 "it under the terms of the GNU Lesser General Public License as published by\n"
yading@10 1117 "the Free Software Foundation; either version 3 of the License, or\n"
yading@10 1118 "(at your option) any later version.\n"
yading@10 1119 "\n"
yading@10 1120 "%s is distributed in the hope that it will be useful,\n"
yading@10 1121 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
yading@10 1122 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
yading@10 1123 "GNU Lesser General Public License for more details.\n"
yading@10 1124 "\n"
yading@10 1125 "You should have received a copy of the GNU Lesser General Public License\n"
yading@10 1126 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
yading@10 1127 program_name, program_name, program_name );
yading@10 1128 #else
yading@10 1129 printf(
yading@10 1130 "%s is free software; you can redistribute it and/or\n"
yading@10 1131 "modify it under the terms of the GNU Lesser General Public\n"
yading@10 1132 "License as published by the Free Software Foundation; either\n"
yading@10 1133 "version 2.1 of the License, or (at your option) any later version.\n"
yading@10 1134 "\n"
yading@10 1135 "%s is distributed in the hope that it will be useful,\n"
yading@10 1136 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
yading@10 1137 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
yading@10 1138 "Lesser General Public License for more details.\n"
yading@10 1139 "\n"
yading@10 1140 "You should have received a copy of the GNU Lesser General Public\n"
yading@10 1141 "License along with %s; if not, write to the Free Software\n"
yading@10 1142 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
yading@10 1143 program_name, program_name, program_name );
yading@10 1144 #endif
yading@10 1145
yading@10 1146 return 0;
yading@10 1147 }
yading@10 1148
yading@10 1149 int show_formats(void *optctx, const char *opt, const char *arg)
yading@10 1150 {
yading@10 1151 AVInputFormat *ifmt = NULL;
yading@10 1152 AVOutputFormat *ofmt = NULL;
yading@10 1153 const char *last_name;
yading@10 1154
yading@10 1155 printf("File formats:\n"
yading@10 1156 " D. = Demuxing supported\n"
yading@10 1157 " .E = Muxing supported\n"
yading@10 1158 " --\n");
yading@10 1159 last_name = "000";
yading@10 1160 for (;;) {
yading@10 1161 int decode = 0;
yading@10 1162 int encode = 0;
yading@10 1163 const char *name = NULL;
yading@10 1164 const char *long_name = NULL;
yading@10 1165
yading@10 1166 while ((ofmt = av_oformat_next(ofmt))) {
yading@10 1167 if ((name == NULL || strcmp(ofmt->name, name) < 0) &&
yading@10 1168 strcmp(ofmt->name, last_name) > 0) {
yading@10 1169 name = ofmt->name;
yading@10 1170 long_name = ofmt->long_name;
yading@10 1171 encode = 1;
yading@10 1172 }
yading@10 1173 }
yading@10 1174 while ((ifmt = av_iformat_next(ifmt))) {
yading@10 1175 if ((name == NULL || strcmp(ifmt->name, name) < 0) &&
yading@10 1176 strcmp(ifmt->name, last_name) > 0) {
yading@10 1177 name = ifmt->name;
yading@10 1178 long_name = ifmt->long_name;
yading@10 1179 encode = 0;
yading@10 1180 }
yading@10 1181 if (name && strcmp(ifmt->name, name) == 0)
yading@10 1182 decode = 1;
yading@10 1183 }
yading@10 1184 if (name == NULL)
yading@10 1185 break;
yading@10 1186 last_name = name;
yading@10 1187
yading@10 1188 printf(" %s%s %-15s %s\n",
yading@10 1189 decode ? "D" : " ",
yading@10 1190 encode ? "E" : " ",
yading@10 1191 name,
yading@10 1192 long_name ? long_name:" ");
yading@10 1193 }
yading@10 1194 return 0;
yading@10 1195 }
yading@10 1196
yading@10 1197 #define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
yading@10 1198 if (codec->field) { \
yading@10 1199 const type *p = codec->field; \
yading@10 1200 \
yading@10 1201 printf(" Supported " list_name ":"); \
yading@10 1202 while (*p != term) { \
yading@10 1203 get_name(*p); \
yading@10 1204 printf(" %s", name); \
yading@10 1205 p++; \
yading@10 1206 } \
yading@10 1207 printf("\n"); \
yading@10 1208 } \
yading@10 1209
yading@10 1210 static void print_codec(const AVCodec *c)
yading@10 1211 {
yading@10 1212 int encoder = av_codec_is_encoder(c);
yading@10 1213
yading@10 1214 printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
yading@10 1215 c->long_name ? c->long_name : "");
yading@10 1216
yading@10 1217 if (c->type == AVMEDIA_TYPE_VIDEO) {
yading@10 1218 printf(" Threading capabilities: ");
yading@10 1219 switch (c->capabilities & (CODEC_CAP_FRAME_THREADS |
yading@10 1220 CODEC_CAP_SLICE_THREADS)) {
yading@10 1221 case CODEC_CAP_FRAME_THREADS |
yading@10 1222 CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
yading@10 1223 case CODEC_CAP_FRAME_THREADS: printf("frame"); break;
yading@10 1224 case CODEC_CAP_SLICE_THREADS: printf("slice"); break;
yading@10 1225 default: printf("no"); break;
yading@10 1226 }
yading@10 1227 printf("\n");
yading@10 1228 }
yading@10 1229
yading@10 1230 if (c->supported_framerates) {
yading@10 1231 const AVRational *fps = c->supported_framerates;
yading@10 1232
yading@10 1233 printf(" Supported framerates:");
yading@10 1234 while (fps->num) {
yading@10 1235 printf(" %d/%d", fps->num, fps->den);
yading@10 1236 fps++;
yading@10 1237 }
yading@10 1238 printf("\n");
yading@10 1239 }
yading@10 1240 PRINT_CODEC_SUPPORTED(c, pix_fmts, enum AVPixelFormat, "pixel formats",
yading@10 1241 AV_PIX_FMT_NONE, GET_PIX_FMT_NAME);
yading@10 1242 PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0,
yading@10 1243 GET_SAMPLE_RATE_NAME);
yading@10 1244 PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats",
yading@10 1245 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME);
yading@10 1246 PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts",
yading@10 1247 0, GET_CH_LAYOUT_DESC);
yading@10 1248
yading@10 1249 if (c->priv_class) {
yading@10 1250 show_help_children(c->priv_class,
yading@10 1251 AV_OPT_FLAG_ENCODING_PARAM |
yading@10 1252 AV_OPT_FLAG_DECODING_PARAM);
yading@10 1253 }
yading@10 1254 }
yading@10 1255
yading@10 1256 static char get_media_type_char(enum AVMediaType type)
yading@10 1257 {
yading@10 1258 switch (type) {
yading@10 1259 case AVMEDIA_TYPE_VIDEO: return 'V';
yading@10 1260 case AVMEDIA_TYPE_AUDIO: return 'A';
yading@10 1261 case AVMEDIA_TYPE_DATA: return 'D';
yading@10 1262 case AVMEDIA_TYPE_SUBTITLE: return 'S';
yading@10 1263 case AVMEDIA_TYPE_ATTACHMENT:return 'T';
yading@10 1264 default: return '?';
yading@10 1265 }
yading@10 1266 }
yading@10 1267
yading@10 1268 static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev,
yading@10 1269 int encoder)
yading@10 1270 {
yading@10 1271 while ((prev = av_codec_next(prev))) {
yading@10 1272 if (prev->id == id &&
yading@10 1273 (encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev)))
yading@10 1274 return prev;
yading@10 1275 }
yading@10 1276 return NULL;
yading@10 1277 }
yading@10 1278
yading@10 1279 static int compare_codec_desc(const void *a, const void *b)
yading@10 1280 {
yading@10 1281 const AVCodecDescriptor * const *da = a;
yading@10 1282 const AVCodecDescriptor * const *db = b;
yading@10 1283
yading@10 1284 return (*da)->type != (*db)->type ? (*da)->type - (*db)->type :
yading@10 1285 strcmp((*da)->name, (*db)->name);
yading@10 1286 }
yading@10 1287
yading@10 1288 static unsigned get_codecs_sorted(const AVCodecDescriptor ***rcodecs)
yading@10 1289 {
yading@10 1290 const AVCodecDescriptor *desc = NULL;
yading@10 1291 const AVCodecDescriptor **codecs;
yading@10 1292 unsigned nb_codecs = 0, i = 0;
yading@10 1293
yading@10 1294 while ((desc = avcodec_descriptor_next(desc)))
yading@10 1295 nb_codecs++;
yading@10 1296 if (!(codecs = av_calloc(nb_codecs, sizeof(*codecs)))) {
yading@10 1297 av_log(NULL, AV_LOG_ERROR, "Out of memory\n");
yading@10 1298 exit(1);
yading@10 1299 }
yading@10 1300 desc = NULL;
yading@10 1301 while ((desc = avcodec_descriptor_next(desc)))
yading@10 1302 codecs[i++] = desc;
yading@10 1303 av_assert0(i == nb_codecs);
yading@10 1304 qsort(codecs, nb_codecs, sizeof(*codecs), compare_codec_desc);
yading@10 1305 *rcodecs = codecs;
yading@10 1306 return nb_codecs;
yading@10 1307 }
yading@10 1308
yading@10 1309 static void print_codecs_for_id(enum AVCodecID id, int encoder)
yading@10 1310 {
yading@10 1311 const AVCodec *codec = NULL;
yading@10 1312
yading@10 1313 printf(" (%s: ", encoder ? "encoders" : "decoders");
yading@10 1314
yading@10 1315 while ((codec = next_codec_for_id(id, codec, encoder)))
yading@10 1316 printf("%s ", codec->name);
yading@10 1317
yading@10 1318 printf(")");
yading@10 1319 }
yading@10 1320
yading@10 1321 int show_codecs(void *optctx, const char *opt, const char *arg)
yading@10 1322 {
yading@10 1323 const AVCodecDescriptor **codecs;
yading@10 1324 unsigned i, nb_codecs = get_codecs_sorted(&codecs);
yading@10 1325
yading@10 1326 printf("Codecs:\n"
yading@10 1327 " D..... = Decoding supported\n"
yading@10 1328 " .E.... = Encoding supported\n"
yading@10 1329 " ..V... = Video codec\n"
yading@10 1330 " ..A... = Audio codec\n"
yading@10 1331 " ..S... = Subtitle codec\n"
yading@10 1332 " ...I.. = Intra frame-only codec\n"
yading@10 1333 " ....L. = Lossy compression\n"
yading@10 1334 " .....S = Lossless compression\n"
yading@10 1335 " -------\n");
yading@10 1336 for (i = 0; i < nb_codecs; i++) {
yading@10 1337 const AVCodecDescriptor *desc = codecs[i];
yading@10 1338 const AVCodec *codec = NULL;
yading@10 1339
yading@10 1340 printf(" ");
yading@10 1341 printf(avcodec_find_decoder(desc->id) ? "D" : ".");
yading@10 1342 printf(avcodec_find_encoder(desc->id) ? "E" : ".");
yading@10 1343
yading@10 1344 printf("%c", get_media_type_char(desc->type));
yading@10 1345 printf((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : ".");
yading@10 1346 printf((desc->props & AV_CODEC_PROP_LOSSY) ? "L" : ".");
yading@10 1347 printf((desc->props & AV_CODEC_PROP_LOSSLESS) ? "S" : ".");
yading@10 1348
yading@10 1349 printf(" %-20s %s", desc->name, desc->long_name ? desc->long_name : "");
yading@10 1350
yading@10 1351 /* print decoders/encoders when there's more than one or their
yading@10 1352 * names are different from codec name */
yading@10 1353 while ((codec = next_codec_for_id(desc->id, codec, 0))) {
yading@10 1354 if (strcmp(codec->name, desc->name)) {
yading@10 1355 print_codecs_for_id(desc->id, 0);
yading@10 1356 break;
yading@10 1357 }
yading@10 1358 }
yading@10 1359 codec = NULL;
yading@10 1360 while ((codec = next_codec_for_id(desc->id, codec, 1))) {
yading@10 1361 if (strcmp(codec->name, desc->name)) {
yading@10 1362 print_codecs_for_id(desc->id, 1);
yading@10 1363 break;
yading@10 1364 }
yading@10 1365 }
yading@10 1366
yading@10 1367 printf("\n");
yading@10 1368 }
yading@10 1369 av_free(codecs);
yading@10 1370 return 0;
yading@10 1371 }
yading@10 1372
yading@10 1373 static void print_codecs(int encoder)
yading@10 1374 {
yading@10 1375 const AVCodecDescriptor **codecs;
yading@10 1376 unsigned i, nb_codecs = get_codecs_sorted(&codecs);
yading@10 1377
yading@10 1378 printf("%s:\n"
yading@10 1379 " V..... = Video\n"
yading@10 1380 " A..... = Audio\n"
yading@10 1381 " S..... = Subtitle\n"
yading@10 1382 " .F.... = Frame-level multithreading\n"
yading@10 1383 " ..S... = Slice-level multithreading\n"
yading@10 1384 " ...X.. = Codec is experimental\n"
yading@10 1385 " ....B. = Supports draw_horiz_band\n"
yading@10 1386 " .....D = Supports direct rendering method 1\n"
yading@10 1387 " ------\n",
yading@10 1388 encoder ? "Encoders" : "Decoders");
yading@10 1389 for (i = 0; i < nb_codecs; i++) {
yading@10 1390 const AVCodecDescriptor *desc = codecs[i];
yading@10 1391 const AVCodec *codec = NULL;
yading@10 1392
yading@10 1393 while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
yading@10 1394 printf(" %c", get_media_type_char(desc->type));
yading@10 1395 printf((codec->capabilities & CODEC_CAP_FRAME_THREADS) ? "F" : ".");
yading@10 1396 printf((codec->capabilities & CODEC_CAP_SLICE_THREADS) ? "S" : ".");
yading@10 1397 printf((codec->capabilities & CODEC_CAP_EXPERIMENTAL) ? "X" : ".");
yading@10 1398 printf((codec->capabilities & CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
yading@10 1399 printf((codec->capabilities & CODEC_CAP_DR1) ? "D" : ".");
yading@10 1400
yading@10 1401 printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
yading@10 1402 if (strcmp(codec->name, desc->name))
yading@10 1403 printf(" (codec %s)", desc->name);
yading@10 1404
yading@10 1405 printf("\n");
yading@10 1406 }
yading@10 1407 }
yading@10 1408 av_free(codecs);
yading@10 1409 }
yading@10 1410
yading@10 1411 int show_decoders(void *optctx, const char *opt, const char *arg)
yading@10 1412 {
yading@10 1413 print_codecs(0);
yading@10 1414 return 0;
yading@10 1415 }
yading@10 1416
yading@10 1417 int show_encoders(void *optctx, const char *opt, const char *arg)
yading@10 1418 {
yading@10 1419 print_codecs(1);
yading@10 1420 return 0;
yading@10 1421 }
yading@10 1422
yading@10 1423 int show_bsfs(void *optctx, const char *opt, const char *arg)
yading@10 1424 {
yading@10 1425 AVBitStreamFilter *bsf = NULL;
yading@10 1426
yading@10 1427 printf("Bitstream filters:\n");
yading@10 1428 while ((bsf = av_bitstream_filter_next(bsf)))
yading@10 1429 printf("%s\n", bsf->name);
yading@10 1430 printf("\n");
yading@10 1431 return 0;
yading@10 1432 }
yading@10 1433
yading@10 1434 int show_protocols(void *optctx, const char *opt, const char *arg)
yading@10 1435 {
yading@10 1436 void *opaque = NULL;
yading@10 1437 const char *name;
yading@10 1438
yading@10 1439 printf("Supported file protocols:\n"
yading@10 1440 "Input:\n");
yading@10 1441 while ((name = avio_enum_protocols(&opaque, 0)))
yading@10 1442 printf("%s\n", name);
yading@10 1443 printf("Output:\n");
yading@10 1444 while ((name = avio_enum_protocols(&opaque, 1)))
yading@10 1445 printf("%s\n", name);
yading@10 1446 return 0;
yading@10 1447 }
yading@10 1448
yading@10 1449 int show_filters(void *optctx, const char *opt, const char *arg)
yading@10 1450 {
yading@10 1451 const AVFilter av_unused(*filter) = NULL;
yading@10 1452 char descr[64], *descr_cur;
yading@10 1453 int i, j;
yading@10 1454 const AVFilterPad *pad;
yading@10 1455
yading@10 1456 printf("Filters:\n"
yading@10 1457 " A = Audio input/output\n"
yading@10 1458 " V = Video input/output\n"
yading@10 1459 " N = Dynamic number and/or type of input/output\n"
yading@10 1460 " | = Source or sink filter\n");
yading@10 1461 #if CONFIG_AVFILTER
yading@10 1462 while ((filter = avfilter_next(filter))) {
yading@10 1463 descr_cur = descr;
yading@10 1464 for (i = 0; i < 2; i++) {
yading@10 1465 if (i) {
yading@10 1466 *(descr_cur++) = '-';
yading@10 1467 *(descr_cur++) = '>';
yading@10 1468 }
yading@10 1469 pad = i ? filter->outputs : filter->inputs;
yading@10 1470 for (j = 0; pad && pad[j].name; j++) {
yading@10 1471 if (descr_cur >= descr + sizeof(descr) - 4)
yading@10 1472 break;
yading@10 1473 *(descr_cur++) = get_media_type_char(pad[j].type);
yading@10 1474 }
yading@10 1475 if (!j)
yading@10 1476 *(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
yading@10 1477 ( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|';
yading@10 1478 }
yading@10 1479 *descr_cur = 0;
yading@10 1480 printf("%-16s %-10s %s\n", filter->name, descr, filter->description);
yading@10 1481 }
yading@10 1482 #endif
yading@10 1483 return 0;
yading@10 1484 }
yading@10 1485
yading@10 1486 int show_pix_fmts(void *optctx, const char *opt, const char *arg)
yading@10 1487 {
yading@10 1488 const AVPixFmtDescriptor *pix_desc = NULL;
yading@10 1489
yading@10 1490 printf("Pixel formats:\n"
yading@10 1491 "I.... = Supported Input format for conversion\n"
yading@10 1492 ".O... = Supported Output format for conversion\n"
yading@10 1493 "..H.. = Hardware accelerated format\n"
yading@10 1494 "...P. = Paletted format\n"
yading@10 1495 "....B = Bitstream format\n"
yading@10 1496 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
yading@10 1497 "-----\n");
yading@10 1498
yading@10 1499 #if !CONFIG_SWSCALE
yading@10 1500 # define sws_isSupportedInput(x) 0
yading@10 1501 # define sws_isSupportedOutput(x) 0
yading@10 1502 #endif
yading@10 1503
yading@10 1504 while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) {
yading@10 1505 enum AVPixelFormat pix_fmt = av_pix_fmt_desc_get_id(pix_desc);
yading@10 1506 printf("%c%c%c%c%c %-16s %d %2d\n",
yading@10 1507 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
yading@10 1508 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
yading@10 1509 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
yading@10 1510 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
yading@10 1511 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
yading@10 1512 pix_desc->name,
yading@10 1513 pix_desc->nb_components,
yading@10 1514 av_get_bits_per_pixel(pix_desc));
yading@10 1515 }
yading@10 1516 return 0;
yading@10 1517 }
yading@10 1518
yading@10 1519 int show_layouts(void *optctx, const char *opt, const char *arg)
yading@10 1520 {
yading@10 1521 int i = 0;
yading@10 1522 uint64_t layout, j;
yading@10 1523 const char *name, *descr;
yading@10 1524
yading@10 1525 printf("Individual channels:\n"
yading@10 1526 "NAME DESCRIPTION\n");
yading@10 1527 for (i = 0; i < 63; i++) {
yading@10 1528 name = av_get_channel_name((uint64_t)1 << i);
yading@10 1529 if (!name)
yading@10 1530 continue;
yading@10 1531 descr = av_get_channel_description((uint64_t)1 << i);
yading@10 1532 printf("%-12s%s\n", name, descr);
yading@10 1533 }
yading@10 1534 printf("\nStandard channel layouts:\n"
yading@10 1535 "NAME DECOMPOSITION\n");
yading@10 1536 for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
yading@10 1537 if (name) {
yading@10 1538 printf("%-12s", name);
yading@10 1539 for (j = 1; j; j <<= 1)
yading@10 1540 if ((layout & j))
yading@10 1541 printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
yading@10 1542 printf("\n");
yading@10 1543 }
yading@10 1544 }
yading@10 1545 return 0;
yading@10 1546 }
yading@10 1547
yading@10 1548 int show_sample_fmts(void *optctx, const char *opt, const char *arg)
yading@10 1549 {
yading@10 1550 int i;
yading@10 1551 char fmt_str[128];
yading@10 1552 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
yading@10 1553 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
yading@10 1554 return 0;
yading@10 1555 }
yading@10 1556
yading@10 1557 static void show_help_codec(const char *name, int encoder)
yading@10 1558 {
yading@10 1559 const AVCodecDescriptor *desc;
yading@10 1560 const AVCodec *codec;
yading@10 1561
yading@10 1562 if (!name) {
yading@10 1563 av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n");
yading@10 1564 return;
yading@10 1565 }
yading@10 1566
yading@10 1567 codec = encoder ? avcodec_find_encoder_by_name(name) :
yading@10 1568 avcodec_find_decoder_by_name(name);
yading@10 1569
yading@10 1570 if (codec)
yading@10 1571 print_codec(codec);
yading@10 1572 else if ((desc = avcodec_descriptor_get_by_name(name))) {
yading@10 1573 int printed = 0;
yading@10 1574
yading@10 1575 while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
yading@10 1576 printed = 1;
yading@10 1577 print_codec(codec);
yading@10 1578 }
yading@10 1579
yading@10 1580 if (!printed) {
yading@10 1581 av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to FFmpeg, "
yading@10 1582 "but no %s for it are available. FFmpeg might need to be "
yading@10 1583 "recompiled with additional external libraries.\n",
yading@10 1584 name, encoder ? "encoders" : "decoders");
yading@10 1585 }
yading@10 1586 } else {
yading@10 1587 av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by FFmpeg.\n",
yading@10 1588 name);
yading@10 1589 }
yading@10 1590 }
yading@10 1591
yading@10 1592 static void show_help_demuxer(const char *name)
yading@10 1593 {
yading@10 1594 const AVInputFormat *fmt = av_find_input_format(name);
yading@10 1595
yading@10 1596 if (!fmt) {
yading@10 1597 av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
yading@10 1598 return;
yading@10 1599 }
yading@10 1600
yading@10 1601 printf("Demuxer %s [%s]:\n", fmt->name, fmt->long_name);
yading@10 1602
yading@10 1603 if (fmt->extensions)
yading@10 1604 printf(" Common extensions: %s.\n", fmt->extensions);
yading@10 1605
yading@10 1606 if (fmt->priv_class)
yading@10 1607 show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM);
yading@10 1608 }
yading@10 1609
yading@10 1610 static void show_help_muxer(const char *name)
yading@10 1611 {
yading@10 1612 const AVCodecDescriptor *desc;
yading@10 1613 const AVOutputFormat *fmt = av_guess_format(name, NULL, NULL);
yading@10 1614
yading@10 1615 if (!fmt) {
yading@10 1616 av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
yading@10 1617 return;
yading@10 1618 }
yading@10 1619
yading@10 1620 printf("Muxer %s [%s]:\n", fmt->name, fmt->long_name);
yading@10 1621
yading@10 1622 if (fmt->extensions)
yading@10 1623 printf(" Common extensions: %s.\n", fmt->extensions);
yading@10 1624 if (fmt->mime_type)
yading@10 1625 printf(" Mime type: %s.\n", fmt->mime_type);
yading@10 1626 if (fmt->video_codec != AV_CODEC_ID_NONE &&
yading@10 1627 (desc = avcodec_descriptor_get(fmt->video_codec))) {
yading@10 1628 printf(" Default video codec: %s.\n", desc->name);
yading@10 1629 }
yading@10 1630 if (fmt->audio_codec != AV_CODEC_ID_NONE &&
yading@10 1631 (desc = avcodec_descriptor_get(fmt->audio_codec))) {
yading@10 1632 printf(" Default audio codec: %s.\n", desc->name);
yading@10 1633 }
yading@10 1634 if (fmt->subtitle_codec != AV_CODEC_ID_NONE &&
yading@10 1635 (desc = avcodec_descriptor_get(fmt->subtitle_codec))) {
yading@10 1636 printf(" Default subtitle codec: %s.\n", desc->name);
yading@10 1637 }
yading@10 1638
yading@10 1639 if (fmt->priv_class)
yading@10 1640 show_help_children(fmt->priv_class, AV_OPT_FLAG_ENCODING_PARAM);
yading@10 1641 }
yading@10 1642
yading@10 1643 #if CONFIG_AVFILTER
yading@10 1644 static void show_help_filter(const char *name)
yading@10 1645 {
yading@10 1646 #if CONFIG_AVFILTER
yading@10 1647 const AVFilter *f = avfilter_get_by_name(name);
yading@10 1648 int i, count;
yading@10 1649
yading@10 1650 if (!name) {
yading@10 1651 av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n");
yading@10 1652 return;
yading@10 1653 } else if (!f) {
yading@10 1654 av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name);
yading@10 1655 return;
yading@10 1656 }
yading@10 1657
yading@10 1658 printf("Filter %s\n", f->name);
yading@10 1659 if (f->description)
yading@10 1660 printf(" %s\n", f->description);
yading@10 1661 printf(" Inputs:\n");
yading@10 1662 count = avfilter_pad_count(f->inputs);
yading@10 1663 for (i = 0; i < count; i++) {
yading@10 1664 printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i),
yading@10 1665 media_type_string(avfilter_pad_get_type(f->inputs, i)));
yading@10 1666 }
yading@10 1667 if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)
yading@10 1668 printf(" dynamic (depending on the options)\n");
yading@10 1669 else if (!count)
yading@10 1670 printf(" none (source filter)\n");
yading@10 1671
yading@10 1672 printf(" Outputs:\n");
yading@10 1673 count = avfilter_pad_count(f->outputs);
yading@10 1674 for (i = 0; i < count; i++) {
yading@10 1675 printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i),
yading@10 1676 media_type_string(avfilter_pad_get_type(f->outputs, i)));
yading@10 1677 }
yading@10 1678 if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS)
yading@10 1679 printf(" dynamic (depending on the options)\n");
yading@10 1680 else if (!count)
yading@10 1681 printf(" none (sink filter)\n");
yading@10 1682
yading@10 1683 if (f->priv_class)
yading@10 1684 show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM |
yading@10 1685 AV_OPT_FLAG_AUDIO_PARAM);
yading@10 1686 #else
yading@10 1687 av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; "
yading@10 1688 "can not to satisfy request\n");
yading@10 1689 #endif
yading@10 1690 }
yading@10 1691 #endif
yading@10 1692
yading@10 1693 int show_help(void *optctx, const char *opt, const char *arg)
yading@10 1694 {
yading@10 1695 char *topic, *par;
yading@10 1696 av_log_set_callback(log_callback_help);
yading@10 1697
yading@10 1698 topic = av_strdup(arg ? arg : "");
yading@10 1699 par = strchr(topic, '=');
yading@10 1700 if (par)
yading@10 1701 *par++ = 0;
yading@10 1702
yading@10 1703 if (!*topic) {
yading@10 1704 show_help_default(topic, par);
yading@10 1705 } else if (!strcmp(topic, "decoder")) {
yading@10 1706 show_help_codec(par, 0);
yading@10 1707 } else if (!strcmp(topic, "encoder")) {
yading@10 1708 show_help_codec(par, 1);
yading@10 1709 } else if (!strcmp(topic, "demuxer")) {
yading@10 1710 show_help_demuxer(par);
yading@10 1711 } else if (!strcmp(topic, "muxer")) {
yading@10 1712 show_help_muxer(par);
yading@10 1713 #if CONFIG_AVFILTER
yading@10 1714 } else if (!strcmp(topic, "filter")) {
yading@10 1715 show_help_filter(par);
yading@10 1716 #endif
yading@10 1717 } else {
yading@10 1718 show_help_default(topic, par);
yading@10 1719 }
yading@10 1720
yading@10 1721 av_freep(&topic);
yading@10 1722 return 0;
yading@10 1723 }
yading@10 1724
yading@10 1725 int read_yesno(void)
yading@10 1726 {
yading@10 1727 int c = getchar();
yading@10 1728 int yesno = (av_toupper(c) == 'Y');
yading@10 1729
yading@10 1730 while (c != '\n' && c != EOF)
yading@10 1731 c = getchar();
yading@10 1732
yading@10 1733 return yesno;
yading@10 1734 }
yading@10 1735
yading@10 1736 int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
yading@10 1737 {
yading@10 1738 int ret;
yading@10 1739 FILE *f = fopen(filename, "rb");
yading@10 1740
yading@10 1741 if (!f) {
yading@10 1742 av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename,
yading@10 1743 strerror(errno));
yading@10 1744 return AVERROR(errno);
yading@10 1745 }
yading@10 1746 fseek(f, 0, SEEK_END);
yading@10 1747 *size = ftell(f);
yading@10 1748 fseek(f, 0, SEEK_SET);
yading@10 1749 if (*size == (size_t)-1) {
yading@10 1750 av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
yading@10 1751 fclose(f);
yading@10 1752 return AVERROR(errno);
yading@10 1753 }
yading@10 1754 *bufptr = av_malloc(*size + 1);
yading@10 1755 if (!*bufptr) {
yading@10 1756 av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n");
yading@10 1757 fclose(f);
yading@10 1758 return AVERROR(ENOMEM);
yading@10 1759 }
yading@10 1760 ret = fread(*bufptr, 1, *size, f);
yading@10 1761 if (ret < *size) {
yading@10 1762 av_free(*bufptr);
yading@10 1763 if (ferror(f)) {
yading@10 1764 av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n",
yading@10 1765 filename, strerror(errno));
yading@10 1766 ret = AVERROR(errno);
yading@10 1767 } else
yading@10 1768 ret = AVERROR_EOF;
yading@10 1769 } else {
yading@10 1770 ret = 0;
yading@10 1771 (*bufptr)[(*size)++] = '\0';
yading@10 1772 }
yading@10 1773
yading@10 1774 fclose(f);
yading@10 1775 return ret;
yading@10 1776 }
yading@10 1777
yading@10 1778 FILE *get_preset_file(char *filename, size_t filename_size,
yading@10 1779 const char *preset_name, int is_path,
yading@10 1780 const char *codec_name)
yading@10 1781 {
yading@10 1782 FILE *f = NULL;
yading@10 1783 int i;
yading@10 1784 const char *base[3] = { getenv("FFMPEG_DATADIR"),
yading@10 1785 getenv("HOME"),
yading@10 1786 FFMPEG_DATADIR, };
yading@10 1787
yading@10 1788 if (is_path) {
yading@10 1789 av_strlcpy(filename, preset_name, filename_size);
yading@10 1790 f = fopen(filename, "r");
yading@10 1791 } else {
yading@10 1792 #ifdef _WIN32
yading@10 1793 char datadir[MAX_PATH], *ls;
yading@10 1794 base[2] = NULL;
yading@10 1795
yading@10 1796 if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
yading@10 1797 {
yading@10 1798 for (ls = datadir; ls < datadir + strlen(datadir); ls++)
yading@10 1799 if (*ls == '\\') *ls = '/';
yading@10 1800
yading@10 1801 if (ls = strrchr(datadir, '/'))
yading@10 1802 {
yading@10 1803 *ls = 0;
yading@10 1804 strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
yading@10 1805 base[2] = datadir;
yading@10 1806 }
yading@10 1807 }
yading@10 1808 #endif
yading@10 1809 for (i = 0; i < 3 && !f; i++) {
yading@10 1810 if (!base[i])
yading@10 1811 continue;
yading@10 1812 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
yading@10 1813 i != 1 ? "" : "/.ffmpeg", preset_name);
yading@10 1814 f = fopen(filename, "r");
yading@10 1815 if (!f && codec_name) {
yading@10 1816 snprintf(filename, filename_size,
yading@10 1817 "%s%s/%s-%s.ffpreset",
yading@10 1818 base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
yading@10 1819 preset_name);
yading@10 1820 f = fopen(filename, "r");
yading@10 1821 }
yading@10 1822 }
yading@10 1823 }
yading@10 1824
yading@10 1825 return f;
yading@10 1826 }
yading@10 1827
yading@10 1828 int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
yading@10 1829 {
yading@10 1830 int ret = avformat_match_stream_specifier(s, st, spec);
yading@10 1831 if (ret < 0)
yading@10 1832 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
yading@10 1833 return ret;
yading@10 1834 }
yading@10 1835
yading@10 1836 AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
yading@10 1837 AVFormatContext *s, AVStream *st, AVCodec *codec)
yading@10 1838 {
yading@10 1839 AVDictionary *ret = NULL;
yading@10 1840 AVDictionaryEntry *t = NULL;
yading@10 1841 int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
yading@10 1842 : AV_OPT_FLAG_DECODING_PARAM;
yading@10 1843 char prefix = 0;
yading@10 1844 const AVClass *cc = avcodec_get_class();
yading@10 1845
yading@10 1846 if (!codec)
yading@10 1847 codec = s->oformat ? avcodec_find_encoder(codec_id)
yading@10 1848 : avcodec_find_decoder(codec_id);
yading@10 1849
yading@10 1850 switch (st->codec->codec_type) {
yading@10 1851 case AVMEDIA_TYPE_VIDEO:
yading@10 1852 prefix = 'v';
yading@10 1853 flags |= AV_OPT_FLAG_VIDEO_PARAM;
yading@10 1854 break;
yading@10 1855 case AVMEDIA_TYPE_AUDIO:
yading@10 1856 prefix = 'a';
yading@10 1857 flags |= AV_OPT_FLAG_AUDIO_PARAM;
yading@10 1858 break;
yading@10 1859 case AVMEDIA_TYPE_SUBTITLE:
yading@10 1860 prefix = 's';
yading@10 1861 flags |= AV_OPT_FLAG_SUBTITLE_PARAM;
yading@10 1862 break;
yading@10 1863 }
yading@10 1864
yading@10 1865 while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
yading@10 1866 char *p = strchr(t->key, ':');
yading@10 1867
yading@10 1868 /* check stream specification in opt name */
yading@10 1869 if (p)
yading@10 1870 switch (check_stream_specifier(s, st, p + 1)) {
yading@10 1871 case 1: *p = 0; break;
yading@10 1872 case 0: continue;
yading@10 1873 default: return NULL;
yading@10 1874 }
yading@10 1875
yading@10 1876 if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
yading@10 1877 (codec && codec->priv_class &&
yading@10 1878 av_opt_find(&codec->priv_class, t->key, NULL, flags,
yading@10 1879 AV_OPT_SEARCH_FAKE_OBJ)))
yading@10 1880 av_dict_set(&ret, t->key, t->value, 0);
yading@10 1881 else if (t->key[0] == prefix &&
yading@10 1882 av_opt_find(&cc, t->key + 1, NULL, flags,
yading@10 1883 AV_OPT_SEARCH_FAKE_OBJ))
yading@10 1884 av_dict_set(&ret, t->key + 1, t->value, 0);
yading@10 1885
yading@10 1886 if (p)
yading@10 1887 *p = ':';
yading@10 1888 }
yading@10 1889 return ret;
yading@10 1890 }
yading@10 1891
yading@10 1892 AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
yading@10 1893 AVDictionary *codec_opts)
yading@10 1894 {
yading@10 1895 int i;
yading@10 1896 AVDictionary **opts;
yading@10 1897
yading@10 1898 if (!s->nb_streams)
yading@10 1899 return NULL;
yading@10 1900 opts = av_mallocz(s->nb_streams * sizeof(*opts));
yading@10 1901 if (!opts) {
yading@10 1902 av_log(NULL, AV_LOG_ERROR,
yading@10 1903 "Could not alloc memory for stream options.\n");
yading@10 1904 return NULL;
yading@10 1905 }
yading@10 1906 for (i = 0; i < s->nb_streams; i++)
yading@10 1907 opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id,
yading@10 1908 s, s->streams[i], NULL);
yading@10 1909 return opts;
yading@10 1910 }
yading@10 1911
yading@10 1912 void *grow_array(void *array, int elem_size, int *size, int new_size)
yading@10 1913 {
yading@10 1914 if (new_size >= INT_MAX / elem_size) {
yading@10 1915 av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
yading@10 1916 exit(1);
yading@10 1917 }
yading@10 1918 if (*size < new_size) {
yading@10 1919 uint8_t *tmp = av_realloc(array, new_size*elem_size);
yading@10 1920 if (!tmp) {
yading@10 1921 av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
yading@10 1922 exit(1);
yading@10 1923 }
yading@10 1924 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
yading@10 1925 *size = new_size;
yading@10 1926 return tmp;
yading@10 1927 }
yading@10 1928 return array;
yading@10 1929 }