plugins/elements/gsttypefindelement.c: Move detecting the input caps of the sinkpad to the setcaps function.

Original commit message from CVS:
* plugins/elements/gsttypefindelement.c:
(gst_type_find_element_have_type), (gst_type_find_element_init),
(gst_type_find_element_setcaps), (gst_type_find_element_chain):
Move detecting the input caps of the sinkpad to the setcaps function.
This allows us to update the output caps when we receive new input caps
instead of always using the first detected caps.
This commit is contained in:
Wim Taymans 2007-10-08 10:28:18 +00:00
parent 71f92e2b3e
commit 7fbe1b8cd5
2 changed files with 47 additions and 23 deletions

View file

@ -1,3 +1,12 @@
2007-10-08 Wim Taymans <wim.taymans@gmail.com>
* plugins/elements/gsttypefindelement.c:
(gst_type_find_element_have_type), (gst_type_find_element_init),
(gst_type_find_element_setcaps), (gst_type_find_element_chain):
Move detecting the input caps of the sinkpad to the setcaps function.
This allows us to update the output caps when we receive new input caps
instead of always using the first detected caps.
2007-10-08 Wim Taymans <wim.taymans@gmail.com> 2007-10-08 Wim Taymans <wim.taymans@gmail.com>
* libs/gst/base/gstbasesink.c: (gst_base_sink_event), * libs/gst/base/gstbasesink.c: (gst_base_sink_event),

View file

@ -125,6 +125,7 @@ static gboolean gst_type_find_handle_src_query (GstPad * pad, GstQuery * query);
static gboolean gst_type_find_element_handle_event (GstPad * pad, static gboolean gst_type_find_element_handle_event (GstPad * pad,
GstEvent * event); GstEvent * event);
static gboolean gst_type_find_element_setcaps (GstPad * pad, GstCaps * caps);
static GstFlowReturn gst_type_find_element_chain (GstPad * sinkpad, static GstFlowReturn gst_type_find_element_chain (GstPad * sinkpad,
GstBuffer * buffer); GstBuffer * buffer);
static GstFlowReturn gst_type_find_element_getrange (GstPad * srcpad, static GstFlowReturn gst_type_find_element_getrange (GstPad * srcpad,
@ -148,10 +149,11 @@ static void
gst_type_find_element_have_type (GstTypeFindElement * typefind, gst_type_find_element_have_type (GstTypeFindElement * typefind,
guint probability, const GstCaps * caps) guint probability, const GstCaps * caps)
{ {
g_assert (typefind->caps == NULL);
g_assert (caps != NULL); g_assert (caps != NULL);
GST_INFO_OBJECT (typefind, "found caps %" GST_PTR_FORMAT, caps); GST_INFO_OBJECT (typefind, "found caps %" GST_PTR_FORMAT, caps);
if (typefind->caps)
gst_caps_unref (typefind->caps);
typefind->caps = gst_caps_copy (caps); typefind->caps = gst_caps_copy (caps);
gst_pad_set_caps (typefind->src, (GstCaps *) caps); gst_pad_set_caps (typefind->src, (GstCaps *) caps);
} }
@ -228,6 +230,8 @@ gst_type_find_element_init (GstTypeFindElement * typefind,
gst_pad_set_activate_function (typefind->sink, gst_pad_set_activate_function (typefind->sink,
GST_DEBUG_FUNCPTR (gst_type_find_element_activate)); GST_DEBUG_FUNCPTR (gst_type_find_element_activate));
gst_pad_set_setcaps_function (typefind->sink,
GST_DEBUG_FUNCPTR (gst_type_find_element_setcaps));
gst_pad_set_chain_function (typefind->sink, gst_pad_set_chain_function (typefind->sink,
GST_DEBUG_FUNCPTR (gst_type_find_element_chain)); GST_DEBUG_FUNCPTR (gst_type_find_element_chain));
gst_pad_set_event_function (typefind->sink, gst_pad_set_event_function (typefind->sink,
@ -529,6 +533,39 @@ gst_type_find_element_send_cached_events (GstTypeFindElement * typefind)
typefind->cached_events = NULL; typefind->cached_events = NULL;
} }
static gboolean
gst_type_find_element_setcaps (GstPad * pad, GstCaps * caps)
{
GstTypeFindElement *typefind;
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
/* don't operate on ANY caps */
if (gst_caps_is_any (caps))
return TRUE;
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
GST_TYPE_FIND_MAXIMUM, caps);
/* Shortcircuit typefinding if we get caps */
if (typefind->mode == MODE_TYPEFIND) {
GST_DEBUG_OBJECT (typefind, "Skipping typefinding, using caps from "
"upstream buffer: %" GST_PTR_FORMAT, caps);
typefind->mode = MODE_NORMAL;
gst_type_find_element_send_cached_events (typefind);
if (typefind->store) {
GST_DEBUG_OBJECT (typefind, "Pushing store: %d",
GST_BUFFER_SIZE (typefind->store));
gst_buffer_set_caps (typefind->store, typefind->caps);
gst_pad_push (typefind->src, typefind->store);
typefind->store = NULL;
}
}
return TRUE;
}
static GstFlowReturn static GstFlowReturn
gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer) gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer)
{ {
@ -537,28 +574,6 @@ gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer)
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad)); typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
/* Shortcircuit typefinding if we already have non-any caps */
if (typefind->mode == MODE_TYPEFIND) {
const GstCaps *caps = GST_BUFFER_CAPS (buffer);
if (caps && !gst_caps_is_any (caps)) {
GST_DEBUG_OBJECT (typefind, "Skipping typefinding, using caps from "
"upstream buffer: %" GST_PTR_FORMAT, caps);
typefind->mode = MODE_NORMAL;
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
GST_TYPE_FIND_MAXIMUM, caps);
gst_type_find_element_send_cached_events (typefind);
if (typefind->store) {
GST_DEBUG_OBJECT (typefind, "Pushing store: %d",
GST_BUFFER_SIZE (typefind->store));
gst_buffer_set_caps (typefind->store, typefind->caps);
gst_pad_push (typefind->src, typefind->store);
typefind->store = NULL;
}
}
}
switch (typefind->mode) { switch (typefind->mode) {
case MODE_ERROR: case MODE_ERROR:
/* we should already have called GST_ELEMENT_ERROR */ /* we should already have called GST_ELEMENT_ERROR */