Exemple #1
0
static GstStateChangeReturn
nle_object_change_state (GstElement * element, GstStateChange transition)
{
  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;

  switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
    {
      GstObject *parent = gst_object_get_parent (GST_OBJECT (element));

      /* Going to READY and if we are not in a composition, we need to make
       * sure that the object positioning state is properly commited  */
      if (parent) {
        gchar *name = gst_element_get_name (GST_ELEMENT (parent));
        if (g_strcmp0 (name, "current-bin")
            && !NLE_OBJECT_IS_COMPOSITION (NLE_OBJECT (element))) {
          GST_INFO ("Adding nleobject to something that is not a composition,"
              " commiting ourself");
          nle_object_commit (NLE_OBJECT (element), FALSE);
        }

        g_free (name);
        gst_object_unref (parent);
      }
    }
      break;
    case GST_STATE_CHANGE_READY_TO_PAUSED:
      if (nle_object_prepare (NLE_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) {
        ret = GST_STATE_CHANGE_FAILURE;
        goto beach;
      }
      break;
    default:
      break;
  }

  GST_DEBUG_OBJECT (element, "Calling parent change_state");

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

  GST_DEBUG_OBJECT (element, "Return from parent change_state was %d", ret);

  if (ret == GST_STATE_CHANGE_FAILURE)
    goto beach;

  switch (transition) {
    case GST_STATE_CHANGE_PAUSED_TO_READY:
      /* cleanup nleobject */
      if (nle_object_cleanup (NLE_OBJECT (element)) == GST_STATE_CHANGE_FAILURE)
        ret = GST_STATE_CHANGE_FAILURE;
      break;
    default:
      break;
  }

beach:
  return ret;
}
static void
nle_operation_dispose (GObject * object)
{
  NleOperation *oper = (NleOperation *) object;

  GST_DEBUG_OBJECT (object, "Disposing of source pad");

  nle_object_ghost_pad_set_target (NLE_OBJECT (object),
      NLE_OBJECT (object)->srcpad, NULL);

  GST_DEBUG_OBJECT (object, "Disposing of sink pad(s)");
  while (oper->sinks) {
    GstPad *ghost = (GstPad *) oper->sinks->data;
    remove_sink_pad (oper, ghost);
  }

  GST_DEBUG_OBJECT (object, "Done, calling parent class ::dispose()");
  G_OBJECT_CLASS (parent_class)->dispose (object);
}
void
commit_and_wait (GstElement * comp, gboolean * ret)
{
  gulong handler_id =
      g_signal_connect (comp, "commited", (GCallback) commited_cb, NULL);
  g_mutex_lock (&lock);
  *ret = nle_object_commit (NLE_OBJECT (comp), TRUE);
  g_cond_wait (&cond, &lock);
  g_mutex_unlock (&lock);
  g_signal_handler_disconnect (comp, handler_id);
}
static GstElement *
new_nle_src (const gchar * name, guint64 start, gint64 duration, gint priority)
{
  GstElement *nlesource = NULL;

  nlesource = gst_element_factory_make_or_warn ("nlesource", name);
  fail_if (nlesource == NULL);

  g_object_set (G_OBJECT (nlesource),
      "start", start,
      "duration", duration, "inpoint", start, "priority", priority, NULL);
  nle_object_commit (NLE_OBJECT (nlesource), FALSE);

  return nlesource;
}
static gboolean
nle_operation_send_event (GstElement * element, GstEvent * event)
{
  gboolean res = TRUE;

  switch (GST_EVENT_TYPE (event)) {
    case GST_EVENT_SEEK:
      nle_object_seek_all_children (NLE_OBJECT (element), event);
      break;
    default:
      res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event);
      break;
  }

  return res;
}