/* * Various utilities for command line tools * Copyright (c) 2000-2003 Fabrice Bellard * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define HAVE_AV_CONFIG_H #include "avformat.h" #include "common.h" #include "cmdutils.h" void show_help_options(const OptionDef *options, const char *msg, int mask, int value) { const OptionDef *po; int first; first = 1; for(po = options; po->name != NULL; po++) { char buf[64]; if ((po->flags & mask) == value) { if (first) { printf("%s", msg); first = 0; } pstrcpy(buf, sizeof(buf), po->name); if (po->flags & HAS_ARG) { pstrcat(buf, sizeof(buf), " "); pstrcat(buf, sizeof(buf), po->argname); } printf("-%-17s %s\n", buf, po->help); } } } static const OptionDef* find_option(const OptionDef *po, const char *name){ while (po->name != NULL) { if (!strcmp(name, po->name)) break; po++; } return po; } void parse_options(int argc, char **argv, const OptionDef *options) { const char *opt, *arg; int optindex; const OptionDef *po; /* parse options */ optindex = 1; while (optindex < argc) { opt = argv[optindex++]; if (opt[0] == '-' && opt[1] != '\0') { po= find_option(options, opt + 1); if (!po->name) po= find_option(options, "default"); if (!po->name) { unknown_opt: fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt); exit(1); } arg = NULL; if (po->flags & HAS_ARG) { arg = argv[optindex++]; if (!arg) { fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt); exit(1); } } if (po->flags & OPT_STRING) { char *str; str = av_strdup(arg); *po->u.str_arg = str; } else if (po->flags & OPT_BOOL) { *po->u.int_arg = 1; } else if (po->flags & OPT_INT) { *po->u.int_arg = atoi(arg); } else if (po->flags & OPT_FLOAT) { *po->u.float_arg = atof(arg); } else if (po->flags & OPT_FUNC2) { if(po->u.func2_arg(opt+1, arg)<0) goto unknown_opt; } else { po->u.func_arg(arg); } } else { parse_arg_file(opt); } } } void print_error(const char *filename, int err) { switch(err) { case AVERROR_NUMEXPECTED: fprintf(stderr, "%s: Incorrect image filename syntax.\n" "Use '%%d' to specify the image number:\n" " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n" " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n", filename); break; case AVERROR_INVALIDDATA: fprintf(stderr, "%s: Error while parsing header\n", filename); break; case AVERROR_NOFMT: fprintf(stderr, "%s: Unknown format\n", filename); break; case AVERROR_IO: fprintf(stderr, "%s: I/O error occured\n" "Usually that means that input file is truncated and/or corrupted.\n", filename); break; case AVERROR_NOMEM: fprintf(stderr, "%s: memory allocation error occured\n", filename); break; default: fprintf(stderr, "%s: Error while opening file\n", filename); break; } }