mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 20:59:44 +00:00
glfilter: rewrite subclasses for filter_texture() occuring on GL thread
There's no need for the jump to an extra thread in most cases, especially when relying solely on a shader to render. We can use the provided render_to_target() functions to simplify filter writing.
This commit is contained in:
parent
6edd89c883
commit
5da138d1ae
30 changed files with 442 additions and 1391 deletions
|
@ -40,79 +40,29 @@ gst_gl_effects_blur_kernel (void)
|
|||
return kernel;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_blur_callback_hconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
|
||||
hconv7_fragment_source_gles2))) {
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
|
||||
gst_gl_effects_blur_kernel ());
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_blur_callback_vconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
|
||||
vconv7_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
|
||||
gst_gl_effects_blur_kernel ());
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_blur (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->midtexture[0], gst_gl_effects_blur_callback_hconv, effects);
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
|
||||
effects->outtexture, gst_gl_effects_blur_callback_vconv, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
|
||||
hconv7_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->in_info));
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
|
||||
gst_gl_effects_blur_kernel ());
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->midtexture[0], shader);
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
|
||||
vconv7_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->in_info));
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
|
||||
gst_gl_effects_blur_kernel ());
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_bulge_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
|
||||
bulge_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_bulge (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_bulge_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
|
||||
bulge_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_fisheye_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
|
||||
fisheye_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_fisheye (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_fisheye_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
|
||||
fisheye_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -26,170 +26,61 @@
|
|||
static gboolean kernel_ready = FALSE;
|
||||
static float gauss_kernel[7];
|
||||
|
||||
static void
|
||||
gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
void
|
||||
gst_gl_effects_glow (GstGLEffects * effects)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
|
||||
luma_threshold_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
|
||||
hconv7_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
if (!kernel_ready) {
|
||||
fill_gaussian_kernel (gauss_kernel, 7, 10.0);
|
||||
kernel_ready = TRUE;
|
||||
}
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* threshold */
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
|
||||
luma_threshold_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->midtexture[0], shader);
|
||||
|
||||
/* blur */
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
|
||||
hconv7_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
|
||||
effects->midtexture[1], shader);
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
|
||||
vconv7_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_glow_step_four (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
|
||||
effects->midtexture[2], shader);
|
||||
|
||||
/* add blurred luma to intexture */
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sum",
|
||||
sum_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->intexture->tex_id);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (effects->intexture));
|
||||
|
||||
gst_gl_shader_set_uniform_1f (shader, "alpha", 1.0f);
|
||||
gst_gl_shader_set_uniform_1i (shader, "base", 2);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (effects->midtexture[2]));
|
||||
|
||||
gst_gl_shader_set_uniform_1f (shader, "beta", (gfloat) 1 / 3.5f);
|
||||
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_glow (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
/* threshold */
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->midtexture[0], gst_gl_effects_glow_step_one, effects);
|
||||
|
||||
/* blur */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
|
||||
effects->midtexture[1], gst_gl_effects_glow_step_two, effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[1],
|
||||
effects->midtexture[2], gst_gl_effects_glow_step_three, effects);
|
||||
|
||||
/* add blurred luma to intexture */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[2],
|
||||
effects->outtexture, gst_gl_effects_glow_step_four, effects);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[2],
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,23 +23,13 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_identity_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
void
|
||||
gst_gl_effects_identity (GstGLEffects * effects)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
GstGLShader *shader;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
shader = g_hash_table_lookup (effects->shaderstable, "identity0");
|
||||
if (!shader) {
|
||||
GError *error = NULL;
|
||||
|
@ -50,28 +40,10 @@ gst_gl_effects_identity_callback (gint width, gint height, guint texture,
|
|||
return;
|
||||
}
|
||||
|
||||
filter->draw_attr_position_loc =
|
||||
gst_gl_shader_get_attribute_location (shader, "a_position");
|
||||
filter->draw_attr_texture_loc =
|
||||
gst_gl_shader_get_attribute_location (shader, "a_texcoord");
|
||||
|
||||
g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader);
|
||||
}
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_identity (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_identity_callback, effects);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -25,48 +25,28 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_laplacian_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
|
||||
conv9_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
static gfloat kernel[9] = { 0.0, -1.0, 0.0,
|
||||
-1.0, 4.0, -1.0,
|
||||
0.0, -1.0, 0.0
|
||||
};
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height", height);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width", width);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
static gfloat kernel[9] = {
|
||||
0.0, -1.0, 0.0,
|
||||
-1.0, 4.0, -1.0,
|
||||
0.0, -1.0, 0.0
|
||||
};
|
||||
|
||||
void
|
||||
gst_gl_effects_laplacian (GstGLEffects * effects)
|
||||
{
|
||||
gst_gl_filter_render_to_target (GST_GL_FILTER (effects), TRUE,
|
||||
effects->intexture, effects->outtexture,
|
||||
gst_gl_effects_laplacian_callback, effects);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
|
||||
conv9_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->in_info));
|
||||
gst_gl_shader_set_uniform_1f (shader, "width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->in_info));
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
|
||||
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -26,13 +26,13 @@
|
|||
|
||||
void
|
||||
gst_gl_effects_luma_to_curve (GstGLEffects * effects,
|
||||
const GstGLEffectsCurve * curve,
|
||||
gint curve_index, gint width, gint height, GLuint texture)
|
||||
const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
|
||||
GstGLMemory * out_tex)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
const GstGLFuncs *gl = context->gl_vtable;
|
||||
GstGLShader *shader;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "luma_to_curve",
|
||||
luma_to_curve_fragment_source_gles2);
|
||||
|
@ -47,112 +47,46 @@ gst_gl_effects_luma_to_curve (GstGLEffects * effects,
|
|||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
if (effects->curve[curve_index] == 0) {
|
||||
/* this parameters are needed to have a right, predictable, mapping */
|
||||
gl->GenTextures (1, &effects->curve[curve_index]);
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
gl->TexImage1D (GL_TEXTURE_1D, 0, curve->bytes_per_pixel,
|
||||
curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
#endif
|
||||
if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
|
||||
curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
}
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 2);
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 1);
|
||||
}
|
||||
#endif
|
||||
if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 1);
|
||||
gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
|
||||
curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
gst_gl_shader_use (shader);
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
|
||||
static void
|
||||
gst_gl_effects_heat_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 2);
|
||||
|
||||
gst_gl_effects_luma_to_curve (effects, &heat_curve, GST_GL_EFFECTS_CURVE_HEAT,
|
||||
width, height, texture);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_heat (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_heat_callback, effects);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_sepia_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
|
||||
gst_gl_effects_luma_to_curve (effects, &sepia_curve,
|
||||
GST_GL_EFFECTS_CURVE_SEPIA, width, height, texture);
|
||||
gst_gl_effects_luma_to_curve (effects, &heat_curve,
|
||||
GST_GL_EFFECTS_CURVE_HEAT, effects->intexture, effects->outtexture);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_sepia (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_sepia_callback, effects);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_luma_xpro_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
|
||||
gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
|
||||
GST_GL_EFFECTS_CURVE_LUMA_XPRO, width, height, texture);
|
||||
gst_gl_effects_luma_to_curve (effects, &sepia_curve,
|
||||
GST_GL_EFFECTS_CURVE_SEPIA, effects->intexture, effects->outtexture);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_luma_xpro (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_luma_xpro_callback, effects);
|
||||
gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
|
||||
GST_GL_EFFECTS_CURVE_LUMA_XPRO, effects->intexture, effects->outtexture);
|
||||
}
|
||||
|
|
|
@ -28,8 +28,8 @@ G_BEGIN_DECLS
|
|||
void gst_gl_effects_luma_to_curve (GstGLEffects *effects,
|
||||
const GstGLEffectsCurve *curve,
|
||||
gint curve_index,
|
||||
gint width, gint height,
|
||||
GLuint texture);
|
||||
GstGLMemory *in_tex,
|
||||
GstGLMemory *out_tex);
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_GL_LUMA_TO_CURVE_H__ */
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_mirror_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLFilter *filter = GST_GL_FILTER (data);
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (filter);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
|
||||
mirror_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_mirror (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_mirror_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
|
||||
mirror_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -26,13 +26,13 @@
|
|||
|
||||
static void
|
||||
gst_gl_effects_rgb_to_curve (GstGLEffects * effects,
|
||||
const GstGLEffectsCurve * curve,
|
||||
gint curve_index, gint width, gint height, GLuint texture)
|
||||
const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
|
||||
GstGLMemory * out_tex)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
const GstGLFuncs *gl = context->gl_vtable;
|
||||
GstGLShader *shader;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "rgb_to_curve",
|
||||
rgb_to_curve_fragment_source_gles2);
|
||||
|
@ -47,73 +47,32 @@ gst_gl_effects_rgb_to_curve (GstGLEffects * effects,
|
|||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
if (effects->curve[curve_index] == 0) {
|
||||
/* this parameters are needed to have a right, predictable, mapping */
|
||||
gl->GenTextures (1, &effects->curve[curve_index]);
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
gl->TexImage1D (GL_TEXTURE_1D, 0, GL_RGB,
|
||||
curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
#endif
|
||||
if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
|
||||
curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
}
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 1);
|
||||
}
|
||||
#endif
|
||||
if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 1);
|
||||
gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
|
||||
curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
|
||||
}
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
gst_gl_shader_use (shader);
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
|
||||
|
||||
static void
|
||||
gst_gl_effects_xpro_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
gst_gl_shader_set_uniform_1i (shader, "curve", 2);
|
||||
|
||||
gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
|
||||
width, height, texture);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_xpro (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_xpro_callback, effects);
|
||||
gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
|
||||
effects->intexture, effects->outtexture);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_sin_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sin",
|
||||
sin_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_sin (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_sin_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sin",
|
||||
sin_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -25,144 +25,37 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_sobel_callback_desaturate (gint width, gint height,
|
||||
guint texture, gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
|
||||
desaturate_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_sobel_callback_hconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
|
||||
sep_sobel_hconv3_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width", width);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_sobel_callback_vconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
|
||||
sep_sobel_vconv3_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height", height);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_sobel_callback_length (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader = NULL;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "len0",
|
||||
sep_sobel_length_fragment_source_gles2))) {
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_sobel (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE,
|
||||
effects->intexture, effects->midtexture[0],
|
||||
gst_gl_effects_sobel_callback_desaturate, effects);
|
||||
gst_gl_filter_render_to_target (filter, FALSE,
|
||||
effects->midtexture[0], effects->midtexture[1],
|
||||
gst_gl_effects_sobel_callback_hconv, effects);
|
||||
gst_gl_filter_render_to_target (filter, FALSE,
|
||||
effects->midtexture[1], effects->midtexture[0],
|
||||
gst_gl_effects_sobel_callback_vconv, effects);
|
||||
gst_gl_filter_render_to_target (filter, FALSE,
|
||||
effects->midtexture[0], effects->outtexture,
|
||||
gst_gl_effects_sobel_callback_length, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
|
||||
desaturate_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->midtexture[0], shader);
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
|
||||
sep_sobel_hconv3_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
|
||||
effects->midtexture[1], shader);
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
|
||||
sep_sobel_vconv3_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
|
||||
effects->midtexture[0], shader);
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "len0",
|
||||
sep_sobel_length_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_square_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "square",
|
||||
square_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_square (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_square_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "square",
|
||||
square_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_squeeze_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLFilter *filter = GST_GL_FILTER (data);
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
|
||||
squeeze_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_squeeze (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_squeeze_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
|
||||
squeeze_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,43 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_stretch_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
|
||||
stretch_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_stretch (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_stretch_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
|
||||
stretch_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_tunnel_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
|
||||
tunnel_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_tunnel (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_tunnel_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
|
||||
tunnel_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -23,44 +23,14 @@
|
|||
|
||||
#include "../gstgleffects.h"
|
||||
|
||||
static void
|
||||
gst_gl_effects_twirl_callback (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
|
||||
twirl_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_twirl (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLShader *shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->outtexture, gst_gl_effects_twirl_callback, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
|
||||
twirl_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -28,297 +28,97 @@
|
|||
static gboolean kernel_ready = FALSE;
|
||||
static float gauss_kernel[7];
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
void
|
||||
gst_gl_effects_xray (GstGLEffects * effects)
|
||||
{
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
|
||||
gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
|
||||
width, height, texture);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_step_two (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
|
||||
hconv7_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
GstGLShader *shader;
|
||||
|
||||
if (!kernel_ready) {
|
||||
fill_gaussian_kernel (gauss_kernel, 7, 1.5);
|
||||
kernel_ready = TRUE;
|
||||
}
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_step_three (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
|
||||
vconv7_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
/* multipass separable sobel */
|
||||
static void
|
||||
gst_gl_effects_xray_desaturate (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
|
||||
desaturate_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_sobel_hconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
|
||||
sep_sobel_hconv3_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width", width);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_sobel_vconv (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
|
||||
sep_sobel_vconv3_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height", height);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_sobel_length (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
|
||||
sep_sobel_length_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", TRUE);
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
/* end of sobel passes */
|
||||
|
||||
static void
|
||||
gst_gl_effects_xray_step_five (gint width, gint height, guint texture,
|
||||
gpointer data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLEffects *effects = GST_GL_EFFECTS (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
|
||||
multiply_fragment_source_gles2);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
gl->MatrixMode (GL_PROJECTION);
|
||||
gl->LoadIdentity ();
|
||||
}
|
||||
#endif
|
||||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[2]->tex_id);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "base", 2);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1f (shader, "alpha", (gfloat) 0.5f);
|
||||
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
void
|
||||
gst_gl_effects_xray (GstGLEffects * effects)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (effects);
|
||||
|
||||
/* map luma to xray curve */
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->midtexture[0], gst_gl_effects_xray_step_one, effects);
|
||||
gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
|
||||
effects->intexture, effects->midtexture[0]);
|
||||
|
||||
/* horizontal blur */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
|
||||
effects->midtexture[1], gst_gl_effects_xray_step_two, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
|
||||
hconv7_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->in_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
|
||||
effects->midtexture[1], shader);
|
||||
|
||||
/* vertical blur */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[1],
|
||||
effects->midtexture[2], gst_gl_effects_xray_step_three, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
|
||||
vconv7_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
||||
gst_gl_shader_set_uniform_1f (shader, "gauss_height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
|
||||
effects->midtexture[2], shader);
|
||||
|
||||
/* detect edges with Sobel */
|
||||
/* the old version used edges from the blurred texture, this uses
|
||||
* the ones from original texture, still not sure what I like
|
||||
* more. This one gives better edges obviously but behaves badly
|
||||
* with noise */
|
||||
/* desaturate */
|
||||
gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
|
||||
effects->midtexture[3], gst_gl_effects_xray_desaturate, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
|
||||
desaturate_fragment_source_gles2);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
|
||||
effects->midtexture[3], shader);
|
||||
|
||||
/* horizonal convolution */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[3],
|
||||
effects->midtexture[4], gst_gl_effects_xray_sobel_hconv, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
|
||||
sep_sobel_hconv3_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
|
||||
effects->midtexture[4], shader);
|
||||
|
||||
/* vertical convolution */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[4],
|
||||
effects->midtexture[3], gst_gl_effects_xray_sobel_vconv, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
|
||||
sep_sobel_vconv3_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
|
||||
effects->midtexture[3], shader);
|
||||
|
||||
/* gradient length */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[3],
|
||||
effects->midtexture[4], gst_gl_effects_xray_sobel_length, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
|
||||
sep_sobel_length_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
gst_gl_shader_set_uniform_1i (shader, "invert", TRUE);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
|
||||
effects->midtexture[4], shader);
|
||||
|
||||
/* multiply edges with the blurred image */
|
||||
gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[4],
|
||||
effects->outtexture, gst_gl_effects_xray_step_five, effects);
|
||||
shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
|
||||
multiply_fragment_source_gles2);
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE2);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (effects->midtexture[2]));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "base", 2);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (effects->midtexture[4]));
|
||||
|
||||
gst_gl_shader_set_uniform_1f (shader, "alpha", (gfloat) 0.5f);
|
||||
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
|
||||
|
||||
gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
|
||||
effects->outtexture, shader);
|
||||
}
|
||||
|
|
|
@ -231,13 +231,11 @@ gst_gl_color_balance_before_transform (GstBaseTransform * base, GstBuffer * buf)
|
|||
gst_object_sync_values (GST_OBJECT (balance), stream_time);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_color_balance_callback (gint width, gint height, guint tex_id,
|
||||
gpointer data)
|
||||
static gboolean
|
||||
gst_gl_color_balance_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
GstGLMemory * out_tex)
|
||||
{
|
||||
GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (data);
|
||||
GstGLFilter *filter = GST_GL_FILTER (data);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (data)->context->gl_vtable;
|
||||
GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (filter);
|
||||
|
||||
if (!balance->shader)
|
||||
_create_shader (balance);
|
||||
|
@ -252,17 +250,8 @@ gst_gl_color_balance_callback (gint width, gint height, guint tex_id,
|
|||
gst_gl_shader_set_uniform_1f (balance->shader, "hue", balance->hue);
|
||||
GST_OBJECT_UNLOCK (balance);
|
||||
|
||||
gl->BindTexture (GL_TEXTURE_2D, tex_id);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_gl_color_balance_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
GstGLMemory * out_tex)
|
||||
{
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
(GLCB) gst_gl_color_balance_callback, filter);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
|
||||
balance->shader);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -181,7 +181,7 @@ gst_gl_colorscale_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
|||
GstGLColorscale *colorscale = GST_GL_COLORSCALE (filter);
|
||||
|
||||
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context))
|
||||
gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
|
||||
colorscale->shader);
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -65,10 +65,10 @@ static gboolean gst_gl_deinterlace_filter (GstGLFilter * filter,
|
|||
GstBuffer * inbuf, GstBuffer * outbuf);
|
||||
static gboolean gst_gl_deinterlace_filter_texture (GstGLFilter * filter,
|
||||
GstGLMemory * in_tex, GstGLMemory * out_tex);
|
||||
static void gst_gl_deinterlace_vfir_callback (gint width, gint height,
|
||||
guint texture, gpointer stuff);
|
||||
static void gst_gl_deinterlace_greedyh_callback (gint width, gint height,
|
||||
guint texture, gpointer stuff);
|
||||
static gboolean gst_gl_deinterlace_vfir_callback (GstGLFilter * filter,
|
||||
GstGLMemory * in_tex, gpointer stuff);
|
||||
static gboolean gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter,
|
||||
GstGLMemory * in_tex, gpointer stuff);
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
static const gchar *greedyh_fragment_source =
|
||||
|
@ -276,7 +276,7 @@ gst_gl_deinterlace_init (GstGLDeinterlace * filter)
|
|||
filter->deinterlacefunc = gst_gl_deinterlace_vfir_callback;
|
||||
filter->current_method = GST_GL_DEINTERLACE_VFIR;
|
||||
filter->prev_buffer = NULL;
|
||||
filter->prev_tex = 0;
|
||||
filter->prev_tex = NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -370,7 +370,7 @@ gst_gl_deinterlace_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
|||
GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
|
||||
|
||||
//blocking call, use a FBO
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_filter_render_to_target (filter, in_tex, out_tex,
|
||||
deinterlace_filter->deinterlacefunc, deinterlace_filter);
|
||||
|
||||
return TRUE;
|
||||
|
@ -424,20 +424,19 @@ gst_gl_deinterlace_get_fragment_shader (GstGLFilter * filter,
|
|||
return shader;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture,
|
||||
gpointer stuff)
|
||||
static gboolean
|
||||
gst_gl_deinterlace_vfir_callback (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer user_data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
const GstGLFuncs *gl = context->gl_vtable;
|
||||
GstGLShader *shader;
|
||||
|
||||
shader = gst_gl_deinterlace_get_fragment_shader (filter, "vfir",
|
||||
vfir_fragment_source);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
|
@ -449,7 +448,7 @@ gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture,
|
|||
gst_gl_shader_use (shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width",
|
||||
|
@ -458,14 +457,15 @@ gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture,
|
|||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture,
|
||||
gpointer stuff)
|
||||
static gboolean
|
||||
gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer user_data)
|
||||
{
|
||||
GstGLShader *shader;
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
@ -475,7 +475,7 @@ gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture,
|
|||
greedyh_fragment_source);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (USING_OPENGL (context)) {
|
||||
|
@ -486,14 +486,15 @@ gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture,
|
|||
|
||||
gst_gl_shader_use (shader);
|
||||
|
||||
if (G_LIKELY (deinterlace_filter->prev_tex != 0)) {
|
||||
if (G_LIKELY (deinterlace_filter->prev_tex != NULL)) {
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex_prev", 1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, deinterlace_filter->prev_tex);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (deinterlace_filter->prev_tex));
|
||||
}
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "max_comb", 5.0f / 255.0f);
|
||||
|
@ -508,5 +509,7 @@ gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture,
|
|||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
/* we keep the previous buffer around so this is safe */
|
||||
deinterlace_filter->prev_tex = texture;
|
||||
deinterlace_filter->prev_tex = in_tex;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -39,14 +39,14 @@ typedef struct _GstGLDeinterlaceClass GstGLDeinterlaceClass;
|
|||
|
||||
struct _GstGLDeinterlace
|
||||
{
|
||||
GstGLFilter filter;
|
||||
GstGLFilter filter;
|
||||
|
||||
GLCB deinterlacefunc;
|
||||
GHashTable *shaderstable;
|
||||
GstBuffer *prev_buffer;
|
||||
guint prev_tex;
|
||||
GstGLFilterRenderFunc deinterlacefunc;
|
||||
GHashTable *shaderstable;
|
||||
GstBuffer *prev_buffer;
|
||||
GstGLMemory * prev_tex;
|
||||
|
||||
gint current_method;
|
||||
gint current_method;
|
||||
};
|
||||
|
||||
struct _GstGLDeinterlaceClass
|
||||
|
|
|
@ -319,87 +319,90 @@ init_pixbuf_texture (GstGLDifferenceMatte * differencematte)
|
|||
gst_object_unref (tex_alloc);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_differencematte_diff (gint width, gint height, guint texture,
|
||||
static gboolean
|
||||
gst_gl_differencematte_diff (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
gst_gl_shader_use (differencematte->shader[0]);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "current", 0);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, differencematte->savedbgtexture->tex_id);
|
||||
gl->BindTexture (GL_TEXTURE_2D,
|
||||
gst_gl_memory_get_texture_id (differencematte->savedbgtexture));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "saved", 1);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_differencematte_hblur (gint width, gint height, guint texture,
|
||||
static gboolean
|
||||
gst_gl_differencematte_hblur (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
gst_gl_shader_use (differencematte->shader[1]);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
|
||||
|
||||
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
|
||||
differencematte->kernel);
|
||||
gst_gl_shader_set_uniform_1f (differencematte->shader[1], "gauss_width",
|
||||
width);
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_differencematte_vblur (gint width, gint height, guint texture,
|
||||
static gboolean
|
||||
gst_gl_differencematte_vblur (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
gst_gl_shader_use (differencematte->shader[2]);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
|
||||
|
||||
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
|
||||
differencematte->kernel);
|
||||
gst_gl_shader_set_uniform_1f (differencematte->shader[2], "gauss_height",
|
||||
height);
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_differencematte_interp (gint width, gint height, guint texture,
|
||||
static gboolean
|
||||
gst_gl_differencematte_interp (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
gst_gl_shader_use (differencematte->shader[3]);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "blend", 0);
|
||||
|
||||
|
@ -414,24 +417,8 @@ gst_gl_differencematte_interp (gint width, gint height, guint texture,
|
|||
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "alpha", 2);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_differencematte_identity (gint width, gint height, guint texture,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (differencematte);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
|
||||
gst_gl_shader_use (differencematte->identity_shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
|
||||
gst_gl_shader_set_uniform_1i (differencematte->identity_shader, "tex", 0);
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -451,9 +438,8 @@ gst_gl_differencematte_filter_texture (GstGLFilter * filter,
|
|||
|
||||
/* save current frame, needed to calculate difference between
|
||||
* this frame and next ones */
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex,
|
||||
differencematte->savedbgtexture,
|
||||
gst_gl_differencematte_identity, differencematte);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex,
|
||||
differencematte->savedbgtexture, differencematte->identity_shader);
|
||||
|
||||
if (differencematte->pixbuf) {
|
||||
free (differencematte->pixbuf);
|
||||
|
@ -464,20 +450,17 @@ gst_gl_differencematte_filter_texture (GstGLFilter * filter,
|
|||
}
|
||||
|
||||
if (differencematte->savedbgtexture != NULL) {
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex,
|
||||
differencematte->midtexture[0], gst_gl_differencematte_diff,
|
||||
differencematte);
|
||||
gst_gl_filter_render_to_target (filter, FALSE,
|
||||
differencematte->midtexture[0], differencematte->midtexture[1],
|
||||
gst_gl_differencematte_hblur, differencematte);
|
||||
gst_gl_filter_render_to_target (filter, FALSE,
|
||||
differencematte->midtexture[1], differencematte->midtexture[2],
|
||||
gst_gl_differencematte_vblur, differencematte);
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_differencematte_interp, differencematte);
|
||||
gst_gl_filter_render_to_target (filter, in_tex,
|
||||
differencematte->midtexture[0], gst_gl_differencematte_diff, NULL);
|
||||
gst_gl_filter_render_to_target (filter, differencematte->midtexture[0],
|
||||
differencematte->midtexture[1], gst_gl_differencematte_hblur, NULL);
|
||||
gst_gl_filter_render_to_target (filter, differencematte->midtexture[1],
|
||||
differencematte->midtexture[2], gst_gl_differencematte_vblur, NULL);
|
||||
gst_gl_filter_render_to_target (filter, in_tex, out_tex,
|
||||
gst_gl_differencematte_interp, NULL);
|
||||
} else {
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_differencematte_identity, differencematte);
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
|
||||
differencematte->identity_shader);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -221,7 +221,7 @@ gst_gl_filter_app_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
|||
out_tex, _emit_draw_signal, &cb);
|
||||
|
||||
if (default_draw) {
|
||||
gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
|
||||
filter->default_shader);
|
||||
}
|
||||
|
||||
|
|
|
@ -83,8 +83,8 @@ static gboolean gst_gl_filtershader_filter (GstGLFilter * filter,
|
|||
GstBuffer * inbuf, GstBuffer * outbuf);
|
||||
static gboolean gst_gl_filtershader_filter_texture (GstGLFilter * filter,
|
||||
GstGLMemory * in_tex, GstGLMemory * out_tex);
|
||||
static void gst_gl_filtershader_hcallback (gint width, gint height,
|
||||
guint texture, gpointer stuff);
|
||||
static gboolean gst_gl_filtershader_hcallback (GstGLFilter * filter,
|
||||
GstGLMemory * in_tex, gpointer stuff);
|
||||
|
||||
static void
|
||||
gst_gl_filtershader_class_init (GstGLFilterShaderClass * klass)
|
||||
|
@ -318,8 +318,8 @@ gst_gl_filtershader_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
|||
{
|
||||
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_filtershader_hcallback, filtershader);
|
||||
gst_gl_filter_render_to_target (filter, in_tex, out_tex,
|
||||
gst_gl_filtershader_hcallback, NULL);
|
||||
|
||||
if (!filtershader->shader)
|
||||
return FALSE;
|
||||
|
@ -493,17 +493,16 @@ print_error:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
|
||||
static gboolean
|
||||
gst_gl_filtershader_hcallback (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
|
||||
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
GstGLShader *shader;
|
||||
|
||||
if (!(shader = _maybe_recompile_shader (filtershader)))
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
gl->ClearColor (0.0, 0.0, 0.0, 1.0);
|
||||
gl->Clear (GL_COLOR_BUFFER_BIT);
|
||||
|
@ -512,8 +511,10 @@ gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
|
|||
|
||||
/* FIXME: propertise these */
|
||||
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width", width);
|
||||
gst_gl_shader_set_uniform_1f (shader, "height", height);
|
||||
gst_gl_shader_set_uniform_1f (shader, "width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
gst_gl_shader_set_uniform_1f (shader, "height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
gst_gl_shader_set_uniform_1f (shader, "time", filtershader->time);
|
||||
|
||||
/* FIXME: propertise these */
|
||||
|
@ -523,9 +524,11 @@ gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
|
|||
gst_gl_shader_get_attribute_location (shader, "a_texcoord");
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
gst_object_unref (shader);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -372,29 +372,31 @@ gst_gl_overlay_set_caps (GstGLFilter * filter, GstCaps * incaps,
|
|||
static void
|
||||
_unbind_buffer (GstGLOverlay * overlay)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (overlay);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
|
||||
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
|
||||
|
||||
gl->DisableVertexAttribArray (overlay->attr_position);
|
||||
gl->DisableVertexAttribArray (overlay->attr_texture);
|
||||
gl->DisableVertexAttribArray (filter->draw_attr_position_loc);
|
||||
gl->DisableVertexAttribArray (filter->draw_attr_texture_loc);
|
||||
}
|
||||
|
||||
static void
|
||||
_bind_buffer (GstGLOverlay * overlay, GLuint vbo)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (overlay);
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
|
||||
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
|
||||
gl->BindBuffer (GL_ARRAY_BUFFER, vbo);
|
||||
|
||||
gl->EnableVertexAttribArray (overlay->attr_position);
|
||||
gl->EnableVertexAttribArray (overlay->attr_texture);
|
||||
gl->EnableVertexAttribArray (filter->draw_attr_position_loc);
|
||||
gl->EnableVertexAttribArray (filter->draw_attr_texture_loc);
|
||||
|
||||
gl->VertexAttribPointer (overlay->attr_position, 3, GL_FLOAT,
|
||||
gl->VertexAttribPointer (filter->draw_attr_position_loc, 3, GL_FLOAT,
|
||||
GL_FALSE, 5 * sizeof (GLfloat), (void *) 0);
|
||||
gl->VertexAttribPointer (overlay->attr_texture, 2, GL_FLOAT,
|
||||
gl->VertexAttribPointer (filter->draw_attr_texture_loc, 2, GL_FLOAT,
|
||||
GL_FALSE, 5 * sizeof (GLfloat), (void *) (3 * sizeof (GLfloat)));
|
||||
}
|
||||
|
||||
|
@ -410,15 +412,16 @@ float v_vertices[] = {
|
|||
static const GLushort indices[] = { 0, 1, 2, 0, 2, 3, };
|
||||
/* *INDENT-ON* */
|
||||
|
||||
static void
|
||||
gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
|
||||
static gboolean
|
||||
gst_gl_overlay_callback (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer stuff)
|
||||
{
|
||||
GstGLOverlay *overlay = GST_GL_OVERLAY (stuff);
|
||||
GstGLFilter *filter = GST_GL_FILTER (overlay);
|
||||
GstGLOverlay *overlay = GST_GL_OVERLAY (filter);
|
||||
GstMapInfo map_info;
|
||||
guint image_tex;
|
||||
gboolean memory_mapped = FALSE;
|
||||
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
#if GST_GL_HAVE_OPENGL
|
||||
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
|
||||
|
@ -430,49 +433,19 @@ gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
|
|||
#endif
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE0);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_use (overlay->shader);
|
||||
|
||||
gst_gl_shader_set_uniform_1f (overlay->shader, "alpha", 1.0f);
|
||||
gst_gl_shader_set_uniform_1i (overlay->shader, "texture", 0);
|
||||
|
||||
overlay->attr_position =
|
||||
filter->draw_attr_position_loc =
|
||||
gst_gl_shader_get_attribute_location (overlay->shader, "a_position");
|
||||
overlay->attr_texture =
|
||||
filter->draw_attr_texture_loc =
|
||||
gst_gl_shader_get_attribute_location (overlay->shader, "a_texcoord");
|
||||
|
||||
if (!overlay->vbo) {
|
||||
if (gl->GenVertexArrays) {
|
||||
gl->GenVertexArrays (1, &overlay->vao);
|
||||
gl->BindVertexArray (overlay->vao);
|
||||
}
|
||||
|
||||
gl->GenBuffers (1, &overlay->vbo);
|
||||
gl->BindBuffer (GL_ARRAY_BUFFER, overlay->vbo);
|
||||
gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), v_vertices,
|
||||
GL_STATIC_DRAW);
|
||||
|
||||
gl->GenBuffers (1, &overlay->vbo_indices);
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
|
||||
gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
|
||||
GL_STATIC_DRAW);
|
||||
|
||||
if (gl->GenVertexArrays) {
|
||||
_bind_buffer (overlay, overlay->vbo);
|
||||
gl->BindVertexArray (0);
|
||||
}
|
||||
|
||||
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
}
|
||||
|
||||
if (gl->GenVertexArrays)
|
||||
gl->BindVertexArray (overlay->vao);
|
||||
else
|
||||
_bind_buffer (overlay, overlay->vbo);
|
||||
|
||||
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
if (!overlay->image_memory)
|
||||
goto out;
|
||||
|
@ -490,6 +463,11 @@ gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
|
|||
gl->BindVertexArray (overlay->overlay_vao);
|
||||
}
|
||||
|
||||
gl->GenBuffers (1, &overlay->vbo_indices);
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
|
||||
gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
|
||||
GL_STATIC_DRAW);
|
||||
|
||||
gl->GenBuffers (1, &overlay->overlay_vbo);
|
||||
gl->BindBuffer (GL_ARRAY_BUFFER, overlay->overlay_vbo);
|
||||
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
|
||||
|
@ -553,6 +531,7 @@ gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
|
|||
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||
|
||||
gl->Disable (GL_BLEND);
|
||||
ret = TRUE;
|
||||
|
||||
out:
|
||||
if (gl->GenVertexArrays) {
|
||||
|
@ -567,6 +546,8 @@ out:
|
|||
gst_memory_unmap ((GstMemory *) overlay->image_memory, &map_info);
|
||||
|
||||
overlay->geometry_change = FALSE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -641,7 +622,7 @@ gst_gl_overlay_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
|
|||
overlay->location_has_changed = FALSE;
|
||||
}
|
||||
|
||||
gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
|
||||
gst_gl_filter_render_to_target (filter, in_tex, out_tex,
|
||||
gst_gl_overlay_callback, overlay);
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -996,66 +996,46 @@ gst_gl_filter_transform (GstBaseTransform * bt, GstBuffer * inbuf,
|
|||
return ret ? GST_FLOW_OK : GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
struct glcb2
|
||||
struct glcb
|
||||
{
|
||||
GLCB func;
|
||||
GstGLFilter *filter;
|
||||
GstGLFilterRenderFunc func;
|
||||
GstGLMemory *in_tex;
|
||||
gpointer data;
|
||||
guint texture;
|
||||
guint width;
|
||||
guint height;
|
||||
};
|
||||
|
||||
/* convenience functions to simplify filter development */
|
||||
static gboolean
|
||||
_glcb2 (gpointer data)
|
||||
_glcb (gpointer data)
|
||||
{
|
||||
struct glcb2 *cb = data;
|
||||
struct glcb *cb = data;
|
||||
|
||||
cb->func (cb->width, cb->height, cb->texture, cb->data);
|
||||
|
||||
return TRUE;
|
||||
return cb->func (cb->filter, cb->in_tex, cb->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_gl_filter_render_to_target:
|
||||
* @filter: a #GstGLFilter
|
||||
* @resize: whether to automatically resize the texture between the input size
|
||||
* and the output size
|
||||
* @input: the input texture
|
||||
* @target: the output texture
|
||||
* @output: the output texture
|
||||
* @func: the function to transform @input into @output. called with @data
|
||||
* @data: the data associated with @func
|
||||
*
|
||||
* Transforms @input into @output using @func on through FBO. @resize should
|
||||
* only ever be %TRUE whenever @input is the input texture of @filter.
|
||||
* Transforms @input into @output using @func on through FBO.
|
||||
*
|
||||
* Returns: the return value of @func
|
||||
*/
|
||||
void
|
||||
gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize,
|
||||
GstGLMemory * input, GstGLMemory * output, GLCB func, gpointer data)
|
||||
gboolean
|
||||
gst_gl_filter_render_to_target (GstGLFilter * filter, GstGLMemory * input,
|
||||
GstGLMemory * output, GstGLFilterRenderFunc func, gpointer data)
|
||||
{
|
||||
guint in_width, in_height, out_width, out_height;
|
||||
struct glcb2 cb;
|
||||
|
||||
out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
|
||||
out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
|
||||
if (resize) {
|
||||
in_width = GST_VIDEO_INFO_WIDTH (&filter->in_info);
|
||||
in_height = GST_VIDEO_INFO_HEIGHT (&filter->in_info);
|
||||
} else {
|
||||
in_width = out_width;
|
||||
in_height = out_height;
|
||||
}
|
||||
|
||||
GST_LOG ("rendering to target. in %u, %ux%u out %u, %ux%u", input->tex_id,
|
||||
in_width, in_height, output->tex_id, out_width, out_height);
|
||||
struct glcb cb;
|
||||
|
||||
cb.filter = filter;
|
||||
cb.func = func;
|
||||
cb.in_tex = input;
|
||||
cb.data = data;
|
||||
cb.texture = input->tex_id;
|
||||
cb.width = in_width;
|
||||
cb.height = in_height;
|
||||
|
||||
gst_gl_framebuffer_draw_to_texture (filter->fbo, output, _glcb2, &cb);
|
||||
return gst_gl_framebuffer_draw_to_texture (filter->fbo, output, _glcb, &cb);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1080,10 +1060,10 @@ _get_attributes (GstGLFilter * filter)
|
|||
filter->valid_attributes = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
|
||||
static gboolean
|
||||
_draw_with_shader_cb (GstGLFilter * filter, GstGLMemory * in_tex,
|
||||
gpointer unused)
|
||||
{
|
||||
GstGLFilter *filter = GST_GL_FILTER (stuff);
|
||||
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
|
||||
GstGLFuncs *gl = context->gl_vtable;
|
||||
|
||||
|
@ -1098,26 +1078,27 @@ _draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
|
|||
gst_gl_shader_use (filter->default_shader);
|
||||
|
||||
gl->ActiveTexture (GL_TEXTURE1);
|
||||
gl->BindTexture (GL_TEXTURE_2D, texture);
|
||||
gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
|
||||
|
||||
gst_gl_shader_set_uniform_1i (filter->default_shader, "tex", 1);
|
||||
gst_gl_shader_set_uniform_1f (filter->default_shader, "width", width);
|
||||
gst_gl_shader_set_uniform_1f (filter->default_shader, "height", height);
|
||||
gst_gl_shader_set_uniform_1f (filter->default_shader, "width",
|
||||
GST_VIDEO_INFO_WIDTH (&filter->out_info));
|
||||
gst_gl_shader_set_uniform_1f (filter->default_shader, "height",
|
||||
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
|
||||
|
||||
gst_gl_filter_draw_fullscreen_quad (filter);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_gl_filter_render_to_target_with_shader:
|
||||
* @filter: a #GstGLFilter
|
||||
* @resize: whether to automatically resize the texture between the input size
|
||||
* and the output size
|
||||
* @input: the input texture
|
||||
* @target: the output texture
|
||||
* @output: the output texture
|
||||
* @shader: the shader to use.
|
||||
*
|
||||
* Transforms @input into @output using @shader on FBO. @resize should
|
||||
* only ever be %TRUE whenever @input is the input texture of @filter.
|
||||
* Transforms @input into @output using @shader with a FBO.
|
||||
*
|
||||
* See also: gst_gl_filter_render_to_target()
|
||||
*/
|
||||
|
@ -1125,15 +1106,14 @@ _draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
|
|||
* the shader, render input to a quad */
|
||||
void
|
||||
gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
|
||||
gboolean resize, GstGLMemory * input, GstGLMemory * output,
|
||||
GstGLShader * shader)
|
||||
GstGLMemory * input, GstGLMemory * output, GstGLShader * shader)
|
||||
{
|
||||
if (filter->default_shader != shader)
|
||||
filter->valid_attributes = FALSE;
|
||||
filter->default_shader = shader;
|
||||
|
||||
gst_gl_filter_render_to_target (filter, resize, input, output,
|
||||
_draw_with_shader_cb, filter);
|
||||
gst_gl_filter_render_to_target (filter, input, output, _draw_with_shader_cb,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
|
|
|
@ -38,6 +38,8 @@ GType gst_gl_filter_get_type(void);
|
|||
#define GST_IS_GL_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_FILTER))
|
||||
#define GST_GL_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_FILTER,GstGLFilterClass))
|
||||
|
||||
typedef gboolean (*GstGLFilterRenderFunc) (GstGLFilter * filter, GstGLMemory * in_tex, gpointer user_data);
|
||||
|
||||
/**
|
||||
* GstGLFilter:
|
||||
* @base_transform: parent #GstBaseTransform
|
||||
|
@ -117,16 +119,14 @@ struct _GstGLFilterClass
|
|||
gboolean gst_gl_filter_filter_texture (GstGLFilter * filter, GstBuffer * inbuf,
|
||||
GstBuffer * outbuf);
|
||||
|
||||
void gst_gl_filter_render_to_target (GstGLFilter *filter,
|
||||
gboolean resize,
|
||||
gboolean gst_gl_filter_render_to_target (GstGLFilter *filter,
|
||||
GstGLMemory * input,
|
||||
GstGLMemory * output,
|
||||
GLCB func,
|
||||
GstGLFilterRenderFunc func,
|
||||
gpointer data);
|
||||
|
||||
void gst_gl_filter_draw_fullscreen_quad (GstGLFilter *filter);
|
||||
void gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
|
||||
gboolean resize,
|
||||
GstGLMemory * input,
|
||||
GstGLMemory * output,
|
||||
GstGLShader *shader);
|
||||
|
|
23
gst-libs/gst/gl/gstglpixelformat.c
Normal file
23
gst-libs/gst/gl/gstglpixelformat.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
|
@ -28,27 +28,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* CDCB:
|
||||
* @texture: texture to draw
|
||||
* @width: new width
|
||||
* @height: new height:
|
||||
* @data: user data
|
||||
*
|
||||
* client draw callback
|
||||
*/
|
||||
typedef gboolean (*CDCB) (GLuint texture, GLuint width, GLuint height, gpointer data);
|
||||
/**
|
||||
* GLCB:
|
||||
* @width: the width
|
||||
* @height: the height
|
||||
* @texture: texture
|
||||
* @stuff: user data
|
||||
*
|
||||
* callback definition for operating on textures
|
||||
*/
|
||||
typedef void (*GLCB) (gint, gint, guint, gpointer stuff);
|
||||
|
||||
gboolean gst_gl_context_gen_shader (GstGLContext * context,
|
||||
const gchar * shader_vertex_source,
|
||||
const gchar * shader_fragment_source, GstGLShader ** shader);
|
||||
|
|
Loading…
Reference in a new issue