AVFilterGraph是对pileline的一个整体描述,没看之前以为里面大概是个有向无环图什么的来描述,进去一看,居然只是用链表来描述
结构体
先看结构体,主要关注里面的两个成员变量
AVFilterContext **filters;unsigned nb_filters;
AVFilterLink **sink_links;int sink_links_count;
以为avfilter是通过avFilterlink链接起来的,所以本质上来说只要有AVFilterLink就能描述清楚所有的链接图了
下面是全部定义
typedef struct AVFilterGraph {const AVClass *av_class;AVFilterContext **filters;unsigned nb_filters;char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters/*** Type of multithreading allowed for filters in this graph. A combination* of AVFILTER_THREAD_* flags.** May be set by the caller at any point, the setting will apply to all* filters initialized after that. The default is allowing everything.** When a filter in this graph is initialized, this field is combined using* bit AND with AVFilterContext.thread_type to get the final mask used for* determining allowed threading types. I.e. a threading type needs to be* set in both to be allowed.*/int thread_type;/*** Maximum number of threads used by filters in this graph. May be set by* the caller before adding any filters to the filtergraph. Zero (the* default) means that the number of threads is determined automatically.*/int nb_threads;/*** Opaque object for libavfilter internal use.*/AVFilterGraphInternal *internal;/*** Opaque user data. May be set by the caller to an arbitrary value, e.g. to* be used from callbacks like @ref AVFilterGraph.execute.* Libavfilter will not touch this field in any way.*/void *opaque;/*** This callback may be set by the caller immediately after allocating the* graph and before adding any filters to it, to provide a custom* multithreading implementation.** If set, filters with slice threading capability will call this callback* to execute multiple jobs in parallel.** If this field is left unset, libavfilter will use its internal* implementation, which may or may not be multithreaded depending on the* platform and build options.*/avfilter_execute_func *execute;char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions/*** Private fields** The following fields are for internal use only.* Their type, offset, number and semantic can change without notice.*/AVFilterLink **sink_links;int sink_links_count;unsigned disable_auto_convert;
} AVFilterGraph;
函数
/*** Allocate a filter graph.** @return the allocated filter graph on success or NULL.*/
AVFilterGraph *avfilter_graph_alloc(void);/*** Create a new filter instance in a filter graph.** @param graph graph in which the new filter will be used* @param filter the filter to create an instance of* @param name Name to give to the new instance (will be copied to* AVFilterContext.name). This may be used by the caller to identify* different filters, libavfilter itself assigns no semantics to* this parameter. May be NULL.** @return the context of the newly created filter instance (note that it is* also retrievable directly through AVFilterGraph.filters or with* avfilter_graph_get_filter()) on success or NULL on failure.*/
AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph,const AVFilter *filter,const char *name);/*** Get a filter instance identified by instance name from graph.** @param graph filter graph to search through.* @param name filter instance name (should be unique in the graph).* @return the pointer to the found filter instance or NULL if it* cannot be found.*/
AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name);/*** Create and add a filter instance into an existing graph.* The filter instance is created from the filter filt and inited* with the parameter args. opaque is currently ignored.** In case of success put in *filt_ctx the pointer to the created* filter instance, otherwise set *filt_ctx to NULL.** @param name the instance name to give to the created filter instance* @param graph_ctx the filter graph* @return a negative AVERROR error code in case of failure, a non* negative value otherwise*/
int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt,const char *name, const char *args, void *opaque,AVFilterGraph *graph_ctx);/*** Enable or disable automatic format conversion inside the graph.** Note that format conversion can still happen inside explicitly inserted* scale and aresample filters.** @param flags any of the AVFILTER_AUTO_CONVERT_* constants*/
void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags);enum {AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */
};/*** Check validity and configure all the links and formats in the graph.** @param graphctx the filter graph* @param log_ctx context used for logging* @return >= 0 in case of success, a negative AVERROR code otherwise*/
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx);/*** Free a graph, destroy its links, and set *graph to NULL.* If *graph is NULL, do nothing.*/
void avfilter_graph_free(AVFilterGraph **graph);
dump一个图
/*** Dump a graph into a human-readable string representation.** @param graph the graph to dump* @param options formatting options; currently ignored* @return a string, or NULL in case of memory allocation failure;* the string must be freed using av_free*/
char *avfilter_graph_dump(AVFilterGraph *graph, const char *options);
解析一个图
图的解析分为三层,突然就忘了艹,总之就是先解析外边最大的block,再解析图内部的filter
/*** Add a graph described by a string to a graph.** @note The caller must provide the lists of inputs and outputs,* which therefore must be known before calling the function.** @note The inputs parameter describes inputs of the already existing* part of the graph; i.e. from the point of view of the newly created* part, they are outputs. Similarly the outputs parameter describes* outputs of the already existing filters, which are provided as* inputs to the parsed filters.** @param graph the filter graph where to link the parsed graph context* @param filters string to be parsed* @param inputs linked list to the inputs of the graph* @param outputs linked list to the outputs of the graph* @return zero on success, a negative AVERROR code on error*/
int avfilter_graph_parse(AVFilterGraph *graph, const char *filters,AVFilterInOut *inputs, AVFilterInOut *outputs,void *log_ctx);/*** Add a graph described by a string to a graph.** In the graph filters description, if the input label of the first* filter is not specified, "in" is assumed; if the output label of* the last filter is not specified, "out" is assumed.** @param graph the filter graph where to link the parsed graph context* @param filters string to be parsed* @param inputs pointer to a linked list to the inputs of the graph, may be NULL.* If non-NULL, *inputs is updated to contain the list of open inputs* after the parsing, should be freed with avfilter_inout_free().* @param outputs pointer to a linked list to the outputs of the graph, may be NULL.* If non-NULL, *outputs is updated to contain the list of open outputs* after the parsing, should be freed with avfilter_inout_free().* @return non negative on success, a negative AVERROR code on error*/
int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters,AVFilterInOut **inputs, AVFilterInOut **outputs,void *log_ctx);/*** Add a graph described by a string to a graph.** @param[in] graph the filter graph where to link the parsed graph context* @param[in] filters string to be parsed* @param[out] inputs a linked list of all free (unlinked) inputs of the* parsed graph will be returned here. It is to be freed* by the caller using avfilter_inout_free().* @param[out] outputs a linked list of all free (unlinked) outputs of the* parsed graph will be returned here. It is to be freed by the* caller using avfilter_inout_free().* @return zero on success, a negative AVERROR code on error** @note This function returns the inputs and outputs that are left* unlinked after parsing the graph and the caller then deals with* them.* @note This function makes no reference whatsoever to already* existing parts of the graph and the inputs parameter will on return* contain inputs of the newly parsed part of the graph. Analogously* the outputs parameter will contain outputs of the newly created* filters.*/
int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters,AVFilterInOut **inputs,AVFilterInOut **outputs);