FFmpeg
avfilter_internal.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /*
20  * APIs internal to the generic filter(graph) layer.
21  *
22  * MUST NOT be included by individual filters.
23  */
24 
25 #ifndef AVFILTER_AVFILTER_INTERNAL_H
26 #define AVFILTER_AVFILTER_INTERNAL_H
27 
28 #include <stdint.h>
29 
30 #include "avfilter.h"
31 #include "filters.h"
32 #include "framepool.h"
33 #include "framequeue.h"
34 
35 typedef struct FilterLinkInternal {
37 
38  /**
39  * Pool of frames used for allocations.
40  */
42 
43  /**
44  * Queue of frames waiting to be filtered.
45  */
47 
48  /**
49  * If set, the source filter can not generate a frame as is.
50  * The goal is to avoid repeatedly calling the request_frame() method on
51  * the same link.
52  */
54 
55  /**
56  * Link input status.
57  * If not zero, all attempts of filter_frame will fail with the
58  * corresponding code.
59  */
60  int status_in;
61 
62  /**
63  * Timestamp of the input status change.
64  */
66 
67  /**
68  * Link output status.
69  * If not zero, all attempts of request_frame will fail with the
70  * corresponding code.
71  */
73 
74  /**
75  * True if a frame is currently wanted on the output of this filter.
76  * Set when ff_request_frame() is called by the output,
77  * cleared when a frame is filtered.
78  */
80 
81  /**
82  * Index in the age array.
83  */
84  int age_index;
85 
86  /** stage of the initialization of the link properties (dimensions, etc) */
87  enum {
88  AVLINK_UNINIT = 0, ///< not started
89  AVLINK_STARTINIT, ///< started, but incomplete
90  AVLINK_INIT ///< complete
91  } init_state;
93 
95 {
96  return (FilterLinkInternal*)link;
97 }
98 
99 typedef struct FFFilterContext {
100  /**
101  * The public AVFilterContext. See avfilter.h for it.
102  */
104 
106 
107  // AV_CLASS_STATE_FLAG_*
108  unsigned state_flags;
109 
110  /**
111  * Ready status of the filter.
112  * A non-0 value means that the filter needs activating;
113  * a higher value suggests a more urgent activation.
114  */
115  unsigned ready;
116 
117  /// parsed expression
118  struct AVExpr *enable;
119  /// variable values for the enable expression
120  double *var_values;
121 
124 
126 {
127  return (FFFilterContext*)ctx;
128 }
129 
130 typedef struct AVFilterCommand {
131  double time; ///< time expressed in seconds
132  char *command; ///< command
133  char *arg; ///< optional argument for the command
134  int flags;
137 
138 typedef struct FFFilterGraph {
139  /**
140  * The public AVFilterGraph. See avfilter.h for it.
141  */
143 
146 
148 
149  void *thread;
152 } FFFilterGraph;
153 
155 {
156  return (FFFilterGraph*)graph;
157 }
158 
159 /**
160  * Update the position of a link in the age heap.
161  */
163  struct FilterLinkInternal *li);
164 
165 /**
166  * Allocate a new filter context and return it.
167  *
168  * @param filter what filter to create an instance of
169  * @param inst_name name to give to the new filter context
170  *
171  * @return newly created filter context or NULL on failure
172  */
173 AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name);
174 
175 /**
176  * Remove a filter from a graph;
177  */
179 
181 
182 /**
183  * Parse filter options into a dictionary.
184  *
185  * @param logctx context for logging
186  * @param priv_class a filter's private class for shorthand options or NULL
187  * @param options dictionary to store parsed options in
188  * @param args options string to parse
189  *
190  * @return a non-negative number on success, a negative error code on failure
191  */
192 int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
193  AVDictionary **options, const char *args);
194 
196 
198 
199 /**
200  * Negotiate the media format, dimensions, etc of all inputs to a filter.
201  *
202  * @param filter the filter to negotiate the properties for its inputs
203  * @return zero on successful negotiation
204  */
206 
207 /* misc trace functions */
208 
209 #define FF_TPRINTF_START(ctx, func) ff_tlog(NULL, "%-16s: ", #func)
210 
211 #ifdef TRACE
212 void ff_tlog_link(void *ctx, AVFilterLink *link, int end);
213 #else
214 #define ff_tlog_link(ctx, link, end) do { } while(0)
215 #endif
216 
217 /**
218  * Run one round of processing on a filter graph.
219  */
221 
222 /**
223  * Process the commands queued in the link up to the time of the frame.
224  * Commands will trigger the process_command() callback.
225  * @return >= 0 or AVERROR code.
226  */
228 
229 #endif /* AVFILTER_AVFILTER_INTERNAL_H */
ff_filter_graph_run_once
int ff_filter_graph_run_once(AVFilterGraph *graph)
Run one round of processing on a filter graph.
Definition: avfiltergraph.c:1616
ff_link_internal
static FilterLinkInternal * ff_link_internal(AVFilterLink *link)
Definition: avfilter_internal.h:94
FFFilterContext::enable
struct AVExpr * enable
parsed expression
Definition: avfilter_internal.h:118
ff_filter_opt_parse
int ff_filter_opt_parse(void *logctx, const AVClass *priv_class, AVDictionary **options, const char *args)
Parse filter options into a dictionary.
Definition: avfilter.c:852
int64_t
long long int64_t
Definition: coverity.c:34
FFFilterGraph
Definition: avfilter_internal.h:138
FilterLinkInternal::frame_pool
FFFramePool frame_pool
Pool of frames used for allocations.
Definition: avfilter_internal.h:41
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:434
FFFilterGraph::sink_links
struct FilterLinkInternal ** sink_links
Definition: avfilter_internal.h:144
filters.h
FilterLinkInternal::l
FilterLink l
Definition: avfilter_internal.h:36
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
AVDictionary
Definition: dict.c:32
FilterLinkInternal
Definition: avfilter_internal.h:35
FFFramePool
Frame pool.
Definition: framepool.h:32
AVFilterCommand::flags
int flags
Definition: avfilter_internal.h:134
FFFilterContext::p
AVFilterContext p
The public AVFilterContext.
Definition: avfilter_internal.h:103
FFFilterGraph::sink_links_count
int sink_links_count
Definition: avfilter_internal.h:145
FFFilterGraph::thread_execute
avfilter_execute_func * thread_execute
Definition: avfilter_internal.h:150
FilterLinkInternal::AVLINK_STARTINIT
@ AVLINK_STARTINIT
started, but incomplete
Definition: avfilter_internal.h:89
FFFrameQueueGlobal
Structure to hold global options and statistics for frame queues.
Definition: framequeue.h:44
ff_filter_config_links
int ff_filter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
Definition: avfilter.c:328
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
AVExpr
Definition: eval.c:171
link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
Definition: filter_design.txt:23
ff_avfilter_graph_update_heap
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, struct FilterLinkInternal *li)
Update the position of a link in the age heap.
Definition: avfiltergraph.c:1559
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
framequeue.h
fffiltergraph
static FFFilterGraph * fffiltergraph(AVFilterGraph *graph)
Definition: avfilter_internal.h:154
options
Definition: swscale.c:45
ff_filter_alloc
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
Definition: avfilter.c:701
AVFilterGraph
Definition: avfilter.h:589
FilterLinkInternal::status_out
int status_out
Link output status.
Definition: avfilter_internal.h:72
ff_filter_activate
int ff_filter_activate(AVFilterContext *filter)
Definition: avfilter.c:1446
FFFilterContext::command_queue
struct AVFilterCommand * command_queue
Definition: avfilter_internal.h:122
FFFrameQueue
Queue of AVFrame pointers.
Definition: framequeue.h:60
FilterLinkInternal::age_index
int age_index
Index in the age array.
Definition: avfilter_internal.h:84
avfilter_execute_func
int() avfilter_execute_func(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
A function executing multiple jobs, possibly in parallel.
Definition: avfilter.h:586
AVFilterCommand::next
struct AVFilterCommand * next
Definition: avfilter_internal.h:135
ff_inlink_process_commands
int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame)
Process the commands queued in the link up to the time of the frame.
Definition: avfilter.c:1602
FFFilterGraph::frame_queues
FFFrameQueueGlobal frame_queues
Definition: avfilter_internal.h:151
FilterLinkInternal::init_state
enum FilterLinkInternal::@374 init_state
stage of the initialization of the link properties (dimensions, etc)
FilterLinkInternal::frame_blocked_in
int frame_blocked_in
If set, the source filter can not generate a frame as is.
Definition: avfilter_internal.h:53
FFFilterGraph::thread
void * thread
Definition: avfilter_internal.h:149
ff_tlog_link
#define ff_tlog_link(ctx, link, end)
Definition: avfilter_internal.h:214
FFFilterContext::state_flags
unsigned state_flags
Definition: avfilter_internal.h:108
FFFilterGraph::disable_auto_convert
unsigned disable_auto_convert
Definition: avfilter_internal.h:147
fffilterctx
static FFFilterContext * fffilterctx(AVFilterContext *ctx)
Definition: avfilter_internal.h:125
AVFilterCommand
Definition: avfilter_internal.h:130
FilterLinkInternal::status_in
int status_in
Link input status.
Definition: avfilter_internal.h:60
FilterLinkInternal::frame_wanted_out
int frame_wanted_out
True if a frame is currently wanted on the output of this filter.
Definition: avfilter_internal.h:79
AVFilter
Filter definition.
Definition: avfilter.h:216
FFFilterContext::ready
unsigned ready
Ready status of the filter.
Definition: avfilter_internal.h:115
FilterLinkInternal::AVLINK_UNINIT
@ AVLINK_UNINIT
not started
Definition: avfilter_internal.h:88
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
framepool.h
ff_filter_graph_remove_filter
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
Definition: avfiltergraph.c:101
FFFilterContext::execute
avfilter_execute_func * execute
Definition: avfilter_internal.h:105
avfilter.h
AVFilterCommand::command
char * command
command
Definition: avfilter_internal.h:132
FFFilterContext
Definition: avfilter_internal.h:99
AVFilterCommand::arg
char * arg
optional argument for the command
Definition: avfilter_internal.h:133
FFFilterContext::var_values
double * var_values
variable values for the enable expression
Definition: avfilter_internal.h:120
FFFilterGraph::p
AVFilterGraph p
The public AVFilterGraph.
Definition: avfilter_internal.h:142
AVFilterContext
An instance of a filter.
Definition: avfilter.h:274
ff_graph_thread_free
void ff_graph_thread_free(FFFilterGraph *graph)
Definition: avfiltergraph.c:73
ff_graph_thread_init
int ff_graph_thread_init(FFFilterGraph *graph)
Definition: avfiltergraph.c:77
FilterLinkInternal::fifo
FFFrameQueue fifo
Queue of frames waiting to be filtered.
Definition: avfilter_internal.h:46
FilterLinkInternal::AVLINK_INIT
@ AVLINK_INIT
complete
Definition: avfilter_internal.h:90
FilterLinkInternal::status_in_pts
int64_t status_in_pts
Timestamp of the input status change.
Definition: avfilter_internal.h:65
AVFilterCommand::time
double time
time expressed in seconds
Definition: avfilter_internal.h:131