Example #1
0
bool gstObjectIsFloating(GstObject* gstObject)
{
#ifdef GST_API_VERSION_1
    return g_object_is_floating(G_OBJECT(gstObject));
#else
    return GST_OBJECT_IS_FLOATING(gstObject);
#endif
}
Example #2
0
void
rbgst_object_initialize(VALUE obj, gpointer cobj)
{
    if (GST_OBJECT_IS_FLOATING(cobj)) {
        gst_object_ref(cobj);
        gst_object_sink(cobj);
    }

    rbgobj_gobject_initialize(obj, cobj);
}
Example #3
0
VALUE
rbgst_object_instance2robj(gpointer instance)
{
    if (GST_OBJECT_IS_FLOATING(instance)) {
        gst_object_ref(instance);
        gst_object_sink(instance);
    }

    return rbgobj_get_ruby_object_from_gobject(instance, TRUE);
}
Example #4
0
/**
 * gst_object_ref_sink:
 * @object: a #GstObject to sink
 *
 * Increase the reference count of @object, and possibly remove the floating
 * reference, if @object has a floating reference.
 *
 * In other words, if the object is floating, then this call "assumes ownership"
 * of the floating reference, converting it to a normal reference by clearing
 * the floating flag while leaving the reference count unchanged. If the object
 * is not floating, then this call adds a new normal reference increasing the
 * reference count by one.
 *
 * MT safe. This function grabs and releases @object lock.
 *
 * Since: 0.10.24
 */
void
gst_object_ref_sink (gpointer object)
{
  g_return_if_fail (GST_IS_OBJECT (object));

  GST_OBJECT_LOCK (object);
  if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
    GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object,
        "unsetting floating flag");
    GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
    GST_OBJECT_UNLOCK (object);
  } else {
    GST_OBJECT_UNLOCK (object);
    gst_object_ref (object);
  }
}
Example #5
0
EXPORT_C
#endif

gboolean
gst_object_set_parent (GstObject * object, GstObject * parent)
{
  g_return_val_if_fail (GST_IS_OBJECT (object), FALSE);
  g_return_val_if_fail (GST_IS_OBJECT (parent), FALSE);
  g_return_val_if_fail (object != parent, FALSE);

  GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object,
      "set parent (ref and sink)");

  GST_OBJECT_LOCK (object);
  if (G_UNLIKELY (object->parent != NULL))
    goto had_parent;

  /* sink object, we don't call our own function because we don't
   * need to release/acquire the lock needlessly or touch the refcount
   * in the floating case. */
  object->parent = parent;
  if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
    GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "unsetting floating flag");
    GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
    GST_OBJECT_UNLOCK (object);
  } else {
    GST_OBJECT_UNLOCK (object);
    gst_object_ref (object);
  }

  g_signal_emit (object, gst_object_signals[PARENT_SET], 0, parent);

  return TRUE;

  /* ERROR handling */
had_parent:
  {
    GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object,
        "set parent failed, object already had a parent");
    GST_OBJECT_UNLOCK (object);
    return FALSE;
  }
}
Example #6
0
EXPORT_C
#endif

