[456/906] glfilter/glmixer/gltestsrc/glupload: throw an element error if no parent bin

Fixes bug #602153
This commit is contained in:
Julien Isorce 2010-05-05 11:21:31 +02:00 committed by Matthew Waters
parent 2b46c87bd0
commit 2c43a348fa
4 changed files with 64 additions and 22 deletions

View file

@ -238,11 +238,20 @@ gst_gl_filter_start (GstBaseTransform * bt)
GstGLFilter *filter = GST_GL_FILTER (bt); GstGLFilter *filter = GST_GL_FILTER (bt);
GstGLFilterClass *filter_class = GST_GL_FILTER_GET_CLASS (filter); GstGLFilterClass *filter_class = GST_GL_FILTER_GET_CLASS (filter);
GstElement *parent = GST_ELEMENT (gst_element_get_parent (filter)); GstElement *parent = GST_ELEMENT (gst_element_get_parent (filter));
GstStructure *structure = GstStructure *structure = NULL;
gst_structure_new (gst_element_get_name (filter), NULL); GstQuery *query = NULL;
GstQuery *query = gst_query_new_application (GST_QUERY_CUSTOM, structure); gboolean isPerformed = FALSE;
gboolean isPerformed = gst_element_query (parent, query); if (!parent) {
GST_ELEMENT_ERROR (filter, CORE, STATE_CHANGE, (NULL),
("A parent bin is required"));
return FALSE;
}
structure = gst_structure_new (gst_element_get_name (filter), NULL);
query = gst_query_new_application (GST_QUERY_CUSTOM, structure);
isPerformed = gst_element_query (parent, query);
if (isPerformed) { if (isPerformed) {
const GValue *id_value = const GValue *id_value =

View file

@ -1243,12 +1243,21 @@ gst_gl_mixer_change_state (GstElement * element, GstStateChange transition)
gint i = 0; gint i = 0;
GstElement *parent = GST_ELEMENT (gst_element_get_parent (mix)); GstElement *parent = GST_ELEMENT (gst_element_get_parent (mix));
GstStructure *structure = GstStructure *structure = NULL;
gst_structure_new (gst_element_get_name (mix), NULL); GstQuery *query = NULL;
GstQuery *query = gst_query_new_application (GST_QUERY_CUSTOM, structure); gboolean isPerformed = FALSE;
if (!parent) {
GST_ELEMENT_ERROR (mix, CORE, STATE_CHANGE, (NULL),
("A parent bin is required"));
return FALSE;
}
structure = gst_structure_new (gst_element_get_name (mix), NULL);
query = gst_query_new_application (GST_QUERY_CUSTOM, structure);
/* retrieve the gldisplay that is owned by gl elements after the gl mixer */ /* retrieve the gldisplay that is owned by gl elements after the gl mixer */
gboolean isPerformed = gst_element_query (parent, query); isPerformed = gst_element_query (parent, query);
if (isPerformed) { if (isPerformed) {
const GValue *id_value = const GValue *id_value =

View file

@ -312,7 +312,9 @@ gst_gl_test_src_src_query (GstPad * pad, GstQuery * query)
case GST_QUERY_CUSTOM: case GST_QUERY_CUSTOM:
{ {
GstStructure *structure = gst_query_get_structure (query); GstStructure *structure = gst_query_get_structure (query);
res = g_strcmp0 (gst_element_get_name (parent), gst_structure_get_name (structure)) == 0; res =
g_strcmp0 (gst_element_get_name (parent),
gst_structure_get_name (structure)) == 0;
break; break;
} }
default: default:
@ -383,6 +385,7 @@ gst_gl_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
gltestsrc->width, gltestsrc->height, gltestsrc->width, gltestsrc->height,
gltestsrc->rate_numerator, gltestsrc->rate_denominator); gltestsrc->rate_numerator, gltestsrc->rate_denominator);
gst_gl_display_gen_fbo (gltestsrc->display, gltestsrc->width, gst_gl_display_gen_fbo (gltestsrc->display, gltestsrc->width,
gltestsrc->height, &gltestsrc->fbo, &gltestsrc->depthbuffer); gltestsrc->height, &gltestsrc->fbo, &gltestsrc->depthbuffer);
} }
@ -614,16 +617,28 @@ gst_gl_test_src_start (GstBaseSrc * basesrc)
{ {
GstGLTestSrc *src = GST_GL_TEST_SRC (basesrc); GstGLTestSrc *src = GST_GL_TEST_SRC (basesrc);
GstElement *parent = GST_ELEMENT (gst_element_get_parent (src)); GstElement *parent = GST_ELEMENT (gst_element_get_parent (src));
GstStructure *structure = gst_structure_new (gst_element_get_name (src), NULL); GstStructure *structure = NULL;
GstQuery *query = gst_query_new_application (GST_QUERY_CUSTOM, structure); GstQuery *query = NULL;
gboolean isPerformed = FALSE;
gboolean isPerformed = gst_element_query (parent, query); if (!parent) {
GST_ELEMENT_ERROR (src, CORE, STATE_CHANGE, (NULL),
("A parent bin is required"));
return FALSE;
}
structure = gst_structure_new (gst_element_get_name (src), NULL);
query = gst_query_new_application (GST_QUERY_CUSTOM, structure);
isPerformed = gst_element_query (parent, query);
if (isPerformed) { if (isPerformed) {
const GValue *id_value = gst_structure_get_value (structure, "gstgldisplay"); const GValue *id_value =
gst_structure_get_value (structure, "gstgldisplay");
if (G_VALUE_HOLDS_POINTER (id_value)) if (G_VALUE_HOLDS_POINTER (id_value))
/* at least one gl element is before in our gl chain */ /* at least one gl element is before in our gl chain */
src->display = g_object_ref (GST_GL_DISPLAY (g_value_get_pointer (id_value))); src->display =
g_object_ref (GST_GL_DISPLAY (g_value_get_pointer (id_value)));
else { else {
/* this gl filter is a sink in terms of the gl chain */ /* this gl filter is a sink in terms of the gl chain */
src->display = gst_gl_display_new (); src->display = gst_gl_display_new ();

View file

@ -273,11 +273,20 @@ gst_gl_upload_start (GstBaseTransform * bt)
{ {
GstGLUpload *upload = GST_GL_UPLOAD (bt); GstGLUpload *upload = GST_GL_UPLOAD (bt);
GstElement *parent = GST_ELEMENT (gst_element_get_parent (upload)); GstElement *parent = GST_ELEMENT (gst_element_get_parent (upload));
GstStructure *structure = GstStructure *structure = NULL;
gst_structure_new (gst_element_get_name (upload), NULL); GstQuery *query = NULL;
GstQuery *query = gst_query_new_application (GST_QUERY_CUSTOM, structure); gboolean isPerformed = FALSE;
gboolean isPerformed = gst_element_query (parent, query); if (!parent) {
GST_ELEMENT_ERROR (upload, CORE, STATE_CHANGE, (NULL),
("A parent bin is required"));
return FALSE;
}
structure = gst_structure_new (gst_element_get_name (upload), NULL);
query = gst_query_new_application (GST_QUERY_CUSTOM, structure);
isPerformed = gst_element_query (parent, query);
if (isPerformed) { if (isPerformed) {
const GValue *id_value = const GValue *id_value =