cmdutils.c 7.65 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1 2 3 4
/*
 * Various utilities for command line tools
 * Copyright (c) 2000-2003 Fabrice Bellard
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
Fabrice Bellard's avatar
Fabrice Bellard committed
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellard's avatar
Fabrice Bellard committed
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
13 14 15 16 17
 * 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
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
Fabrice Bellard's avatar
Fabrice Bellard committed
20
 */
21

22 23 24 25
#include <string.h>
#include <stdlib.h>
#include <errno.h>

Fabrice Bellard's avatar
Fabrice Bellard committed
26
#include "avformat.h"
27
#include "avdevice.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
28
#include "cmdutils.h"
29
#include "avstring.h"
30
#include "version.h"
31
#include "config.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
32

Michael Niedermayer's avatar
Michael Niedermayer committed
33 34
#undef exit

35
void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
Fabrice Bellard's avatar
Fabrice Bellard committed
36 37
{
    const OptionDef *po;
38
    int first;
Fabrice Bellard's avatar
Fabrice Bellard committed
39

40 41 42 43 44 45 46 47
    first = 1;
    for(po = options; po->name != NULL; po++) {
        char buf[64];
        if ((po->flags & mask) == value) {
            if (first) {
                printf("%s", msg);
                first = 0;
            }
48
            av_strlcpy(buf, po->name, sizeof(buf));
49
            if (po->flags & HAS_ARG) {
50 51
                av_strlcat(buf, " ", sizeof(buf));
                av_strlcat(buf, po->argname, sizeof(buf));
Fabrice Bellard's avatar
Fabrice Bellard committed
52
            }
53
            printf("-%-17s  %s\n", buf, po->help);
Fabrice Bellard's avatar
Fabrice Bellard committed
54 55 56 57
        }
    }
}

Måns Rullgård's avatar
Måns Rullgård committed
58
static const OptionDef* find_option(const OptionDef *po, const char *name){
Michael Niedermayer's avatar
Michael Niedermayer committed
59 60 61 62 63 64 65 66
    while (po->name != NULL) {
        if (!strcmp(name, po->name))
            break;
        po++;
    }
    return po;
}

67 68
void parse_options(int argc, char **argv, const OptionDef *options,
                   void (* parse_arg_function)(const char*))
Fabrice Bellard's avatar
Fabrice Bellard committed
69 70
{
    const char *opt, *arg;
71
    int optindex, handleoptions=1;
Fabrice Bellard's avatar
Fabrice Bellard committed
72 73 74 75 76 77
    const OptionDef *po;

    /* parse options */
    optindex = 1;
    while (optindex < argc) {
        opt = argv[optindex++];
78

79 80 81 82 83
        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
          if (opt[1] == '-' && opt[2] == '\0') {
            handleoptions = 0;
            continue;
          }
Michael Niedermayer's avatar
Michael Niedermayer committed
84 85 86
            po= find_option(options, opt + 1);
            if (!po->name)
                po= find_option(options, "default");
Fabrice Bellard's avatar
Fabrice Bellard committed
87
            if (!po->name) {
Michael Niedermayer's avatar
Michael Niedermayer committed
88
unknown_opt:
Fabrice Bellard's avatar
Fabrice Bellard committed
89 90 91 92 93 94 95 96 97 98 99 100 101
                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;
102
                str = av_strdup(arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
103 104 105
                *po->u.str_arg = str;
            } else if (po->flags & OPT_BOOL) {
                *po->u.int_arg = 1;
Michael Niedermayer's avatar
OPT_INT  
Michael Niedermayer committed
106 107
            } else if (po->flags & OPT_INT) {
                *po->u.int_arg = atoi(arg);
Baptiste Coudurier's avatar
Baptiste Coudurier committed
108
            } else if (po->flags & OPT_INT64) {
109
                *po->u.int64_arg = strtoll(arg, (char **)NULL, 10);
Michael Niedermayer's avatar
Michael Niedermayer committed
110 111
            } else if (po->flags & OPT_FLOAT) {
                *po->u.float_arg = atof(arg);
Michael Niedermayer's avatar
Michael Niedermayer committed
112 113 114
            } else if (po->flags & OPT_FUNC2) {
                if(po->u.func2_arg(opt+1, arg)<0)
                    goto unknown_opt;
Fabrice Bellard's avatar
Fabrice Bellard committed
115
            } else {
116
                po->u.func_arg(arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
117 118
            }
        } else {
119 120
            if (parse_arg_function)
                parse_arg_function(opt);
Fabrice Bellard's avatar
Fabrice Bellard committed
121 122 123 124 125 126 127 128 129 130 131
        }
    }
}

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"
132
                "  for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
Fabrice Bellard's avatar
Fabrice Bellard committed
133 134 135 136 137 138 139 140
                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;
141
    case AVERROR(EIO):
142
        fprintf(stderr, "%s: I/O error occured\n"
143 144
                "Usually that means that input file is truncated and/or corrupted.\n",
                filename);
145
        break;
146
    case AVERROR(ENOMEM):
147 148
        fprintf(stderr, "%s: memory allocation error occured\n", filename);
        break;
149
    case AVERROR(ENOENT):
150 151
        fprintf(stderr, "%s: no such file or directory\n", filename);
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
152 153 154 155 156
    default:
        fprintf(stderr, "%s: Error while opening file\n", filename);
        break;
    }
}
157

