+2004-07-25 Benjamin Otte <otte@gnome.org>
+
+ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_link):
+ don't delay links on the sink elements, it causes unnegotiated
+ links.
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_base_init):
+ add our padtemplates, we indeed do have some.
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_chain):
+ don't push data when typefinding failed.
+ * gst/gstpad.c: (gst_pad_link_fixate):
+ check that no fixate function returns empty caps.
+ * gst/gstpad.c: (gst_pad_push):
+ check that the link is negotiated before data gets pushed.
+ * tools/gst-register.c: (main):
+ don't assert (fixes #148283)
+
2004-07-25 Steve Lhomme <steve.lhomme@free.fr>
* docs/gst/gstreamer-sections.txt:
GST_SPIDER_IDENTITY (gst_pad_get_parent (pad));
GstPad *otherpad;
- if (pad == spider_identity->src)
+ if (pad == spider_identity->src) {
otherpad = spider_identity->sink;
- else
+ if (GST_PAD_PEER (otherpad) == NULL)
+ return GST_PAD_LINK_DELAYED;
+ } else {
otherpad = spider_identity->src;
+ }
g_return_val_if_fail (otherpad != NULL, GST_PAD_LINK_REFUSED);
- if (GST_PAD_PEER (otherpad) == NULL)
- return GST_PAD_LINK_DELAYED;
return gst_pad_try_set_caps (otherpad, caps);
}
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_sink_template));
gst_element_class_set_details (gstelement_class,
&gst_type_find_element_details);
}
GST_PLUGIN_FEATURE_NAME (entry->factory), entry->probability);
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
entry->probability, entry->caps);
+ stop_typefinding (typefind);
+ gst_pad_event_default (pad, event);
+ } else {
+ gst_pad_event_default (pad, event);
+ GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ stop_typefinding (typefind);
}
- stop_typefinding (typefind);
- gst_pad_event_default (pad, event);
break;
default:
gst_data_unref (GST_DATA (event));
stop_typefinding (typefind);
} else if (typefind->possibilities == NULL) {
GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ stop_typefinding (typefind);
} else {
/* set up typefind element for next iteration */
typefind->possibilities =
if (i == 4) {
/* we trust the default fixation function unconditionally */
bad = FALSE;
+ } else if (gst_caps_is_empty (newcaps)) {
+ g_warning
+ ("a fixation function did not fixate correctly, it returned empty caps");
+ gst_caps_free (newcaps);
+ continue;
} else if (gst_caps_is_any (caps)) {
bad = gst_caps_is_any (newcaps);
} else {
return;
}
+ if (GST_IS_BUFFER (data) && !gst_pad_is_negotiated (pad)) {
+ g_warning ("pushing data on non-negotiated pad %s:%s, not allowed.",
+ GST_DEBUG_PAD_NAME (pad));
+ gst_data_unref (data);
+ return;
+ }
+
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pushing");
peer = GST_RPAD_PEER (pad);
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_sink_template));
gst_element_class_set_details (gstelement_class,
&gst_type_find_element_details);
}
GST_PLUGIN_FEATURE_NAME (entry->factory), entry->probability);
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
entry->probability, entry->caps);
+ stop_typefinding (typefind);
+ gst_pad_event_default (pad, event);
+ } else {
+ gst_pad_event_default (pad, event);
+ GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ stop_typefinding (typefind);
}
- stop_typefinding (typefind);
- gst_pad_event_default (pad, event);
break;
default:
gst_data_unref (GST_DATA (event));
stop_typefinding (typefind);
} else if (typefind->possibilities == NULL) {
GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ stop_typefinding (typefind);
} else {
/* set up typefind element for next iteration */
typefind->possibilities =
/* move over paths from this registry to the next one */
path_spill = g_list_concat (path_spill,
gst_registry_get_path_list (registry));
- g_assert (path_spill != NULL);
+ /* this assertion triggers for a non-readable/writable user registry,
+ * see #148283 */
+ /* g_assert (path_spill != NULL); */
}
/* also move over paths if the registry wasn't writable
* FIXME: we should check if the paths that were loaded from this