FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavfilter
formats.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
#ifndef AVFILTER_FORMATS_H
20
#define AVFILTER_FORMATS_H
21
22
#include "
avfilter.h
"
23
24
/**
25
* A list of supported formats for one end of a filter link. This is used
26
* during the format negotiation process to try to pick the best format to
27
* use to minimize the number of necessary conversions. Each filter gives a
28
* list of the formats supported by each input and output pad. The list
29
* given for each pad need not be distinct - they may be references to the
30
* same list of formats, as is often the case when a filter supports multiple
31
* formats, but will always output the same format as it is given in input.
32
*
33
* In this way, a list of possible input formats and a list of possible
34
* output formats are associated with each link. When a set of formats is
35
* negotiated over a link, the input and output lists are merged to form a
36
* new list containing only the common elements of each list. In the case
37
* that there were no common elements, a format conversion is necessary.
38
* Otherwise, the lists are merged, and all other links which reference
39
* either of the format lists involved in the merge are also affected.
40
*
41
* For example, consider the filter chain:
42
* filter (a) --> (b) filter (b) --> (c) filter
43
*
44
* where the letters in parenthesis indicate a list of formats supported on
45
* the input or output of the link. Suppose the lists are as follows:
46
* (a) = {A, B}
47
* (b) = {A, B, C}
48
* (c) = {B, C}
49
*
50
* First, the first link's lists are merged, yielding:
51
* filter (a) --> (a) filter (a) --> (c) filter
52
*
53
* Notice that format list (b) now refers to the same list as filter list (a).
54
* Next, the lists for the second link are merged, yielding:
55
* filter (a) --> (a) filter (a) --> (a) filter
56
*
57
* where (a) = {B}.
58
*
59
* Unfortunately, when the format lists at the two ends of a link are merged,
60
* we must ensure that all links which reference either pre-merge format list
61
* get updated as well. Therefore, we have the format list structure store a
62
* pointer to each of the pointers to itself.
63
*/
64
struct
AVFilterFormats
{
65
unsigned
format_count
;
///< number of formats
66
int
*
formats
;
///< list of media formats
67
68
unsigned
refcount
;
///< number of references to this list
69
struct
AVFilterFormats
***
refs
;
///< references to this list
70
};
71
72
typedef
struct
AVFilterChannelLayouts
{
73
uint64_t *
channel_layouts
;
///< list of channel layouts
74
int
nb_channel_layouts
;
///< number of channel layouts
75
76
unsigned
refcount
;
///< number of references to this list
77
struct
AVFilterChannelLayouts
***
refs
;
///< references to this list
78
}
AVFilterChannelLayouts
;
79
80
/**
81
* Return a channel layouts/samplerates list which contains the intersection of
82
* the layouts/samplerates of a and b. Also, all the references of a, all the
83
* references of b, and a and b themselves will be deallocated.
84
*
85
* If a and b do not share any common elements, neither is modified, and NULL
86
* is returned.
87
*/
88
AVFilterChannelLayouts
*
ff_merge_channel_layouts
(
AVFilterChannelLayouts
*
a
,
89
AVFilterChannelLayouts
*
b
);
90
AVFilterFormats
*
ff_merge_samplerates
(
AVFilterFormats
*
a
,
91
AVFilterFormats
*
b
);
92
93
/**
94
* Construct an empty AVFilterChannelLayouts/AVFilterFormats struct --
95
* representing any channel layout/sample rate.
96
*/
97
AVFilterChannelLayouts
*
ff_all_channel_layouts
(
void
);
98
AVFilterFormats
*
ff_all_samplerates
(
void
);
99
100
AVFilterChannelLayouts
*
avfilter_make_format64_list
(
const
int64_t *fmts);
101
102
103
/**
104
* A helper for query_formats() which sets all links to the same list of channel
105
* layouts/sample rates. If there are no links hooked to this filter, the list
106
* is freed.
107
*/
108
void
ff_set_common_channel_layouts
(
AVFilterContext
*ctx,
109
AVFilterChannelLayouts
*
layouts
);
110
void
ff_set_common_samplerates
(
AVFilterContext
*ctx,
111
AVFilterFormats
*samplerates);
112
113
/**
114
* A helper for query_formats() which sets all links to the same list of
115
* formats. If there are no links hooked to this filter, the list of formats is
116
* freed.
117
*/
118
void
ff_set_common_formats
(
AVFilterContext
*ctx,
AVFilterFormats
*
formats
);
119
120
int
ff_add_channel_layout
(
AVFilterChannelLayouts
**l, uint64_t channel_layout);
121
122
/**
123
* Add *ref as a new reference to f.
124
*/
125
void
ff_channel_layouts_ref
(
AVFilterChannelLayouts
*f,
126
AVFilterChannelLayouts
**ref);
127
128
/**
129
* Remove a reference to a channel layouts list.
130
*/
131
void
ff_channel_layouts_unref
(
AVFilterChannelLayouts
**ref);
132
133
void
ff_channel_layouts_changeref
(
AVFilterChannelLayouts
**oldref,
134
AVFilterChannelLayouts
**newref);
135
136
int
ff_default_query_formats
(
AVFilterContext
*ctx);
137
138
139
/**
140
* Create a list of supported formats. This is intended for use in
141
* AVFilter->query_formats().
142
*
143
* @param fmts list of media formats, terminated by -1
144
* @return the format list, with no existing references
145
*/
146
AVFilterFormats
*
ff_make_format_list
(
const
int
*fmts);
147
148
/**
149
* Add fmt to the list of media formats contained in *avff.
150
* If *avff is NULL the function allocates the filter formats struct
151
* and puts its pointer in *avff.
152
*
153
* @return a non negative value in case of success, or a negative
154
* value corresponding to an AVERROR code in case of error
155
*/
156
int
ff_add_format
(
AVFilterFormats
**avff, int64_t
fmt
);
157
158
/**
159
* Return a list of all formats supported by FFmpeg for the given media type.
160
*/
161
AVFilterFormats
*
ff_all_formats
(
enum
AVMediaType
type);
162
163
/**
164
* Construct a formats list containing all planar sample formats.
165
*/
166
AVFilterFormats
*
ff_planar_sample_fmts
(
void
);
167
168
/**
169
* Return a format list which contains the intersection of the formats of
170
* a and b. Also, all the references of a, all the references of b, and
171
* a and b themselves will be deallocated.
172
*
173
* If a and b do not share any common formats, neither is modified, and NULL
174
* is returned.
175
*/
176
AVFilterFormats
*
ff_merge_formats
(
AVFilterFormats
*
a
,
AVFilterFormats
*
b
);
177
178
/**
179
* Add *ref as a new reference to formats.
180
* That is the pointers will point like in the ascii art below:
181
* ________
182
* |formats |<--------.
183
* | ____ | ____|___________________
184
* | |refs| | | __|_
185
* | |* * | | | | | | AVFilterLink
186
* | |* *--------->|*ref|
187
* | |____| | | |____|
188
* |________| |________________________
189
*/
190
void
ff_formats_ref
(
AVFilterFormats
*
formats
,
AVFilterFormats
**ref);
191
192
/**
193
* If *ref is non-NULL, remove *ref as a reference to the format list
194
* it currently points to, deallocates that list if this was the last
195
* reference, and sets *ref to NULL.
196
*
197
* Before After
198
* ________ ________ NULL
199
* |formats |<--------. |formats | ^
200
* | ____ | ____|________________ | ____ | ____|________________
201
* | |refs| | | __|_ | |refs| | | __|_
202
* | |* * | | | | | | AVFilterLink | |* * | | | | | | AVFilterLink
203
* | |* *--------->|*ref| | |* | | | |*ref|
204
* | |____| | | |____| | |____| | | |____|
205
* |________| |_____________________ |________| |_____________________
206
*/
207
void
ff_formats_unref
(
AVFilterFormats
**ref);
208
209
/**
210
*
211
* Before After
212
* ________ ________
213
* |formats |<---------. |formats |<---------.
214
* | ____ | ___|___ | ____ | ___|___
215
* | |refs| | | | | | |refs| | | | | NULL
216
* | |* *--------->|*oldref| | |* *--------->|*newref| ^
217
* | |* * | | |_______| | |* * | | |_______| ___|___
218
* | |____| | | |____| | | | |
219
* |________| |________| |*oldref|
220
* |_______|
221
*/
222
void
ff_formats_changeref
(
AVFilterFormats
**oldref,
AVFilterFormats
**newref);
223
224
#endif
/* AVFILTER_FORMATS_H */
Generated on Sat May 25 2013 03:58:44 for FFmpeg by
1.8.2