void
gst_object_sink (gpointer object)
{
  g_return_if_fail (GST_IS_OBJECT (object));

  GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "sink");

  GST_OBJECT_LOCK (object);
  if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
    GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "clear floating flag");
    GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
    GST_OBJECT_UNLOCK (object);
    gst_object_unref (object);
  } else {
    GST_OBJECT_UNLOCK (object);
  }
}
GstElement *
rygel_gst_utils_create_source_for_uri (const gchar *uri) {
  GstElement *src;

  g_return_val_if_fail (uri != NULL, NULL);

  src = gst_element_make_from_uri (GST_URI_SRC, uri, NULL);

  if (src) {
    if (GST_OBJECT_IS_FLOATING (GST_OBJECT (src))) {
      gst_object_ref_sink (src);
    }

    if (g_object_class_find_property (G_OBJECT_GET_CLASS (src), "blocksize")) {
      g_object_set (src, "blocksize", (glong) 65536, NULL);
    }

    if (g_object_class_find_property (G_OBJECT_GET_CLASS (src), "tcp-timeout")) {
      g_object_set (src, "tcp-timeout", (gint64) 60000000, NULL);
    }
  }

  return src;
}
Example #8
0
int
main (int argc, gchar * argv[])
{
  GstElement *element;
  GstElement *element2;
  GstPad *pad;
  long usage1;
  gint i, iters;

  gst_init (&argc, &argv);

  if (argc == 2)
    iters = atoi (argv[1]);
  else
    iters = ITERS;

  g_print ("starting element with pad test with %d iterations\n", iters);
  usage1 = vmsize ();

  element = gst_element_factory_make ("fakesink", NULL);;
  g_assert (GST_IS_ELEMENT (element));
  pad = gst_element_get_pad (element, "sink");
  g_assert (GST_IS_PAD (pad));
  g_assert (GST_OBJECT_IS_FLOATING (element));
  g_assert (!GST_OBJECT_IS_FLOATING (pad));
  g_assert (gst_pad_get_parent (pad) == element);
  gst_object_unref (element);
  g_print ("create/addpad/unref 1 new element: %ld\n", vmsize () - usage1);

  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesink", NULL);;
    g_assert (GST_IS_ELEMENT (element));
    gst_object_unref (element);
  }
  g_print ("create/unref %d elements: %ld\n", iters, vmsize () - usage1);

  for (i = 0; i < iters / 2; i++) {
    element = gst_element_factory_make ("fakesink", NULL);
    g_assert (GST_IS_ELEMENT (element));
    element2 = gst_element_factory_make ("fakesrc", NULL);
    g_assert (GST_IS_ELEMENT (element2));
    gst_element_link_pads (element2, "src", element, "sink");
    g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src")));
    g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element, "sink")));
    gst_object_unref (element);
    g_assert (!GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src")));
    gst_object_unref (element2);
  }
  g_print ("create/link/unref %d element duos: %ld\n", iters / 2,
      vmsize () - usage1);

  element = gst_element_factory_make ("fakesink", NULL);;
  g_assert (GST_IS_ELEMENT (element));
  pad = gst_element_get_pad (element, "sink");
  g_assert (GST_IS_PAD (pad));
  gst_element_remove_pad (element, pad);
  g_assert (gst_element_get_pad (element, "sink") == NULL);
  gst_object_unref (element);

  g_print ("pad removal on one element: %ld\n", vmsize () - usage1);

  for (i = 0; i < iters / 2; i++) {
    element = gst_element_factory_make ("fakesink", NULL);;
    g_assert (GST_IS_ELEMENT (element));
    pad = gst_element_get_pad (element, "sink");
    g_assert (GST_IS_PAD (pad));
    gst_element_remove_pad (element, pad);
    g_assert (gst_element_get_pad (element, "sink") == NULL);
    gst_object_unref (element);
  }
  g_print ("pad removal loop on %d elements: %ld\n", iters / 2,
      vmsize () - usage1);

  for (i = 0; i < iters / 2; i++) {
    element = gst_element_factory_make ("fakesink", NULL);;
    g_assert (GST_IS_ELEMENT (element));
    pad = gst_element_get_pad (element, "sink");
    g_assert (GST_IS_PAD (pad));
    gst_object_ref (pad);
    gst_element_remove_pad (element, pad);
    g_assert (gst_pad_get_parent (pad) == NULL);
    gst_object_unref (pad);
    gst_object_unref (element);
  }
  g_print ("pad ref/removal/test loop on %d elements: %ld\n", iters / 2,
      vmsize () - usage1);

  element = gst_element_factory_make ("fakesink", NULL);;
  g_assert (GST_IS_ELEMENT (element));
  pad = gst_element_get_pad (element, "sink");
  g_assert (GST_IS_PAD (pad));
  gst_object_unref (element);

  g_print ("pad unref on one element: %ld\n", vmsize () - usage1);

  for (i = 0; i < iters / 2; i++) {
    element = gst_element_factory_make ("fakesink", NULL);
    g_assert (GST_IS_ELEMENT (element));
    pad = gst_element_get_pad (element, "sink");
    g_assert (GST_IS_PAD (pad));
    gst_object_unref (element);
  }
  g_print ("pad unref loop on %d elements: %ld\n", iters / 2,
      vmsize () - usage1);

  g_print ("leaked: %ld\n", vmsize () - usage1);

  return 0;
}
template <> GRefPtr<GstPadTemplate> adoptGRef(GstPadTemplate* ptr)
{
    ASSERT(!ptr || !GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr)));
    return GRefPtr<GstPadTemplate>(ptr, GRefPtrAdopt);
}
template <> GRefPtr<GstTask> adoptGRef(GstTask* ptr)
{
    ASSERT(!GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr)));
    return GRefPtr<GstTask>(ptr, GRefPtrAdopt);
}
Example #11
0
template <> GRefPtr<GstElementFactory> adoptGRef(GstElementFactory* ptr)
{
    ASSERT(!GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr)));
    return GRefPtr<GstElementFactory>(ptr, GRefPtrAdopt);
}
Example #12
0
int
main (int argc, gchar * argv[])
{
  GstElement *element;
  int usage1;
  gint i, iters;

  gst_init (&argc, &argv);

  if (argc == 2)
    iters = atoi (argv[1]);
  else
    iters = ITERS;

  g_print ("starting test\n");

  usage1 = gst_alloc_trace_live_all ();
  //gst_alloc_trace_print_all ();

  element = gst_element_factory_make ("fakesrc", NULL);
  gst_object_unref (element);
  g_print ("create/unref new element %d\n",
      gst_alloc_trace_live_all () - usage1);

  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_unref (element);
  }
  g_print ("create/unref %d elements %d\n", iters,
      gst_alloc_trace_live_all () - usage1);

  element = gst_element_factory_make ("fakesrc", NULL);
  g_assert (GST_OBJECT_IS_FLOATING (element));
  gst_object_ref (element);
  gst_object_sink (GST_OBJECT (element));
  g_assert (!GST_OBJECT_IS_FLOATING (element));
  gst_object_unref (element);
  g_print ("create/ref/sink/unref new element %d\n",
      gst_alloc_trace_live_all () - usage1);


  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_ref (element);
    gst_object_sink (GST_OBJECT (element));
    gst_object_unref (element);
  }
  g_print ("create/ref/sink/unref %d elements %d\n", iters,
      gst_alloc_trace_live_all () - usage1);

