static gboolean
gst_gl_mixer_gl_start (GstGLBaseMixer * base_mix)
{
- GstGLMixer *mix = GST_GL_MIXER (base_mix);
- GstGLMixerClass *mixer_class = GST_GL_MIXER_GET_CLASS (mix);
-
- g_mutex_lock (&mix->priv->gl_resource_lock);
- mix->priv->gl_resource_ready = FALSE;
- if (mix->fbo)
- gst_object_unref (mix->fbo);
-
- gst_gl_context_thread_add (base_mix->context,
- (GstGLContextThreadFunc) _mixer_create_fbo, mix);
- if (!mix->fbo) {
- g_cond_signal (&mix->priv->gl_resource_cond);
- g_mutex_unlock (&mix->priv->gl_resource_lock);
- goto context_error;
- }
-
- if (mixer_class->set_caps)
- mixer_class->set_caps (mix, mix->out_caps);
-
- mix->priv->gl_resource_ready = TRUE;
- g_cond_signal (&mix->priv->gl_resource_cond);
- g_mutex_unlock (&mix->priv->gl_resource_lock);
-
return GST_GL_BASE_MIXER_CLASS (parent_class)->gl_start (base_mix);
-
-context_error:
- {
- GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND, ("Context error"), (NULL));
- return FALSE;
- }
}
static void
if (mixer_class->reset)
mixer_class->reset (mix);
- if (mix->fbo) {
- gst_object_unref (mix->fbo);
- mix->fbo = NULL;
- }
+ g_mutex_lock (&mix->priv->gl_resource_lock);
+ gst_clear_object (&mix->fbo);
+ g_mutex_unlock (&mix->priv->gl_resource_lock);
GST_GL_BASE_MIXER_CLASS (parent_class)->gl_stop (base_mix);
}
gst_gl_mixer_decide_allocation (GstAggregator * agg, GstQuery * query)
{
GstGLBaseMixer *base_mix = GST_GL_BASE_MIXER (agg);
+ GstGLMixer *mix = GST_GL_MIXER (base_mix);
+ GstGLMixerClass *mixer_class = GST_GL_MIXER_GET_CLASS (mix);
GstGLContext *context;
GstBufferPool *pool = NULL;
GstStructure *config;
return FALSE;
}
+ g_mutex_lock (&mix->priv->gl_resource_lock);
+ mix->priv->gl_resource_ready = FALSE;
+ if (mix->fbo)
+ gst_object_unref (mix->fbo);
+
+ gst_gl_context_thread_add (context,
+ (GstGLContextThreadFunc) _mixer_create_fbo, mix);
+ if (!mix->fbo) {
+ g_cond_signal (&mix->priv->gl_resource_cond);
+ g_mutex_unlock (&mix->priv->gl_resource_lock);
+ goto context_error;
+ }
+
+ if (mixer_class->set_caps)
+ mixer_class->set_caps (mix, mix->out_caps);
+
+ mix->priv->gl_resource_ready = TRUE;
+ g_cond_signal (&mix->priv->gl_resource_cond);
+ g_mutex_unlock (&mix->priv->gl_resource_lock);
+
gst_query_parse_allocation (query, &caps, NULL);
if (gst_query_get_n_allocation_pools (query) > 0) {
gst_clear_object (&context);
return TRUE;
+
+context_error:
+ {
+ GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND, ("Context error"), (NULL));
+ return FALSE;
+ }
}
gboolean