X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmdutils.h;h=f013c2a33f78b15f052888f73aa4936a851119f7;hb=87fa05a0dae629cdad390adaa1054db3f4ecc3c7;hp=61cfc229b72edd6c5a0746b2f86344a7c7ea01b0;hpb=6b779cccaab1856575b1840e09510b0f54e988a6;p=ffmpeg diff --git a/cmdutils.h b/cmdutils.h index 61cfc229b72..f013c2a33f7 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -83,14 +83,15 @@ int opt_timelimit(const char *opt, const char *arg); * parsed or the corresponding value is invalid. * * @param context the context of the value to be set (e.g. the - * corresponding commandline option name) + * corresponding command line option name) * @param numstr the string to be parsed * @param type the type (OPT_INT64 or OPT_FLOAT) as which the * string should be parsed * @param min the minimum valid accepted value * @param max the maximum valid accepted value */ -double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max); +double parse_number_or_die(const char *context, const char *numstr, int type, + double min, double max); /** * Parse a string specifying a time and return its corresponding @@ -98,7 +99,7 @@ double parse_number_or_die(const char *context, const char *numstr, int type, do * the string cannot be correctly parsed. * * @param context the context of the value to be set (e.g. the - * corresponding commandline option name) + * corresponding command line option name) * @param timestr the string to be parsed * @param is_duration a flag which tells how to interpret timestr, if * not zero timestr is interpreted as a duration, otherwise as a @@ -106,7 +107,8 @@ double parse_number_or_die(const char *context, const char *numstr, int type, do * * @see parse_date() */ -int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration); +int64_t parse_time_or_die(const char *context, const char *timestr, + int is_duration); typedef struct SpecifierOpt { char *specifier; /**< stream/chapter/program/... specifier */ @@ -115,6 +117,7 @@ typedef struct SpecifierOpt { int i; int64_t i64; float f; + double dbl; } u; } SpecifierOpt; @@ -140,6 +143,7 @@ typedef struct { 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 union { void *dst_ptr; int (*func_arg)(const char *, const char *); @@ -150,7 +154,14 @@ typedef struct { const char *argname; } OptionDef; -void show_help_options(const OptionDef *options, const char *msg, int mask, int value); +void show_help_options(const OptionDef *options, const char *msg, int mask, + int value); + +/** + * Show help for all options with given flags in class and all its + * children. + */ +void show_help_children(const AVClass *class, int flags); /** * Parse the command line arguments. @@ -170,14 +181,26 @@ void parse_options(void *optctx, int argc, char **argv, const OptionDef *options * * @return on success 1 if arg was consumed, 0 otherwise; negative number on error */ -int parse_option(void *optctx, const char *opt, const char *arg, const OptionDef *options); +int parse_option(void *optctx, const char *opt, const char *arg, + const OptionDef *options); + +/** + * Find the '-loglevel' option in the command line args and apply it. + */ +void parse_loglevel(int argc, char **argv, const OptionDef *options); + +/** + * Return index of option opt in argv or 0 if not found. + */ +int locate_option(int argc, char **argv, const OptionDef *options, + const char *optname); /** * Check if the given stream matches a stream specifier. * * @param s Corresponding format context. * @param st Stream from s to be checked. - * @param spec A stream specifier of the [v|a|s|d]:[] form. + * @param spec A stream specifier of the [v|a|s|d]:[\] form. * * @return 1 if the stream matches, 0 if it doesn't, <0 on error */ @@ -191,9 +214,12 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); * * @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. + * If null, the default one is looked up according to the codec id. * @return a pointer to the created dictionary */ -AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFormatContext *s, AVStream *st); +AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, + AVFormatContext *s, AVStream *st, AVCodec *codec); /** * Setup AVCodecContext options for avformat_find_stream_info(). @@ -206,7 +232,8 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFor * @return pointer to the created array of dictionaries, NULL if it * cannot be created */ -AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts); +AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, + AVDictionary *codec_opts); /** * Print an error message to stderr, indicating filename and a human @@ -275,6 +302,12 @@ void show_protocols(void); */ void show_pix_fmts(void); +/** + * Print a listing containing all the sample formats supported by the + * program. + */ +int show_sample_fmts(const char *opt, const char *arg); + /** * Return a positive value if a line read from standard input * starts with [yY], otherwise return 0. @@ -290,7 +323,7 @@ int read_yesno(void); * @return 0 in case of success, a negative value corresponding to an * AVERROR error code in case of failure. */ -int read_file(const char *filename, char **bufptr, size_t *size); +int cmdutils_read_file(const char *filename, char **bufptr, size_t *size); typedef struct { int64_t num_faulty_pts; /// Number of incorrect PTS values so far @@ -320,11 +353,11 @@ int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t pts, int64_t dts); * Get a file corresponding to a preset file. * * If is_path is non-zero, look for the file in the path preset_name. - * Otherwise search for a file named arg.ffpreset in the directories - * $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined + * Otherwise search for a file named arg.avpreset in the directories + * $AVCONV_DATADIR (if set), $HOME/.avconv, and in the datadir defined * at configuration time, in that order. If no such file is found and * codec_name is defined, then search for a file named - * codec_name-preset_name.ffpreset in the above-mentioned directories. + * codec_name-preset_name.avpreset in the above-mentioned directories. * * @param filename buffer where the name of the found filename is written * @param filename_size size in bytes of the filename buffer @@ -336,26 +369,11 @@ 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); -typedef struct { - enum PixelFormat pix_fmt; -} FFSinkContext; - -extern AVFilter ffsink; - -/** - * Extract a frame from sink. - * - * @return a negative error in case of failure, 1 if one frame has - * been extracted successfully. - */ -int get_filtered_video_frame(AVFilterContext *sink, AVFrame *frame, - AVFilterBufferRef **picref, AVRational *pts_tb); - /** * Do all the necessary cleanup and abort. * This function is implemented in the avtools, not cmdutils. */ -void exit_program(int ret); +av_noreturn void exit_program(int ret); /** * Realloc array to hold new_size elements of elem_size. @@ -367,4 +385,46 @@ void exit_program(int ret); */ 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]; + + int h, w; + enum PixelFormat pix_fmt; + + int refcount; + struct FrameBuffer **pool; ///< head of the buffer pool + struct FrameBuffer *next; +} FrameBuffer; + +/** + * 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); + +/** + * A callback to be used for AVCodecContext.release_buffer along with + * codec_get_buffer(). + */ +void codec_release_buffer(AVCodecContext *s, AVFrame *frame); + +/** + * 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); + +/** + * 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 */