X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=plugins%2Felements%2Fgsttypefindelement.c;h=5da2d75713b2708d5eb3e99b561632f447ee353e;hb=a87b4551a6090663a1714f263d4e20fe75eb46ca;hp=ba82716967c1fae35c04cbc3d0e89c81672c594f;hpb=20859af3f2e9256b502905270426881e04b09898;p=platform%2Fupstream%2Fgstreamer.git diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index ba82716..5da2d75 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -20,6 +20,7 @@ */ /** * SECTION:element-typefind + * @title: typefind * * Determines the media-type of a stream. It applies typefind functions in the * order of their rank. Once the type has been detected it sets its src pad caps @@ -179,6 +180,10 @@ gst_type_find_element_have_type (GstTypeFindElement * typefind, GST_INFO_OBJECT (typefind, "found caps %" GST_PTR_FORMAT ", probability=%u", caps, probability); + /* Do nothing if downstream is pulling from us */ + if (GST_PAD_MODE (typefind->src) == GST_PAD_MODE_PULL) + return; + GST_OBJECT_LOCK (typefind); /* Now actually send the CAPS event downstream. @@ -193,9 +198,7 @@ gst_type_find_element_have_type (GstTypeFindElement * typefind, GstCaps *event_caps; gst_event_parse_caps (event, &event_caps); - if (caps == event_caps) { - event = event; - } else { + if (caps != event_caps) { gst_event_unref (event); event = gst_event_new_caps (caps); } @@ -448,6 +451,8 @@ gst_type_find_handle_src_query (GstPad * pad, GstObject * parent, switch (format) { case GST_FORMAT_BYTES: peer_pos -= gst_adapter_available (typefind->adapter); + if (peer_pos < 0) /* Clamp result to 0 */ + peer_pos = 0; break; default: /* FIXME */ @@ -554,6 +559,7 @@ gst_type_find_element_src_event (GstPad * pad, GstObject * parent, if (typefind->mode != MODE_NORMAL) { /* need to do more? */ + GST_LOG_OBJECT (typefind, "Still typefinding. Not passing event upstream"); gst_event_unref (event); return FALSE; } @@ -779,6 +785,8 @@ gst_type_find_element_setcaps (GstTypeFindElement * typefind, GstCaps * caps) if (gst_caps_is_any (caps)) return TRUE; + /* Set to MODE_NORMAL before emitting have-type, in case it triggers a seek */ + typefind->mode = MODE_NORMAL; gst_type_find_element_emit_have_type (typefind, GST_TYPE_FIND_MAXIMUM, caps); /* Shortcircuit typefinding if we get caps */ @@ -963,6 +971,8 @@ gst_type_find_element_chain_do_typefinding (GstTypeFindElement * typefind, /* probability is good enough too, so let's make it known ... emiting this * signal calls our object handler which sets the caps. */ + /* Set to MODE_NORMAL before emitting have-type, in case it triggers a seek */ + typefind->mode = MODE_NORMAL; gst_type_find_element_emit_have_type (typefind, probability, caps); /* .. and send out the accumulated data */ @@ -1154,8 +1164,9 @@ gst_type_find_element_loop (GstPad * pad) } GST_DEBUG ("Emiting found caps %" GST_PTR_FORMAT, found_caps); - gst_type_find_element_emit_have_type (typefind, probability, found_caps); + /* Set to MODE_NORMAL before emitting have-type, in case it triggers a seek */ typefind->mode = MODE_NORMAL; + gst_type_find_element_emit_have_type (typefind, probability, found_caps); gst_caps_unref (found_caps); } else if (typefind->mode == MODE_NORMAL) { GstBuffer *outbuf = NULL; @@ -1214,8 +1225,7 @@ pause: } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) { /* for fatal errors we post an error message */ - GST_ELEMENT_ERROR (typefind, STREAM, FAILED, (NULL), - ("stream stopped, reason %s", reason)); + GST_ELEMENT_FLOW_ERROR (typefind, ret); push_eos = TRUE; } if (push_eos) { @@ -1271,7 +1281,6 @@ gst_type_find_element_activate_sink (GstPad * pad, GstObject * parent) { GstQuery *query; gboolean pull_mode; - GstSchedulingFlags sched_flags; query = gst_query_new_scheduling (); @@ -1280,10 +1289,8 @@ gst_type_find_element_activate_sink (GstPad * pad, GstObject * parent) goto typefind_push; } - gst_query_parse_scheduling (query, &sched_flags, NULL, NULL, NULL); - - pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL) - && ((sched_flags & GST_SCHEDULING_FLAG_SEEKABLE) != 0); + pull_mode = gst_query_has_scheduling_mode_with_flags (query, + GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); gst_query_unref (query);