Statistics
| Branch: | Revision:

ffmpeg / cmdutils.c @ 86074ed1

History | View | Annotate | Download (7.47 KB)

1 01310af2 Fabrice Bellard
/*
2
 * Various utilities for command line tools
3
 * Copyright (c) 2000-2003 Fabrice Bellard
4
 *
5 b78e7197 Diego Biurrun
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8 01310af2 Fabrice Bellard
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10 b78e7197 Diego Biurrun
 * version 2.1 of the License, or (at your option) any later version.
11 01310af2 Fabrice Bellard
 *
12 b78e7197 Diego Biurrun
 * FFmpeg is distributed in the hope that it will be useful,
13 01310af2 Fabrice Bellard
 * 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 b78e7197 Diego Biurrun
 * License along with FFmpeg; if not, write to the Free Software
19 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 01310af2 Fabrice Bellard
 */
21 364a9607 Diego Biurrun
22 0f4e8165 Ronald S. Bultje
#include <string.h>
23
#include <stdlib.h>
24
#include <errno.h>
25
26 01310af2 Fabrice Bellard
#include "avformat.h"
27
#include "cmdutils.h"
28 f7d78f36 Måns Rullgård
#include "avstring.h"
29 86074ed1 Stefano Sabatini
#include "version.h"
30 01310af2 Fabrice Bellard
31 c367d067 Michael Niedermayer
#undef exit
32
33 02d504a7 Fabrice Bellard
void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
34 01310af2 Fabrice Bellard
{
35
    const OptionDef *po;
36 02d504a7 Fabrice Bellard
    int first;
37 01310af2 Fabrice Bellard
38 02d504a7 Fabrice Bellard
    first = 1;
39
    for(po = options; po->name != NULL; po++) {
40
        char buf[64];
41
        if ((po->flags & mask) == value) {
42
            if (first) {
43
                printf("%s", msg);
44
                first = 0;
45
            }
46 f7d78f36 Måns Rullgård
            av_strlcpy(buf, po->name, sizeof(buf));
47 02d504a7 Fabrice Bellard
            if (po->flags & HAS_ARG) {
48 f7d78f36 Måns Rullgård
                av_strlcat(buf, " ", sizeof(buf));
49
                av_strlcat(buf, po->argname, sizeof(buf));
50 01310af2 Fabrice Bellard
            }
51 02d504a7 Fabrice Bellard
            printf("-%-17s  %s\n", buf, po->help);
52 01310af2 Fabrice Bellard
        }
53
    }
54
}
55
56 fccfc475 Måns Rullgård
static const OptionDef* find_option(const OptionDef *po, const char *name){
57 8bbf6db9 Michael Niedermayer
    while (po->name != NULL) {
58
        if (!strcmp(name, po->name))
59
            break;
60
        po++;
61
    }
62
    return po;
63
}
64
65 60a9966e Stefano Sabatini
void parse_options(int argc, char **argv, const OptionDef *options,
66
                   void (* parse_arg_function)(const char*))
67 01310af2 Fabrice Bellard
{
68
    const char *opt, *arg;
69 b0d7bc1e Loren Merritt
    int optindex, handleoptions=1;
70 01310af2 Fabrice Bellard
    const OptionDef *po;
71
72
    /* parse options */
73
    optindex = 1;
74
    while (optindex < argc) {
75
        opt = argv[optindex++];
76 115329f1 Diego Biurrun
77 84bf226b Timo Lindfors
        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
78
          if (opt[1] == '-' && opt[2] == '\0') {
79
            handleoptions = 0;
80
            continue;
81
          }
82 8bbf6db9 Michael Niedermayer
            po= find_option(options, opt + 1);
83
            if (!po->name)
84
                po= find_option(options, "default");
85 01310af2 Fabrice Bellard
            if (!po->name) {
86 8bbf6db9 Michael Niedermayer
unknown_opt:
87 01310af2 Fabrice Bellard
                fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
88
                exit(1);
89
            }
90
            arg = NULL;
91
            if (po->flags & HAS_ARG) {
92
                arg = argv[optindex++];
93
                if (!arg) {
94
                    fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
95
                    exit(1);
96
                }
97
            }
98
            if (po->flags & OPT_STRING) {
99
                char *str;
100 02d504a7 Fabrice Bellard
                str = av_strdup(arg);
101 01310af2 Fabrice Bellard
                *po->u.str_arg = str;
102
            } else if (po->flags & OPT_BOOL) {
103
                *po->u.int_arg = 1;
104 26d4f26b Michael Niedermayer
            } else if (po->flags & OPT_INT) {
105
                *po->u.int_arg = atoi(arg);
106 ffdf9a1f Baptiste Coudurier
            } else if (po->flags & OPT_INT64) {
107 946d3b12 Patrice Bensoussan
                *po->u.int64_arg = strtoll(arg, (char **)NULL, 10);
108 1f631450 Michael Niedermayer
            } else if (po->flags & OPT_FLOAT) {
109
                *po->u.float_arg = atof(arg);
110 8bbf6db9 Michael Niedermayer
            } else if (po->flags & OPT_FUNC2) {
111
                if(po->u.func2_arg(opt+1, arg)<0)
112
                    goto unknown_opt;
113 01310af2 Fabrice Bellard
            } else {
114 bb270c08 Diego Biurrun
                po->u.func_arg(arg);
115 01310af2 Fabrice Bellard
            }
116
        } else {
117 60a9966e Stefano Sabatini
            if (parse_arg_function)
118
                parse_arg_function(opt);
119 01310af2 Fabrice Bellard
        }
120
    }
