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 11 extern "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 */ 29 int32_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_") 55 void weed_add_plant_flags(weed_plant_t *, uint32_t flags, const char *ign_prefix); 56 void 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 59 uint32_t weed_leaf_set_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits); ///< value ORed with flags 60 uint32_t weed_leaf_clear_flagbits(weed_plant_t *, const char *leaf, uint32_t flagbits); ///< ~value ANDed with flags 61 62 /* HOST_INFO functions */ 63 int weed_host_info_get_flags(weed_plant_t *host_info); 64 void weed_host_info_set_flags(weed_plant_t *host_info, int flags); 65 void weed_host_set_supports_linear_gamma(weed_plant_t *host_info); 66 void weed_host_set_supports_premult_alpha(weed_plant_t *host_info); 67 void weed_host_set_verbosity(weed_plant_t *host_info, int verbosityy); 68 69 /* PLUGIN_INFO functions */ 70 char *weed_plugin_info_get_package_name(weed_plant_t *pinfo); 71 72 73 /* FILTER functions */ 74 int weed_filter_get_flags(weed_plant_t *filter); 75 int weed_filter_is_resizer(weed_plant_t *filter); 76 char *weed_filter_get_name(weed_plant_t *filter); 77 weed_plant_t **weed_filter_get_in_chantmpls(weed_plant_t *filter, int *ntmpls); 78 weed_plant_t **weed_filter_get_out_chantmpls(weed_plant_t *filter, int *ntmpls); 79 weed_plant_t **weed_filter_get_in_paramtmpls(weed_plant_t *filter, int *ntmpls); 80 weed_plant_t **weed_filter_get_out_paramtmpls(weed_plant_t *filter, int *ntmpls); 81 weed_plant_t *weed_filter_get_gui(weed_plant_t *filter, int create_if_not_exists); 82 weed_plant_t *weed_filter_get_plugin_info(weed_plant_t *filter); 83 char *weed_filter_get_package_name(weed_plant_t *filter); 84 int weed_filter_hints_unstable(weed_plant_t *filter); 85 int weed_filter_hints_hidden(weed_plant_t *filter); 86 int weed_filter_hints_stateless(weed_plant_t *filter); 87 int weed_filter_is_converter(weed_plant_t *filter); 88 int weed_filter_is_process_last(weed_plant_t *filter); 89 int weed_filter_prefers_linear_gamma(weed_plant_t *filter); 90 int weed_filter_prefers_premult_alpha(weed_plant_t *filter); 91 int weed_filter_non_realtime(weed_plant_t *filter); 92 int weed_filter_may_thread(weed_plant_t *filter); 93 int weed_filter_channel_sizes_vary(weed_plant_t *filter); 94 int weed_filter_palettes_vary(weed_plant_t *filter); 95 96 97 /* FILTER_INSTANCE functions */ 98 weed_plant_t **weed_instance_get_out_channels(weed_plant_t *instance, int *nchans); 99 weed_plant_t **weed_instance_get_in_channels(weed_plant_t *instance, int *nchans); 100 weed_plant_t **weed_instance_get_in_params(weed_plant_t *instance, int *nparams); 101 weed_plant_t **weed_instance_get_out_params(weed_plant_t *instance, int *nparams); 102 weed_plant_t *weed_instance_get_gui(weed_plant_t *inst, int create_if_not_exists); 103 int weed_instance_get_flags(weed_plant_t *instance); 104 void weed_instance_set_flags(weed_plant_t *instance, int flags); 105 106 /* CHANNEL_TEMPLATE functions */ 107 char *weed_chantmpl_get_name(weed_plant_t *chantmpl); 108 int weed_chantmpl_get_flags(weed_plant_t *chantmpl); 109 int weed_chantmpl_is_optional(weed_plant_t *chantmpl); 110 int weed_chantmpl_is_audio(weed_plant_t *chantmpl); 111 int *weed_chantmpl_get_palette_list(weed_plant_t *filter, weed_plant_t *chantmpl, int *nvals); 112 113 // audio 114 int weed_chantmpl_get_max_audio_length(weed_plant_t *chantmpl); 115 116 /* a return value of zero means unlimited repeats */ 117 int weed_chantmpl_get_max_repeats(weed_plant_t *chantmpl); 118 119 /* CHANNEL functions */ 120 void *weed_channel_get_pixel_data(weed_plant_t *channel); 121 void **weed_channel_get_pixel_data_planar(weed_plant_t *channel, int *nplanes); 122 123 /// width in macropixels 124 int weed_channel_get_width(weed_plant_t *channel); 125 int weed_channel_get_height(weed_plant_t *channel); 126 int weed_channel_get_palette(weed_plant_t *channel); 127 int weed_channel_get_gamma_type(weed_plant_t *channel); 128 int weed_channel_get_palette_yuv(weed_plant_t *channel, int *clamping, int *sampling, int *subspace); 129 int weed_channel_get_rowstride(weed_plant_t *channel); 130 int *weed_channel_get_rowstrides(weed_plant_t *channel, int *nplanes); 131 int weed_channel_is_disabled(weed_plant_t *channel); 132 weed_plant_t *weed_channel_get_template(weed_plant_t *channel); 133 134 /// width in macropixels 135 void weed_channel_set_width(weed_plant_t *channel, int width); 136 void weed_channel_set_height(weed_plant_t *channel, int height); 137 void weed_channel_set_size(weed_plant_t *channel, int width, int height); 138 void weed_channel_set_palette(weed_plant_t *channel, int palette); 139 140 /// only sets value; no conversion of pixel_data done 141 weed_plant_t *weed_channel_set_gamma_type(weed_plant_t *channel, int gamma_type); 142 143 /// width in pixels: only relevant when comparing widths of diferrent palettes 144 int weed_channel_get_width_pixels(weed_plant_t *channel); 145 146 // audio channels 147 int weed_channel_get_audio_rate(weed_plant_t *channel); 148 int weed_channel_get_naudchans(weed_plant_t *channel); 149 int weed_channel_get_audio_length(weed_plant_t *channel); 150 float **weed_channel_get_audio_data(weed_plant_t *channel, int *naudchans); 151 152 weed_plant_t *weed_channel_set_audio_data(weed_plant_t *channel, float **data, int arate, int naudchans, int nsamps); 153 154 // paramtmpls 155 weed_plant_t *weed_paramtmpl_get_gui(weed_plant_t *paramtmpl, int create_if_not_exists); 156 int weed_paramtmpl_get_flags(weed_plant_t *paramtmpl); 157 char *weed_paramtmpl_get_name(weed_plant_t *paramtmpl); 158 int weed_paramtmpl_get_type(weed_plant_t *paramtmpl); 159 int weed_paramtmpl_has_variable_size(weed_plant_t *paramtmpl); 160 int weed_paramtmpl_has_value_perchannel(weed_plant_t *paramtmpl); 161 uint32_t weed_paramtmpl_value_type(weed_plant_t *paramtmpl); 162 int weed_paramtmpl_does_wrap(weed_plant_t *paramtmpl); 163 int weed_paramtmpl_hints_string_choice(weed_plant_t *paramtmpl); 164 int weed_paramtmpl_hints_hidden(weed_plant_t *paramtmpl); 165 int 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 171 int weed_param_is_hidden(weed_plant_t *param, int temporary); 172 weed_plant_t *weed_param_get_gui(weed_plant_t *param, int create_if_not_exists); 173 weed_plant_t *weed_param_get_template(weed_plant_t *param); 174 int weed_param_get_type(weed_plant_t *param); 175 int weed_param_has_variable_size(weed_plant_t *param); 176 int weed_param_has_value_perchannel(weed_plant_t *param); 177 int weed_param_does_wrap(weed_plant_t *param); 178 int weed_param_get_value_type(weed_plant_t *param); 179 int weed_param_value_irrelevant(weed_plant_t *param); 180 181 int weed_param_get_value_int(weed_plant_t *param); 182 int weed_param_get_value_boolean(weed_plant_t *param); 183 double weed_param_get_value_double(weed_plant_t *param); 184 int64_t weed_param_get_value_int64(weed_plant_t *param); 185 char *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 */ 188 int weed_param_get_nchoices(weed_plant_t *param); 189 190 /// gui plants 191 int weed_gui_get_flags(weed_plant_t *gui); 192 193 // utils 194 char *weed_seed_type_to_text(uint32_t seed_type) WARN_UNUSED; 195 char *weed_error_to_text(weed_error_t error) WARN_UNUSED; 196 char *weed_palette_get_name_full(int pal, int clamping, int subspace) WARN_UNUSED; 197 198 const char *weed_palette_get_name(int pal); 199 const char *weed_yuv_clamping_get_name(int clamping); 200 const char *weed_yuv_subspace_get_name(int subspace); 201 const char *weed_gamma_get_name(int gamma); 202 203 double weed_palette_get_compression_ratio(int pal); 204 205 #ifndef WEED_ADVANCED_PALETTES 206 207 int weed_palette_get_bits_per_macropixel(int pal); 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 216 /// This is actually the MACRO pixel size in bytes, to get the real pixel size, divide by weed_palette_pixles_per_macropixel() 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 262