static void gst_gl_filtershader_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object); switch (prop_id) { case PROP_SHADER: GST_OBJECT_LOCK (filtershader); g_value_set_object (value, filtershader->shader); GST_OBJECT_UNLOCK (filtershader); break; case PROP_VERTEX: GST_OBJECT_LOCK (filtershader); g_value_set_string (value, filtershader->vertex); GST_OBJECT_UNLOCK (filtershader); break; case PROP_FRAGMENT: GST_OBJECT_LOCK (filtershader); g_value_set_string (value, filtershader->fragment); GST_OBJECT_UNLOCK (filtershader); break; case PROP_UNIFORMS: GST_OBJECT_LOCK (filtershader); g_value_set_boxed (value, filtershader->uniforms); GST_OBJECT_UNLOCK (filtershader); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_gl_filtershader_gl_stop (GstGLBaseFilter * base) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (base); if (filtershader->shader) gst_object_unref (filtershader->shader); filtershader->shader = NULL; GST_GL_BASE_FILTER_CLASS (parent_class)->gl_stop (base); }
static gboolean gst_gl_filtershader_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex, GstGLMemory * out_tex) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter); gst_gl_filter_render_to_target (filter, in_tex, out_tex, gst_gl_filtershader_hcallback, NULL); if (!filtershader->shader) return FALSE; return TRUE; }
static gboolean gst_gl_filtershader_filter (GstGLFilter * filter, GstBuffer * inbuf, GstBuffer * outbuf) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter); if (!_gst_clock_time_to_double (GST_BUFFER_PTS (inbuf), &filtershader->time)) { if (!_gst_clock_time_to_double (GST_BUFFER_DTS (inbuf), &filtershader->time)) _gint64_time_val_to_double (g_get_monotonic_time (), &filtershader->time); } return gst_gl_filter_filter_texture (filter, inbuf, outbuf); }
static void gst_gl_filtershader_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object); switch (prop_id) { case PROP_SHADER: GST_OBJECT_LOCK (filtershader); gst_object_replace ((GstObject **) & filtershader->shader, g_value_dup_object (value)); filtershader->new_source = FALSE; GST_OBJECT_UNLOCK (filtershader); break; case PROP_VERTEX: GST_OBJECT_LOCK (filtershader); if (filtershader->vertex) g_free (filtershader->vertex); filtershader->vertex = g_value_dup_string (value); filtershader->new_source = TRUE; GST_OBJECT_UNLOCK (filtershader); break; case PROP_FRAGMENT: GST_OBJECT_LOCK (filtershader); if (filtershader->fragment) g_free (filtershader->fragment); filtershader->fragment = g_value_dup_string (value); filtershader->new_source = TRUE; GST_OBJECT_UNLOCK (filtershader); break; case PROP_UNIFORMS: GST_OBJECT_LOCK (filtershader); if (filtershader->uniforms) gst_structure_free (filtershader->uniforms); filtershader->uniforms = g_value_dup_boxed (value); filtershader->new_uniforms = TRUE; GST_OBJECT_UNLOCK (filtershader); break; case PROP_UPDATE_SHADER: GST_OBJECT_LOCK (filtershader); filtershader->update_shader = g_value_get_boolean (value); GST_OBJECT_UNLOCK (filtershader); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_gl_filtershader_finalize (GObject * object) { GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object); g_free (filtershader->vertex); filtershader->vertex = NULL; g_free (filtershader->fragment); filtershader->fragment = NULL; if (filtershader->uniforms) gst_structure_free (filtershader->uniforms); filtershader->uniforms = NULL; G_OBJECT_CLASS (gst_gl_filtershader_parent_class)->finalize (object); }
static gboolean gst_gl_filtershader_hcallback (GstGLFilter * filter, GstGLMemory * in_tex, gpointer 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 FALSE; gl->ClearColor (0.0, 0.0, 0.0, 1.0); gl->Clear (GL_COLOR_BUFFER_BIT); gst_gl_shader_use (shader); /* FIXME: propertise these */ gst_gl_shader_set_uniform_1i (shader, "tex", 0); 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 */ 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"); gl->ActiveTexture (GL_TEXTURE0); 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; }
static void gst_gl_filtershader_hcallback (gint width, gint height, guint texture, 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; gl->ClearColor (0.0, 0.0, 0.0, 1.0); gl->Clear (GL_COLOR_BUFFER_BIT); gst_gl_shader_use (shader); /* 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, "time", filtershader->time); /* FIXME: propertise these */ 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"); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, texture); gst_gl_filter_draw_texture (filter, texture, width, height); gst_object_unref (shader); }