static gboolean gst_asf_parse_sink_activate (GstPad * sinkpad, GstObject * parent) { GstQuery *query; gboolean pull_mode; query = gst_query_new_scheduling (); if (!gst_pad_peer_query (sinkpad, query)) { gst_query_unref (query); goto activate_push; } pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); gst_query_unref (query); if (!pull_mode) goto activate_push; GST_DEBUG_OBJECT (sinkpad, "activating pull"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); activate_push: { GST_DEBUG_OBJECT (sinkpad, "activating push"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); } }
static gboolean gst_wildmidi_activate (GstPad * sinkpad, GstObject * parent) { GstQuery *query; gboolean pull_mode; query = gst_query_new_scheduling (); if (!gst_pad_peer_query (sinkpad, query)) { gst_query_unref (query); goto activate_push; } pull_mode = gst_query_has_scheduling_mode_with_flags (query, GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); gst_query_unref (query); if (!pull_mode) goto activate_push; GST_DEBUG_OBJECT (sinkpad, "activating pull"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); activate_push: { GST_DEBUG_OBJECT (sinkpad, "activating push"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); } }
static gboolean gst_type_find_element_activate_sink (GstPad * pad, GstObject * parent) { GstQuery *query; gboolean pull_mode; query = gst_query_new_scheduling (); if (!gst_pad_peer_query (pad, query)) { gst_query_unref (query); goto typefind_push; } pull_mode = gst_query_has_scheduling_mode_with_flags (query, GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); 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_rnd_buffer_size_activate (GstPad * pad, GstObject * parent) { GstQuery *query; gboolean pull_mode; query = gst_query_new_scheduling (); if (!gst_pad_peer_query (pad, query)) { gst_query_unref (query); goto no_pull; } pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); gst_query_unref (query); if (!pull_mode) goto no_pull; GST_DEBUG_OBJECT (pad, "activating pull"); return gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE); /* ERRORS */ no_pull: { GST_DEBUG_OBJECT (pad, "pull mode not supported"); return FALSE; } }
static gboolean gst_raw_parse_sink_activate (GstPad * sinkpad, GstObject * parent) { GstQuery *query; gboolean pull_mode = FALSE; query = gst_query_new_scheduling (); if (gst_pad_peer_query (sinkpad, query)) pull_mode = gst_query_has_scheduling_mode_with_flags (query, GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); gst_query_unref (query); if (pull_mode) { GST_DEBUG ("going to pull mode"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); } else { GST_DEBUG ("going to push (streaming) mode"); return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); } }
static gboolean gst_rnd_buffer_size_activate (GstPad * pad, GstObject * parent) { GstQuery *query; gboolean pull_mode; query = gst_query_new_scheduling (); if (gst_pad_peer_query (pad, query)) pull_mode = gst_query_has_scheduling_mode_with_flags (query, GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE); else pull_mode = FALSE; gst_query_unref (query); if (pull_mode) { GST_DEBUG_OBJECT (pad, "activating pull"); return gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE); } else { GST_DEBUG_OBJECT (pad, "activating 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); } }