diff options
author | Matthew Waters <matthew@centricular.com> | 2019-06-05 18:17:35 +1000 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2020-02-03 19:42:46 +1100 |
commit | a016e47a9159206221cf7c06e511b305fb12b045 (patch) | |
tree | 8580b3cfc671380ca137c418664c265df3098844 | |
parent | 969446f1fcf38c741d40e8a220f4272194bfecc3 (diff) | |
download | gstreamer-plugins-base-a016e47a9159206221cf7c06e511b305fb12b045.tar.gz |
glvideomixer: perform _get_highest_precision on the GL thread
gst_gl_shader_string_get_highest_precision needs to make an OpenGL call
so execution outside the OpenGL thread and context results in undefined
behaviour.
-rw-r--r-- | ext/gl/gstglvideomixer.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c index 8eca6e0b5..c5b9dc9a2 100644 --- a/ext/gl/gstglvideomixer.c +++ b/ext/gl/gstglvideomixer.c @@ -473,7 +473,7 @@ static GstCaps *_fixate_caps (GstAggregator * agg, GstCaps * caps); static gboolean gst_gl_video_mixer_propose_allocation (GstAggregator * agg, GstAggregatorPad * agg_pad, GstQuery * decide_query, GstQuery * query); static void gst_gl_video_mixer_reset (GstGLMixer * mixer); -static gboolean gst_gl_video_mixer_init_shader (GstGLMixer * mixer, +static gboolean gst_gl_video_mixer_set_caps (GstGLMixer * mixer, GstCaps * outcaps); static gboolean gst_gl_video_mixer_process_textures (GstGLMixer * mixer, @@ -918,7 +918,7 @@ gst_gl_video_mixer_class_init (GstGLVideoMixerClass * klass) GST_TYPE_GL_VIDEO_MIXER_BACKGROUND, DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - GST_GL_MIXER_CLASS (klass)->set_caps = gst_gl_video_mixer_init_shader; + GST_GL_MIXER_CLASS (klass)->set_caps = gst_gl_video_mixer_set_caps; GST_GL_MIXER_CLASS (klass)->reset = gst_gl_video_mixer_reset; GST_GL_MIXER_CLASS (klass)->process_textures = gst_gl_video_mixer_process_textures; @@ -1203,30 +1203,16 @@ gst_gl_video_mixer_reset (GstGLMixer * mixer) } static gboolean -gst_gl_video_mixer_init_shader (GstGLMixer * mixer, GstCaps * outcaps) +gst_gl_video_mixer_set_caps (GstGLMixer * mixer, GstCaps * outcaps) { GstGLVideoMixer *video_mixer = GST_GL_VIDEO_MIXER (mixer); - gchar *frag_str; - gboolean ret; - if (video_mixer->shader) - gst_object_unref (video_mixer->shader); + g_clear_object (&video_mixer->shader); /* need reconfigure output geometry */ video_mixer->output_geo_change = TRUE; - frag_str = - g_strdup_printf ("%s%s", - gst_gl_shader_string_get_highest_precision (GST_GL_BASE_MIXER - (mixer)->context, GST_GLSL_VERSION_NONE, - GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY), - video_mixer_f_src); - - ret = gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context, - gst_gl_shader_string_vertex_mat4_vertex_transform, - frag_str, &video_mixer->shader); - g_free (frag_str); - return ret; + return TRUE; } static void @@ -1234,6 +1220,19 @@ _video_mixer_process_gl (GstGLContext * context, GstGLVideoMixer * video_mixer) { GstGLMixer *mixer = GST_GL_MIXER (video_mixer); + if (!video_mixer->shader) { + gchar *frag_str = g_strdup_printf ("%s%s", + gst_gl_shader_string_get_highest_precision (GST_GL_BASE_MIXER + (mixer)->context, GST_GLSL_VERSION_NONE, + GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY), + video_mixer_f_src); + + gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context, + gst_gl_shader_string_vertex_mat4_vertex_transform, + frag_str, &video_mixer->shader); + g_free (frag_str); + } + gst_gl_framebuffer_draw_to_texture (mixer->fbo, video_mixer->out_tex, gst_gl_video_mixer_callback, video_mixer); } |