1 /* WEED is free software; you can redistribute it and/or
2    modify it under the terms of the GNU Lesser General Public
3    License as published by the Free Software Foundation; either
4    version 3 of the License, or (at your option) any later version.
5 
6    Weed is distributed in the hope that it will be useful,
7    but WITHOUT ANY WARRANTY; without even the implied warranty of
8    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9    Lesser General Public License for more details.
10 
11    You should have received a copy of the GNU Lesser General Public
12    License along with this source code; if not, write to the Free Software
13    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
14 
15    Weed is developed by:
16    Gabriel "Salsaman" Finch - http://lives-video.com
17 
18    partly based on LiViDO, which is developed by:
19    Niels Elburg - http://veejay.sf.net
20    Denis "Jaromil" Rojo - http://freej.dyne.org
21    Tom Schouten - http://zwizwa.fartit.com
22    Andraz Tori - http://cvs.cinelerra.org
23 
24    reviewed with suggestions and contributions from:
25    Silvano "Kysucix" Galliani - http://freej.dyne.org
26    Kentaro Fukuchi - http://megaui.net/fukuchi
27    Jun Iio - http://www.malib.net
28    Carlo Prelz - http://www2.fluido.as:8080/
29 */
30 
31 /* (C) G. Finch, 2005 - 2019 */
32 
33 #ifndef __WEED_EFFECTS_H__
34 #define __WEED_EFFECTS_H__
35 
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #endif /* __cplusplus */
40 
41 #include <inttypes.h>
42 
43 /* API version * 200 */
44 #define WEED_FILTER_API_VERSION 200
45 #define WEED_FILTER_API_VERSION 200
46 
47 /* plant types */
48 #define WEED_PLANT_PLUGIN_INFO        		1
49 #define WEED_PLANT_FILTER_CLASS       		2
50 #define WEED_PLANT_FILTER_INSTANCE     		3
51 #define WEED_PLANT_CHANNEL_TEMPLATE     	4
52 #define WEED_PLANT_PARAMETER_TEMPLATE   	5
53 #define WEED_PLANT_CHANNEL                     	6
54 #define WEED_PLANT_PARAMETER                  	7
55 #define WEED_PLANT_GUI                        	8
56 #define WEED_PLANT_HOST_INFO                   	9
57 
58 /* Parameter types */
59 #define WEED_PARAM_UNSPECIFIED	  	0
60 #define WEED_PARAM_INTEGER        	1
61 #define WEED_PARAM_FLOAT           	2
62 #define WEED_PARAM_TEXT             	3
63 #define WEED_PARAM_SWITCH          	4
64 #define WEED_PARAM_COLOR           	5
65 
66 typedef struct {
67   int32_t red, green, blue;
68 } weed_rgb_int_t;
69 
70 typedef struct {
71   int32_t red, green, blue, alpha;
72 } weed_rgba_int_t;
73 
74 typedef struct {
75   double red, green, blue;
76 } weed_rgb_double_t;
77 
78 typedef struct {
79   double red, green, blue, alpha;
80 } weed_rgba_double_t;
81 
82 /* Colorspaces for Color parameters */
83 #define WEED_COLORSPACE_RGB   	1
84 #define WEED_COLORSPACE_RGBA  	2
85 
86 /* host_info flags */
87 /* API version 200 */
88 #define WEED_HOST_SUPPORTS_LINEAR_GAMMA    		(1 << 0)
89 #define WEED_HOST_SUPPORTS_PREMULTIPLIED_ALPHA    	(1 << 1)
90 
91 /* Filter flags */
92 #define WEED_FILTER_NON_REALTIME                	(1 << 0)
93 #define WEED_FILTER_IS_CONVERTER                	(1 << 1)
94 #define WEED_FILTER_HINT_STATELESS			(1 << 2)
95 #define WEED_FILTER_PREF_LINEAR_GAMMA			(1 << 3)
96 #define WEED_FILTER_PREF_PREMULTIPLIED_ALPHA		(1 << 4)
97 #define WEED_FILTER_HINT_PROCESS_LAST			(1 << 5)
98 #define WEED_FILTER_HINT_MAY_THREAD                    	(1 << 6)
99 #define WEED_FILTER_HINT_MAYBE_UNSTABLE                	(1 << 7)
100 #define WEED_FILTER_CHANNEL_SIZES_MAY_VARY     		(1 << 8)
101 #define WEED_FILTER_PALETTES_MAY_VARY			(1 << 9)
102 
103 /* audio */
104 #define WEED_FILTER_CHANNEL_LAYOUTS_MAY_VARY		(1 << 15)
105 #define WEED_FILTER_AUDIO_RATES_MAY_VARY	 	(1 << 16)
106 
107 /* Channel template flags */
108 #define WEED_CHANNEL_REINIT_ON_SIZE_CHANGE		(1 << 0)
109 #define WEED_CHANNEL_REINIT_ON_PALETTE_CHANGE          	(1 << 1)
110 #define WEED_CHANNEL_REINIT_ON_ROWSTRIDES_CHANGE    	(1 << 2)
111 #define WEED_CHANNEL_OPTIONAL                          	(1 << 3)
112 #define WEED_CHANNEL_CAN_DO_INPLACE                    	(1 << 4)
113 #define WEED_CHANNEL_NEEDS_NATURAL_SIZE                	(1 << 5)
114 
115 /* audio */
116 #define WEED_CHANNEL_REINIT_ON_RATE_CHANGE	WEED_CHANNEL_REINIT_ON_SIZE_CHANGE
117 #define WEED_CHANNEL_REINIT_ON_LAYOUT_CHANGE	WEED_CHANNEL_REINIT_ON_PALETTE_CHANGE
118 
119 /* Parameter template flags */
120 #define WEED_PARAMETER_REINIT_ON_VALUE_CHANGE     	(1 << 0)
121 #define WEED_PARAMETER_VARIABLE_SIZE                   	(1 << 1)
122 #define WEED_PARAMETER_VALUE_PER_CHANNEL              	(1 << 2)
123 #define WEED_PARAMETER_VALUE_IRRELEVANT			(1 << 3)
124 
125 /* Parameter template GUI flags */
126 #define WEED_GUI_REINIT_ON_VALUE_CHANGE		(1 << 0)
127 #define WEED_GUI_CHOICES_SET_ON_INIT	      	(1 << 1)
128 
129 /* filter instance flags */
130 #define WEED_INSTANCE_UPDATE_GUI_ONLY		(1 << 0)
131 
132 /* error codes (in addidion to WEED_SUCCESS and WEED_ERROR_MEMORY_ALLOCATION) */
133 #define WEED_ERROR_PLUGIN_INVALID              	64
134 #define WEED_ERROR_FILTER_INVALID		65
135 #define WEED_ERROR_TOO_MANY_INSTANCES		66
136 #define WEED_ERROR_REINIT_NEEDED               	67
137 #define WEED_ERROR_NOT_READY	               	68
138 
139 #define WEED_VERBOSITY_SILENT	 	-2 ///< no output
140 #define WEED_VERBOSITY_CRITICAL		-1 ///< only critical errors which prevent the plugin / filter from operating AT ALL
141 #define WEED_VERBOSITY_ERROR	      	 0 ///< default choice a (errors which prevent normal operation)
142 #define WEED_VERBOSITY_WARN	      	 1 ///< default choice b (errors which adversly affect operation)
143 #define WEED_VERBOSITY_INFO		 2 ///< info (any additional non-debug info)
144 #define WEED_VERBOSITY_DEBUG		 3 ///< output to assist with debugging the plugin / filter
145 
146 typedef int64_t weed_timecode_t;
147 
148 // allows the plugin to get the plugin_info before weed_leaf_get() is defined
149 typedef weed_error_t (*weed_default_getter_f)(weed_plant_t *plant, const char *key, void *value);
150 
151 /* host bootstrap function */
152 typedef weed_plant_t *(*weed_bootstrap_f)(weed_default_getter_f *,
153     int32_t plugin_weed_min_api_version,
154     int32_t plugin_weed_max_api_version,
155     int32_t plugin_filter_min_api_version,
156     int32_t plugin_filter_max_api_version);
157 
158 /* mandatory plugin functions */
159 typedef weed_plant_t *(*weed_setup_f)(weed_bootstrap_f weed_boot);
160 
161 /* optional plugin functions */
162 typedef void (*weed_desetup_f)(void);
163 typedef weed_error_t (*weed_process_f)(weed_plant_t *filter_instance, weed_timecode_t timestamp);
164 typedef weed_error_t (*weed_init_f)(weed_plant_t *filter_instance);
165 typedef weed_error_t (*weed_deinit_f)(weed_plant_t *filter_instance);
166 
167 /* special plugin functions */
168 typedef void (*weed_display_f)(weed_plant_t *parameter); // deprecated
169 typedef weed_error_t (*weed_interpolate_f)(weed_plant_t **in_values, weed_plant_t *out_value);
170 
171 // PLUGIN_INFO
172 // mandatory:
173 #define WEED_LEAF_FILTERS "filters"
174 #define WEED_LEAF_HOST_INFO "host_info"
175 #define WEED_LEAF_VERSION "version"
176 
177 // optional
178 #define WEED_LEAF_PACKAGE_NAME "package_name"
179 #define WEED_LEAF_MAINTAINER "maintainer"
180 #define WEED_LEAF_URL "url"
181 #define WEED_LEAF_DESCRIPTION "description"
182 #define WEED_LEAF_ERROR_NUMBER "error_number"
183 #define WEED_LEAF_ERROR_TEXT "error_text"
184 
185 // HOST_INFO
186 // mandatory:
187 #define WEED_LEAF_FILTER_API_VERSION "filter_api_version"
188 #define WEED_LEAF_GET_FUNC "weed_leaf_get_func"
189 #define WEED_LEAF_SET_FUNC "weed_leaf_set_func"
190 #define WEED_LEAF_DELETE_FUNC "weed_leaf_delete_func"
191 #define WEED_PLANT_NEW_FUNC "weed_plant_new_func"
192 #define WEED_PLANT_FREE_FUNC "weed_plant_free_func"
193 #define WEED_PLANT_LIST_LEAVES_FUNC "weed_plant_list_leaves_func"
194 #define WEED_LEAF_NUM_ELEMENTS_FUNC "weed_leaf_num_elements_func"
195 #define WEED_LEAF_ELEMENT_SIZE_FUNC "weed_leaf_element_size_func"
196 #define WEED_LEAF_SEED_TYPE_FUNC "weed_leaf_seed_type_func"
197 #define WEED_LEAF_GET_FLAGS_FUNC "weed_leaf_get_flags_func"
198 #define WEED_LEAF_MALLOC_FUNC "weed_malloc_func"
199 #define WEED_LEAF_FREE_FUNC "weed_free_func"
200 #define WEED_LEAF_MEMSET_FUNC "weed_memset_func"
201 #define WEED_LEAF_MEMCPY_FUNC "weed_memcpy_func"
202 #define WEED_LEAF_MEMMOVE_FUNC "weed_memmove_func"
203 #define WEED_LEAF_CALLOC_FUNC "weed_calloc_func"
204 #define WEED_LEAF_REALLOC_FUNC "weed_realloc_func"
205 
206 // optional //
207 #define WEED_LEAF_HOST_NAME "host_name"
208 #define WEED_LEAF_HOST_VERSION "host_version"
209 #define WEED_LEAF_FLAGS "flags"
210 #define WEED_LEAF_VERBOSITY "verbosity"
211 #define WEED_LEAF_LAYOUT_SCHEMES "layout_schemes"
212 #define WEED_LEAF_PLUGIN_INFO "plugin_info"
213 
214 // FILTER_CLASS
215 // mandatory
216 #define WEED_LEAF_NAME "name"
217 #define WEED_LEAF_AUTHOR "author"
218 /* also WEED_LEAF_VERSION */
219 
220 /* mandatory for filters with video, unless overridden in channel templates */
221 #define WEED_LEAF_PALETTE_LIST "palette_list"
222 
223 // optional
224 #define WEED_LEAF_INIT_FUNC "init_func"
225 #define WEED_LEAF_DEINIT_FUNC "deinit_func"
226 #define WEED_LEAF_PROCESS_FUNC "process_func"
227 #define WEED_LEAF_IN_PARAMETER_TEMPLATES "in_param_tmpls"
228 #define WEED_LEAF_OUT_PARAMETER_TEMPLATES "out_param_tmpls"
229 #define WEED_LEAF_IN_CHANNEL_TEMPLATES "in_chan_tmpls"
230 #define WEED_LEAF_OUT_CHANNEL_TEMPLATES "out_chan_tmpls"
231 #define WEED_LEAF_GUI "gui"
232 #define WEED_LEAF_EXTRA_AUTHORS "extra_authors"
233 #define WEED_LEAF_MICRO_VERSION "micro_version"
234 #define WEED_LEAF_ICON "icon"
235 #define WEED_LEAF_LICENSE "license"
236 #define WEED_LEAF_COPYRIGHT "copyright"
237 
238 /* optional for filters with video channels */
239 #define WEED_LEAF_PREFERRED_FPS "target_fps"
240 #define WEED_LEAF_HSTEP "hstep"
241 #define WEED_LEAF_VSTEP "vstep"
242 #define WEED_LEAF_ALIGNMENT_HINT "alignment_hint"
243 
244 /* optional for filters with video channels (may be overriden in channel templates depending on filter_class flags) */
245 #define WEED_LEAF_WIDTH "width"
246 #define WEED_LEAF_HEIGHT "height"
247 #define WEED_LEAF_MAXWIDTH "maxwidth"
248 #define WEED_LEAF_MAXHEIGHT "maxheight"
249 #define WEED_LEAF_MINWIDTH "minwidth"
250 #define WEED_LEAF_MINHEIGHT "minheight"
251 #define WEED_LEAF_YUV_CLAMPING "YUV_clamping"
252 #define WEED_LEAF_YUV_SAMPLING "YUV_sampling"
253 #define WEED_LEAF_YUV_SUBSPACE "YUV_subspace"
254 #define WEED_LEAF_NATURAL_SIZE "natural_size"
255 #define WEED_LEAF_INNER_SIZE "inner_size"
256 
257 ///
258 /* optional for filters with audio channels (maybe overriden in channel templates depending on filter_class flags) */
259 #define WEED_LEAF_AUDIO_RATE "audio_rate"
260 #define WEED_LEAF_MAX_AUDIO_CHANNELS "max_audio_chans"
261 #define WEED_LEAF_MIN_AUDIO_LENGTH "min_audio_len"
262 #define WEED_LEAF_MAX_AUDIO_LENGTH "max_audio_len"
263 #define WEED_LEAF_CHANNEL_LAYOUTS "channel_layouts"  /// only if set in filter_class or channel_template
264 
265 /* audio channel layouts (default settings) */
266 #ifndef  WEED_CHANNEL_LAYOUT_TYPE
267 #define WEED_CHANNEL_LAYOUT_TYPE "default"
268 #define WEED_CH_FRONT_LEFT 0x00000001
269 #define WEED_CH_FRONT_RIGHT 0x00000002
270 #define WEED_CH_FRONT_CENTER 0x00000004
271 #define WEED_CH_LAYOUT_MONO (WEED_CH_FRONT_CENTER)
272 #define WEED_CH_LAYOUT_STEREO (WEED_CH_FRONT_LEFT | WEED_CH_FRONT_RIGHT)
273 #define WEED_CH_LAYOUT_DEFAULT_1 WEED_CH_LAYOUT_MONO
274 #define WEED_CH_LAYOUT_DEFAULT_2 WEED_CH_LAYOUT_STEREO
275 #define WEED_CH_LAYOUTS_DEFAULT (WEED_CH_LAYOUT_DEFAULT_2, WEED_CH_LAYOUT_DEFAULT_1}
276 #define WEED_CH_LAYOUTS_DEFAULT_MIN2 (WEED_CH_LAYOUT_DEFAULT_2}
277 #endif
278 
279 // FILTER_CLASS GUI
280 #define WEED_LEAF_LAYOUT_SCHEME "layout_scheme"
281 
282 
283 // FILTER_INSTANCE
284 // mandatory
285 #define WEED_LEAF_FILTER_CLASS "filter_class"
286 #define WEED_LEAF_IN_PARAMETERS "in_parameters"
287 #define WEED_LEAF_OUT_PARAMETERS "out_parameters"
288 #define WEED_LEAF_IN_CHANNELS "in_channels"
289 #define WEED_LEAF_OUT_CHANNELS "out_channels"
290   // optional
291 #define WEED_LEAF_FPS "fps"
292 #define WEED_LEAF_TARGET_FPS "target_fps"
293 
294 // instance GUI leaves
295 #define WEED_LEAF_EASE_IN_FRAMES "ease_in_frames" // set by filter in init_func()
296 #define WEED_LEAF_EASE_OUT_FRAMES "ease_out_frames" // set by filter in process_func()
297 
298 #define WEED_LEAF_EASE_IN "ease_in" // host request, set prior to first process_func() call
299 #define WEED_LEAF_EASE_OUT "ease_out" // host request, set prior to andy process_func() call
300 
301 
302 // CHANNEL_TEMPLATE
303 // mandatory
304 /// WEED_LEAF_NAME
305 
306 // mandatory for audio
307 #define WEED_LEAF_IS_AUDIO "is_audio"
308 
309 //optional
310 /// WEED_LEAF_FLAGS
311 /// WEED_LEAF_DESCRIPTION
312 #define WEED_LEAF_MAX_REPEATS "max_repeats"
313 /// WEED_LEAF_PALETTE_LIST
314 
315 
316 // CHANNEL
317 // mandatory
318 #define WEED_LEAF_TEMPLATE "template"
319 /// WEED_LEAF_FLAGS
320 
321 /* mandatory for VIDEO */
322 /// WEED_LEAF_WIDTH
323 /// WEED_LEAF_HEIGHT
324 #define WEED_LEAF_PIXEL_DATA "pixel_data"
325 #define WEED_LEAF_CURRENT_PALETTE "current_palette"
326 #define WEED_LEAF_ROWSTRIDES "rowstrides"
327 
328 // mandatory for AUDIO
329 #define WEED_LEAF_AUDIO_DATA "audio_data"
330 #define WEED_LEAF_AUDIO_DATA_LENGTH "audio_data_len"
331 #define WEED_LEAF_AUDIO_RATE "audio_rate"
332 #define WEED_LEAF_AUDIO_CHANNELS "audio_channels"
333 //#define WEED_LEAF_AUDIO_CHANNEL_LAYOUT "channel_layout"  /// ONLY if set in filter_class or channel_template
334 
335 // optional
336 #define WEED_LEAF_OFFSET "offset" ///< threading
337 #define WEED_LEAF_DISABLED "disabled"
338 
339 /// optional for VIDEO
340 /// WEED_LEAF_YUV_CLAMPING
341 /// WEED_LEAF_YUV_SAMPLING
342 /// WEED_LEAF_YUV_SUBSPACE
343 #define WEED_LEAF_PIXEL_ASPECT_RATIO "par"
344 #define WEED_LEAF_GAMMA_TYPE "gamma_type"
345 #define WEED_LEAF_ALPHA_PREMULTIPLIED "alpha_premult"
346 
347 
348 // PARAM_TEMPLATE
349 // mandatory
350 /// WEED_LEAF_NAME
351 #define WEED_LEAF_DEFAULT "default"
352 #define WEED_LEAF_MIN "min"  /// Mand. for in chans, Opt. for out
353 #define WEED_LEAF_MAX "max"  /// M for in chans, O for out
354 #define WEED_LEAF_PARAM_TYPE "param_type"
355 
356 //optional
357 /// WEED_LEAF_FLAGS
358 /// WEED_LEAF_GUI
359 /// WEED_LEAF_DESCRIPTION
360 #define WEED_LEAF_NEW_DEFAULT "new_default"
361 #define WEED_LEAF_GROUP "group"
362 #define WEED_LEAF_COLORSPACE "colorspace"
363 #define WEED_LEAF_IS_TRANSITION "is_transition"
364 #define WEED_LEAF_IS_VOLUME_MASTER "is_vol_master"
365 
366 // PARAM_TEMPLATE GUI
367 #define WEED_LEAF_WRAP "wrap"
368 #define WEED_LEAF_MAXCHARS "maxchars"
369 #define WEED_LEAF_LABEL "label"
370 #define WEED_LEAF_DECIMALS "decimals"
371 #define WEED_LEAF_STEP_SIZE "step_size"
372 #define WEED_LEAF_USE_MNEMONIC "use_mnemonic"
373 #define WEED_LEAF_CHOICES "choices"
374 #define WEED_LEAF_CHOICES_LANGUAGES "choices_langs"
375 #define WEED_LEAF_HIDDEN "hidden"
376 #define WEED_LEAF_COPY_VALUE_TO "copy_value_to"
377 
378 // PARAM
379 // mandatory
380 #define WEED_LEAF_VALUE "value"
381 
382 // PARAM_GUI
383 #define WEED_LEAF_CHOICES_LANGUAGE "choices_lang"
384 
385 #ifdef __cplusplus
386 }
387 #endif /* __cplusplus */
388 
389 #endif // #ifndef __WEED_EFFECTS_H__
390