add major optimization to filter processing, and as a nice side effect, make it easier to create new filters and sources

This commit is contained in:
jp9000
2013-12-22 01:30:18 -07:00
parent 5471625dd7
commit 19c4ee995e
9 changed files with 148 additions and 64 deletions

View File

@@ -55,31 +55,6 @@ void test_video_tick(struct test_filter *tf, float seconds)
void test_video_render(struct test_filter *tf)
{
obs_source_t filter_target = obs_filter_gettarget(tf->source);
int cx = obs_source_getwidth(filter_target);
int cy = obs_source_getheight(filter_target);
float fcx = (float)cx;
float fcy = (float)cy;
technique_t tech;
texture_t tex;
if (texrender_begin(tf->texrender, cx, cy)) {
gs_ortho(0.0f, fcx, 0.0f, fcy, -100.0f, 100.0f);
obs_source_video_render(filter_target);
texrender_end(tf->texrender);
}
/* --------------------------- */
tex = texrender_gettexture(tf->texrender);
tech = effect_gettechnique(tf->whatever, "Default");
effect_settexture(tf->whatever, effect_getparambyidx(tf->whatever, 1),
tex);
technique_begin(tech);
technique_beginpass(tech, 0);
gs_draw_sprite(tex, 0, 0, 0);
technique_endpass(tech);
technique_end(tech);
obs_source_process_filter(tf->source, tf->texrender, tf->whatever,
0, 0);
}

View File

@@ -10,7 +10,6 @@ struct random_tex *random_create(const char *settings, obs_source_t source)
{
struct random_tex *rt = bmalloc(sizeof(struct random_tex));
uint32_t *pixels = bmalloc(20*20*4);
char *effect_file;
size_t x, y;
memset(rt, 0, sizeof(struct random_tex));
@@ -37,15 +36,6 @@ struct random_tex *random_create(const char *settings, obs_source_t source)
return NULL;
}
effect_file = obs_find_plugin_file("test-input/draw.effect");
rt->whatever = gs_create_effect_from_file(effect_file, NULL);
bfree(effect_file);
if (!rt->whatever) {
random_destroy(rt);
return NULL;
}
gs_leavecontext();
return rt;
@@ -56,7 +46,6 @@ void random_destroy(struct random_tex *rt)
if (rt) {
gs_entercontext(obs_graphics());
effect_destroy(rt->whatever);
texture_destroy(rt->texture);
bfree(rt);
@@ -66,21 +55,16 @@ void random_destroy(struct random_tex *rt)
uint32_t random_get_output_flags(struct random_tex *rt)
{
return SOURCE_VIDEO;
return SOURCE_VIDEO | SOURCE_DEFAULT_EFFECT;
}
void random_video_render(struct random_tex *rt, obs_source_t filter_target)
{
technique_t tech = effect_gettechnique(rt->whatever, "Default");
effect_settexture(rt->whatever, effect_getparambyidx(rt->whatever, 1),
rt->texture);
technique_begin(tech);
technique_beginpass(tech, 0);
effect_t effect = gs_geteffect();
eparam_t diffuse = effect_getparambyname(effect, "diffuse");
effect_settexture(effect, diffuse, rt->texture);
gs_draw_sprite(rt->texture, 0, 0, 0);
technique_endpass(tech);
technique_end(tech);
}
uint32_t random_getwidth(struct random_tex *rt)

View File

@@ -8,16 +8,17 @@ extern "C" {
struct random_tex {
texture_t texture;
effect_t whatever;
};
EXPORT const char *random_getname(const char *locale);
EXPORT struct random_tex *random_create(const char *settings, obs_source_t source);
EXPORT struct random_tex *random_create(const char *settings,
obs_source_t source);
EXPORT void random_destroy(struct random_tex *rt);
EXPORT uint32_t random_get_output_flags(struct random_tex *rt);
EXPORT void random_video_render(struct random_tex *rt, obs_source_t filter_target);
EXPORT void random_video_render(struct random_tex *rt,
obs_source_t filter_target);
EXPORT uint32_t random_getwidth(struct random_tex *rt);
EXPORT uint32_t random_getheight(struct random_tex *rt);