Example #1
0
static GstStateChangeReturn
fs_funnel_change_state (GstElement *element, GstStateChange transition)
{
  FsFunnel *funnel = FS_FUNNEL (element);
  GstStateChangeReturn ret;

  switch (transition) {
    case GST_STATE_CHANGE_READY_TO_PAUSED:
      {
        GstIterator *iter = gst_element_iterate_sink_pads (element);
        GstIteratorResult res;

        do {
          res = gst_iterator_foreach (iter, reset_pad, NULL);
        } while (res == GST_ITERATOR_RESYNC);

        gst_iterator_free (iter);

        if (res == GST_ITERATOR_ERROR)
          return GST_STATE_CHANGE_FAILURE;

        GST_OBJECT_LOCK (funnel);
        funnel->has_segment = FALSE;
        GST_OBJECT_UNLOCK (funnel);
      }
      break;
    default:
      break;
  }

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

  return ret;
}
Example #2
0
static GstFlowReturn
fs_funnel_buffer_alloc (GstPad * pad, guint64 offset, guint size,
    GstCaps * caps, GstBuffer ** buf)
{
  FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent_element (pad));
  GstFlowReturn ret = GST_FLOW_OK;

  ret = gst_pad_alloc_buffer (funnel->srcpad, offset, size, caps, buf);

  gst_object_unref (funnel);

  return ret;
}
Example #3
0
static gboolean
fs_funnel_event (GstPad * pad, GstEvent * event)
{
  FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
  FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
  gboolean forward = TRUE;
  gboolean res = TRUE;

  switch (GST_EVENT_TYPE (event)) {
    case GST_EVENT_NEWSEGMENT:
      {
        gboolean update;
        gdouble rate, arate;
        GstFormat format;
        gint64 start;
        gint64 stop;
        gint64 time;

        gst_event_parse_new_segment_full (event, &update, &rate, &arate,
            &format, &start, &stop, &time);


        GST_OBJECT_LOCK (funnel);
        gst_segment_set_newsegment_full (&priv->segment, update, rate, arate,
            format, start, stop, time);
        GST_OBJECT_UNLOCK (funnel);

        forward = FALSE;
        gst_event_unref (event);
      }
      break;
    case GST_EVENT_FLUSH_STOP:
      {
        GST_OBJECT_LOCK (funnel);
        gst_segment_init (&priv->segment, GST_FORMAT_UNDEFINED);
        GST_OBJECT_UNLOCK (funnel);
      }
      break;
    default:
      break;
  }


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

  gst_object_unref (funnel);

  return res;
}
Example #4
0
static GstCaps*
fs_funnel_getcaps (GstPad * pad)
{
  FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
  GstCaps *caps;

  caps = gst_pad_peer_get_caps (funnel->srcpad);
  if (caps == NULL)
    caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));

  gst_object_unref (funnel);

  return caps;
}
Example #5
0
static void
fs_funnel_release_pad (GstElement * element, GstPad * pad)
{
  FsFunnel *funnel = FS_FUNNEL (element);
  FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);

  GST_DEBUG_OBJECT (funnel, "releasing pad");

  gst_pad_set_active (pad, FALSE);

  if (priv)
    g_slice_free1 (sizeof(FsFunnelPadPrivate), priv);

  gst_element_remove_pad (GST_ELEMENT_CAST (funnel), pad);
}
Example #6
0
static GstFlowReturn
fs_funnel_chain (GstPad * pad, GstBuffer * buffer)
{
  GstFlowReturn res;
  FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
  FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
  GstEvent *event = NULL;
  GstClockTime newts;
  GstCaps *padcaps;

  GST_DEBUG_OBJECT (funnel, "received buffer %p", buffer);

  GST_OBJECT_LOCK (funnel);
  if (priv->segment.format == GST_FORMAT_UNDEFINED) {
    GST_WARNING_OBJECT (funnel, "Got buffer without segment,"
        " setting segment [0,inf[");
     gst_segment_set_newsegment_full (&priv->segment, FALSE, 1.0, 1.0,
         GST_FORMAT_TIME, 0, -1, 0);
  }

  if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)))
    gst_segment_set_last_stop (&priv->segment, priv->segment.format,
        GST_BUFFER_TIMESTAMP (buffer));

  newts = gst_segment_to_running_time (&priv->segment,
      priv->segment.format, GST_BUFFER_TIMESTAMP (buffer));
  if (newts != GST_BUFFER_TIMESTAMP (buffer)) {
    buffer = gst_buffer_make_metadata_writable (buffer);
    GST_BUFFER_TIMESTAMP (buffer) = newts;
  }

  if (!funnel->has_segment)
  {
    event = gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME,
        0, -1, 0);
    funnel->has_segment = TRUE;
  }
  GST_OBJECT_UNLOCK (funnel);

  if (event) {
    if (!gst_pad_push_event (funnel->srcpad, event))
      GST_WARNING_OBJECT (funnel, "Could not push out newsegment event");
  }


  GST_OBJECT_LOCK (pad);
  padcaps = GST_PAD_CAPS (funnel->srcpad);
  GST_OBJECT_UNLOCK (pad);

  if (GST_BUFFER_CAPS (buffer) && GST_BUFFER_CAPS (buffer) != padcaps) {
    if (!gst_pad_set_caps (funnel->srcpad, GST_BUFFER_CAPS (buffer))) {
      res = GST_FLOW_NOT_NEGOTIATED;
      goto out;
    }
  }

  res = gst_pad_push (funnel->srcpad, buffer);

  GST_LOG_OBJECT (funnel, "handled buffer %s", gst_flow_get_name (res));

 out:
  gst_object_unref (funnel);

  return res;
}