static gboolean gst_neonhttp_src_query (GstBaseSrc * bsrc, GstQuery * query) { GstNeonhttpSrc *src = GST_NEONHTTP_SRC (bsrc); gboolean ret; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_URI: gst_query_set_uri (query, src->location); ret = TRUE; break; default: ret = FALSE; break; } if (!ret) ret = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_SCHEDULING: { GstSchedulingFlags flags; gint minsize, maxsize, align; gst_query_parse_scheduling (query, &flags, &minsize, &maxsize, &align); flags |= GST_SCHEDULING_FLAG_BANDWIDTH_LIMITED; gst_query_set_scheduling (query, flags, minsize, maxsize, align); break; } default: break; } return ret; }
static gboolean gst_type_find_element_activate_sink (GstPad * pad, GstObject * parent) { GstQuery *query; gboolean pull_mode; GstSchedulingFlags sched_flags; query = gst_query_new_scheduling (); if (!gst_pad_peer_query (pad, query)) { gst_query_unref (query); 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); gst_query_unref (query); if (!pull_mode) goto typefind_push; if (!gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE)) goto typefind_push; /* only start our task if we ourselves decide to start in pull mode */ return gst_pad_start_task (pad, (GstTaskFunction) gst_type_find_element_loop, pad, NULL); typefind_push: { return gst_pad_activate_mode (pad, GST_PAD_MODE_PUSH, TRUE); } }
static gboolean gst_type_find_element_activate_sink (GstPad * pad, GstObject * parent) { GstTypeFindElement *typefind; GstQuery *query; gboolean pull_mode; GstCaps *found_caps = NULL; GstTypeFindProbability probability = GST_TYPE_FIND_NONE; GstSchedulingFlags sched_flags; typefind = GST_TYPE_FIND_ELEMENT (parent); /* if we have force caps, use those */ GST_OBJECT_LOCK (typefind); if (typefind->force_caps) { found_caps = gst_caps_ref (typefind->force_caps); probability = GST_TYPE_FIND_MAXIMUM; GST_OBJECT_UNLOCK (typefind); GST_DEBUG ("Emiting found caps %" GST_PTR_FORMAT, found_caps); g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0, probability, found_caps); typefind->mode = MODE_NORMAL; /* the signal above could have made a downstream element activate * the pad in pull mode, we check if the pad is already active now and if * so, we are done */ if (gst_pad_is_active (pad)) return TRUE; goto typefind_push; } GST_OBJECT_UNLOCK (typefind); query = gst_query_new_scheduling (); if (!gst_pad_peer_query (pad, query)) { gst_query_unref (query); 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); gst_query_unref (query); if (!pull_mode) goto typefind_push; if (!gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE)) goto typefind_push; /* only start our task if we ourselves decide to start in pull mode */ return gst_pad_start_task (pad, (GstTaskFunction) gst_type_find_element_loop, pad, NULL); typefind_push: { return gst_pad_activate_mode (pad, GST_PAD_MODE_PUSH, TRUE); } }