158 159
void show_banner(const char *program_name, int program_birth_year)
{
Benoit Fouet's avatar
Benoit Fouet committed
160
    fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2008 Fabrice Bellard, et al.\n",
161 162 163 164 165
            program_name, program_birth_year);
    fprintf(stderr, "  configuration: " FFMPEG_CONFIGURATION "\n");
    fprintf(stderr, "  libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
    fprintf(stderr, "  libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
    fprintf(stderr, "  libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
166
    fprintf(stderr, "  libavdevice version: " AV_STRINGIFY(LIBAVDEVICE_VERSION) "\n");
167 168 169 170 171 172 173 174 175
    fprintf(stderr, "  built on " __DATE__ " " __TIME__);
#ifdef __GNUC__
    fprintf(stderr, ", gcc: " __VERSION__ "\n");
#else
    fprintf(stderr, ", using a non-gcc compiler\n");
#endif
}

void show_version(const char *program_name) {
176
     /* TODO: add function interface to avutil and avformat avdevice*/
177 178 179
    printf("%s " FFMPEG_VERSION "\n", program_name);
    printf("libavutil   %d\n"
           "libavcodec  %d\n"
180 181 182
           "libavformat %d\n"
           "libavdevice %d\n",
           LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD, LIBAVDEVICE_BUILD);
183 184
}

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
void show_license(void)
{
#ifdef CONFIG_GPL
    printf(
    "FFmpeg is free software; you can redistribute it and/or modify\n"
    "it under the terms of the GNU General Public License as published by\n"
    "the Free Software Foundation; either version 2 of the License, or\n"
    "(at your option) any later version.\n"
    "\n"
    "FFmpeg is distributed in the hope that it will be useful,\n"
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
    "GNU General Public License for more details.\n"
    "\n"
    "You should have received a copy of the GNU General Public License\n"
    "along with FFmpeg; if not, write to the Free Software\n"
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
    );
#else
    printf(
    "FFmpeg is free software; you can redistribute it and/or\n"
    "modify it under the terms of the GNU Lesser General Public\n"
    "License as published by the Free Software Foundation; either\n"
    "version 2.1 of the License, or (at your option) any later version.\n"
    "\n"
    "FFmpeg is distributed in the hope that it will be useful,\n"
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
    "Lesser General Public License for more details.\n"
    "\n"
    "You should have received a copy of the GNU Lesser General Public\n"
    "License along with FFmpeg; if not, write to the Free Software\n"
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
    );
#endif
}