(Note: this commit also modifies the obs-filters and test-input modules) Changes the obs_source_process_filter_begin return type so that it returns true/false to indicate that filter processing should or should not continue (for example if the filter is bypassed or if there's some other sort of issue that causes the filtering to fail)
72 lines
1.3 KiB
C
72 lines
1.3 KiB
C
#include <obs-module.h>
|
|
|
|
struct test_filter {
|
|
obs_source_t *source;
|
|
gs_effect_t *whatever;
|
|
};
|
|
|
|
static const char *filter_getname(void)
|
|
{
|
|
return "Test";
|
|
}
|
|
|
|
static void filter_destroy(void *data)
|
|
{
|
|
struct test_filter *tf = data;
|
|
|
|
if (tf) {
|
|
obs_enter_graphics();
|
|
|
|
gs_effect_destroy(tf->whatever);
|
|
bfree(tf);
|
|
|
|
obs_leave_graphics();
|
|
}
|
|
}
|
|
|
|
static void *filter_create(obs_data_t *settings, obs_source_t *source)
|
|
{
|
|
struct test_filter *tf = bzalloc(sizeof(struct test_filter));
|
|
char *effect_file;
|
|
|
|
obs_enter_graphics();
|
|
|
|
effect_file = obs_module_file("test.effect");
|
|
|
|
tf->source = source;
|
|
tf->whatever = gs_effect_create_from_file(effect_file, NULL);
|
|
bfree(effect_file);
|
|
if (!tf->whatever) {
|
|
filter_destroy(tf);
|
|
tf = NULL;
|
|
}
|
|
|
|
obs_leave_graphics();
|
|
|
|
UNUSED_PARAMETER(settings);
|
|
return tf;
|
|
}
|
|
|
|
static void filter_render(void *data, gs_effect_t *effect)
|
|
{
|
|
struct test_filter *tf = data;
|
|
|
|
if (!obs_source_process_filter_begin(tf->source, GS_RGBA,
|
|
OBS_ALLOW_DIRECT_RENDERING))
|
|
return;
|
|
|
|
obs_source_process_filter_end(tf->source, tf->whatever, 0, 0);
|
|
|
|
UNUSED_PARAMETER(effect);
|
|
}
|
|
|
|
struct obs_source_info test_filter = {
|
|
.id = "test_filter",
|
|
.type = OBS_SOURCE_TYPE_FILTER,
|
|
.output_flags = OBS_SOURCE_VIDEO,
|
|
.get_name = filter_getname,
|
|
.create = filter_create,
|
|
.destroy = filter_destroy,
|
|
.video_render = filter_render
|
|
};
|