+2004-05-06 Benjamin Otte <in7y118@public.uni-hamburg.de>
+
+ * gst/elements/gstfilesrc.c: (gst_filesrc_get),
+ (gst_filesrc_change_state), (gst_filesrc_srcpad_event):
+ * gst/elements/gstfilesrc.h:
+ send NEW_MEDIA events correctly
+ * gst/elements/gsttypefindelement.c: (start_typefinding),
+ (gst_type_find_element_handle_event):
+ restart typefinding when we get a NEW_MEDIA event
+ * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_change_state),
+ (gst_bin_dispose):
+ don't die when someone removes elements in callbacks
+ * gst/gstelement.c: (gst_element_change_state):
+ improve debugging
+ * gst/gstpad.c: (gst_pad_pull), (gst_pad_call_chain_function):
+ we need a NEW_MEDIA event to engage a link
+ * gst/gsttrace.c: (gst_trace_new), (gst_alloc_trace_set_flags_all):
+ don't g_print debugging stuff
+ * testsuite/caps/simplify.c: (check_caps):
+
2004-05-04 Benjamin Otte <otte@gnome.org>
* gst/parse/grammar.y:
if (src->need_discont) {
GstEvent *event;
- src->need_discont = FALSE;
GST_DEBUG_OBJECT (src, "sending discont");
event =
- gst_event_new_discontinuous (FALSE, GST_FORMAT_BYTES, src->curoffset,
- NULL);
+ gst_event_new_discontinuous (src->need_discont > 1, GST_FORMAT_BYTES,
+ src->curoffset, NULL);
+ src->need_discont = 0;
return GST_DATA (event);
}
if (!gst_filesrc_open_file (GST_FILESRC (element)))
return GST_STATE_FAILURE;
}
- src->need_discont = TRUE;
+ src->need_discont = 2;
break;
case GST_STATE_PAUSED_TO_READY:
if (GST_FLAG_IS_SET (element, GST_FILESRC_OPEN))
gst_filesrc_close_file (GST_FILESRC (element));
- src->need_discont = TRUE;
break;
default:
break;
goto error;
break;
}
- src->need_discont = TRUE;
+ src->need_discont = 1;
src->need_flush = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH;
break;
}
GstBuffer *mapbuf;
size_t mapsize;
- gboolean need_discont;
+ gint need_discont;
gboolean need_flush;
};
static void
start_typefinding (GstTypeFindElement * typefind)
{
- g_assert (typefind->caps == NULL);
g_assert (typefind->possibilities == NULL);
GST_DEBUG_OBJECT (typefind, "starting typefinding");
+ gst_pad_unnegotiate (typefind->src);
+ if (typefind->caps) {
+ gst_caps_replace (&typefind->caps, NULL);
+ }
typefind->mode = MODE_TYPEFIND;
typefind->stream_length_available = TRUE;
typefind->stream_length = 0;
break;
}
} else {
- gst_pad_event_default (pad, event);
+ if (GST_EVENT_TYPE (event) == GST_EVENT_DISCONTINUOUS &&
+ GST_EVENT_DISCONT_NEW_MEDIA (event)) {
+ start_typefinding (typefind);
+ gst_event_unref (event);
+ } else {
+ gst_pad_event_default (pad, event);
+ }
}
}
static guint8 *
GstElementState old_child_state;
child = GST_ELEMENT (children->data);
- children = g_list_next (children);
- if (GST_FLAG_IS_SET (child, GST_ELEMENT_LOCKED_STATE))
+ if (GST_FLAG_IS_SET (child, GST_ELEMENT_LOCKED_STATE)) {
+ children = g_list_next (children);
continue;
+ }
old_child_state = GST_STATE (child);
gst_element_state_get_name (pending));
break;
}
+ /* we need to do this down here, because there might be elements removed
+ * from this bin during state changes, so g_list_next (children) might
+ * change as well */
+ children = g_list_next (children);
}
GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
gst_bin_dispose (GObject * object)
{
GstBin *bin = GST_BIN (object);
- GList *children, *orig;
- GstElement *child;
GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "dispose");
if (gst_element_get_state (GST_ELEMENT (object)) == GST_STATE_PLAYING)
gst_element_set_state (GST_ELEMENT (object), GST_STATE_PAUSED);
- if (bin->children) {
- orig = children = g_list_copy (bin->children);
- while (children) {
- child = GST_ELEMENT (children->data);
- gst_bin_remove (bin, child);
- children = g_list_next (children);
- }
- g_list_free (bin->children);
- g_list_free (orig);
+ while (bin->children) {
+ gst_bin_remove (bin, GST_ELEMENT (bin->children->data));
}
- bin->children = NULL;
- bin->numchildren = 0;
+ g_assert (bin->children == NULL);
+ g_assert (bin->numchildren == 0);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
}
GST_CAT_LOG_OBJECT (GST_CAT_STATES, element,
- "default handler sets state from %s to %s %04x",
+ "default handler tries setting state from %s to %s %04x",
gst_element_state_get_name (old_state),
gst_element_state_get_name (old_pending), old_transition);
/* if we are going to paused, we try to negotiate the pads */
case GST_STATE_READY_TO_PAUSED:
g_assert (element->base_time == 0);
- if (!gst_element_negotiate_pads (element))
+ if (!gst_element_negotiate_pads (element)) {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "failed state change, could not negotiate pads");
goto failure;
+ }
break;
/* going to the READY state clears all pad caps */
/* FIXME: Why doesn't this happen on READY => NULL? -- Company */
data = (peer->gethandler) (GST_PAD (peer));
/* refetch - we might have been relinked */
link = GST_RPAD_LINK (pad);
+ peer = GST_RPAD_PEER (pad);
}
if (data) {
link->engaged = TRUE;
data = _invent_event (pad, GST_BUFFER (data));
} else if (GST_IS_EVENT (data) &&
- GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS) {
+ GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
+ GST_EVENT_DISCONT_NEW_MEDIA (data)) {
link->engaged = TRUE;
GST_CAT_LOG (GST_CAT_DATAFLOW,
"link engaged by discont event for pad %s:%s",
g_assert (link->temp_store == data);
link->temp_store = NULL;
} else if (GST_IS_EVENT (data) &&
- GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS) {
+ GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
+ GST_EVENT_DISCONT_NEW_MEDIA (data)) {
link->engaged = TRUE;
GST_CAT_LOG (GST_CAT_DATAFLOW,
"link engaged by discont event for pad %s:%s",
g_return_val_if_fail (trace != NULL, NULL);
trace->filename = g_strdup (filename);
- g_print ("opening '%s'\n", trace->filename);
+ GST_DEBUG ("opening '%s'\n", trace->filename);
#ifndef S_IWUSR
#define S_IWUSR S_IWRITE
#endif
while (walk) {
GstAllocTrace *trace = (GstAllocTrace *) walk->data;
- g_print ("set flags on %p\n", trace);
+ GST_DEBUG ("set flags on %p\n", trace);
gst_alloc_trace_set_flags (trace, flags);
walk = g_list_next (walk);
if (src->need_discont) {
GstEvent *event;
- src->need_discont = FALSE;
GST_DEBUG_OBJECT (src, "sending discont");
event =
- gst_event_new_discontinuous (FALSE, GST_FORMAT_BYTES, src->curoffset,
- NULL);
+ gst_event_new_discontinuous (src->need_discont > 1, GST_FORMAT_BYTES,
+ src->curoffset, NULL);
+ src->need_discont = 0;
return GST_DATA (event);
}
if (!gst_filesrc_open_file (GST_FILESRC (element)))
return GST_STATE_FAILURE;
}
- src->need_discont = TRUE;
+ src->need_discont = 2;
break;
case GST_STATE_PAUSED_TO_READY:
if (GST_FLAG_IS_SET (element, GST_FILESRC_OPEN))
gst_filesrc_close_file (GST_FILESRC (element));
- src->need_discont = TRUE;
break;
default:
break;
goto error;
break;
}
- src->need_discont = TRUE;
+ src->need_discont = 1;
src->need_flush = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH;
break;
}
GstBuffer *mapbuf;
size_t mapsize;
- gboolean need_discont;
+ gint need_discont;
gboolean need_flush;
};
static void
start_typefinding (GstTypeFindElement * typefind)
{
- g_assert (typefind->caps == NULL);
g_assert (typefind->possibilities == NULL);
GST_DEBUG_OBJECT (typefind, "starting typefinding");
+ gst_pad_unnegotiate (typefind->src);
+ if (typefind->caps) {
+ gst_caps_replace (&typefind->caps, NULL);
+ }
typefind->mode = MODE_TYPEFIND;
typefind->stream_length_available = TRUE;
typefind->stream_length = 0;
break;
}
} else {
- gst_pad_event_default (pad, event);
+ if (GST_EVENT_TYPE (event) == GST_EVENT_DISCONTINUOUS &&
+ GST_EVENT_DISCONT_NEW_MEDIA (event)) {
+ start_typefinding (typefind);
+ gst_event_unref (event);
+ } else {
+ gst_pad_event_default (pad, event);
+ }
}
}
static guint8 *