gloverlaycompositor: Create own shader object

Make gloverlaycompositor independent of the shader used in the sink.

https://bugzilla.gnome.org/show_bug.cgi?id=745107
This commit is contained in:
Lubosz Sarnecki 2015-07-21 21:27:45 -04:00 committed by Nicolas Dufresne
parent e8c31619c4
commit b155f5d73e
3 changed files with 47 additions and 18 deletions

View file

@ -1287,8 +1287,7 @@ prepare_next_buffer (GstGLImageSink * glimage_sink)
} }
gst_gl_overlay_compositor_upload_overlays (glimage_sink->overlay_compositor, gst_gl_overlay_compositor_upload_overlays (glimage_sink->overlay_compositor,
next_buffer, glimage_sink->attr_position, glimage_sink->attr_texture, next_buffer, glimage_sink->window_width, glimage_sink->window_height);
glimage_sink->window_width, glimage_sink->window_height);
/* in_buffer invalid now */ /* in_buffer invalid now */
if (!gst_video_frame_map (&gl_frame, info, next_buffer, if (!gst_video_frame_map (&gl_frame, info, next_buffer,
@ -1880,8 +1879,7 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink)
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
gst_gl_overlay_compositor_draw_overlays (gl_sink->overlay_compositor, gst_gl_overlay_compositor_draw_overlays (gl_sink->overlay_compositor);
gl_sink->redisplay_shader);
gst_gl_context_clear_shader (gl_sink->context); gst_gl_context_clear_shader (gl_sink->context);

View file

@ -54,6 +54,20 @@ gst_gl_overlay_compositor_init (GstGLOverlayCompositor * compositor)
{ {
} }
static void
gst_gl_overlay_compositor_init_gl (GstGLContext * context,
gpointer compositor_pointer)
{
GstGLOverlayCompositor *compositor =
(GstGLOverlayCompositor *) compositor_pointer;
if (!gst_gl_shader_compile_with_default_vf_and_check
(compositor->shader, &compositor->position_attrib,
&compositor->texcoord_attrib)) {
GST_ERROR ("could not initialize shader.");
}
}
GstGLOverlayCompositor * GstGLOverlayCompositor *
gst_gl_overlay_compositor_new (GstGLContext * context) gst_gl_overlay_compositor_new (GstGLContext * context)
{ {
@ -62,6 +76,11 @@ gst_gl_overlay_compositor_new (GstGLContext * context)
compositor->context = gst_object_ref (context); compositor->context = gst_object_ref (context);
compositor->shader = gst_gl_shader_new (compositor->context);
gst_gl_context_thread_add (compositor->context,
gst_gl_overlay_compositor_init_gl, compositor);
GST_DEBUG_OBJECT (compositor, "Created new GstGLOverlayCompositor"); GST_DEBUG_OBJECT (compositor, "Created new GstGLOverlayCompositor");
return compositor; return compositor;
@ -79,6 +98,11 @@ gst_gl_overlay_compositor_finalize (GObject * object)
if (compositor->context) if (compositor->context)
gst_object_unref (compositor->context); gst_object_unref (compositor->context);
if (compositor->shader) {
gst_object_unref (compositor->shader);
compositor->shader = NULL;
}
G_OBJECT_CLASS (gst_gl_overlay_compositor_parent_class)->finalize (object); G_OBJECT_CLASS (gst_gl_overlay_compositor_parent_class)->finalize (object);
} }
@ -129,8 +153,7 @@ gst_gl_overlay_compositor_free_overlays (GstGLOverlayCompositor * compositor)
void void
gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor, gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor,
GstBuffer * buf, GLint position_attrib, GLint texcoord_attrib, GstBuffer * buf, guint window_width, guint window_height)
guint window_width, guint window_height)
{ {
GstVideoOverlayCompositionMeta *composition_meta; GstVideoOverlayCompositionMeta *composition_meta;
@ -161,10 +184,11 @@ gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor,
if (!_is_rectangle_in_overlays (compositor->overlays, rectangle)) { if (!_is_rectangle_in_overlays (compositor->overlays, rectangle)) {
GstGLCompositionOverlay *overlay = GstGLCompositionOverlay *overlay =
gst_gl_composition_overlay_new (compositor->context, rectangle, gst_gl_composition_overlay_new (compositor->context, rectangle,
position_attrib, texcoord_attrib); compositor->position_attrib, compositor->texcoord_attrib);
gst_gl_composition_overlay_upload (overlay, buf, window_width,
window_height);
gst_gl_composition_overlay_upload (overlay, buf,
window_width, window_height);
compositor->overlays = g_list_append (compositor->overlays, overlay); compositor->overlays = g_list_append (compositor->overlays, overlay);
} }
} }
@ -185,19 +209,24 @@ gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor,
} }
void void
gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor, gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor)
GstGLShader * shader)
{ {
const GstGLFuncs *gl = compositor->context->gl_vtable; const GstGLFuncs *gl = compositor->context->gl_vtable;
if (compositor->overlays != NULL) { if (compositor->overlays != NULL) {
GList *l; GList *l;
glEnable (GL_BLEND); gl->Enable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gl->BlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gst_gl_shader_use (compositor->shader);
gl->ActiveTexture (GL_TEXTURE0);
gst_gl_shader_set_uniform_1i (compositor->shader, "tex", 0);
for (l = compositor->overlays; l != NULL; l = l->next) { for (l = compositor->overlays; l != NULL; l = l->next) {
GstGLCompositionOverlay *overlay = (GstGLCompositionOverlay *) l->data; GstGLCompositionOverlay *overlay = (GstGLCompositionOverlay *) l->data;
gst_gl_composition_overlay_draw (overlay, shader); gst_gl_composition_overlay_draw (overlay, compositor->shader);
} }
gl->BindTexture (GL_TEXTURE_2D, 0); gl->BindTexture (GL_TEXTURE_2D, 0);
} }
} }

View file

@ -49,6 +49,10 @@ struct _GstGLOverlayCompositor
guint last_window_height; guint last_window_height;
GList * overlays; GList * overlays;
GstGLShader *shader;
GLint position_attrib;
GLint texcoord_attrib;
}; };
/** /**
@ -65,11 +69,9 @@ GstGLOverlayCompositor *gst_gl_overlay_compositor_new (GstGLContext * context);
void gst_gl_overlay_compositor_free_overlays (GstGLOverlayCompositor * compositor); void gst_gl_overlay_compositor_free_overlays (GstGLOverlayCompositor * compositor);
void gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor, void gst_gl_overlay_compositor_upload_overlays (GstGLOverlayCompositor * compositor,
GstBuffer * buf, GLint position_attrib, GLint texcoord_attrib, GstBuffer * buf, guint window_width, guint window_height);
guint window_width, guint window_height);
void gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor, void gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor);
GstGLShader *shader);
GstCaps * gst_gl_overlay_compositor_add_caps(GstCaps * caps); GstCaps * gst_gl_overlay_compositor_add_caps(GstCaps * caps);