#if 0
  element = gst_element_factory_make ("fakesrc", NULL);
  g_assert (!GST_OBJECT_IS_DESTROYED (element));
  gst_object_unref (element);
  g_assert (GST_OBJECT_IS_DESTROYED (element));
  gst_object_unref (element);
  g_print ("create/destroy/unref new element %d\n",
      gst_alloc_trace_live_all () - usage1);
#endif

#if 0
  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_unref (element);
    gst_object_unref (element);
  }
  g_print ("create/destroy/unref %d element %d\n", iters,
      gst_alloc_trace_live_all () - usage1);
#endif

  element = gst_element_factory_make ("fakesrc", NULL);
  gst_object_ref (element);
  gst_object_unref (element);
  gst_object_unref (element);
  g_print ("create/ref/unref/unref new element %d\n",
      gst_alloc_trace_live_all () - usage1);

  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_ref (element);
    gst_object_unref (element);
    gst_object_unref (element);
  }
  g_print ("create/ref/unref/unref %d element %d\n", iters,
      gst_alloc_trace_live_all () - usage1);

#if 0
  element = gst_element_factory_make ("fakesrc", NULL);
  gst_object_ref (element);
  gst_object_unref (element);
  gst_object_unref (element);
  gst_object_unref (element);
  g_print ("craete/ref/destroy/unref/unref new element %d\n",
      gst_alloc_trace_live_all () - usage1);
#endif

#if 0
  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_ref (element);
    gst_object_unref (element);
    gst_object_unref (element);
    gst_object_unref (element);
  }
  g_print ("craete/ref/destroy/unref/unref %d elements %d\n", iters,
      gst_alloc_trace_live_all () - usage1);
#endif

#if 0
  for (i = 0; i < iters; i++) {
    element = gst_element_factory_make ("fakesrc", NULL);
    gst_object_ref (element);
    gst_element_set_name (element, "testing123");
    gst_object_unref (element);
    gst_element_set_name (element, "testing123");
    gst_object_unref (element);
    gst_object_unref (element);
  }
  g_print ("craete/ref/destroy/unref/unref %d elements with name %d\n", iters,
      gst_alloc_trace_live_all () - usage1);
#endif

  element = gst_element_factory_make ("fakesrc", NULL);
  for (i = 0; i < iters; i++) {
    gst_element_set_name (element, "testing");
  }
  gst_object_unref (element);
  g_print ("set name %d times %d\n", iters,
      gst_alloc_trace_live_all () - usage1);

  g_print ("leaked: %d\n", gst_alloc_trace_live_all () - usage1);

  return (gst_alloc_trace_live_all () - usage1 ? -1 : 0);
}