LiVES 3.2.0
weed-effects-utils.h
Go to the documentation of this file.
1// weed-effects-utils.c
2// - will probaly become libweed-effects-utils or something
3// LiVES
4// (c) G. Finch 2003 - 2019 <salsaman+lives@gmail.com>
5// released under the GNU GPL 3 or later
6// see file ../COPYING for licensing details
7
8// weed filter utility functions designed for Weed Filter hosts
9
10#ifdef __cplusplus
11extern "C"
12{
13#endif /* __cplusplus */
14
15#ifndef _WEED_FILTER_UTILS_H_
16#define _WEEED_FILTER_UTILS_H_
17
18#ifndef __WEED_HOST__
19#error This header is designed for Weed hosts. Plugins have their own utilities in weed-plugin-utils.h
20#endif
21
22#ifdef __GNUC__
23# define WARN_UNUSED __attribute__((warn_unused_result))
24#else
25# define WARN_UNUSED
26#endif
27
28/* general Weed functions and definitions */
29int32_t weed_plant_get_type(weed_plant_t *);
30
31#define WEED_PLANT_IS_PLUGIN_INFO(plant) (weed_plant_get_type(plant) == WEED_PLANT_PLUGIN_INFO ? WEED_TRUE : \
32 WEED_FALSE)
33
34#define WEED_PLANT_IS_HOST_INFO(plant) (weed_plant_get_type(plant) == WEED_PLANT_HOST_INFO ? WEED_TRUE : WEED_FALSE)
35
36#define WEED_PLANT_IS_FILTER_CLASS(plant) (weed_plant_get_type(plant) == WEED_PLANT_FILTER_CLASS ? WEED_TRUE : \
37 WEED_FALSE)
38#define WEED_PLANT_IS_FILTER_INSTANCE(plant) (weed_plant_get_type(plant) == WEED_PLANT_FILTER_INSTANCE ? WEED_TRUE : \
39 WEED_FALSE)
40
41#define WEED_PLANT_IS_CHANNEL(plant) (weed_plant_get_type(plant) == WEED_PLANT_CHANNEL ? WEED_TRUE : WEED_FALSE)
42
43#define WEED_PLANT_IS_CHANNEL_TEMPLATE(plant) (weed_plant_get_type(plant) == WEED_PLANT_CHANNEL_TEMPLATE ? \
44 WEED_TRUE : WEED_FALSE)
45
46#define WEED_PLANT_IS_PARAMETER(plant) (weed_plant_get_type(plant) == WEED_PLANT_PARAMETER ? WEED_TRUE : WEED_FALSE)
47
48#define WEED_PLANT_IS_PARAMETER_TEMPLATE(plant) (weed_plant_get_type(plant) == WEED_PLANT_PARAMETER_TEMPLATE ? \
49 WEED_TRUE : WEED_FALSE)
50
51#define WEED_PLANT_IS_GUI(plant) (weed_plant_get_type(plant) == WEED_PLANT_GUI ? WEED_TRUE : WEED_FALSE)
52
53// set flags for each leaf in a plant. If ign_prefix is not NULL, ignore leaves with keys that begin with ign_prefix
54// this enables a host to do: weed_add_plant_flags(plant, WEED_FLAG_IMMUTABLE | WEED_FLAG_UNDELETABLE, "plugin_")
55void weed_add_plant_flags(weed_plant_t *, uint32_t flags, const char *ign_prefix);
56void weed_clear_plant_flags(weed_plant_t *t, uint32_t flags, const char *ign_prefix);
57
58// add / clear bits for leaf flags, returns value of flags before alteration
59uint32_t weed_leaf_set_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits);
60uint32_t weed_leaf_clear_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits);
61
62/* HOST_INFO functions */
63int weed_host_info_get_flags(weed_plant_t *host_info);
64void weed_host_info_set_flags(weed_plant_t *host_info, int flags);
65void weed_host_set_supports_linear_gamma(weed_plant_t *host_info);
66void weed_host_set_supports_premult_alpha(weed_plant_t *host_info);
67void weed_host_set_verbosity(weed_plant_t *host_info, int verbosityy);
68
69/* PLUGIN_INFO functions */
70char *weed_plugin_info_get_package_name(weed_plant_t *pinfo);
71
72
73/* FILTER functions */
74int weed_filter_get_flags(weed_plant_t *filter);
75int weed_filter_is_resizer(weed_plant_t *filter);
76char *weed_filter_get_name(weed_plant_t *filter);
77weed_plant_t **weed_filter_get_in_chantmpls(weed_plant_t *filter, int *ntmpls);
78weed_plant_t **weed_filter_get_out_chantmpls(weed_plant_t *filter, int *ntmpls);
79weed_plant_t **weed_filter_get_in_paramtmpls(weed_plant_t *filter, int *ntmpls);
80weed_plant_t **weed_filter_get_out_paramtmpls(weed_plant_t *filter, int *ntmpls);
81weed_plant_t *weed_filter_get_gui(weed_plant_t *filter, int create_if_not_exists);
82weed_plant_t *weed_filter_get_plugin_info(weed_plant_t *filter);
83char *weed_filter_get_package_name(weed_plant_t *filter);
84int weed_filter_hints_unstable(weed_plant_t *filter);
85int weed_filter_hints_hidden(weed_plant_t *filter);
86int weed_filter_hints_stateless(weed_plant_t *filter);
87int weed_filter_is_converter(weed_plant_t *filter);
88int weed_filter_is_process_last(weed_plant_t *filter);
89int weed_filter_prefers_linear_gamma(weed_plant_t *filter);
90int weed_filter_prefers_premult_alpha(weed_plant_t *filter);
91int weed_filter_non_realtime(weed_plant_t *filter);
92int weed_filter_may_thread(weed_plant_t *filter);
93int weed_filter_channel_sizes_vary(weed_plant_t *filter);
94int weed_filter_palettes_vary(weed_plant_t *filter);
95
96
97/* FILTER_INSTANCE functions */
98weed_plant_t **weed_instance_get_out_channels(weed_plant_t *instance, int *nchans);
99weed_plant_t **weed_instance_get_in_channels(weed_plant_t *instance, int *nchans);
100weed_plant_t **weed_instance_get_in_params(weed_plant_t *instance, int *nparams);
101weed_plant_t **weed_instance_get_out_params(weed_plant_t *instance, int *nparams);
102weed_plant_t *weed_instance_get_gui(weed_plant_t *inst, int create_if_not_exists);
103int weed_instance_get_flags(weed_plant_t *instance);
104void weed_instance_set_flags(weed_plant_t *instance, int flags);
105
106/* CHANNEL_TEMPLATE functions */
107char *weed_chantmpl_get_name(weed_plant_t *chantmpl);
108int weed_chantmpl_get_flags(weed_plant_t *chantmpl);
109int weed_chantmpl_is_optional(weed_plant_t *chantmpl);
110int weed_chantmpl_is_audio(weed_plant_t *chantmpl);
111int *weed_chantmpl_get_palette_list(weed_plant_t *filter, weed_plant_t *chantmpl, int *nvals);
112
113// audio
114int weed_chantmpl_get_max_audio_length(weed_plant_t *chantmpl);
115
116/* a return value of zero means unlimited repeats */
117int weed_chantmpl_get_max_repeats(weed_plant_t *chantmpl);
118
119/* CHANNEL functions */
120void *weed_channel_get_pixel_data(weed_plant_t *channel);
121void **weed_channel_get_pixel_data_planar(weed_plant_t *channel, int *nplanes);
122
124int weed_channel_get_width(weed_plant_t *channel);
125int weed_channel_get_height(weed_plant_t *channel);
126int weed_channel_get_palette(weed_plant_t *channel);
127int weed_channel_get_gamma_type(weed_plant_t *channel);
128int weed_channel_get_palette_yuv(weed_plant_t *channel, int *clamping, int *sampling, int *subspace);
129int weed_channel_get_rowstride(weed_plant_t *channel);
130int *weed_channel_get_rowstrides(weed_plant_t *channel, int *nplanes);
131int weed_channel_is_disabled(weed_plant_t *channel);
132weed_plant_t *weed_channel_get_template(weed_plant_t *channel);
133
135void weed_channel_set_width(weed_plant_t *channel, int width);
136void weed_channel_set_height(weed_plant_t *channel, int height);
137void weed_channel_set_size(weed_plant_t *channel, int width, int height);
138void weed_channel_set_palette(weed_plant_t *channel, int palette);
139
141weed_plant_t *weed_channel_set_gamma_type(weed_plant_t *channel, int gamma_type);
142
144int weed_channel_get_width_pixels(weed_plant_t *channel);
145
146// audio channels
147int weed_channel_get_audio_rate(weed_plant_t *channel);
148int weed_channel_get_naudchans(weed_plant_t *channel);
149int weed_channel_get_audio_length(weed_plant_t *channel);
150float **weed_channel_get_audio_data(weed_plant_t *channel, int *naudchans);
151
152weed_plant_t *weed_channel_set_audio_data(weed_plant_t *channel, float **data, int arate, int naudchans, int nsamps);
153
154// paramtmpls
155weed_plant_t *weed_paramtmpl_get_gui(weed_plant_t *paramtmpl, int create_if_not_exists);
156int weed_paramtmpl_get_flags(weed_plant_t *paramtmpl);
157char *weed_paramtmpl_get_name(weed_plant_t *paramtmpl);
158int weed_paramtmpl_get_type(weed_plant_t *paramtmpl);
159int weed_paramtmpl_has_variable_size(weed_plant_t *paramtmpl);
160int weed_paramtmpl_has_value_perchannel(weed_plant_t *paramtmpl);
161uint32_t weed_paramtmpl_value_type(weed_plant_t *paramtmpl);
162int weed_paramtmpl_does_wrap(weed_plant_t *paramtmpl);
163int weed_paramtmpl_hints_string_choice(weed_plant_t *paramtmpl);
164int weed_paramtmpl_hints_hidden(weed_plant_t *paramtmpl);
165int weed_paramtmpl_value_irrelevant(weed_plant_t *paramtmpl);
166
167// params
168
169// if temporary is WEED_TRUE, then we return the current state,
170// otherwise we return the permanent (structural) state
171int weed_param_is_hidden(weed_plant_t *param, int temporary);
172weed_plant_t *weed_param_get_gui(weed_plant_t *param, int create_if_not_exists);
173weed_plant_t *weed_param_get_template(weed_plant_t *param);
174int weed_param_get_type(weed_plant_t *param);
175int weed_param_has_variable_size(weed_plant_t *param);
176int weed_param_has_value_perchannel(weed_plant_t *param);
177int weed_param_does_wrap(weed_plant_t *param);
178int weed_param_get_value_type(weed_plant_t *param);
179int weed_param_value_irrelevant(weed_plant_t *param);
180
181int weed_param_get_value_int(weed_plant_t *param);
182int weed_param_get_value_boolean(weed_plant_t *param);
183double weed_param_get_value_double(weed_plant_t *param);
184int64_t weed_param_get_value_int64(weed_plant_t *param);
185char *weed_param_get_value_string(weed_plant_t *param);
186
187/* if param is WEED_SEED_STRING and WEED_LEAF_CHOICES is set in param or template, returns the length, else returns 0 */
188int weed_param_get_nchoices(weed_plant_t *param);
189
191int weed_gui_get_flags(weed_plant_t *gui);
192
193// utils
194char *weed_seed_type_to_text(uint32_t seed_type) WARN_UNUSED;
195char *weed_error_to_text(weed_error_t error) WARN_UNUSED;
196char *weed_palette_get_name_full(int pal, int clamping, int subspace) WARN_UNUSED;
197
198const char *weed_palette_get_name(int pal);
199const char *weed_yuv_clamping_get_name(int clamping);
200const char *weed_yuv_subspace_get_name(int subspace);
201const char *weed_gamma_get_name(int gamma);
202
204
205#ifndef WEED_ADVANCED_PALETTES
206
208
209#define weed_palette_is_alpha(pal) ((((pal >= 1024) && (pal < 2048))) ? WEED_TRUE : WEED_FALSE)
210#define weed_palette_is_rgb(pal) (pal >0 && pal < 512 ? WEED_TRUE : WEED_FALSE)
211#define weed_palette_is_yuv(pal) (pal >= 512 && pal < 1024 ? WEED_TRUE : WEED_FALSE)
212
213#define weed_palette_is_float(pal) ((pal == WEED_PALETTE_RGBAFLOAT || pal == WEED_PALETTE_AFLOAT || \
214 pal == WEED_PALETTE_RGBFLOAT) ? WEED_TRUE : WEED_FALSE)
215
217#define pixel_size(pal) ((pal == WEED_PALETTE_RGB24 || pal == WEED_PALETTE_BGR24 || pal == WEED_PALETTE_YUV888) ? 3 : \
218 (pal == WEED_PALETTE_RGBA32 || pal == WEED_PALETTE_BGRA32 || pal == WEED_PALETTE_ARGB32 || \
219 pal == WEED_PALETTE_YUVA8888 || pal == WEED_PALETTE_UYVY || pal == WEED_PALETTE_YUYV) ? 4 : 1)
220
221#define weed_palette_has_alpha(pal) ((pal == WEED_PALETTE_RGBA32 || pal == WEED_PALETTE_BGRA32 || \
222 pal == WEED_PALETTE_ARGB32 || pal == WEED_PALETTE_YUVA4444P || pal == WEED_PALETTE_YUVA8888 || \
223 pal == WEED_PALETTE_RGBAFLOAT || weed_palette_is_alpha(pal)) ? WEED_TRUE : WEED_FALSE)
224
225// return ratio of plane[n] width/plane[0] width
226#define weed_palette_get_plane_ratio_horizontal(pal, plane) ((double)(plane == 0 ? 1.0 : (plane == 1 || plane == 2) ? \
227 (pal == WEED_PALETTE_YUV444P || pal == WEED_PALETTE_YUVA4444P) ? 1.0 : \
228 (pal == WEED_PALETTE_YUV422P || pal == WEED_PALETTE_YUV420P || \
229 pal == WEED_PALETTE_YVU420P) ? 0.5 : plane == 3 ? \
230 pal == WEED_PALETTE_YUVA4444P ? 1.0 : 0.0 : 0.0 : 0.0))
231
232// return ratio of plane[n] height/plane[n] height
233#define weed_palette_get_plane_ratio_vertical(pal, plane) ((double)(plane == 0 ? 1.0 : (plane == 1 || plane == 2) ? \
234 (pal == WEED_PALETTE_YUV444P || pal == WEED_PALETTE_YUVA4444P || \
235 pal == WEED_PALETTE_YUV422P) ? 1.0 : (pal == WEED_PALETTE_YUV420P || \
236 pal == WEED_PALETTE_YVU420P) ? 0.5 : plane == 3 ? \
237 pal == WEED_PALETTE_YUVA4444P ? 1.0 : 0.0 : 0.0 : 0.0))
238
239#define weed_palette_get_nplanes(pal) ((pal == WEED_PALETTE_RGB24 || pal == WEED_PALETTE_BGR24 || \
240 pal == WEED_PALETTE_RGBA32 || pal == WEED_PALETTE_BGRA32 || pal == WEED_PALETTE_ARGB32 || \
241 pal == WEED_PALETTE_UYVY || pal == WEED_PALETTE_YUYV || pal == WEED_PALETTE_YUV411 || \
242 pal == WEED_PALETTE_YUV888 || pal == WEED_PALETTE_YUVA8888 || pal == WEED_PALETTE_AFLOAT || \
243 pal == WEED_PALETTE_A8 || pal == WEED_PALETTE_A1 || pal == WEED_PALETTE_RGBFLOAT || \
244 pal == WEED_PALETTE_RGBAFLOAT) ? 1 : (pal == WEED_PALETTE_YUV420P || \
245 pal == WEED_PALETTE_YVU420P || pal == WEED_PALETTE_YUV422P || \
246 pal == WEED_PALETTE_YUV444P) ? 3 : pal == WEED_PALETTE_YUVA4444P ? 4 : 0)
247
248#define weed_palette_get_pixels_per_macropixel(pal) ((pal == WEED_PALETTE_UYVY || pal == WEED_PALETTE_YUYV) ? 2 : \
249 (pal == WEED_PALETTE_YUV411) ? 4 : (weed_palette_is_valid(pal) ? 1 : 0))
250
251#define weed_palette_is_valid(pal) (weed_palette_get_nplanes(pal) == 0 ? WEED_FALSE : WEED_TRUE)
252
253#endif
254
255#define weed_palette_is_planar(pal) (weed_palette_get_nplanes(pal) > 1)
256
257#ifdef __cplusplus
258}
259#endif /* __cplusplus */
260
261#endif
error("LSD_RANDFUNC(ptr, size) must be defined")
_palette * palette
interface colour settings
Definition: main.c:101
weed_plant_t * weed_paramtmpl_get_gui(weed_plant_t *paramtmpl, int create_if_not_exists)
int weed_param_has_variable_size(weed_plant_t *param)
int weed_param_get_nchoices(weed_plant_t *param)
int weed_channel_is_disabled(weed_plant_t *channel)
weed_plant_t * weed_channel_set_gamma_type(weed_plant_t *channel, int gamma_type)
only sets value; no conversion of pixel_data done
void weed_channel_set_height(weed_plant_t *channel, int height)
int weed_palette_get_bits_per_macropixel(int pal)
Definition: colourspace.c:1411
int weed_param_has_value_perchannel(weed_plant_t *param)
int weed_param_get_type(weed_plant_t *param)
int weed_channel_get_audio_rate(weed_plant_t *channel)
int weed_paramtmpl_get_type(weed_plant_t *paramtmpl)
int weed_paramtmpl_get_flags(weed_plant_t *paramtmpl)
weed_plant_t * weed_param_get_gui(weed_plant_t *param, int create_if_not_exists)
const char * weed_yuv_subspace_get_name(int subspace)
int weed_filter_prefers_premult_alpha(weed_plant_t *filter)
void weed_host_set_supports_linear_gamma(weed_plant_t *host_info)
int weed_host_info_get_flags(weed_plant_t *host_info)
int weed_paramtmpl_value_irrelevant(weed_plant_t *paramtmpl)
int weed_paramtmpl_does_wrap(weed_plant_t *paramtmpl)
weed_plant_t ** weed_filter_get_in_paramtmpls(weed_plant_t *filter, int *ntmpls)
char * weed_filter_get_name(weed_plant_t *filter)
int weed_instance_get_flags(weed_plant_t *instance)
weed_plant_t ** weed_instance_get_out_channels(weed_plant_t *instance, int *nchans)
int64_t weed_param_get_value_int64(weed_plant_t *param)
uint32_t weed_paramtmpl_value_type(weed_plant_t *paramtmpl)
void weed_host_set_supports_premult_alpha(weed_plant_t *host_info)
int weed_channel_get_naudchans(weed_plant_t *channel)
void weed_channel_set_size(weed_plant_t *channel, int width, int height)
void weed_instance_set_flags(weed_plant_t *instance, int flags)
weed_plant_t ** weed_filter_get_out_chantmpls(weed_plant_t *filter, int *ntmpls)
int weed_chantmpl_is_audio(weed_plant_t *chantmpl)
char * weed_paramtmpl_get_name(weed_plant_t *paramtmpl)
void weed_host_info_set_flags(weed_plant_t *host_info, int flags)
char * weed_param_get_value_string(weed_plant_t *param)
char * weed_chantmpl_get_name(weed_plant_t *chantmpl)
int32_t weed_plant_get_type(weed_plant_t *)
int weed_param_does_wrap(weed_plant_t *param)
weed_plant_t ** weed_instance_get_out_params(weed_plant_t *instance, int *nparams)
int weed_paramtmpl_has_variable_size(weed_plant_t *paramtmpl)
weed_plant_t * weed_channel_set_audio_data(weed_plant_t *channel, float **data, int arate, int naudchans, int nsamps)
char * weed_plugin_info_get_package_name(weed_plant_t *pinfo)
weed_plant_t ** weed_instance_get_in_params(weed_plant_t *instance, int *nparams)
int weed_chantmpl_is_optional(weed_plant_t *chantmpl)
int weed_filter_non_realtime(weed_plant_t *filter)
int weed_filter_hints_stateless(weed_plant_t *filter)
int weed_channel_get_gamma_type(weed_plant_t *channel)
char * weed_seed_type_to_text(uint32_t seed_type) WARN_UNUSED
#define WARN_UNUSED
float ** weed_channel_get_audio_data(weed_plant_t *channel, int *naudchans)
int weed_param_value_irrelevant(weed_plant_t *param)
char * weed_error_to_text(weed_error_t error) WARN_UNUSED
int weed_param_get_value_boolean(weed_plant_t *param)
weed_plant_t ** weed_filter_get_out_paramtmpls(weed_plant_t *filter, int *ntmpls)
int weed_channel_get_width_pixels(weed_plant_t *channel)
width in pixels: only relevant when comparing widths of diferrent palettes
const char * weed_gamma_get_name(int gamma)
void ** weed_channel_get_pixel_data_planar(weed_plant_t *channel, int *nplanes)
double weed_palette_get_compression_ratio(int pal)
char * weed_filter_get_package_name(weed_plant_t *filter)
int * weed_channel_get_rowstrides(weed_plant_t *channel, int *nplanes)
uint32_t weed_leaf_set_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits)
value ORed with flags
weed_plant_t * weed_param_get_template(weed_plant_t *param)
int weed_filter_prefers_linear_gamma(weed_plant_t *filter)
int weed_param_get_value_int(weed_plant_t *param)
int weed_filter_is_process_last(weed_plant_t *filter)
weed_plant_t * weed_filter_get_gui(weed_plant_t *filter, int create_if_not_exists)
weed_plant_t * weed_channel_get_template(weed_plant_t *channel)
weed_plant_t * weed_instance_get_gui(weed_plant_t *inst, int create_if_not_exists)
int weed_filter_is_converter(weed_plant_t *filter)
int weed_filter_hints_hidden(weed_plant_t *filter)
uint32_t weed_leaf_clear_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits)
~value ANDed with flags
int * weed_chantmpl_get_palette_list(weed_plant_t *filter, weed_plant_t *chantmpl, int *nvals)
char * weed_palette_get_name_full(int pal, int clamping, int subspace) WARN_UNUSED
int weed_filter_hints_unstable(weed_plant_t *filter)
void * weed_channel_get_pixel_data(weed_plant_t *channel)
void weed_host_set_verbosity(weed_plant_t *host_info, int verbosityy)
void weed_channel_set_width(weed_plant_t *channel, int width)
width in macropixels
int weed_paramtmpl_hints_string_choice(weed_plant_t *paramtmpl)
int weed_channel_get_rowstride(weed_plant_t *channel)
int weed_channel_get_height(weed_plant_t *channel)
int weed_chantmpl_get_max_audio_length(weed_plant_t *chantmpl)
int weed_chantmpl_get_flags(weed_plant_t *chantmpl)
int weed_channel_get_audio_length(weed_plant_t *channel)
int weed_channel_get_palette_yuv(weed_plant_t *channel, int *clamping, int *sampling, int *subspace)
int weed_chantmpl_get_max_repeats(weed_plant_t *chantmpl)
int weed_param_is_hidden(weed_plant_t *param, int temporary)
const char * weed_palette_get_name(int pal)
void weed_clear_plant_flags(weed_plant_t *t, uint32_t flags, const char *ign_prefix)
int weed_filter_may_thread(weed_plant_t *filter)
int weed_channel_get_width(weed_plant_t *channel)
width in macropixels
int weed_filter_is_resizer(weed_plant_t *filter)
int weed_channel_get_palette(weed_plant_t *channel)
int weed_gui_get_flags(weed_plant_t *gui)
gui plants
void weed_channel_set_palette(weed_plant_t *channel, int palette)
int weed_filter_get_flags(weed_plant_t *filter)
const char * weed_yuv_clamping_get_name(int clamping)
int weed_filter_channel_sizes_vary(weed_plant_t *filter)
void weed_add_plant_flags(weed_plant_t *, uint32_t flags, const char *ign_prefix)
double weed_param_get_value_double(weed_plant_t *param)
weed_plant_t * weed_filter_get_plugin_info(weed_plant_t *filter)
int weed_filter_palettes_vary(weed_plant_t *filter)
weed_plant_t ** weed_filter_get_in_chantmpls(weed_plant_t *filter, int *ntmpls)
int weed_paramtmpl_hints_hidden(weed_plant_t *paramtmpl)
int weed_param_get_value_type(weed_plant_t *param)
weed_plant_t ** weed_instance_get_in_channels(weed_plant_t *instance, int *nchans)
int weed_paramtmpl_has_value_perchannel(weed_plant_t *paramtmpl)