]> git.sesse.net Git - ffmpeg/blob - libavfilter/avfiltergraph.h
Merge commit '62549f9655c48f0ec061087fa33a96040ce01145'
[ffmpeg] / libavfilter / avfiltergraph.h
1 /*
2  * Filter graphs
3  * copyright (c) 2007 Bobby Bingham
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
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  *
12  * FFmpeg is distributed in the hope that it will be useful,
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
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #ifndef AVFILTER_AVFILTERGRAPH_H
23 #define AVFILTER_AVFILTERGRAPH_H
24
25 #include "avfilter.h"
26 #include "libavutil/log.h"
27
28 typedef struct AVFilterGraph {
29     const AVClass *av_class;
30 #if FF_API_FOO_COUNT
31     attribute_deprecated
32     unsigned filter_count_unused;
33 #endif
34     AVFilterContext **filters;
35 #if !FF_API_FOO_COUNT
36     unsigned nb_filters;
37 #endif
38
39     char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters
40     char *resample_lavr_opts;   ///< libavresample options to use for the auto-inserted resample filters
41 #if FF_API_FOO_COUNT
42     unsigned nb_filters;
43 #endif
44     char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions
45
46     /**
47      * Private fields
48      *
49      * The following fields are for internal use only.
50      * Their type, offset, number and semantic can change without notice.
51      */
52
53     AVFilterLink **sink_links;
54     int sink_links_count;
55
56     unsigned disable_auto_convert;
57 } AVFilterGraph;
58
59 /**
60  * Allocate a filter graph.
61  */
62 AVFilterGraph *avfilter_graph_alloc(void);
63
64 /**
65  * Get a filter instance with name name from graph.
66  *
67  * @return the pointer to the found filter instance or NULL if it
68  * cannot be found.
69  */
70 AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, char *name);
71
72 /**
73  * Add an existing filter instance to a filter graph.
74  *
75  * @param graphctx  the filter graph
76  * @param filter the filter to be added
77  */
78 int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter);
79
80 /**
81  * Create and add a filter instance into an existing graph.
82  * The filter instance is created from the filter filt and inited
83  * with the parameters args and opaque.
84  *
85  * In case of success put in *filt_ctx the pointer to the created
86  * filter instance, otherwise set *filt_ctx to NULL.
87  *
88  * @param name the instance name to give to the created filter instance
89  * @param graph_ctx the filter graph
90  * @return a negative AVERROR error code in case of failure, a non
91  * negative value otherwise
92  */
93 int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt,
94                                  const char *name, const char *args, void *opaque,
95                                  AVFilterGraph *graph_ctx);
96
97 /**
98  * Enable or disable automatic format conversion inside the graph.
99  *
100  * Note that format conversion can still happen inside explicitly inserted
101  * scale and aconvert filters.
102  *
103  * @param flags  any of the AVFILTER_AUTO_CONVERT_* constants
104  */
105 void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags);
106
107 enum {
108     AVFILTER_AUTO_CONVERT_ALL  =  0, /**< all automatic conversions enabled */
109     AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */
110 };
111
112 /**
113  * Check validity and configure all the links and formats in the graph.
114  *
115  * @param graphctx the filter graph
116  * @param log_ctx context used for logging
117  * @return 0 in case of success, a negative AVERROR code otherwise
118  */
119 int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx);
120
121 /**
122  * Free a graph, destroy its links, and set *graph to NULL.
123  * If *graph is NULL, do nothing.
124  */
125 void avfilter_graph_free(AVFilterGraph **graph);
126
127 /**
128  * A linked-list of the inputs/outputs of the filter chain.
129  *
130  * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(),
131  * where it is used to communicate open (unlinked) inputs and outputs from and
132  * to the caller.
133  * This struct specifies, per each not connected pad contained in the graph, the
134  * filter context and the pad index required for establishing a link.
135  */
136 typedef struct AVFilterInOut {
137     /** unique name for this input/output in the list */
138     char *name;
139
140     /** filter context associated to this input/output */
141     AVFilterContext *filter_ctx;
142
143     /** index of the filt_ctx pad to use for linking */
144     int pad_idx;
145
146     /** next input/input in the list, NULL if this is the last */
147     struct AVFilterInOut *next;
148 } AVFilterInOut;
149
150 /**
151  * Allocate a single AVFilterInOut entry.
152  * Must be freed with avfilter_inout_free().
153  * @return allocated AVFilterInOut on success, NULL on failure.
154  */
155 AVFilterInOut *avfilter_inout_alloc(void);
156
157 /**
158  * Free the supplied list of AVFilterInOut and set *inout to NULL.
159  * If *inout is NULL, do nothing.
160  */
161 void avfilter_inout_free(AVFilterInOut **inout);
162
163 /**
164  * Add a graph described by a string to a graph.
165  *
166  * @param graph   the filter graph where to link the parsed graph context
167  * @param filters string to be parsed
168  * @param inputs  pointer to a linked list to the inputs of the graph, may be NULL.
169  *                If non-NULL, *inputs is updated to contain the list of open inputs
170  *                after the parsing, should be freed with avfilter_inout_free().
171  * @param outputs pointer to a linked list to the outputs of the graph, may be NULL.
172  *                If non-NULL, *outputs is updated to contain the list of open outputs
173  *                after the parsing, should be freed with avfilter_inout_free().
174  * @return non negative on success, a negative AVERROR code on error
175  */
176 int avfilter_graph_parse(AVFilterGraph *graph, const char *filters,
177                          AVFilterInOut **inputs, AVFilterInOut **outputs,
178                          void *log_ctx);
179
180 /**
181  * Add a graph described by a string to a graph.
182  *
183  * @param[in]  graph   the filter graph where to link the parsed graph context
184  * @param[in]  filters string to be parsed
185  * @param[out] inputs  a linked list of all free (unlinked) inputs of the
186  *                     parsed graph will be returned here. It is to be freed
187  *                     by the caller using avfilter_inout_free().
188  * @param[out] outputs a linked list of all free (unlinked) outputs of the
189  *                     parsed graph will be returned here. It is to be freed by the
190  *                     caller using avfilter_inout_free().
191  * @return zero on success, a negative AVERROR code on error
192  *
193  * @note the difference between avfilter_graph_parse2() and
194  * avfilter_graph_parse() is that in avfilter_graph_parse(), the caller provides
195  * the lists of inputs and outputs, which therefore must be known before calling
196  * the function. On the other hand, avfilter_graph_parse2() \em returns the
197  * inputs and outputs that are left unlinked after parsing the graph and the
198  * caller then deals with them. Another difference is that in
199  * avfilter_graph_parse(), the inputs parameter describes inputs of the
200  * <em>already existing</em> part of the graph; i.e. from the point of view of
201  * the newly created part, they are outputs. Similarly the outputs parameter
202  * describes outputs of the already existing filters, which are provided as
203  * inputs to the parsed filters.
204  * avfilter_graph_parse2() takes the opposite approach -- it makes no reference
205  * whatsoever to already existing parts of the graph and the inputs parameter
206  * will on return contain inputs of the newly parsed part of the graph.
207  * Analogously the outputs parameter will contain outputs of the newly created
208  * filters.
209  */
210 int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters,
211                           AVFilterInOut **inputs,
212                           AVFilterInOut **outputs);
213
214
215 /**
216  * Send a command to one or more filter instances.
217  *
218  * @param graph  the filter graph
219  * @param target the filter(s) to which the command should be sent
220  *               "all" sends to all filters
221  *               otherwise it can be a filter or filter instance name
222  *               which will send the command to all matching filters.
223  * @param cmd    the command to sent, for handling simplicity all commands must be alphanumeric only
224  * @param arg    the argument for the command
225  * @param res    a buffer with size res_size where the filter(s) can return a response.
226  *
227  * @returns >=0 on success otherwise an error code.
228  *              AVERROR(ENOSYS) on unsupported commands
229  */
230 int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags);
231
232 /**
233  * Queue a command for one or more filter instances.
234  *
235  * @param graph  the filter graph
236  * @param target the filter(s) to which the command should be sent
237  *               "all" sends to all filters
238  *               otherwise it can be a filter or filter instance name
239  *               which will send the command to all matching filters.
240  * @param cmd    the command to sent, for handling simplicity all commands must be alphanummeric only
241  * @param arg    the argument for the command
242  * @param ts     time at which the command should be sent to the filter
243  *
244  * @note As this executes commands after this function returns, no return code
245  *       from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported.
246  */
247 int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts);
248
249
250 /**
251  * Dump a graph into a human-readable string representation.
252  *
253  * @param graph    the graph to dump
254  * @param options  formatting options; currently ignored
255  * @return  a string, or NULL in case of memory allocation failure;
256  *          the string must be freed using av_free
257  */
258 char *avfilter_graph_dump(AVFilterGraph *graph, const char *options);
259
260 /**
261  * Request a frame on the oldest sink link.
262  *
263  * If the request returns AVERROR_EOF, try the next.
264  *
265  * Note that this function is not meant to be the sole scheduling mechanism
266  * of a filtergraph, only a convenience function to help drain a filtergraph
267  * in a balanced way under normal circumstances.
268  *
269  * Also note that AVERROR_EOF does not mean that frames did not arrive on
270  * some of the sinks during the process.
271  * When there are multiple sink links, in case the requested link
272  * returns an EOF, this may cause a filter to flush pending frames
273  * which are sent to another sink link, although unrequested.
274  *
275  * @return  the return value of ff_request_frame(),
276  *          or AVERROR_EOF if all links returned AVERROR_EOF
277  */
278 int avfilter_graph_request_oldest(AVFilterGraph *graph);
279
280 #endif /* AVFILTER_AVFILTERGRAPH_H */