Commit | Line | Data |
---|---|---|
f5a90186 DB |
1 | /* |
2 | * Various utilities for command line tools | |
3 | * copyright (c) 2003 Fabrice Bellard | |
4 | * | |
2912e87a | 5 | * This file is part of Libav. |
f5a90186 | 6 | * |
2912e87a | 7 | * Libav is free software; you can redistribute it and/or |
f5a90186 DB |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
10 | * version 2.1 of the License, or (at your option) any later version. | |
11 | * | |
2912e87a | 12 | * Libav is distributed in the hope that it will be useful, |
f5a90186 DB |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 | * Lesser General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU Lesser General Public | |
2912e87a | 18 | * License along with Libav; if not, write to the Free Software |
f5a90186 DB |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ | |
21 | ||
153382e1 DB |
22 | #ifndef LIBAV_CMDUTILS_H |
23 | #define LIBAV_CMDUTILS_H | |
01310af2 | 24 | |
ea91e771 DB |
25 | #include <stdint.h> |
26 | ||
95137bbb | 27 | #include "libavcodec/avcodec.h" |
ea91e771 | 28 | #include "libavfilter/avfilter.h" |
95137bbb DB |
29 | #include "libavformat/avformat.h" |
30 | #include "libswscale/swscale.h" | |
f0a838e5 | 31 | |
60b5a745 | 32 | /** |
64555bd9 MN |
33 | * program name, defined by the program for show_version(). |
34 | */ | |
35 | extern const char program_name[]; | |
36 | ||
37 | /** | |
ea9c581f SS |
38 | * program birth year, defined by the program for show_banner() |
39 | */ | |
40 | extern const int program_birth_year; | |
41 | ||
72415b2a | 42 | extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; |
85663ef3 MN |
43 | extern AVFormatContext *avformat_opts; |
44 | extern struct SwsContext *sws_opts; | |
8c8eab8b | 45 | extern AVDictionary *format_opts, *codec_opts; |
85663ef3 MN |
46 | |
47 | /** | |
a5c33faa RD |
48 | * Initialize the cmdutils option system, in particular |
49 | * allocate the *_opts contexts. | |
50 | */ | |
51 | void init_opts(void); | |
52 | /** | |
53 | * Uninitialize the cmdutils option system, in particular | |
54 | * free the *_opts contexts and their contents. | |
55 | */ | |
56 | void uninit_opts(void); | |
57 | ||
58 | /** | |
1790d3b3 SS |
59 | * Trivial log callback. |
60 | * Only suitable for show_help and similar since it lacks prefix handling. | |
61 | */ | |
62 | void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); | |
63 | ||
64 | /** | |
b7438896 | 65 | * Fallback for options that are not explicitly handled, these will be |
85663ef3 MN |
66 | * parsed through AVOptions. |
67 | */ | |
68 | int opt_default(const char *opt, const char *arg); | |
69 | ||
ea9c581f | 70 | /** |
49bd8e4b | 71 | * Set the libav* libraries log level. |
4c97a6fa SS |
72 | */ |
73 | int opt_loglevel(const char *opt, const char *arg); | |
74 | ||
75 | /** | |
ffcc6e24 MR |
76 | * Limit the execution time. |
77 | */ | |
78 | int opt_timelimit(const char *opt, const char *arg); | |
79 | ||
80 | /** | |
49bd8e4b MR |
81 | * Parse a string and return its corresponding value as a double. |
82 | * Exit from the application if the string cannot be correctly | |
15067504 | 83 | * parsed or the corresponding value is invalid. |
60b5a745 SS |
84 | * |
85 | * @param context the context of the value to be set (e.g. the | |
86 | * corresponding commandline option name) | |
87 | * @param numstr the string to be parsed | |
88 | * @param type the type (OPT_INT64 or OPT_FLOAT) as which the | |
89 | * string should be parsed | |
15067504 DB |
90 | * @param min the minimum valid accepted value |
91 | * @param max the maximum valid accepted value | |
60b5a745 SS |
92 | */ |
93 | double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max); | |
94 | ||
7542157d | 95 | /** |
49bd8e4b MR |
96 | * Parse a string specifying a time and return its corresponding |
97 | * value as a number of microseconds. Exit from the application if | |
7542157d SS |
98 | * the string cannot be correctly parsed. |
99 | * | |
100 | * @param context the context of the value to be set (e.g. the | |
101 | * corresponding commandline option name) | |
102 | * @param timestr the string to be parsed | |
bf7e799c SS |
103 | * @param is_duration a flag which tells how to interpret timestr, if |
104 | * not zero timestr is interpreted as a duration, otherwise as a | |
7542157d SS |
105 | * date |
106 | * | |
748061de | 107 | * @see parse_date() |
7542157d SS |
108 | */ |
109 | int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration); | |
110 | ||
6361c5e1 AK |
111 | typedef struct SpecifierOpt { |
112 | char *specifier; /**< stream/chapter/program/... specifier */ | |
113 | union { | |
114 | uint8_t *str; | |
115 | int i; | |
116 | int64_t i64; | |
117 | float f; | |
33f75d72 | 118 | double dbl; |
6361c5e1 AK |
119 | } u; |
120 | } SpecifierOpt; | |
121 | ||
01310af2 FB |
122 | typedef struct { |
123 | const char *name; | |
124 | int flags; | |
125 | #define HAS_ARG 0x0001 | |
126 | #define OPT_BOOL 0x0002 | |
127 | #define OPT_EXPERT 0x0004 | |
128 | #define OPT_STRING 0x0008 | |
02d504a7 FB |
129 | #define OPT_VIDEO 0x0010 |
130 | #define OPT_AUDIO 0x0020 | |
131 | #define OPT_GRAB 0x0040 | |
26d4f26b | 132 | #define OPT_INT 0x0080 |
394c4d77 | 133 | #define OPT_FLOAT 0x0100 |
ae27975d | 134 | #define OPT_SUBTITLE 0x0200 |
26513856 SS |
135 | #define OPT_INT64 0x0400 |
136 | #define OPT_EXIT 0x0800 | |
137 | #define OPT_DATA 0x1000 | |
7cc8d638 AK |
138 | #define OPT_FUNC2 0x2000 |
139 | #define OPT_OFFSET 0x4000 /* option is specified as an offset in a passed optctx */ | |
6361c5e1 AK |
140 | #define OPT_SPEC 0x8000 /* option is to be stored in an array of SpecifierOpt. |
141 | Implies OPT_OFFSET. Next element after the offset is | |
142 | an int containing element count in the array. */ | |
6b779ccc | 143 | #define OPT_TIME 0x10000 |
33f75d72 | 144 | #define OPT_DOUBLE 0x20000 |
ae27975d | 145 | union { |
7efe05ab | 146 | void *dst_ptr; |
26513856 | 147 | int (*func_arg)(const char *, const char *); |
7cc8d638 AK |
148 | int (*func2_arg)(void *, const char *, const char *); |
149 | size_t off; | |
01310af2 FB |
150 | } u; |
151 | const char *help; | |
152 | const char *argname; | |
153 | } OptionDef; | |
154 | ||
02d504a7 | 155 | void show_help_options(const OptionDef *options, const char *msg, int mask, int value); |
60a9966e SS |
156 | |
157 | /** | |
49bd8e4b | 158 | * Parse the command line arguments. |
7cc8d638 AK |
159 | * |
160 | * @param optctx an opaque options context | |
60a9966e | 161 | * @param options Array with the definitions required to interpret every |
0baf34d8 | 162 | * option of the form: -option_name [argument] |
60a9966e SS |
163 | * @param parse_arg_function Name of the function called to process every |
164 | * argument without a leading option name flag. NULL if such arguments do | |
165 | * not have to be processed. | |
166 | */ | |
7cc8d638 AK |
167 | void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, |
168 | void (* parse_arg_function)(void *optctx, const char*)); | |
60a9966e | 169 | |
8d787f8e | 170 | /** |
2f8e586d AK |
171 | * Parse one given option. |
172 | * | |
173 | * @return on success 1 if arg was consumed, 0 otherwise; negative number on error | |
174 | */ | |
175 | int parse_option(void *optctx, const char *opt, const char *arg, const OptionDef *options); | |
176 | ||
177 | /** | |
d4863fc1 AK |
178 | * Check if the given stream matches a stream specifier. |
179 | * | |
180 | * @param s Corresponding format context. | |
181 | * @param st Stream from s to be checked. | |
182 | * @param spec A stream specifier of the [v|a|s|d]:[<stream index>] form. | |
183 | * | |
184 | * @return 1 if the stream matches, 0 if it doesn't, <0 on error | |
185 | */ | |
186 | int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); | |
187 | ||
188 | /** | |
8c8eab8b | 189 | * Filter out options for given codec. |
ce23ca81 SS |
190 | * |
191 | * Create a new options dictionary containing only the options from | |
192 | * opts which apply to the codec with ID codec_id. | |
193 | * | |
d4863fc1 AK |
194 | * @param s Corresponding format context. |
195 | * @param st A stream from s for which the options should be filtered. | |
ce23ca81 | 196 | * @return a pointer to the created dictionary |
8c8eab8b | 197 | */ |
d4863fc1 | 198 | AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFormatContext *s, AVStream *st); |
8c8eab8b | 199 | |
7cea06d1 SS |
200 | /** |
201 | * Setup AVCodecContext options for avformat_find_stream_info(). | |
202 | * | |
203 | * Create an array of dictionaries, one dictionary for each stream | |
204 | * contained in s. | |
205 | * Each dictionary will contain the options from codec_opts which can | |
206 | * be applied to the corresponding stream codec context. | |
207 | * | |
208 | * @return pointer to the created array of dictionaries, NULL if it | |
209 | * cannot be created | |
3009f521 | 210 | */ |
8ec19f84 | 211 | AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts); |
3009f521 | 212 | |
8c8eab8b | 213 | /** |
49bd8e4b | 214 | * Print an error message to stderr, indicating filename and a human |
8d787f8e SS |
215 | * readable description of the error code err. |
216 | * | |
217 | * If strerror_r() is not available the use of this function in a | |
218 | * multithreaded application may be unsafe. | |
219 | * | |
220 | * @see av_strerror() | |
221 | */ | |
01310af2 | 222 | void print_error(const char *filename, int err); |
c5dc6026 | 223 | |
f35917b2 | 224 | /** |
49bd8e4b | 225 | * Print the program banner to stderr. The banner contents depend on the |
15067504 DB |
226 | * current version of the repository and of the libav* libraries used by |
227 | * the program. | |
86074ed1 | 228 | */ |
ea9c581f | 229 | void show_banner(void); |
86074ed1 SS |
230 | |
231 | /** | |
49bd8e4b | 232 | * Print the version of the program to stdout. The version message |
86074ed1 SS |
233 | * depends on the current versions of the repository and of the libav* |
234 | * libraries. | |
86074ed1 | 235 | */ |
64555bd9 | 236 | void show_version(void); |
86074ed1 SS |
237 | |
238 | /** | |
49bd8e4b | 239 | * Print the license of the program to stdout. The license depends on |
15067504 | 240 | * the license of the libraries compiled into the program. |
f35917b2 SS |
241 | */ |
242 | void show_license(void); | |
243 | ||
ba9880c1 | 244 | /** |
49bd8e4b | 245 | * Print a listing containing all the formats supported by the |
ba9880c1 SS |
246 | * program. |
247 | */ | |
248 | void show_formats(void); | |
249 | ||
090b61b2 | 250 | /** |
49bd8e4b | 251 | * Print a listing containing all the codecs supported by the |
8447f0bd MN |
252 | * program. |
253 | */ | |
254 | void show_codecs(void); | |
255 | ||
256 | /** | |
49bd8e4b | 257 | * Print a listing containing all the filters supported by the |
62d75662 SS |
258 | * program. |
259 | */ | |
260 | void show_filters(void); | |
261 | ||
262 | /** | |
49bd8e4b | 263 | * Print a listing containing all the bit stream filters supported by the |
8447f0bd MN |
264 | * program. |
265 | */ | |
266 | void show_bsfs(void); | |
267 | ||
268 | /** | |
49bd8e4b | 269 | * Print a listing containing all the protocols supported by the |
8447f0bd MN |
270 | * program. |
271 | */ | |
272 | void show_protocols(void); | |
273 | ||
274 | /** | |
49bd8e4b | 275 | * Print a listing containing all the pixel formats supported by the |
3f7bb426 SS |
276 | * program. |
277 | */ | |
278 | void show_pix_fmts(void); | |
279 | ||
280 | /** | |
05bffc12 AK |
281 | * Print a listing containing all the sample formats supported by the |
282 | * program. | |
283 | */ | |
284 | int show_sample_fmts(const char *opt, const char *arg); | |
285 | ||
286 | /** | |
48966b02 MR |
287 | * Return a positive value if a line read from standard input |
288 | * starts with [yY], otherwise return 0. | |
090b61b2 SS |
289 | */ |
290 | int read_yesno(void); | |
291 | ||
458b062d | 292 | /** |
49bd8e4b | 293 | * Read the file with name filename, and put its content in a newly |
458b062d SS |
294 | * allocated 0-terminated buffer. |
295 | * | |
49bd8e4b MR |
296 | * @param bufptr location where pointer to buffer is returned |
297 | * @param size location where size of buffer is returned | |
458b062d SS |
298 | * @return 0 in case of success, a negative value corresponding to an |
299 | * AVERROR error code in case of failure. | |
300 | */ | |
301 | int read_file(const char *filename, char **bufptr, size_t *size); | |
302 | ||
7a8bfa5d AS |
303 | typedef struct { |
304 | int64_t num_faulty_pts; /// Number of incorrect PTS values so far | |
305 | int64_t num_faulty_dts; /// Number of incorrect DTS values so far | |
306 | int64_t last_pts; /// PTS of the last frame | |
307 | int64_t last_dts; /// DTS of the last frame | |
308 | } PtsCorrectionContext; | |
309 | ||
310 | /** | |
f03f30d7 | 311 | * Reset the state of the PtsCorrectionContext. |
7a8bfa5d AS |
312 | */ |
313 | void init_pts_correction(PtsCorrectionContext *ctx); | |
314 | ||
315 | /** | |
f03f30d7 | 316 | * Attempt to guess proper monotonic timestamps for decoded video frames |
7a8bfa5d AS |
317 | * which might have incorrect times. Input timestamps may wrap around, in |
318 | * which case the output will as well. | |
319 | * | |
f03f30d7 | 320 | * @param pts the pts field of the decoded AVPacket, as passed through |
7a8bfa5d | 321 | * AVCodecContext.reordered_opaque |
f03f30d7 SS |
322 | * @param dts the dts field of the decoded AVPacket |
323 | * @return one of the input values, may be AV_NOPTS_VALUE | |
7a8bfa5d AS |
324 | */ |
325 | int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t pts, int64_t dts); | |
326 | ||
6e872935 SS |
327 | /** |
328 | * Get a file corresponding to a preset file. | |
329 | * | |
330 | * If is_path is non-zero, look for the file in the path preset_name. | |
331 | * Otherwise search for a file named arg.ffpreset in the directories | |
332 | * $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined | |
333 | * at configuration time, in that order. If no such file is found and | |
334 | * codec_name is defined, then search for a file named | |
335 | * codec_name-preset_name.ffpreset in the above-mentioned directories. | |
336 | * | |
337 | * @param filename buffer where the name of the found filename is written | |
338 | * @param filename_size size in bytes of the filename buffer | |
339 | * @param preset_name name of the preset to search | |
340 | * @param is_path tell if preset_name is a filename path | |
341 | * @param codec_name name of the codec for which to look for the | |
342 | * preset, may be NULL | |
343 | */ | |
344 | FILE *get_preset_file(char *filename, size_t filename_size, | |
345 | const char *preset_name, int is_path, const char *codec_name); | |
346 | ||
f7ead94c SS |
347 | typedef struct { |
348 | enum PixelFormat pix_fmt; | |
349 | } FFSinkContext; | |
350 | ||
351 | extern AVFilter ffsink; | |
352 | ||
ff0652e5 SS |
353 | /** |
354 | * Extract a frame from sink. | |
355 | * | |
356 | * @return a negative error in case of failure, 1 if one frame has | |
357 | * been extracted successfully. | |
358 | */ | |
359 | int get_filtered_video_frame(AVFilterContext *sink, AVFrame *frame, | |
360 | AVFilterBufferRef **picref, AVRational *pts_tb); | |
361 | ||
dad09ff9 AK |
362 | /** |
363 | * Do all the necessary cleanup and abort. | |
364 | * This function is implemented in the avtools, not cmdutils. | |
365 | */ | |
366 | void exit_program(int ret); | |
367 | ||
cac651c8 AK |
368 | /** |
369 | * Realloc array to hold new_size elements of elem_size. | |
370 | * Calls exit_program() on failure. | |
371 | * | |
372 | * @param elem_size size in bytes of each element | |
373 | * @param size new element count will be written here | |
374 | * @return reallocated array | |
375 | */ | |
376 | void *grow_array(void *array, int elem_size, int *size, int new_size); | |
377 | ||
153382e1 | 378 | #endif /* LIBAV_CMDUTILS_H */ |