X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=cmdutils.h;h=d90ad4549dc2e38eda99304b005e7fe1e6fa25fb;hb=1316df7aa98c4784f190d107206d0bb12c590b89;hp=eb8a22a003765c9c2b4125d3df74ef80cd4e0e74;hpb=7c5012127fb7e18f0616011257bb4248f6a8b608;p=ffmpeg diff --git a/cmdutils.h b/cmdutils.h index eb8a22a0037..d90ad4549dc 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -42,7 +42,17 @@ extern const int program_birth_year; extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; extern AVFormatContext *avformat_opts; extern struct SwsContext *sws_opts; -extern AVDictionary *format_opts, *codec_opts; +extern AVDictionary *format_opts, *codec_opts, *resample_opts; + +/** + * Register a program-specific cleanup routine. + */ +void register_exit(void (*cb)(int ret)); + +/** + * Wraps exit with a program-specific cleanup routine. + */ +void exit_program(int ret) av_noreturn; /** * Initialize the cmdutils option system, in particular @@ -61,21 +71,26 @@ void uninit_opts(void); */ void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); +/** + * Override the cpuflags mask. + */ +int opt_cpuflags(void *optctx, const char *opt, const char *arg); + /** * Fallback for options that are not explicitly handled, these will be * parsed through AVOptions. */ -int opt_default(const char *opt, const char *arg); +int opt_default(void *optctx, const char *opt, const char *arg); /** * Set the libav* libraries log level. */ -int opt_loglevel(const char *opt, const char *arg); +int opt_loglevel(void *optctx, const char *opt, const char *arg); /** * Limit the execution time. */ -int opt_timelimit(const char *opt, const char *arg); +int opt_timelimit(void *optctx, const char *opt, const char *arg); /** * Parse a string and return its corresponding value as a double. @@ -121,7 +136,7 @@ typedef struct SpecifierOpt { } u; } SpecifierOpt; -typedef struct { +typedef struct OptionDef { const char *name; int flags; #define HAS_ARG 0x0001 @@ -136,17 +151,19 @@ typedef struct { #define OPT_INT64 0x0400 #define OPT_EXIT 0x0800 #define OPT_DATA 0x1000 -#define OPT_FUNC2 0x2000 +#define OPT_PERFILE 0x2000 /* the option is per-file (currently avconv-only). + implied by OPT_OFFSET or OPT_SPEC */ #define OPT_OFFSET 0x4000 /* option is specified as an offset in a passed optctx */ #define OPT_SPEC 0x8000 /* option is to be stored in an array of SpecifierOpt. Implies OPT_OFFSET. Next element after the offset is an int containing element count in the array. */ #define OPT_TIME 0x10000 #define OPT_DOUBLE 0x20000 +#define OPT_INPUT 0x40000 +#define OPT_OUTPUT 0x80000 union { void *dst_ptr; - int (*func_arg)(const char *, const char *); - int (*func2_arg)(void *, const char *, const char *); + int (*func_arg)(void *, const char *, const char *); size_t off; } u; const char *help; @@ -160,9 +177,10 @@ typedef struct { * @param msg title of this group. Only printed if at least one option matches. * @param req_flags print only options which have all those flags set. * @param rej_flags don't print options which have any of those flags set. + * @param alt_flags print only options that have at least one of those flags set */ void show_help_options(const OptionDef *options, const char *msg, int req_flags, - int rej_flags); + int rej_flags, int alt_flags); /** * Show help for all options with given flags in class and all its @@ -170,10 +188,23 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags, */ void show_help_children(const AVClass *class, int flags); +/** + * Per-avtool specific help handler. Implemented in each + * avtool, called by show_help(). + */ +void show_help_default(const char *opt, const char *arg); + +/** + * Generic -h handler common to all avtools. + */ +int show_help(void *optctx, const char *opt, const char *arg); + /** * Parse the command line arguments. * * @param optctx an opaque options context + * @param argc number of command line arguments + * @param argv values of command line arguments * @param options Array with the definitions required to interpret every * option of the form: -option_name [argument] * @param parse_arg_function Name of the function called to process every @@ -191,6 +222,100 @@ void parse_options(void *optctx, int argc, char **argv, const OptionDef *options int parse_option(void *optctx, const char *opt, const char *arg, const OptionDef *options); +/** + * An option extracted from the commandline. + * Cannot use AVDictionary because of options like -map which can be + * used multiple times. + */ +typedef struct Option { + const OptionDef *opt; + const char *key; + const char *val; +} Option; + +typedef struct OptionGroupDef { + /**< group name */ + const char *name; + /** + * Option to be used as group separator. Can be NULL for groups which + * are terminated by a non-option argument (e.g. avconv output files) + */ + const char *sep; + /** + * Option flags that must be set on each option that is + * applied to this group + */ + int flags; +} OptionGroupDef; + +typedef struct OptionGroup { + const OptionGroupDef *group_def; + const char *arg; + + Option *opts; + int nb_opts; + + AVDictionary *codec_opts; + AVDictionary *format_opts; + AVDictionary *resample_opts; + struct SwsContext *sws_opts; +} OptionGroup; + +/** + * A list of option groups that all have the same group type + * (e.g. input files or output files) + */ +typedef struct OptionGroupList { + const OptionGroupDef *group_def; + + OptionGroup *groups; + int nb_groups; +} OptionGroupList; + +typedef struct OptionParseContext { + OptionGroup global_opts; + + OptionGroupList *groups; + int nb_groups; + + /* parsing state */ + OptionGroup cur_group; +} OptionParseContext; + +/** + * Parse an options group and write results into optctx. + * + * @param optctx an app-specific options context. NULL for global options group + */ +int parse_optgroup(void *optctx, OptionGroup *g); + +/** + * Split the commandline into an intermediate form convenient for further + * processing. + * + * The commandline is assumed to be composed of options which either belong to a + * group (those with OPT_SPEC, OPT_OFFSET or OPT_PERFILE) or are global + * (everything else). + * + * A group (defined by an OptionGroupDef struct) is a sequence of options + * terminated by either a group separator option (e.g. -i) or a parameter that + * is not an option (doesn't start with -). A group without a separator option + * must always be first in the supplied groups list. + * + * All options within the same group are stored in one OptionGroup struct in an + * OptionGroupList, all groups with the same group definition are stored in one + * OptionGroupList in OptionParseContext.groups. The order of group lists is the + * same as the order of group definitions. + */ +int split_commandline(OptionParseContext *octx, int argc, char *argv[], + const OptionDef *options, + const OptionGroupDef *groups, int nb_groups); + +/** + * Free all allocated memory in an OptionParseContext. + */ +void uninit_parse_context(OptionParseContext *octx); + /** * Find the '-loglevel' option in the command line args and apply it. */ @@ -219,6 +344,8 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); * Create a new options dictionary containing only the options from * opts which apply to the codec with ID codec_id. * + * @param opts dictionary to place options in + * @param codec_id ID of the codec that should be filtered for * @param s Corresponding format context. * @param st A stream from s for which the options should be filtered. * @param codec The particular codec for which the options should be filtered. @@ -265,67 +392,67 @@ void show_banner(void); * depends on the current versions of the repository and of the libav* * libraries. */ -int show_version(const char *opt, const char *arg); +int show_version(void *optctx, const char *opt, const char *arg); /** * Print the license of the program to stdout. The license depends on * the license of the libraries compiled into the program. */ -int show_license(const char *opt, const char *arg); +int show_license(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the formats supported by the * program. */ -int show_formats(const char *opt, const char *arg); +int show_formats(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the codecs supported by the * program. */ -int show_codecs(const char *opt, const char *arg); +int show_codecs(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the decoders supported by the * program. */ -int show_decoders(const char *opt, const char *arg); +int show_decoders(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the encoders supported by the * program. */ -int show_encoders(const char *opt, const char *arg); +int show_encoders(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the filters supported by the * program. */ -int show_filters(const char *opt, const char *arg); +int show_filters(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the bit stream filters supported by the * program. */ -int show_bsfs(const char *opt, const char *arg); +int show_bsfs(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the protocols supported by the * program. */ -int show_protocols(const char *opt, const char *arg); +int show_protocols(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the pixel formats supported by the * program. */ -int show_pix_fmts(const char *opt, const char *arg); +int show_pix_fmts(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the sample formats supported by the * program. */ -int show_sample_fmts(const char *opt, const char *arg); +int show_sample_fmts(void *optctx, const char *opt, const char *arg); /** * Return a positive value if a line read from standard input @@ -337,6 +464,7 @@ int read_yesno(void); * Read the file with name filename, and put its content in a newly * allocated 0-terminated buffer. * + * @param filename file to read from * @param bufptr location where pointer to buffer is returned * @param size location where size of buffer is returned * @return 0 in case of success, a negative value corresponding to an @@ -344,7 +472,7 @@ int read_yesno(void); */ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size); -typedef struct { +typedef struct PtsCorrectionContext { int64_t num_faulty_pts; /// Number of incorrect PTS values so far int64_t num_faulty_dts; /// Number of incorrect DTS values so far int64_t last_pts; /// PTS of the last frame @@ -361,6 +489,7 @@ void init_pts_correction(PtsCorrectionContext *ctx); * which might have incorrect times. Input timestamps may wrap around, in * which case the output will as well. * + * @param ctx the PtsCorrectionContext carrying stream pts information * @param pts the pts field of the decoded AVPacket, as passed through * AVCodecContext.reordered_opaque * @param dts the dts field of the decoded AVPacket @@ -388,62 +517,42 @@ int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t pts, int64_t dts); FILE *get_preset_file(char *filename, size_t filename_size, const char *preset_name, int is_path, const char *codec_name); -/** - * Do all the necessary cleanup and abort. - * This function is implemented in the avtools, not cmdutils. - */ -av_noreturn void exit_program(int ret); - /** * Realloc array to hold new_size elements of elem_size. - * Calls exit_program() on failure. + * Calls exit() on failure. * + * @param array array to reallocate * @param elem_size size in bytes of each element * @param size new element count will be written here + * @param new_size number of elements to place in reallocated array * @return reallocated array */ void *grow_array(void *array, int elem_size, int *size, int new_size); -typedef struct FrameBuffer { - uint8_t *base[4]; - uint8_t *data[4]; - int linesize[4]; +/** + * Get a string describing a media type. + */ +const char *media_type_string(enum AVMediaType media_type); - int h, w; - enum PixelFormat pix_fmt; +#define GROW_ARRAY(array, nb_elems)\ + array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) - int refcount; - struct FrameBuffer **pool; ///< head of the buffer pool - struct FrameBuffer *next; -} FrameBuffer; +#define GET_PIX_FMT_NAME(pix_fmt)\ + const char *name = av_get_pix_fmt_name(pix_fmt); -/** - * Get a frame from the pool. This is intended to be used as a callback for - * AVCodecContext.get_buffer. - * - * @param s codec context. s->opaque must be a pointer to the head of the - * buffer pool. - * @param frame frame->opaque will be set to point to the FrameBuffer - * containing the frame data. - */ -int codec_get_buffer(AVCodecContext *s, AVFrame *frame); +#define GET_SAMPLE_FMT_NAME(sample_fmt)\ + const char *name = av_get_sample_fmt_name(sample_fmt) -/** - * A callback to be used for AVCodecContext.release_buffer along with - * codec_get_buffer(). - */ -void codec_release_buffer(AVCodecContext *s, AVFrame *frame); +#define GET_SAMPLE_RATE_NAME(rate)\ + char name[16];\ + snprintf(name, sizeof(name), "%d", rate); -/** - * A callback to be used for AVFilterBuffer.free. - * @param fb buffer to free. fb->priv must be a pointer to the FrameBuffer - * containing the buffer data. - */ -void filter_release_buffer(AVFilterBuffer *fb); +#define GET_CH_LAYOUT_NAME(ch_layout)\ + char name[16];\ + snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout); + +#define GET_CH_LAYOUT_DESC(ch_layout)\ + char name[128];\ + av_get_channel_layout_string(name, sizeof(name), 0, ch_layout); -/** - * Free all the buffers in the pool. This must be called after all the - * buffers have been released. - */ -void free_buffer_pool(FrameBuffer **pool); #endif /* LIBAV_CMDUTILS_H */