21 #include "../libweed/weed-host.h"
22 #include "../libweed/weed.h"
23 #include "../libweed/weed-utils.h"
24 #include "../libweed/weed-effects.h"
25 #include "../libweed/weed-palettes.h"
27 #include <weed/weed-host.h>
28 #include <weed/weed.h>
29 #include <weed/weed-utils.h>
30 #include <weed/weed-effects.h>
31 #include <weed/weed-palettes.h>
36 #ifndef WEED_GLOBAL_INLINE
37 #define WEED_GLOBAL_INLINE inline
40 #ifndef WEED_LOCAL_INLINE
41 #define WEED_LOCAL_INLINE static inline
45 if (!plant)
return WEED_PLANT_UNKNOWN;
46 return weed_get_int_value(plant, WEED_LEAF_TYPE, NULL);
52 flags = weed_leaf_get_flags(plant, leaf);
53 weed_leaf_set_flags(plant, leaf, flags | flagbits);
61 flags = weed_leaf_get_flags(plant, leaf);
62 weed_leaf_set_flags(plant, leaf, flags & ~flagbits);
70 size_t ign_prefix_len = 0;
71 char **leaves = weed_plant_list_leaves(plant, NULL);
73 if (ign_prefix) ign_prefix_len = strlen(ign_prefix);
74 for (
register int i = 0; leaves[i]; i++) {
75 if (!ign_prefix || strncmp(leaves[i], ign_prefix, ign_prefix_len)) {
88 size_t ign_prefix_len = 0;
89 char **leaves = weed_plant_list_leaves(plant, NULL);
91 if (ign_prefix) ign_prefix_len = strlen(ign_prefix);
92 for (
register int i = 0; leaves[i]; i++) {
93 if (!ign_prefix || strncmp(leaves[i], ign_prefix, ign_prefix_len)) {
104 weed_plant_t *gui = NULL;
106 if (type != WEED_PLANT_FILTER_CLASS && type != WEED_PLANT_PARAMETER_TEMPLATE
107 && type != WEED_PLANT_PARAMETER && type != WEED_PLANT_FILTER_INSTANCE)
return NULL;
108 gui = weed_get_plantptr_value(plant, WEED_LEAF_GUI, NULL);
109 if (!gui && create_if_not_exists == WEED_TRUE) {
110 gui = weed_plant_new(WEED_PLANT_GUI);
111 weed_leaf_set(plant, WEED_LEAF_GUI, WEED_SEED_PLANTPTR, 1, &gui);
118 return weed_get_int_value(hinfo, WEED_LEAF_FLAGS, NULL);
123 weed_set_int_value(hinfo, WEED_LEAF_FLAGS, flags);
128 weed_set_int_value(hinfo, WEED_LEAF_VERBOSITY, verbosity);
143 return weed_get_string_value(pinfo, WEED_LEAF_PACKAGE_NAME, NULL);
151 return weed_get_plantptr_value(filter, WEED_LEAF_PLUGIN_INFO, NULL);
173 return weed_get_boolean_value(gui, WEED_LEAF_HIDDEN, NULL);
178 return weed_get_int_value(filter, WEED_LEAF_FLAGS, NULL);
235 && weed_get_boolean_value(gui, WEED_LEAF_HIDDEN, NULL) == WEED_TRUE)
242 return weed_get_string_value(filter, WEED_LEAF_NAME, NULL);
246 if (ntmpls) *ntmpls = 0;
248 return weed_get_plantptr_array_counted(filter, WEED_LEAF_IN_CHANNEL_TEMPLATES, ntmpls);
252 if (ntmpls) *ntmpls = 0;
254 return weed_get_plantptr_array_counted(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES, ntmpls);
258 if (ntmpls) *ntmpls = 0;
260 return weed_get_plantptr_array_counted(filter, WEED_LEAF_IN_PARAMETER_TEMPLATES, ntmpls);
264 if (ntmpls) *ntmpls = 0;
266 return weed_get_plantptr_array_counted(filter, WEED_LEAF_OUT_PARAMETER_TEMPLATES, ntmpls);
287 return weed_get_string_value(chantmpl, WEED_LEAF_NAME, NULL);
292 return weed_get_int_value(chantmpl, WEED_LEAF_FLAGS, NULL);
297 return weed_get_int_value(chantmpl, WEED_LEAF_MAX_AUDIO_LENGTH, NULL);
302 return weed_get_int_value(paramtmpl, WEED_LEAF_FLAGS, NULL);
308 return weed_leaf_seed_type(paramtmpl, WEED_LEAF_NEW_DEFAULT);
309 return weed_leaf_seed_type(paramtmpl, WEED_LEAF_DEFAULT);
314 return weed_get_int_value(paramtmpl, WEED_LEAF_PARAM_TYPE, NULL);
319 return weed_get_string_value(paramtmpl, WEED_LEAF_NAME, NULL);
338 && weed_get_boolean_value(gui, WEED_LEAF_WRAP, NULL) == WEED_TRUE)
return WEED_TRUE;
346 && weed_plant_has_leaf(gui, WEED_LEAF_CHOICES))
355 && weed_get_boolean_value(gui, WEED_LEAF_HIDDEN, NULL) == WEED_TRUE)
376 if (weed_plant_has_leaf(chantmpl, WEED_LEAF_MAX_REPEATS))
377 return weed_get_int_value(chantmpl, WEED_LEAF_MAX_REPEATS, NULL);
383 return weed_get_boolean_value(chantmpl, WEED_LEAF_IS_AUDIO, NULL);
388 if (nvals) *nvals = 0;
391 && weed_plant_has_leaf(chantmpl, WEED_LEAF_PALETTE_LIST)) {
392 pals = weed_get_int_array_counted(chantmpl, WEED_LEAF_PALETTE_LIST, &npals);
393 for (
register int i = 0; i < npals; i++) {
396 if (!weed_plant_has_leaf(filter, WEED_LEAF_PALETTE_LIST))
return NULL;
397 pals = weed_get_int_array_counted(filter, WEED_LEAF_PALETTE_LIST, &npals);
399 if (npals > 0 && pals[npals - 1] == WEED_PALETTE_END) npals--;
400 if (nvals) *nvals = npals;
406 return weed_get_voidptr_value(channel, WEED_LEAF_PIXEL_DATA, NULL);
410 if (nplanes) *nplanes = 0;
412 return weed_get_voidptr_array_counted(channel, WEED_LEAF_PIXEL_DATA, NULL);
418 return weed_get_int_value(channel, WEED_LEAF_WIDTH, NULL);
424 weed_set_int_value(channel, WEED_LEAF_WIDTH, width);
434 return weed_get_int_value(channel, WEED_LEAF_HEIGHT, NULL);
439 weed_set_int_value(channel, WEED_LEAF_HEIGHT, height);
444 weed_set_int_value(channel, WEED_LEAF_WIDTH, width);
445 weed_set_int_value(channel, WEED_LEAF_HEIGHT, height);
450 weed_set_int_value(channel, WEED_LEAF_CURRENT_PALETTE,
palette);
455 return weed_get_int_value(channel, WEED_LEAF_CURRENT_PALETTE, NULL);
460 return weed_get_int_value(channel, WEED_LEAF_GAMMA_TYPE, NULL);
465 weed_set_int_value(channel, WEED_LEAF_GAMMA_TYPE, gamma_type);
474 if (clamping) *clamping = weed_get_int_value(channel, WEED_LEAF_YUV_CLAMPING, NULL);
475 if (sampling) *sampling = weed_get_int_value(channel, WEED_LEAF_YUV_SAMPLING, NULL);
476 if (subspace) *subspace = weed_get_int_value(channel, WEED_LEAF_YUV_SUBSPACE, NULL);
484 return weed_get_int_value(channel, WEED_LEAF_ROWSTRIDES, NULL);
488 if (nplanes) *nplanes = 0;
490 return weed_get_int_array_counted(channel, WEED_LEAF_ROWSTRIDES, nplanes);
495 return weed_get_int_value(channel, WEED_LEAF_AUDIO_RATE, NULL);
500 return weed_get_int_value(channel, WEED_LEAF_AUDIO_CHANNELS, NULL);
505 return weed_get_int_value(channel, WEED_LEAF_AUDIO_DATA_LENGTH, NULL);
510 return weed_get_boolean_value(channel, WEED_LEAF_DISABLED, NULL);
515 return weed_get_plantptr_value(channel, WEED_LEAF_TEMPLATE, NULL);
520 return weed_get_plantptr_value(param, WEED_LEAF_TEMPLATE, NULL);
556 if ((gui =
weed_param_get_gui(param, WEED_FALSE)) != NULL && weed_plant_has_leaf(gui, WEED_LEAF_CHOICES))
557 return weed_leaf_num_elements(gui, WEED_LEAF_CHOICES);
559 && weed_plant_has_leaf(gui, WEED_LEAF_CHOICES))
560 return weed_leaf_num_elements(gui, WEED_LEAF_CHOICES);
565 if (naudchans) *naudchans = 0;
567 return (
float **)weed_get_voidptr_array_counted(channel, WEED_LEAF_AUDIO_DATA, naudchans);
571 int arate,
int naudchans,
int nsamps) {
573 weed_set_voidptr_array(channel, WEED_LEAF_AUDIO_DATA, naudchans, (
void **)data);
574 weed_set_int_value(channel, WEED_LEAF_AUDIO_RATE, arate);
575 weed_set_int_value(channel, WEED_LEAF_AUDIO_DATA_LENGTH, nsamps);
576 weed_set_int_value(channel, WEED_LEAF_AUDIO_CHANNELS, naudchans);
582 return weed_get_int_value(inst, WEED_LEAF_FLAGS, NULL);
587 weed_set_int_value(inst, WEED_LEAF_FLAGS, flags);
591 if (nchans) *nchans = 0;
593 return weed_get_plantptr_array_counted(instance, WEED_LEAF_IN_CHANNELS, nchans);
597 if (nchans) *nchans = 0;
599 return weed_get_plantptr_array_counted(instance, WEED_LEAF_OUT_CHANNELS, nchans);
603 if (nparams) *nparams = 0;
605 return weed_get_plantptr_array_counted(instance, WEED_LEAF_IN_PARAMETERS, nparams);
609 if (nparams) *nparams = 0;
611 return weed_get_plantptr_array_counted(instance, WEED_LEAF_OUT_PARAMETERS, nparams);
616 return weed_get_int_value(param, WEED_LEAF_VALUE, NULL);
621 return weed_get_boolean_value(param, WEED_LEAF_VALUE, NULL);
626 return weed_get_double_value(param, WEED_LEAF_VALUE, NULL);
631 return weed_get_int64_value(param, WEED_LEAF_VALUE, NULL);
636 if (weed_leaf_num_elements(param, WEED_LEAF_VALUE) == 0)
return NULL;
637 return weed_get_string_value(param, WEED_LEAF_VALUE, NULL);
642 return weed_get_int_value(gui, WEED_LEAF_FLAGS, NULL);
650 case (WEED_ERROR_MEMORY_ALLOCATION):
651 return strdup(
"Memory allocation error");
653 return strdup(
"Thread concurrency failure");
654 case (WEED_ERROR_IMMUTABLE):
655 return strdup(
"Read only property");
656 case (WEED_ERROR_UNDELETABLE):
657 return strdup(
"Undeletable property");
658 case (WEED_ERROR_BADVERSION):
659 return strdup(
"Bad version number");
660 case (WEED_ERROR_NOSUCH_ELEMENT):
661 return strdup(
"Invalid element");
662 case (WEED_ERROR_NOSUCH_LEAF):
663 return strdup(
"Invalid property");
664 case (WEED_ERROR_WRONG_SEED_TYPE):
665 return strdup(
"Incorrect property type");
666 case (WEED_ERROR_TOO_MANY_INSTANCES):
667 return strdup(
"Too many instances");
668 case (WEED_ERROR_PLUGIN_INVALID):
669 return strdup(
"Fatal plugin error");
670 case (WEED_ERROR_FILTER_INVALID):
671 return strdup(
"Invalid filter in plugin");
672 case (WEED_ERROR_REINIT_NEEDED):
673 return strdup(
"Filter needs reiniting");
677 return strdup(
"No error");
683 return strdup(
"integer");
684 case WEED_SEED_INT64:
685 return strdup(
"int64");
686 case WEED_SEED_BOOLEAN:
687 return strdup(
"boolean");
688 case WEED_SEED_DOUBLE:
689 return strdup(
"double");
690 case WEED_SEED_STRING:
691 return strdup(
"string");
692 case WEED_SEED_FUNCPTR:
693 return strdup(
"function pointer");
694 case WEED_SEED_VOIDPTR:
695 return strdup(
"void *");
696 case WEED_SEED_PLANTPTR:
697 return strdup(
"weed_plant_t *");
699 return strdup(
"custom pointer type");
705 case WEED_PALETTE_RGB24:
707 case WEED_PALETTE_RGBA32:
709 case WEED_PALETTE_BGR24:
711 case WEED_PALETTE_BGRA32:
713 case WEED_PALETTE_ARGB32:
715 case WEED_PALETTE_RGBFLOAT:
717 case WEED_PALETTE_RGBAFLOAT:
719 case WEED_PALETTE_YUV888:
721 case WEED_PALETTE_YUVA8888:
723 case WEED_PALETTE_YUV444P:
725 case WEED_PALETTE_YUVA4444P:
727 case WEED_PALETTE_YUV422P:
729 case WEED_PALETTE_YUV420P:
731 case WEED_PALETTE_YVU420P:
733 case WEED_PALETTE_YUV411:
735 case WEED_PALETTE_UYVY8888:
737 case WEED_PALETTE_YUYV8888:
739 case WEED_PALETTE_A8:
740 return "8 BIT ALPHA";
741 case WEED_PALETTE_A1:
742 return "1 BIT ALPHA";
743 case WEED_PALETTE_AFLOAT:
744 return "FLOAT ALPHA";
746 if (pal >= 2048)
return "custom";
752 if (clamping == WEED_YUV_CLAMPING_UNCLAMPED)
return "unclamped";
753 if (clamping == WEED_YUV_CLAMPING_CLAMPED)
return "clamped";
758 if (subspace == WEED_YUV_SUBSPACE_YUV)
return "Y'UV";
759 if (subspace == WEED_YUV_SUBSPACE_YCBCR)
return "Y'CbCr";
760 if (subspace == WEED_YUV_SUBSPACE_BT709)
return "BT.709";
771 return strdup(pname);
775 if (gamma == WEED_GAMMA_LINEAR)
return "linear";
776 if (gamma == WEED_GAMMA_SRGB)
return "sRGB";
777 if (gamma == WEED_GAMMA_BT709)
return "bt709";
781 #ifndef WEED_ADVANCED_PALETTES
784 if (pal == WEED_PALETTE_A8 || pal == WEED_PALETTE_YUV420P || pal == WEED_PALETTE_YVU420P ||
785 pal == WEED_PALETTE_YUV422P || pal == WEED_PALETTE_YUV444P || pal == WEED_PALETTE_YUVA4444P)
return 8;
786 if (pal == WEED_PALETTE_RGB24 || pal == WEED_PALETTE_BGR24)
return 24;
787 if (pal == WEED_PALETTE_RGBA32 || pal == WEED_PALETTE_BGRA32 || pal == WEED_PALETTE_ARGB32 ||
788 pal == WEED_PALETTE_UYVY8888 || pal == WEED_PALETTE_YUYV8888 || pal == WEED_PALETTE_YUV888
789 || pal == WEED_PALETTE_YUVA8888)
791 if (pal == WEED_PALETTE_YUV411)
return 48;
792 if (pal == WEED_PALETTE_AFLOAT)
return sizeof(float);
793 if (pal == WEED_PALETTE_A1)
return 1;
794 if (pal == WEED_PALETTE_RGBFLOAT)
return (3 *
sizeof(
float));
795 if (pal == WEED_PALETTE_RGBAFLOAT)
return (4 *
sizeof(
float));
813 for (i = 0; i < nplanes; i++) {
835 && (flags & WEED_FILTER_AUDIO_RATES_MAY_VARY))
return WEED_TRUE;