static gboolean gst_kate_dec_sink_handle_event (GstPad * pad, GstEvent * event) { GstKateDec *kd = (GstKateDec *) (gst_object_get_parent (GST_OBJECT (pad))); gboolean res = TRUE; GST_LOG_OBJECT (pad, "Handling event on sink pad: %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: gst_kate_util_decoder_base_segment_event (&kd->decoder, event); res = gst_pad_event_default (pad, event); break; case GST_EVENT_FLUSH_START: gst_kate_util_decoder_base_set_flushing (&kd->decoder, TRUE); res = gst_pad_event_default (pad, event); break; case GST_EVENT_FLUSH_STOP: gst_kate_util_decoder_base_set_flushing (&kd->decoder, FALSE); res = gst_pad_event_default (pad, event); break; default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (kd); return res; }
gboolean gst_kate_util_decoder_base_queue_event (GstKateDecoderBase * decoder, GstEvent * event, gboolean (*handler) (GstPad *, GstObject *, GstEvent *), GstObject * parent, GstPad * pad) { gboolean can_be_queued; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: case GST_EVENT_FLUSH_STOP: case GST_EVENT_EOS: can_be_queued = FALSE; break; case GST_EVENT_SEGMENT: gst_kate_util_decoder_base_segment_event (decoder, event); can_be_queued = TRUE; break; default: can_be_queued = TRUE; break; } if (GST_EVENT_IS_STICKY (event) && GST_EVENT_TYPE (event) < GST_EVENT_CAPS) can_be_queued = FALSE; if (decoder->delay_events && can_be_queued) { GstKateDecoderBaseQueuedEvent *item; GST_DEBUG_OBJECT (decoder, "We have to delay the event"); item = g_slice_new (GstKateDecoderBaseQueuedEvent); if (item) { item->event = event; item->parent = parent; item->pad = pad; item->handler = handler; g_queue_push_tail (decoder->event_queue, item); return TRUE; } else { return FALSE; } } else { return FALSE; } }