Ejemplo n.º 1
0
static gboolean
forward_event (GstPad * pad, gpointer user_data)
{
    struct ForwardEventData *fdata = user_data;
    GSList *walk = NULL;
    GstEvent *newevent = NULL;

    GST_PAD_LOCK (fdata->demux);
    for (walk = fdata->demux->srcpads; walk; walk = walk->next) {
        GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data;

        /* Only forward the event if the initial events have been through first,
         * the initial events should be forwarded before any other event
         * or buffer is pushed */
        if ((pad == dpad->rtp_pad && dpad->pushed_initial_rtp_events) ||
                (pad == dpad->rtcp_pad && dpad->pushed_initial_rtcp_events)) {
            newevent = add_ssrc_and_ref (fdata->event, dpad->ssrc);
            break;
        }
    }
    GST_PAD_UNLOCK (fdata->demux);

    if (newevent)
        fdata->res &= gst_pad_push_event (pad, newevent);

    return TRUE;
}
Ejemplo n.º 2
0
static gboolean
forward_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data)
{
    struct ForwardStickyEventData *data = user_data;
    GstEvent *newevent;

    newevent = add_ssrc_and_ref (*event, data->ssrc);

    gst_pad_push_event (data->pad, newevent);

    return TRUE;
}
Ejemplo n.º 3
0
static gboolean
gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstObject * parent,
    GstEvent * event)
{
  GstRtpSsrcDemux *demux;
  gboolean res = FALSE;

  demux = GST_RTP_SSRC_DEMUX (parent);

  switch (GST_EVENT_TYPE (event)) {
    case GST_EVENT_FLUSH_STOP:
      gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
      /* fallthrough */
    default:
    {
      GSList *walk;
      GSList *pads = NULL;

      res = TRUE;
      /* need local snapshot of pads;
       * should not push downstream while holding lock as that might deadlock
       * with stuff traveling upstream tyring to get this lock while holding
       * other (stream)lock */
      GST_PAD_LOCK (demux);
      for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) {
        GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data;

        pad = g_slice_dup (GstRtpSsrcDemuxPad, pad);
        gst_object_ref (pad->rtp_pad);

        pads = g_slist_prepend (pads, pad);
      }
      GST_PAD_UNLOCK (demux);

      for (walk = pads; walk; walk = g_slist_next (walk)) {
        GstRtpSsrcDemuxPad *dpad = walk->data;
        GstEvent *newevent;

        newevent = add_ssrc_and_ref (event, dpad->ssrc);

        res &= gst_pad_push_event (dpad->rtp_pad, newevent);
        gst_object_unref (dpad->rtp_pad);
        g_slice_free (GstRtpSsrcDemuxPad, dpad);
      }
      g_slist_free (pads);
      gst_event_unref (event);
      break;
    }
  }

  return res;
}
Ejemplo n.º 4
0
static gboolean
gst_rtp_ssrc_demux_rtcp_sink_event (GstPad * pad, GstObject * parent,
    GstEvent * event)
{
  GstRtpSsrcDemux *demux;
  gboolean res = TRUE;
  GSList *walk;
  GSList *pads = NULL;

  demux = GST_RTP_SSRC_DEMUX (parent);

  GST_PAD_LOCK (demux);
  for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) {
    GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data;

    pad = g_slice_dup (GstRtpSsrcDemuxPad, pad);
    gst_object_ref (pad->rtcp_pad);

    pads = g_slist_prepend (pads, pad);
  }
  GST_PAD_UNLOCK (demux);

  for (walk = pads; walk; walk = g_slist_next (walk)) {
    GstRtpSsrcDemuxPad *dpad = walk->data;
    GstEvent *newevent;

    newevent = add_ssrc_and_ref (event, dpad->ssrc);

    res &= gst_pad_push_event (dpad->rtcp_pad, newevent);
    gst_object_unref (dpad->rtcp_pad);
    g_slice_free (GstRtpSsrcDemuxPad, dpad);
  }
  g_slist_free (pads);
  gst_event_unref (event);

  return res;
}