121
}
122
123
void print_error(const char *filename, int err)
124
{
125
    switch(err) {
126
    case AVERROR_NUMEXPECTED:
127
        fprintf(stderr, "%s: Incorrect image filename syntax.\n"
128
                "Use '%%d' to specify the image number:\n"
129
                "  for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
130 115329f1 Diego Biurrun
                "  for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n",
131 01310af2 Fabrice Bellard
                filename);
132
        break;
133
    case AVERROR_INVALIDDATA:
134
        fprintf(stderr, "%s: Error while parsing header\n", filename);
135
        break;
136
    case AVERROR_NOFMT:
137
        fprintf(stderr, "%s: Unknown format\n", filename);
138
        break;
139 6f3e0b21 Panagiotis Issaris
    case AVERROR(EIO):
140 45ce5ddb Kostya Shishkov
        fprintf(stderr, "%s: I/O error occured\n"
141 bb270c08 Diego Biurrun
                "Usually that means that input file is truncated and/or corrupted.\n",
142
                filename);
143 45ce5ddb Kostya Shishkov
        break;
144 769e10f0 Panagiotis Issaris
    case AVERROR(ENOMEM):
145 45ce5ddb Kostya Shishkov
        fprintf(stderr, "%s: memory allocation error occured\n", filename);
146
        break;
147 24fddf48 Panagiotis Issaris
    case AVERROR(ENOENT):
148 0ba0c8de Benoit Fouet
        fprintf(stderr, "%s: no such file or directory\n", filename);
149
        break;
150 01310af2 Fabrice Bellard
    default:
151
        fprintf(stderr, "%s: Error while opening file\n", filename);
152
        break;
153
    }
154
}
155 f35917b2 Stefano Sabatini
156 86074ed1 Stefano Sabatini
void show_banner(const char *program_name, int program_birth_year)
157
{
158
    fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-2007 Fabrice Bellard, et al.\n",
159
            program_name, program_birth_year);
160
    fprintf(stderr, "  configuration: " FFMPEG_CONFIGURATION "\n");
161
    fprintf(stderr, "  libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n");
162
    fprintf(stderr, "  libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n");
163
    fprintf(stderr, "  libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n");
164
    fprintf(stderr, "  built on " __DATE__ " " __TIME__);
165
#ifdef __GNUC__
166
    fprintf(stderr, ", gcc: " __VERSION__ "\n");
167
#else
168
    fprintf(stderr, ", using a non-gcc compiler\n");
169
#endif
170
}
171
172
void show_version(const char *program_name) {
173
     /* TODO: add function interface to avutil and avformat */
174
    printf("%s " FFMPEG_VERSION "\n", program_name);
175
    printf("libavutil   %d\n"
176
           "libavcodec  %d\n"
177
           "libavformat %d\n",
178
           LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD);
179
}
180
181 f35917b2 Stefano Sabatini
void show_license(void)
182
{
183
#ifdef CONFIG_GPL
184
    printf(
185
    "FFmpeg is free software; you can redistribute it and/or modify\n"
186
    "it under the terms of the GNU General Public License as published by\n"
187
    "the Free Software Foundation; either version 2 of the License, or\n"
188
    "(at your option) any later version.\n"
189
    "\n"
190
    "FFmpeg is distributed in the hope that it will be useful,\n"
191
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
192
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
193
    "GNU General Public License for more details.\n"
194
    "\n"
195
    "You should have received a copy of the GNU General Public License\n"
196
    "along with FFmpeg; if not, write to the Free Software\n"
197
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
198
    );
199
#else
200
    printf(
201
    "FFmpeg is free software; you can redistribute it and/or\n"
202
    "modify it under the terms of the GNU Lesser General Public\n"
203
    "License as published by the Free Software Foundation; either\n"
204
    "version 2.1 of the License, or (at your option) any later version.\n"
205
    "\n"
206
    "FFmpeg is distributed in the hope that it will be useful,\n"
207
    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
208
    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
209
    "Lesser General Public License for more details.\n"
210
    "\n"
211
    "You should have received a copy of the GNU Lesser General Public\n"
212
    "License along with FFmpeg; if not, write to the Free Software\n"
213
    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
214
    );
215
#endif
216
}