static void gst_gl_base_mixer_set_context (GstElement * element,
GstContext * context);
+static GstStateChangeReturn gst_gl_base_mixer_change_state (GstElement *
+ element, GstStateChange transition);
enum
{
element_class->set_context =
GST_DEBUG_FUNCPTR (gst_gl_base_mixer_set_context);
+ element_class->change_state = gst_gl_base_mixer_change_state;
agg_class->sinkpads_type = GST_TYPE_GL_BASE_MIXER_PAD;
agg_class->sink_query = gst_gl_base_mixer_sink_query;
return TRUE;
}
+
+static GstStateChangeReturn
+gst_gl_base_mixer_change_state (GstElement * element, GstStateChange transition)
+{
+ GstGLBaseMixer *mix = GST_GL_BASE_MIXER (element);
+ GstGLBaseMixerClass *mix_class = GST_GL_BASE_MIXER_GET_CLASS (mix);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ GST_DEBUG_OBJECT (mix, "changing state: %s => %s",
+ gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
+ gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_gl_ensure_element_data (element, &mix->display,
+ &mix->priv->other_context))
+ return GST_STATE_CHANGE_FAILURE;
+
+ gst_gl_display_filter_gl_api (mix->display, mix_class->supported_gl_api);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ default:
+ break;
+ }
+
+ return ret;
+}
GST_DEBUG_OBJECT (gl_sink, "Ensuring setup");
- if (!gst_gl_ensure_element_data (gl_sink, &gl_sink->display,
- &gl_sink->other_context))
- return FALSE;
-
- gst_gl_display_filter_gl_api (gl_sink->display, SUPPORTED_GL_APIS);
-
if (!gl_sink->context) {
do {
GstGLContext *other_context;
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- _ensure_gl_setup (glimage_sink);
+ if (!gst_gl_ensure_element_data (glimage_sink, &glimage_sink->display,
+ &glimage_sink->other_context))
+ return GST_STATE_CHANGE_FAILURE;
+
+ gst_gl_display_filter_gl_api (glimage_sink->display, SUPPORTED_GL_APIS);
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
g_atomic_int_set (&glimage_sink->to_quit, 0);
static gboolean gst_gl_test_src_query (GstBaseSrc * bsrc, GstQuery * query);
static void gst_gl_test_src_set_context (GstElement * element,
GstContext * context);
+static GstStateChangeReturn gst_gl_test_src_change_state (GstElement * element,
+ GstStateChange transition);
static void gst_gl_test_src_get_times (GstBaseSrc * basesrc,
GstBuffer * buffer, GstClockTime * start, GstClockTime * end);
gst_static_pad_template_get (&src_factory));
element_class->set_context = gst_gl_test_src_set_context;
+ element_class->change_state = gst_gl_test_src_change_state;
gstbasesrc_class->set_caps = gst_gl_test_src_setcaps;
gstbasesrc_class->get_caps = gst_gl_test_src_getcaps;
gst_buffer_unref (src->buffer);
src->buffer = NULL;
}
+
+static GstStateChangeReturn
+gst_gl_test_src_change_state (GstElement * element, GstStateChange transition)
+{
+ GstGLTestSrc *src = GST_GL_TEST_SRC (element);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ GST_DEBUG_OBJECT (src, "changing state: %s => %s",
+ gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
+ gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_gl_ensure_element_data (element, &src->display,
+ &src->other_context))
+ return GST_STATE_CHANGE_FAILURE;
+
+ gst_gl_display_filter_gl_api (src->display, SUPPORTED_GL_APIS);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ default:
+ break;
+ }
+
+ return ret;
+}
#define gst_gl_base_filter_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstGLBaseFilter, gst_gl_base_filter,
GST_TYPE_BASE_TRANSFORM, GST_DEBUG_CATEGORY_INIT (gst_gl_base_filter_debug,
- "glbasefilter", 0, "glbasefilter element"););
+ "glbasefilter", 0, "glbasefilter element");
+ );
static void gst_gl_base_filter_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_gl_base_filter_set_context (GstElement * element,
GstContext * context);
+static GstStateChangeReturn gst_gl_base_filter_change_state (GstElement *
+ element, GstStateChange transition);
static gboolean gst_gl_base_filter_query (GstBaseTransform * trans,
GstPadDirection direction, GstQuery * query);
static void gst_gl_base_filter_reset (GstGLBaseFilter * filter);
gst_gl_base_filter_propose_allocation;
element_class->set_context = gst_gl_base_filter_set_context;
+ element_class->change_state = gst_gl_base_filter_change_state;
g_object_class_install_property (gobject_class, PROP_CONTEXT,
g_param_spec_object ("context",
return FALSE;
}
-static gboolean
-_ensure_gl_setup (GstGLBaseFilter * filter)
-{
- GstGLBaseFilterClass *filter_class = GST_GL_BASE_FILTER_GET_CLASS (filter);
-
- if (!gst_gl_ensure_element_data (filter, &filter->display,
- &filter->priv->other_context)) {
- return FALSE;
- }
-
- gst_gl_display_filter_gl_api (filter->display,
- filter_class->supported_gl_api);
-
- _find_local_gl_context (filter);
-
- return TRUE;
-}
-
static gboolean
gst_gl_base_filter_query (GstBaseTransform * trans, GstPadDirection direction,
GstQuery * query)
{
if (direction == GST_PAD_SINK
&& gst_base_transform_is_passthrough (trans)) {
- if (!_ensure_gl_setup (filter))
- return FALSE;
+ _find_local_gl_context (filter);
return gst_pad_peer_query (GST_BASE_TRANSFORM_SRC_PAD (trans), query);
}
static gboolean
gst_gl_base_filter_start (GstBaseTransform * bt)
{
- GstGLBaseFilter *filter = GST_GL_BASE_FILTER (bt);
- GstGLBaseFilterClass *filter_class = GST_GL_BASE_FILTER_GET_CLASS (filter);
-
- if (!gst_gl_ensure_element_data (filter, &filter->display,
- &filter->priv->other_context))
- return FALSE;
-
- gst_gl_display_filter_gl_api (filter->display,
- filter_class->supported_gl_api);
-
return TRUE;
}
{
return FALSE;
}
+
+static GstStateChangeReturn
+gst_gl_base_filter_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstGLBaseFilter *filter = GST_GL_BASE_FILTER (element);
+ GstGLBaseFilterClass *filter_class = GST_GL_BASE_FILTER_GET_CLASS (filter);
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ GST_DEBUG_OBJECT (filter, "changing state: %s => %s",
+ gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
+ gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_gl_ensure_element_data (element, &filter->display,
+ &filter->priv->other_context))
+ return GST_STATE_CHANGE_FAILURE;
+
+ gst_gl_display_filter_gl_api (filter->display,
+ filter_class->supported_gl_api);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ default:
+ break;
+ }
+
+ return ret;
+}
{
GstGLFilter *filter = GST_GL_FILTER (bt);
GstGLFilterClass *filter_class = GST_GL_FILTER_GET_CLASS (filter);
- GstGLDisplay *display = GST_GL_BASE_FILTER (bt)->display;
-
- if (display)
- gst_gl_display_filter_gl_api (display, filter_class->supported_gl_api);
if (filter_class->onStart)
filter_class->onStart (filter);