From dedb94323c51c2839136956c9f4e592d8b8b72c4 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 23 Mar 2016 03:16:11 +0000 Subject: [PATCH] glvideomixer: add support for the affine transformation meta --- ext/gl/gstglvideomixer.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c index 208a6df..fddd4cb 100644 --- a/ext/gl/gstglvideomixer.c +++ b/ext/gl/gstglvideomixer.c @@ -43,6 +43,8 @@ #include "config.h" #endif +#include + #include "gstglvideomixer.h" #include "gstglmixerbin.h" @@ -472,15 +474,6 @@ static gboolean gst_gl_video_mixer_process_textures (GstGLMixer * mixer, static void gst_gl_video_mixer_callback (gpointer stuff); /* *INDENT-OFF* */ -/* vertex source */ -static const gchar *video_mixer_v_src = - "attribute vec4 a_position; \n" - "attribute vec2 a_texCoord; \n" - "varying vec2 v_texCoord; \n" - "void main() \n" - "{ \n" - " gl_Position = a_position; \n" - " v_texCoord = a_texCoord; \n" "}"; /* fragment source */ static const gchar *video_mixer_f_src = @@ -489,10 +482,10 @@ static const gchar *video_mixer_f_src = "#endif\n" "uniform sampler2D texture; \n" "uniform float alpha;\n" - "varying vec2 v_texCoord; \n" + "varying vec2 v_texcoord; \n" "void main() \n" "{ \n" - " vec4 rgba = texture2D( texture, v_texCoord );\n" + " vec4 rgba = texture2D(texture, v_texcoord);\n" " gl_FragColor = vec4(rgba.rgb, rgba.a * alpha);\n" "} \n"; @@ -1141,7 +1134,8 @@ gst_gl_video_mixer_init_shader (GstGLMixer * mixer, GstCaps * outcaps) video_mixer->shader); return gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context, - video_mixer_v_src, video_mixer_f_src, &video_mixer->shader); + gst_gl_shader_string_vertex_mat4_texture_transform, + video_mixer_f_src, &video_mixer->shader); } static gboolean @@ -1371,6 +1365,13 @@ _set_blend_state (GstGLVideoMixer * video_mixer, GstGLVideoMixerPad * mix_pad) return TRUE; } +static const gfloat identity_matrix[] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, +}; + /* opengl scene, params: input texture (not the output mixer->texture) */ static void gst_gl_video_mixer_callback (gpointer stuff) @@ -1407,7 +1408,7 @@ gst_gl_video_mixer_callback (gpointer stuff) attr_position_loc = gst_gl_shader_get_attribute_location (video_mixer->shader, "a_position"); attr_texture_loc = - gst_gl_shader_get_attribute_location (video_mixer->shader, "a_texCoord"); + gst_gl_shader_get_attribute_location (video_mixer->shader, "a_texcoord"); gl->Enable (GL_BLEND); @@ -1416,6 +1417,7 @@ gst_gl_video_mixer_callback (gpointer stuff) while (walk) { GstGLMixerPad *mix_pad = walk->data; GstGLVideoMixerPad *pad = walk->data; + GstVideoAggregatorPad *vagg_pad = walk->data; GstVideoInfo *v_info; guint in_tex; guint in_width, in_height; @@ -1495,6 +1497,19 @@ gst_gl_video_mixer_callback (gpointer stuff) gst_gl_shader_set_uniform_1i (video_mixer->shader, "texture", 0); gst_gl_shader_set_uniform_1f (video_mixer->shader, "alpha", pad->alpha); + { + GstVideoAffineTransformationMeta *af_meta; + + af_meta = + gst_buffer_get_video_affine_transformation_meta (vagg_pad->buffer); + if (af_meta) + gst_gl_shader_set_uniform_matrix_4fv (video_mixer->shader, + "u_transformation", 1, FALSE, af_meta->matrix); + else + gst_gl_shader_set_uniform_matrix_4fv (video_mixer->shader, + "u_transformation", 1, FALSE, identity_matrix); + } + gl->EnableVertexAttribArray (attr_position_loc); gl->EnableVertexAttribArray (attr_texture_loc); -- 2.7.4