static gboolean gst_smpte_sink_event (GstCollectPads * pads, GstCollectData * data, GstEvent * event, gpointer user_data) { GstPad *pad; gboolean ret = FALSE; pad = data->pad; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_smpte_setcaps (pad, caps); gst_event_unref (event); event = NULL; break; } default: break; } if (event != NULL) return gst_collect_pads_event_default (pads, data, event, FALSE); return ret; }
static gboolean gst_mxf_mux_handle_sink_event (GstCollectPads * pads, GstCollectData * data, GstEvent * event, gpointer user_data) { GstCaps *caps; gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: /* TODO: do something with the tags */ break; case GST_EVENT_SEGMENT: /* We don't support SEGMENT events */ ret = FALSE; gst_event_unref (event); break; case GST_EVENT_CAPS: gst_event_parse_caps (event, &caps); gst_mxf_mux_event_caps (data->pad, caps); gst_caps_unref (caps); break; default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ if (ret) ret = gst_collect_pads_event_default (pads, data, event, FALSE); return ret; }
static gboolean gst_frei0r_mixer_sink_event (GstCollectPads * pads, GstCollectData * cdata, GstEvent * event, GstFrei0rMixer * self) { gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_frei0r_mixer_set_caps (self, cdata->pad, caps); gst_event_unref (event); break; } default: ret = gst_collect_pads_event_default (pads, cdata, event, FALSE); break; } return ret; }
static gboolean gst_interleave_sink_event (GstCollectPads * pads, GstCollectData * data, GstEvent * event, gpointer user_data) { GstInterleave *self = GST_INTERLEAVE (user_data); gboolean ret = TRUE; GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (data->pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: GST_OBJECT_LOCK (self); gst_event_replace (&self->pending_segment, NULL); GST_OBJECT_UNLOCK (self); break; case GST_EVENT_SEGMENT: { GST_OBJECT_LOCK (self); gst_event_replace (&self->pending_segment, event); GST_OBJECT_UNLOCK (self); break; } case GST_EVENT_CAPS: { GstCaps *caps; GstAudioInfo info; GValue *val; guint channel; gst_event_parse_caps (event, &caps); if (!gst_audio_info_from_caps (&info, caps)) { GST_WARNING_OBJECT (self, "invalid sink caps"); gst_event_unref (event); event = NULL; ret = FALSE; break; } if (self->channel_positions_from_input && GST_AUDIO_INFO_CHANNELS (&info) == 1) { channel = GST_INTERLEAVE_PAD_CAST (data->pad)->channel; val = g_value_array_get_nth (self->input_channel_positions, channel); g_value_set_enum (val, GST_AUDIO_INFO_POSITION (&info, 0)); } if (!gst_pad_has_current_caps (data->pad)) g_atomic_int_add (&self->configured_sinkpads_counter, 1); /* Last caps that are set on a sink pad are used as output caps */ if (g_atomic_int_get (&self->configured_sinkpads_counter) == self->channels) { ret = gst_interleave_sink_setcaps (self, data->pad, caps, &info); gst_event_unref (event); event = NULL; } break; } case GST_EVENT_TAG: GST_FIXME_OBJECT (self, "FIXME: merge tags and send after stream-start"); break; default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ if (event != NULL) return gst_collect_pads_event_default (pads, data, event, FALSE); return ret; }
static gboolean gst_adder_sink_event (GstCollectPads * pads, GstCollectData * pad, GstEvent * event, gpointer user_data) { GstAdder *adder = GST_ADDER (user_data); gboolean res = TRUE, discard = FALSE; GST_DEBUG_OBJECT (pad->pad, "Got %s event on sink pad", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); res = gst_adder_setcaps (adder, pad->pad, caps); gst_event_unref (event); event = NULL; break; } case GST_EVENT_FLUSH_START: /* ensure that we will send a flush stop */ res = gst_collect_pads_event_default (pads, pad, event, discard); event = NULL; GST_COLLECT_PADS_STREAM_LOCK (adder->collect); adder->flush_stop_pending = TRUE; GST_COLLECT_PADS_STREAM_UNLOCK (adder->collect); break; case GST_EVENT_FLUSH_STOP: /* we received a flush-stop. We will only forward it when * flush_stop_pending is set, and we will unset it then. */ g_atomic_int_set (&adder->new_segment_pending, TRUE); GST_COLLECT_PADS_STREAM_LOCK (adder->collect); if (adder->flush_stop_pending) { GST_DEBUG_OBJECT (pad->pad, "forwarding flush stop"); res = gst_collect_pads_event_default (pads, pad, event, discard); adder->flush_stop_pending = FALSE; event = NULL; } else { discard = TRUE; GST_DEBUG_OBJECT (pad->pad, "eating flush stop"); } GST_COLLECT_PADS_STREAM_UNLOCK (adder->collect); /* Clear pending tags */ if (adder->pending_events) { g_list_foreach (adder->pending_events, (GFunc) gst_event_unref, NULL); g_list_free (adder->pending_events); adder->pending_events = NULL; } break; case GST_EVENT_TAG: /* collect tags here so we can push them out when we collect data */ adder->pending_events = g_list_append (adder->pending_events, event); event = NULL; break; case GST_EVENT_SEGMENT:{ const GstSegment *segment; gst_event_parse_segment (event, &segment); if (segment->rate != adder->segment.rate) { GST_ERROR_OBJECT (pad->pad, "Got segment event with wrong rate %lf, expected %lf", segment->rate, adder->segment.rate); res = FALSE; gst_event_unref (event); event = NULL; } discard = TRUE; break; } default: break; } if (G_LIKELY (event)) return gst_collect_pads_event_default (pads, pad, event, discard); else return res; }