Beispiel #1
0
static void
gst_funnel_release_pad (GstElement * element, GstPad * pad)
{
  GstFunnel *funnel = GST_FUNNEL (element);
  GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
  gboolean got_eos;
  gboolean send_eos = FALSE;

  GST_DEBUG_OBJECT (funnel, "releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));

  gst_pad_set_active (pad, FALSE);

  got_eos = fpad->got_eos;

  gst_element_remove_pad (GST_ELEMENT_CAST (funnel), pad);

  GST_OBJECT_LOCK (funnel);
  if (!got_eos && gst_funnel_all_sinkpads_eos_unlocked (funnel, NULL)) {
    GST_DEBUG_OBJECT (funnel, "Pad removed. All others are EOS. Sending EOS");
    send_eos = TRUE;
  }
  GST_OBJECT_UNLOCK (funnel);

  if (send_eos)
    if (!gst_pad_push_event (funnel->srcpad, gst_event_new_eos ()))
      GST_WARNING_OBJECT (funnel, "Failure pushing EOS");
}
Beispiel #2
0
static void
gst_funnel_pad_finalize (GObject * gobject)
{
  GstFunnelPad *pad = GST_FUNNEL_PAD_CAST (gobject);

  g_slist_free_full (pad->events_sent, (GDestroyNotify) gst_event_unref);

  G_OBJECT_CLASS (gst_funnel_pad_parent_class)->finalize (gobject);
}
Beispiel #3
0
static gboolean
gst_funnel_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
  GstFunnel *funnel = GST_FUNNEL (parent);
  GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
  gboolean forward = TRUE;
  gboolean res = TRUE;
  gboolean unlock = FALSE;

  GST_DEBUG_OBJECT (pad, "received event %" GST_PTR_FORMAT, event);

  if (GST_EVENT_IS_STICKY (event)) {
    unlock = TRUE;
    GST_PAD_STREAM_LOCK (funnel->srcpad);

    if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
      GST_OBJECT_LOCK (funnel);
      fpad->got_eos = TRUE;
      if (!gst_funnel_all_sinkpads_eos_unlocked (funnel, pad)) {
        forward = FALSE;
      } else {
        forward = TRUE;
      }
      GST_OBJECT_UNLOCK (funnel);
    } else if (pad != funnel->last_sinkpad) {
      forward = FALSE;
    }
  } else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
    unlock = TRUE;
    GST_PAD_STREAM_LOCK (funnel->srcpad);
    GST_OBJECT_LOCK (funnel);
    fpad->got_eos = FALSE;
    GST_OBJECT_UNLOCK (funnel);
  } else if (GST_EVENT_TYPE (event) == GST_EVENT_GAP) {
    /* If no data is coming and we receive GAP event, need to forward sticky events. */
    unlock = TRUE;
    GST_PAD_STREAM_LOCK (funnel->srcpad);
    GST_OBJECT_LOCK (funnel);
    gst_object_replace ((GstObject **) & funnel->last_sinkpad,
        GST_OBJECT (pad));
    GST_OBJECT_UNLOCK (funnel);
    gst_pad_sticky_events_foreach (pad, forward_events, funnel->srcpad);
  }

  if (forward)
    res = gst_pad_push_event (funnel->srcpad, event);
  else
    gst_event_unref (event);

  if (unlock)
    GST_PAD_STREAM_UNLOCK (funnel->srcpad);

  return res;
}
Beispiel #4
0
static void
reset_pad (const GValue * data, gpointer user_data)
{
  GstPad *pad = g_value_get_object (data);
  GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
  GstFunnel *funnel = user_data;

  GST_OBJECT_LOCK (funnel);
  fpad->got_eos = FALSE;
  GST_OBJECT_UNLOCK (funnel);
}
Beispiel #5
0
static void
reset_pad (const GValue * data, gpointer user_data)
{
  GstPad *pad = g_value_get_object (data);
  GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
  GstFunnel *funnel = user_data;

  GST_OBJECT_LOCK (funnel);
  g_slist_free_full (fpad->events_sent, (GDestroyNotify) gst_event_unref);
  fpad->events_sent = NULL;
  fpad->got_eos = FALSE;
  GST_OBJECT_UNLOCK (funnel);
}
Beispiel #6
0
static gboolean
forward_event_on_stream_changed (GstFunnel * funnel, GstPad * sinkpad,
    GstEvent * event)
{
  GstFunnelPad *funnelpad = GST_FUNNEL_PAD_CAST (sinkpad);
  gboolean ret = TRUE;

  if (funnel->last_sinkpad == NULL || funnel->forward_sticky_events_mode ==
      GST_FUNNEL_FORWARD_STICKY_EVENTS_MODE_ALWAYS) {
    GST_DEBUG_OBJECT (sinkpad, "Forwarding event %" GST_PTR_FORMAT, event);
    ret = gst_pad_push_event (funnel->srcpad, gst_event_ref (event));
  } else if ((funnel->forward_sticky_events_mode ==
          GST_FUNNEL_FORWARD_STICKY_EVENTS_MODE_ONCE)
      && (g_slist_find (funnelpad->events_sent, event) == NULL)) {
    GST_DEBUG_OBJECT (sinkpad, "Forwarding event %" GST_PTR_FORMAT, event);
    ret = gst_pad_push_event (funnel->srcpad, gst_event_ref (event));
    funnelpad->events_sent =
        g_slist_prepend (funnelpad->events_sent, gst_event_ref (event));
  }

  return ret;
}
Beispiel #7
0
static gboolean
gst_funnel_all_sinkpads_eos_unlocked (GstFunnel * funnel, GstPad * pad)
{
  GstElement *element = GST_ELEMENT_CAST (funnel);
  GList *item;
  gboolean all_eos = FALSE;


  if (element->numsinkpads == 0)
    goto done;

  for (item = element->sinkpads; item != NULL; item = g_list_next (item)) {
    GstFunnelPad *sinkpad = GST_FUNNEL_PAD_CAST (item->data);

    if (!sinkpad->got_eos) {
      return FALSE;
    }
  }

  all_eos = TRUE;

done:
  return all_eos;
}