bufferlist: simplify bufferlists
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 31 Mar 2011 15:51:02 +0000 (17:51 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 31 Mar 2011 15:51:02 +0000 (17:51 +0200)
We now have multiple memory blocks as part of the buffers and we can therefore
reduce the bufferlist to a simple array of buffers.

docs/gst/gstreamer-sections.txt
gst/gst.c
gst/gstbufferlist.c
gst/gstbufferlist.h
gst/gstpad.c
libs/gst/base/gstbasesink.c
tests/check/gst/gstbufferlist.c
tests/check/gst/gstpad.c
win32/common/libgstreamer.def

index 2027493..506ebd8 100644 (file)
@@ -288,48 +288,30 @@ GST_BUFFER_POOL_GET_CLASS
 <FILE>gstbufferlist</FILE>
 <TITLE>GstBufferList</TITLE>
 GstBufferList
-GstBufferListIterator
-GstBufferListDoFunction
 
 gst_buffer_list_new
+gst_buffer_list_sized_new
+gst_buffer_list_len
+gst_buffer_list_add
+gst_buffer_list_insert
+gst_buffer_list_remove
+
 gst_buffer_list_ref
 gst_buffer_list_unref
 gst_buffer_list_copy
 gst_buffer_list_is_writable
 gst_buffer_list_make_writable
 
-gst_buffer_list_n_groups
-
-GstBufferListItem
 GstBufferListFunc
 gst_buffer_list_foreach
 gst_buffer_list_get
 
-gst_buffer_list_iterate
-gst_buffer_list_iterator_free
-gst_buffer_list_iterator_n_buffers
-gst_buffer_list_iterator_add
-gst_buffer_list_iterator_add_group
-gst_buffer_list_iterator_add_list
-gst_buffer_list_iterator_next
-gst_buffer_list_iterator_next_group
-gst_buffer_list_iterator_remove
-gst_buffer_list_iterator_steal
-gst_buffer_list_iterator_take
-gst_buffer_list_iterator_do
-gst_buffer_list_iterator_merge_group
 <SUBSECTION Standard>
-GstBufferListClass
 GST_BUFFER_LIST
-GST_BUFFER_LIST_CLASS
-GST_BUFFER_LIST_GET_CLASS
 GST_IS_BUFFER_LIST
-GST_IS_BUFFER_LIST_CLASS
 GST_TYPE_BUFFER_LIST
 GST_BUFFER_LIST_CAST
-GST_TYPE_BUFFER_LIST_ITEM
 <SUBSECTION Private>
-gst_buffer_list_item_get_type
 gst_buffer_list_get_type
 </SECTION>
 
index 5227bf2..c1b9aa0 100644 (file)
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -688,7 +688,6 @@ init_post (GOptionContext * context, GOptionGroup * group, gpointer data,
   g_type_class_ref (gst_bin_flags_get_type ());
   g_type_class_ref (gst_buffer_flag_get_type ());
   g_type_class_ref (gst_buffer_copy_flags_get_type ());
-  g_type_class_ref (gst_buffer_list_item_get_type ());
   g_type_class_ref (gst_bus_flags_get_type ());
   g_type_class_ref (gst_bus_sync_reply_get_type ());
   g_type_class_ref (gst_caps_flags_get_type ());
@@ -1052,7 +1051,6 @@ gst_deinit (void)
   g_type_class_unref (g_type_class_peek (gst_bin_flags_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_buffer_flag_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_buffer_copy_flags_get_type ()));
-  g_type_class_unref (g_type_class_peek (gst_buffer_list_item_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_bus_flags_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_bus_sync_reply_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_caps_flags_get_type ()));
index 29798f0..2d380c0 100644 (file)
 
 /**
  * SECTION:gstbufferlist
- * @short_description: Grouped scatter data buffer type for data-passing
+ * @short_description: Lists of buffers for data-passing
  * @see_also: #GstPad, #GstMiniObject
  *
- * Buffer lists are units of grouped scatter/gather data transfer in
- * GStreamer.
+ * Buffer lists are an object containing a list of buffers.
  *
  * Buffer lists are created with gst_buffer_list_new() and filled with data
- * using a #GstBufferListIterator. The iterator has no current buffer; its
- * cursor position lies between buffers, immediately before the buffer that
- * would be returned by gst_buffer_list_iterator_next(). After iterating to the
- * end of a group the iterator must be advanced to the next group by a call to
- * gst_buffer_list_iterator_next_group() before any further calls to
- * gst_buffer_list_iterator_next() can return buffers again. The cursor position
- * of a newly created iterator lies before the first group; a call to
- * gst_buffer_list_iterator_next_group() is necessary before calls to
- * gst_buffer_list_iterator_next() can return buffers.
+ * using a gst_buffer_list_take().
  *
- * <informalfigure>
- *   <programlisting>
- *      +--- group0 ----------------------+--- group1 ------------+
- *      |   buffer0   buffer1   buffer2   |   buffer3   buffer4   |
- *    ^   ^         ^         ^         ^   ^         ^         ^
- *    Iterator positions between buffers
- *   </programlisting>
- * </informalfigure>
- *
- * The gst_buffer_list_iterator_remove(), gst_buffer_list_iterator_steal(),
- * gst_buffer_list_iterator_take() and gst_buffer_list_iterator_do() functions
- * are not defined in terms of the cursor position; they operate on the last
- * element returned from gst_buffer_list_iterator_next().
- *
- * The basic use pattern of creating a buffer list with an iterator is as
- * follows:
- *
- * <example>
- * <title>Creating a buffer list</title>
- *   <programlisting>
- *    GstBufferList *list;
- *    GstBufferListIterator *it;
- *
- *    list = gst_buffer_list_new ();
- *    it = gst_buffer_list_iterate (list);
- *    gst_buffer_list_iterator_add_group (it);
- *    gst_buffer_list_iterator_add (it, header1);
- *    gst_buffer_list_iterator_add (it, data1);
- *    gst_buffer_list_iterator_add_group (it);
- *    gst_buffer_list_iterator_add (it, header2);
- *    gst_buffer_list_iterator_add (it, data2);
- *    gst_buffer_list_iterator_add_group (it);
- *    gst_buffer_list_iterator_add (it, header3);
- *    gst_buffer_list_iterator_add (it, data3);
- *    ...
- *    gst_buffer_list_iterator_free (it);
- *   </programlisting>
- * </example>
- *
- * The basic use pattern of iterating over a buffer list is as follows:
- *
- * <example>
- * <title>Iterating a buffer list</title>
- *   <programlisting>
- *    GstBufferListIterator *it;
- *
- *    it = gst_buffer_list_iterate (list);
- *    while (gst_buffer_list_iterator_next_group (it)) {
- *      while ((buffer = gst_buffer_list_iterator_next (it)) != NULL) {
- *        do_something_with_buffer (buffer);
- *      }
- *    }
- *    gst_buffer_list_iterator_free (it);
- *   </programlisting>
- * </example>
- *
- * The basic use pattern of modifying a buffer in a list is as follows:
- *
- * <example>
- * <title>Modifying the data of the first buffer in a list</title>
- *   <programlisting>
- *    GstBufferListIterator *it;
- *
- *    list = gst_buffer_list_make_writable (list);
- *    it = gst_buffer_list_iterate (list);
- *    if (gst_buffer_list_iterator_next_group (it)) {
- *      GstBuffer *buf
- *
- *      buf = gst_buffer_list_iterator_next (it);
- *      if (buf != NULL) {
- *        buf = gst_buffer_list_iterator_do (it,
- *            (GstBufferListDoFunction) gst_mini_object_make_writable, NULL);
- *        modify_data (GST_BUFFER_DATA (buf));
- *      }
- *    }
- *    gst_buffer_list_iterator_free (it);
- *   </programlisting>
- * </example>
- *
- * Since: 0.10.24
  */
 #include "gst_private.h"
 
 
 #define GST_CAT_DEFAULT GST_CAT_BUFFER_LIST
 
-#define GROUP_START NULL
-static gconstpointer STOLEN = "";
-
 /**
  * GstBufferList:
  * @mini_object: the parent structure
@@ -142,21 +50,7 @@ struct _GstBufferList
 {
   GstMiniObject mini_object;
 
-  GQueue *buffers;
-};
-
-/**
- * GstBufferListIterator:
- *
- * Opaque iterator for a #GstBufferList.
- *
- * Since: 0.10.24
- */
-struct _GstBufferListIterator
-{
-  GstBufferList *list;
-  GList *next;
-  GList *last_returned;
+  GArray *array;
 };
 
 GType _gst_buffer_list_type = 0;
@@ -172,54 +66,38 @@ _gst_buffer_list_initialize (void)
 static GstBufferList *
 _gst_buffer_list_copy (GstBufferList * list)
 {
-  GstBufferList *list_copy;
-  GQueue *buffers_copy;
-  GList *tmp;
-
-  g_return_val_if_fail (list != NULL, NULL);
-
-  /* shallow copy of list and pointers */
-  buffers_copy = g_queue_copy (list->buffers);
-
-  /* ref all buffers in the list */
-  tmp = list->buffers->head;
-  while (tmp) {
-    if (tmp->data != GROUP_START && tmp->data != STOLEN) {
-      tmp->data = gst_buffer_ref (GST_BUFFER_CAST (tmp->data));
-    }
-    tmp = g_list_next (tmp);
-  }
+  GstBufferList *copy;
+  guint i, len;
 
-  list_copy = gst_buffer_list_new ();
-  g_queue_free (list_copy->buffers);
-  list_copy->buffers = buffers_copy;
+  len = list->array->len;
+  copy = gst_buffer_list_sized_new (len);
 
-  return list_copy;
+  /* add and ref all buffers in the array */
+  for (i = 0; i < len; i++) {
+    GstBuffer *buf = g_array_index (list->array, GstBuffer *, i);
+    buf = gst_buffer_ref (buf);
+    g_array_append_val (copy->array, buf);
+  }
+  return copy;
 }
 
 static void
 _gst_buffer_list_free (GstBufferList * list)
 {
-  GList *tmp;
-
-  g_return_if_fail (list != NULL);
-
+  guint i, len;
   GST_LOG ("free %p", list);
 
-  tmp = list->buffers->head;
-  while (tmp) {
-    if (tmp->data != GROUP_START && tmp->data != STOLEN) {
-      gst_buffer_unref (GST_BUFFER_CAST (tmp->data));
-    }
-    tmp = tmp->next;
-  }
-  g_queue_free (list->buffers);
+  /* unrefs all buffers too */
+  len = list->array->len;
+  for (i = 0; i < len; i++)
+    gst_buffer_unref (g_array_index (list->array, GstBuffer *, i));
+  g_array_free (list->array, TRUE);
 
   g_slice_free1 (GST_MINI_OBJECT_SIZE (list), list);
 }
 
 static void
-gst_buffer_list_init (GstBufferList * list, gsize size)
+gst_buffer_list_init (GstBufferList * list, gsize size, guint asize)
 {
   gst_mini_object_init (GST_MINI_OBJECT_CAST (list), _gst_buffer_list_type,
       size);
@@ -227,16 +105,18 @@ gst_buffer_list_init (GstBufferList * list, gsize size)
   list->mini_object.copy = (GstMiniObjectCopyFunction) _gst_buffer_list_copy;
   list->mini_object.free = (GstMiniObjectFreeFunction) _gst_buffer_list_free;
 
-  list->buffers = g_queue_new ();
+  list->array = g_array_sized_new (FALSE, FALSE, sizeof (GstBuffer *), asize);
 
   GST_LOG ("init %p", list);
 }
 
 /**
- * gst_buffer_list_new:
+ * gst_buffer_list_sized_new:
+ * @size: an initial reserved size
  *
  * Creates a new, empty #GstBufferList. The caller is responsible for unreffing
- * the returned #GstBufferList.
+ * the returned #GstBufferList. The list will have @size space preallocated so
+ * that memory reallocations can be avoided.
  *
  * Free-function: gst_buffer_list_unref
  *
@@ -246,7 +126,7 @@ gst_buffer_list_init (GstBufferList * list, gsize size)
  * Since: 0.10.24
  */
 GstBufferList *
-gst_buffer_list_new (void)
+gst_buffer_list_sized_new (guint size)
 {
   GstBufferList *list;
 
@@ -254,39 +134,46 @@ gst_buffer_list_new (void)
 
   GST_LOG ("new %p", list);
 
-  gst_buffer_list_init (list, sizeof (GstBufferList));
+  gst_buffer_list_init (list, sizeof (GstBufferList), size);
 
   return list;
 }
 
 /**
- * gst_buffer_list_n_groups:
+ * gst_buffer_list_new:
+ *
+ * Creates a new, empty #GstBufferList. The caller is responsible for unreffing
+ * the returned #GstBufferList.
+ *
+ * Free-function: gst_buffer_list_unref
+ *
+ * Returns: (transfer full): the new #GstBufferList. gst_buffer_list_unref()
+ *     after usage.
+ *
+ * Since: 0.10.24
+ */
+GstBufferList *
+gst_buffer_list_new (void)
+{
+  return gst_buffer_list_sized_new (8);
+}
+
+/**
+ * gst_buffer_list_len:
  * @list: a #GstBufferList
  *
- * Returns the number of groups in @list.
+ * Returns the number of buffers in @list.
  *
- * Returns: the number of groups in the buffer list
+ * Returns: the number of buffers in the buffer list
  *
  * Since: 0.10.24
  */
 guint
-gst_buffer_list_n_groups (GstBufferList * list)
+gst_buffer_list_len (GstBufferList * list)
 {
-  GList *tmp;
-  guint n;
-
-  g_return_val_if_fail (list != NULL, 0);
-
-  tmp = list->buffers->head;
-  n = 0;
-  while (tmp) {
-    if (tmp->data == GROUP_START) {
-      n++;
-    }
-    tmp = g_list_next (tmp);
-  }
+  g_return_val_if_fail (GST_IS_BUFFER_LIST (list), 0);
 
-  return n;
+  return list->array->len;
 }
 
 /**
@@ -307,70 +194,14 @@ void
 gst_buffer_list_foreach (GstBufferList * list, GstBufferListFunc func,
     gpointer user_data)
 {
-  GList *tmp, *next;
-  guint group, idx;
-  GstBufferListItem res;
-
-  g_return_if_fail (list != NULL);
-  g_return_if_fail (func != NULL);
-
-  next = list->buffers->head;
-  group = idx = 0;
-  while (next) {
-    GstBuffer *buffer;
-
-    tmp = next;
-    next = g_list_next (tmp);
-
-    buffer = tmp->data;
-
-    if (buffer == GROUP_START) {
-      group++;
-      idx = 0;
-      continue;
-    } else if (buffer == STOLEN)
-      continue;
-    else
-      idx++;
-
-    /* need to decrement the indices */
-    res = func (&buffer, group - 1, idx - 1, user_data);
-
-    if (G_UNLIKELY (buffer != tmp->data)) {
-      /* the function changed the buffer */
-      if (buffer == NULL) {
-        /* we were asked to remove the item */
-        g_queue_delete_link (list->buffers, tmp);
-        idx--;
-      } else {
-        /* change the buffer */
-        tmp->data = buffer;
-      }
-    }
-
-    switch (res) {
-      case GST_BUFFER_LIST_CONTINUE:
-        break;
-      case GST_BUFFER_LIST_SKIP_GROUP:
-        while (next && next->data != GROUP_START)
-          next = g_list_next (next);
-        break;
-      case GST_BUFFER_LIST_END:
-        return;
-    }
-  }
 }
 
 /**
  * gst_buffer_list_get:
  * @list: a #GstBufferList
- * @group: the group
- * @idx: the index in @group
- *
- * Get the buffer at @idx in @group.
+ * @idx: the index
  *
- * Note that this function is not efficient for iterating over the entire list.
- * Use an iterator or gst_buffer_list_foreach() instead.
+ * Get the buffer at @idx.
  *
  * Returns: (transfer none): the buffer at @idx in @group or NULL when there
  *     is no buffer. The buffer remains valid as long as @list is valid.
@@ -378,507 +209,48 @@ gst_buffer_list_foreach (GstBufferList * list, GstBufferListFunc func,
  * Since: 0.10.24
  */
 GstBuffer *
-gst_buffer_list_get (GstBufferList * list, guint group, guint idx)
+gst_buffer_list_get (GstBufferList * list, guint idx)
 {
-  GList *tmp;
-  guint cgroup, cidx;
-
-  g_return_val_if_fail (list != NULL, NULL);
-
-  tmp = list->buffers->head;
-  cgroup = 0;
-  while (tmp) {
-    if (tmp->data == GROUP_START) {
-      if (cgroup == group) {
-        /* we found the group */
-        tmp = g_list_next (tmp);
-        cidx = 0;
-        while (tmp && tmp->data != GROUP_START) {
-          if (tmp->data != STOLEN) {
-            if (cidx == idx)
-              return GST_BUFFER_CAST (tmp->data);
-            else
-              cidx++;
-          }
-          tmp = g_list_next (tmp);
-        }
-        break;
-      } else {
-        cgroup++;
-        if (cgroup > group)
-          break;
-      }
-    }
-    tmp = g_list_next (tmp);
-  }
-  return NULL;
-}
-
-/**
- * gst_buffer_list_iterate:
- * @list: a #GstBufferList
- *
- * Iterate the buffers in @list. The owner of the iterator must also be the
- * owner of a reference to @list while the returned iterator is in use.
- *
- * Free-function: gst_buffer_list_iterator_free
- *
- * Returns: (transfer full): a new #GstBufferListIterator of the buffers in
- *     @list. gst_buffer_list_iterator_free() after usage
- *
- * Since: 0.10.24
- */
-GstBufferListIterator *
-gst_buffer_list_iterate (GstBufferList * list)
-{
-  GstBufferListIterator *it;
-
-  g_return_val_if_fail (list != NULL, NULL);
-
-  it = g_slice_new (GstBufferListIterator);
-  it->list = list;
-  it->next = list->buffers->head;
-  it->last_returned = NULL;
-
-  return it;
-}
-
-/**
- * gst_buffer_list_iterator_free:
- * @it: (transfer full): the #GstBufferListIterator to free
- *
- * Free the iterator.
- *
- * Since: 0.10.24
- */
-void
-gst_buffer_list_iterator_free (GstBufferListIterator * it)
-{
-  g_return_if_fail (it != NULL);
+  GstBuffer *buf;
 
-  g_slice_free (GstBufferListIterator, it);
-}
+  g_return_val_if_fail (GST_IS_BUFFER_LIST (list), NULL);
+  g_return_val_if_fail (idx < list->array->len, NULL);
 
-/**
- * gst_buffer_list_iterator_n_buffers:
- * @it: a #GstBufferListIterator
- *
- * Returns the number of buffers left to iterate in the current group. I.e. the
- * number of calls that can be made to gst_buffer_list_iterator_next() before
- * it returns NULL.
- *
- * This function will not move the implicit cursor or in any other way affect
- * the state of the iterator @it.
- *
- * Returns: the number of buffers left to iterate in the current group
- *
- * Since: 0.10.24
- */
-guint
-gst_buffer_list_iterator_n_buffers (const GstBufferListIterator * it)
-{
-  GList *tmp;
-  guint n;
-
-  g_return_val_if_fail (it != NULL, 0);
-
-  tmp = it->next;
-  n = 0;
-  while (tmp && tmp->data != GROUP_START) {
-    if (tmp->data != STOLEN) {
-      n++;
-    }
-    tmp = g_list_next (tmp);
-  }
+  buf = g_array_index (list->array, GstBuffer *, idx);
 
-  return n;
+  return buf;
 }
 
 /**
- * gst_buffer_list_iterator_add:
- * @it: a #GstBufferListIterator
- * @buffer: (transfer full): a #GstBuffer
- *
- * Inserts @buffer into the #GstBufferList iterated with @it. The buffer is
- * inserted into the current group, immediately before the buffer that would be
- * returned by gst_buffer_list_iterator_next(). The buffer is inserted before
- * the implicit cursor, a subsequent call to gst_buffer_list_iterator_next()
- * will return the buffer after the inserted buffer, if any.
+ * gst_buffer_list_insert:
+ * @list: a #GstBufferList
+ * @idx: the index
+ * @buffer: a #GstBuffer
  *
- * This function takes ownership of @buffer.
+ * Insert @buffer at @idx in @list. Other buffers are moved to make room for
+ * this new buffer.
  *
- * Since: 0.10.24
+ * A -1 value for @idx will append the buffer at the end.
  */
 void
-gst_buffer_list_iterator_add (GstBufferListIterator * it, GstBuffer * buffer)
+gst_buffer_list_insert (GstBufferList * list, guint idx, GstBuffer * buffer)
 {
-  g_return_if_fail (it != NULL);
+  g_return_if_fail (GST_IS_BUFFER_LIST (list));
   g_return_if_fail (buffer != NULL);
 
-  /* adding before the first group start is not allowed */
-  g_return_if_fail (it->next != it->list->buffers->head);
-
-  /* cheap insert into the GQueue */
-  if (it->next != NULL) {
-    g_queue_insert_before (it->list->buffers, it->next, buffer);
-  } else {
-    g_queue_push_tail (it->list->buffers, buffer);
-  }
-}
-
-/**
- * gst_buffer_list_iterator_add_list:
- * @it: a #GstBufferListIterator
- * @list: (transfer full) (element-type Gst.Buffer): a #GList of buffers
- *
- * Inserts @list of buffers into the #GstBufferList iterated with @it. The list is
- * inserted into the current group, immediately before the buffer that would be
- * returned by gst_buffer_list_iterator_next(). The list is inserted before
- * the implicit cursor, a subsequent call to gst_buffer_list_iterator_next()
- * will return the buffer after the last buffer of the inserted list, if any.
- *
- * This function takes ownership of @list and all its buffers.
- *
- * Since: 0.10.31
- */
-void
-gst_buffer_list_iterator_add_list (GstBufferListIterator * it, GList * list)
-{
-  GList *last;
-  guint len;
-
-  g_return_if_fail (it != NULL);
-  g_return_if_fail (it->next != it->list->buffers->head);
-
-  if (list == NULL)
-    return;
-
-  last = list;
-  len = 1;
-  while (last->next) {
-    last = last->next;
-    len++;
-  }
-
-  if (it->next) {
-    last->next = it->next;
-    list->prev = it->next->prev;
-    it->next->prev = last;
-    if (list->prev)
-      list->prev->next = list;
-  } else {
-    it->list->buffers->tail->next = list;
-    list->prev = it->list->buffers->tail;
-    it->list->buffers->tail = last;
-  }
-  it->list->buffers->length += len;
-}
-
-/**
- * gst_buffer_list_iterator_add_group:
- * @it: a #GstBufferListIterator
- *
- * Inserts a new, empty group into the #GstBufferList iterated with @it. The
- * group is inserted immediately before the group that would be returned by
- * gst_buffer_list_iterator_next_group(). A subsequent call to
- * gst_buffer_list_iterator_next_group() will advance the iterator to the group
- * after the inserted group, if any.
- *
- * Since: 0.10.24
- */
-void
-gst_buffer_list_iterator_add_group (GstBufferListIterator * it)
-{
-  g_return_if_fail (it != NULL);
-
-  /* advance iterator to next group start */
-  while (it->next != NULL && it->next->data != GROUP_START) {
-    it->next = g_list_next (it->next);
-  }
-
-  /* cheap insert of a group start into the GQueue */
-  if (it->next != NULL) {
-    g_queue_insert_before (it->list->buffers, it->next, GROUP_START);
-  } else {
-    g_queue_push_tail (it->list->buffers, GROUP_START);
-  }
-}
-
-/**
- * gst_buffer_list_iterator_next:
- * @it: a #GstBufferListIterator
- *
- * Returns the next buffer in the list iterated with @it. If the iterator is at
- * the end of a group, NULL will be returned. This function may be called
- * repeatedly to iterate through the current group.
- *
- * The caller will not get a new ref to the returned #GstBuffer and must not
- * unref it.
- *
- * Returns: (transfer none): the next buffer in the current group of the
- *     buffer list, or NULL
- *
- * Since: 0.10.24
- */
-GstBuffer *
-gst_buffer_list_iterator_next (GstBufferListIterator * it)
-{
-  GstBuffer *buffer;
-
-  g_return_val_if_fail (it != NULL, NULL);
-
-  while (it->next != NULL && it->next->data != GROUP_START &&
-      it->next->data == STOLEN) {
-    it->next = g_list_next (it->next);
-  }
-
-  if (it->next == NULL || it->next->data == GROUP_START) {
-    goto no_buffer;
-  }
-
-  buffer = GST_BUFFER_CAST (it->next->data);
-
-  it->last_returned = it->next;
-  it->next = g_list_next (it->next);
-
-  return buffer;
-
-no_buffer:
-  {
-    it->last_returned = NULL;
-    return NULL;
+  if (idx == -1)
+    g_array_append_val (list->array, buffer);
+  else {
+    g_return_if_fail (idx < list->array->len);
+    g_array_insert_val (list->array, idx, buffer);
   }
 }
 
-/**
- * gst_buffer_list_iterator_next_group:
- * @it: a #GstBufferListIterator
- *
- * Advance the iterator @it to the first buffer in the next group. If the
- * iterator is at the last group, FALSE will be returned. This function may be
- * called repeatedly to iterate through the groups in a buffer list.
- *
- * Returns: TRUE if the iterator could be advanced to the next group, FALSE if
- * the iterator was already at the last group
- *
- * Since: 0.10.24
- */
-gboolean
-gst_buffer_list_iterator_next_group (GstBufferListIterator * it)
-{
-  g_return_val_if_fail (it != NULL, FALSE);
-
-  /* advance iterator to next group start */
-  while (it->next != NULL && it->next->data != GROUP_START) {
-    it->next = g_list_next (it->next);
-  }
-
-  if (it->next) {
-    /* move one step beyond the group start */
-    it->next = g_list_next (it->next);
-  }
-
-  it->last_returned = NULL;
-
-  return (it->next != NULL);
-}
-
-/**
- * gst_buffer_list_iterator_remove:
- * @it: a #GstBufferListIterator
- *
- * Removes the last buffer returned by gst_buffer_list_iterator_next() from
- * the #GstBufferList iterated with @it. gst_buffer_list_iterator_next() must
- * have been called on @it before this function is called. This function can
- * only be called once per call to gst_buffer_list_iterator_next().
- *
- * The removed buffer is unreffed.
- *
- * Since: 0.10.24
- */
 void
-gst_buffer_list_iterator_remove (GstBufferListIterator * it)
+gst_buffer_list_remove (GstBufferList * list, guint idx, guint length)
 {
-  g_return_if_fail (it != NULL);
-  g_return_if_fail (it->last_returned != NULL);
-  g_assert (it->last_returned->data != GROUP_START);
+  g_return_if_fail (GST_IS_BUFFER_LIST (list));
+  g_return_if_fail (idx < list->array->len);
 
-  if (it->last_returned->data != STOLEN) {
-    gst_buffer_unref (it->last_returned->data);
-  }
-  g_queue_delete_link (it->list->buffers, it->last_returned);
-  it->last_returned = NULL;
-}
-
-/**
- * gst_buffer_list_iterator_take:
- * @it: a #GstBufferListIterator
- * @buffer: (transfer full): a #GstBuffer
- *
- * Replaces the last buffer returned by gst_buffer_list_iterator_next() with
- * @buffer in the #GstBufferList iterated with @it and takes ownership of
- * @buffer. gst_buffer_list_iterator_next() must have been called on @it before
- * this function is called. gst_buffer_list_iterator_remove() must not have been
- * called since the last call to gst_buffer_list_iterator_next().
- *
- * This function unrefs the replaced buffer if it has not been stolen with
- * gst_buffer_list_iterator_steal() and takes ownership of @buffer (i.e. the
- * refcount of @buffer is not increased).
- *
- * FIXME 0.11: this conditional taking-ownership is not good for bindings
- *
- * Since: 0.10.24
- */
-void
-gst_buffer_list_iterator_take (GstBufferListIterator * it, GstBuffer * buffer)
-{
-  g_return_if_fail (it != NULL);
-  g_return_if_fail (it->last_returned != NULL);
-  g_return_if_fail (buffer != NULL);
-  g_assert (it->last_returned->data != GROUP_START);
-
-  if (it->last_returned->data != STOLEN) {
-    gst_buffer_unref (it->last_returned->data);
-  }
-  it->last_returned->data = buffer;
-}
-
-/**
- * gst_buffer_list_iterator_steal:
- * @it: a #GstBufferListIterator
- *
- * Returns the last buffer returned by gst_buffer_list_iterator_next() without
- * modifying the refcount of the buffer.
- *
- * Returns: (transfer none): the last buffer returned by
- *     gst_buffer_list_iterator_next()
- *
- * Since: 0.10.24
- */
-GstBuffer *
-gst_buffer_list_iterator_steal (GstBufferListIterator * it)
-{
-  GstBuffer *buffer;
-
-  g_return_val_if_fail (it != NULL, NULL);
-  g_return_val_if_fail (it->last_returned != NULL, NULL);
-  g_return_val_if_fail (it->last_returned->data != STOLEN, NULL);
-  g_assert (it->last_returned->data != GROUP_START);
-
-  buffer = it->last_returned->data;
-  it->last_returned->data = (gpointer) STOLEN;
-
-  return buffer;
-}
-
-/**
- * gst_buffer_list_iterator_do:
- * @it: a #GstBufferListIterator
- * @do_func: the function to be called
- * @user_data: the gpointer to optional user data.
- *
- * Calls the given function for the last buffer returned by
- * gst_buffer_list_iterator_next(). gst_buffer_list_iterator_next() must have
- * been called on @it before this function is called.
- * gst_buffer_list_iterator_remove() and gst_buffer_list_iterator_steal() must
- * not have been called since the last call to gst_buffer_list_iterator_next().
- *
- * See #GstBufferListDoFunction for more details.
- *
- * Returns: (transfer none): the return value from @do_func
- *
- * Since: 0.10.24
- */
-GstBuffer *
-gst_buffer_list_iterator_do (GstBufferListIterator * it,
-    GstBufferListDoFunction do_func, gpointer user_data)
-{
-  GstBuffer *buffer;
-
-  g_return_val_if_fail (it != NULL, NULL);
-  g_return_val_if_fail (it->last_returned != NULL, NULL);
-  g_return_val_if_fail (it->last_returned->data != STOLEN, NULL);
-  g_return_val_if_fail (do_func != NULL, NULL);
-  g_return_val_if_fail (gst_buffer_list_is_writable (it->list), NULL);
-  g_assert (it->last_returned->data != GROUP_START);
-
-  buffer = gst_buffer_list_iterator_steal (it);
-  buffer = do_func (buffer, user_data);
-  if (buffer == NULL) {
-    gst_buffer_list_iterator_remove (it);
-  } else {
-    gst_buffer_list_iterator_take (it, buffer);
-  }
-
-  return buffer;
-}
-
-/**
- * gst_buffer_list_iterator_merge_group:
- * @it: a #GstBufferListIterator
- *
- * Merge a buffer list group into a normal #GstBuffer by copying its metadata
- * and memcpying its data into consecutive memory. All buffers in the current
- * group after the implicit cursor will be merged into one new buffer. The
- * metadata of the new buffer will be a copy of the metadata of the buffer that
- * would be returned by gst_buffer_list_iterator_next(). If there is no buffer
- * in the current group after the implicit cursor, NULL will be returned.
- *
- * This function will not move the implicit cursor or in any other way affect
- * the state of the iterator @it or the list.
- *
- * Returns: (transfer full): a new #GstBuffer, gst_buffer_unref() after usage,
- *     or NULL
- *
- * Since: 0.10.24
- */
-GstBuffer *
-gst_buffer_list_iterator_merge_group (const GstBufferListIterator * it)
-{
-  GList *tmp;
-  gsize size;
-  GstBuffer *buf;
-  guint8 *dest, *ptr;
-
-  g_return_val_if_fail (it != NULL, NULL);
-
-  /* calculate size of merged buffer */
-  size = 0;
-  tmp = it->next;
-  while (tmp && tmp->data != GROUP_START) {
-    if (tmp->data != STOLEN) {
-      size += gst_buffer_get_size (tmp->data);
-    }
-    tmp = g_list_next (tmp);
-  }
-
-  if (size == 0) {
-    return NULL;
-  }
-
-  /* allocate a new buffer */
-  buf = gst_buffer_new_and_alloc (size);
-
-  /* copy metadata from the next buffer after the implicit cursor */
-  gst_buffer_copy_into (buf, GST_BUFFER_CAST (it->next->data),
-      GST_BUFFER_COPY_METADATA, 0, -1);
-
-  /* copy data of all buffers before the next group start into the new buffer */
-  dest = ptr = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
-  tmp = it->next;
-  do {
-    if (tmp->data != STOLEN) {
-      GstBuffer *tbuf = GST_BUFFER_CAST (tmp->data);
-      gsize bsize;
-
-      bsize = gst_buffer_get_size (tbuf);
-      gst_buffer_extract (tbuf, 0, ptr, bsize);
-      ptr += bsize;
-    }
-    tmp = g_list_next (tmp);
-  } while (tmp && tmp->data != GROUP_START);
-
-  gst_buffer_unmap (buf, dest, size);
-
-  return buf;
+  g_array_remove_range (list->array, idx, length);
 }
index 1ff34ae..6ac0a67 100644 (file)
@@ -35,80 +35,30 @@ extern GType _gst_buffer_list_type;
 #define GST_BUFFER_LIST(obj)      (GST_BUFFER_LIST_CAST(obj))
 
 typedef struct _GstBufferList GstBufferList;
-typedef struct _GstBufferListIterator GstBufferListIterator;
-
-/**
- * GstBufferListDoFunction:
- * @buffer: (transfer full): the #GstBuffer
- * @user_data: user data
- *
- * A function for accessing the last buffer returned by
- * gst_buffer_list_iterator_next(). The function can leave @buffer in the list,
- * replace @buffer in the list or remove @buffer from the list, depending on
- * the return value. If the function returns NULL, @buffer will be removed from
- * the list, otherwise @buffer will be replaced with the returned buffer.
- *
- * The last buffer returned by gst_buffer_list_iterator_next() will be replaced
- * with the buffer returned from the function. The function takes ownership of
- * @buffer and if a different value than @buffer is returned, @buffer must be
- * unreffed. If NULL is returned, the buffer will be removed from the list. The
- * list must be writable.
- *
- * Returns: (transfer full): the buffer to replace @buffer in the list, or NULL
- *     to remove @buffer from the list
- *
- * Since: 0.10.24
- */
-typedef GstBuffer* (*GstBufferListDoFunction) (GstBuffer * buffer, gpointer user_data);
-
-/**
- * GstBufferListItem:
- * @GST_BUFFER_LIST_CONTINUE:   Retrieve next buffer
- * @GST_BUFFER_LIST_SKIP_GROUP: Skip to next group
- * @GST_BUFFER_LIST_END:        End iteration
- *
- * The result of the #GstBufferListFunc.
- *
- * Since: 0.10.24
- */
-typedef enum {
-  GST_BUFFER_LIST_CONTINUE,
-  GST_BUFFER_LIST_SKIP_GROUP,
-  GST_BUFFER_LIST_END
-} GstBufferListItem;
 
 /**
  * GstBufferListFunc:
  * @buffer: pointer the buffer
- * @group: the group index of @buffer
- * @idx: the index in @group of @buffer
+ * @idx: the index of @buffer
  * @user_data: user data passed to gst_buffer_list_foreach()
  *
  * A function that will be called from gst_buffer_list_foreach(). The @buffer
- * field will point to a the reference of the buffer at @idx in @group.
+ * field will point to a the reference of the buffer at @idx.
  *
- * When this function returns #GST_BUFFER_LIST_CONTINUE, the next buffer will be
- * returned. When #GST_BUFFER_LIST_SKIP_GROUP is returned, all remaining buffers
- * in the current group will be skipped and the first buffer of the next group
- * is returned (if any). When GST_BUFFER_LIST_END is returned,
- * gst_buffer_list_foreach() will return.
+ * When this function returns %TRUE, the next buffer will be
+ * returned. When %FALSE is returned, gst_buffer_list_foreach() will return.
  *
  * When @buffer is set to NULL, the item will be removed from the bufferlist.
  * When @buffer has been made writable, the new buffer reference can be assigned
  * to @buffer. This function is responsible for unreffing the old buffer when
  * removing or modifying.
  *
- * Returns: a #GstBufferListItem
- *
- * Since: 0.10.24
+ * Returns: %FALSE when gst_buffer_list_foreach() should stop
  */
-typedef GstBufferListItem (*GstBufferListFunc)   (GstBuffer **buffer, guint group, guint idx,
-                                                  gpointer user_data);
+typedef gboolean   (*GstBufferListFunc)   (GstBuffer **buffer, guint idx,
+                                           gpointer user_data);
 
 
-/* allocation */
-GstBufferList *gst_buffer_list_new (void);
-
 /* refcounting */
 /**
  * gst_buffer_list_ref:
@@ -203,33 +153,21 @@ gst_buffer_list_copy (const GstBufferList * list)
  */
 #define gst_buffer_list_make_writable(list) GST_BUFFER_LIST_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (list)))
 
-guint                    gst_buffer_list_n_groups              (GstBufferList *list);
+/* allocation */
+GstBufferList *          gst_buffer_list_new                   (void);
+GstBufferList *          gst_buffer_list_sized_new             (guint size);
+
+guint                    gst_buffer_list_len                   (GstBufferList *list);
+
+GstBuffer *              gst_buffer_list_get                   (GstBufferList *list, guint idx);
+void                     gst_buffer_list_insert                (GstBufferList *list, guint idx, GstBuffer *buffer);
+void                     gst_buffer_list_remove                (GstBufferList *list, guint idx, guint length);
 
 void                     gst_buffer_list_foreach               (GstBufferList *list,
                                                                 GstBufferListFunc func,
                                                                gpointer user_data);
-GstBuffer *              gst_buffer_list_get                   (GstBufferList *list, guint group, guint idx);
-
-/* iterator */
-GstBufferListIterator *  gst_buffer_list_iterate               (GstBufferList *list);
-void                     gst_buffer_list_iterator_free         (GstBufferListIterator *it);
-
-guint                    gst_buffer_list_iterator_n_buffers    (const GstBufferListIterator *it);
-GstBuffer *              gst_buffer_list_iterator_next         (GstBufferListIterator *it);
-gboolean                 gst_buffer_list_iterator_next_group   (GstBufferListIterator *it);
-
-void                     gst_buffer_list_iterator_add          (GstBufferListIterator *it, GstBuffer *buffer);
-void                     gst_buffer_list_iterator_add_list     (GstBufferListIterator *it, GList *list);
-void                     gst_buffer_list_iterator_add_group    (GstBufferListIterator *it);
-void                     gst_buffer_list_iterator_remove       (GstBufferListIterator *it);
-GstBuffer *              gst_buffer_list_iterator_steal        (GstBufferListIterator *it);
-void                     gst_buffer_list_iterator_take         (GstBufferListIterator *it, GstBuffer *buffer);
-
-GstBuffer *              gst_buffer_list_iterator_do           (GstBufferListIterator *it, GstBufferListDoFunction do_func,
-                                                                gpointer user_data);
 
-/* conversion */
-GstBuffer *              gst_buffer_list_iterator_merge_group  (const GstBufferListIterator *it);
+#define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
 
 G_END_DECLS
 
index e064386..0859849 100644 (file)
@@ -3685,7 +3685,7 @@ gst_pad_data_get_caps (gboolean is_buffer, void *data)
   } else {
     GstBuffer *buf;
 
-    if ((buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (data), 0, 0)))
+    if ((buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (data), 0)))
       caps = GST_BUFFER_CAPS (buf);
     else
       caps = NULL;
@@ -3786,33 +3786,24 @@ gst_pad_chain_data_unchecked (GstPad * pad, gboolean is_buffer, void *data,
 chain_groups:
   {
     GstBufferList *list;
-    GstBufferListIterator *it;
-    GstBuffer *group;
+    guint i, len;
+    GstBuffer *buffer;
 
     GST_PAD_STREAM_UNLOCK (pad);
 
     GST_INFO_OBJECT (pad, "chaining each group in list as a merged buffer");
 
     list = GST_BUFFER_LIST_CAST (data);
-    it = gst_buffer_list_iterate (list);
-
-    if (gst_buffer_list_iterator_next_group (it)) {
-      do {
-        group = gst_buffer_list_iterator_merge_group (it);
-        if (group == NULL) {
-          group = gst_buffer_new ();
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
-        } else {
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining group");
-        }
-        ret = gst_pad_chain_data_unchecked (pad, TRUE, group, NULL);
-      } while (ret == GST_FLOW_OK && gst_buffer_list_iterator_next_group (it));
-    } else {
-      GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
-      ret = gst_pad_chain_data_unchecked (pad, TRUE, gst_buffer_new (), NULL);
+    len = gst_buffer_list_len (list);
+
+    for (i = 0; i < len; i++) {
+      buffer = gst_buffer_list_get (list, i);
+      ret =
+          gst_pad_chain_data_unchecked (pad, TRUE, gst_buffer_ref (buffer),
+          NULL);
+      if (ret != GST_FLOW_OK)
+        break;
     }
-
-    gst_buffer_list_iterator_free (it);
     gst_buffer_list_unref (list);
 
     return ret;
@@ -3998,31 +3989,20 @@ gst_pad_push_data (GstPad * pad, gboolean is_buffer, void *data,
 push_groups:
   {
     GstBufferList *list;
-    GstBufferListIterator *it;
-    GstBuffer *group;
+    guint i, len;
+    GstBuffer *buffer;
 
     GST_INFO_OBJECT (pad, "pushing each group in list as a merged buffer");
 
     list = GST_BUFFER_LIST_CAST (data);
-    it = gst_buffer_list_iterate (list);
-
-    if (gst_buffer_list_iterator_next_group (it)) {
-      do {
-        group = gst_buffer_list_iterator_merge_group (it);
-        if (group == NULL) {
-          group = gst_buffer_new ();
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing empty group");
-        } else {
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing group");
-        }
-        ret = gst_pad_push_data (pad, TRUE, group, NULL);
-      } while (ret == GST_FLOW_OK && gst_buffer_list_iterator_next_group (it));
-    } else {
-      GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing empty group");
-      ret = gst_pad_push_data (pad, TRUE, gst_buffer_new (), NULL);
-    }
+    len = gst_buffer_list_len (list);
 
-    gst_buffer_list_iterator_free (it);
+    for (i = 0; i < len; i++) {
+      buffer = gst_buffer_list_get (list, i);
+      ret = gst_pad_push_data (pad, TRUE, gst_buffer_ref (buffer), NULL);
+      if (ret != GST_FLOW_OK)
+        break;
+    }
     gst_buffer_list_unref (list);
 
     return ret;
@@ -4294,7 +4274,7 @@ gst_pad_push_list (GstPad * pad, GstBufferList * list)
     goto slow_path;
 
   /* check caps */
-  if ((buf = gst_buffer_list_get (list, 0, 0)))
+  if ((buf = gst_buffer_list_get (list, 0)))
     caps = GST_BUFFER_CAPS (buf);
   else
     caps = NULL;
index 356aa41..3f9718e 100644 (file)
@@ -2940,7 +2940,7 @@ gst_base_sink_render_object (GstBaseSink * basesink, GstPad * pad,
      * If buffer list, use the first group buffer within the list
      * for syncing
      */
-    sync_obj = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0, 0);
+    sync_obj = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
     g_assert (NULL != sync_obj);
   } else {
     sync_obj = obj;
@@ -3161,7 +3161,7 @@ gst_base_sink_preroll_object (GstBaseSink * basesink, guint8 obj_type,
     GstClockTime timestamp;
 
     if (OBJ_IS_BUFFERLIST (obj_type)) {
-      buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0, 0);
+      buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
       g_assert (NULL != buf);
     } else {
       buf = GST_BUFFER_CAST (obj);
@@ -3589,7 +3589,7 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
     goto was_eos;
 
   if (OBJ_IS_BUFFERLIST (obj_type)) {
-    time_buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0, 0);
+    time_buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
     g_assert (NULL != time_buf);
   } else {
     time_buf = GST_BUFFER_CAST (obj);
@@ -3727,32 +3727,21 @@ gst_base_sink_chain_list (GstPad * pad, GstBufferList * list)
   if (G_LIKELY (bclass->render_list)) {
     result = gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFERLIST, list);
   } else {
-    GstBufferListIterator *it;
-    GstBuffer *group;
+    guint i, len;
+    GstBuffer *buffer;
 
     GST_INFO_OBJECT (pad, "chaining each group in list as a merged buffer");
 
-    it = gst_buffer_list_iterate (list);
+    len = gst_buffer_list_len (list);
 
-    if (gst_buffer_list_iterator_next_group (it)) {
-      do {
-        group = gst_buffer_list_iterator_merge_group (it);
-        if (group == NULL) {
-          group = gst_buffer_new ();
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
-        } else {
-          GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining group");
-        }
-        result = gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFER, group);
-      } while (result == GST_FLOW_OK
-          && gst_buffer_list_iterator_next_group (it));
-    } else {
-      GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
-      result =
-          gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFER,
-          gst_buffer_new ());
+    result = GST_FLOW_OK;
+    for (i = 0; i < len; i++) {
+      buffer = gst_buffer_list_get (list, 0);
+      result = gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFER,
+          gst_buffer_ref (buffer));
+      if (result != GST_FLOW_OK)
+        break;
     }
-    gst_buffer_list_iterator_free (it);
     gst_buffer_list_unref (list);
   }
   return result;
index 4789ae9..2e2fdcd 100644 (file)
@@ -44,6 +44,7 @@ cleanup (void)
   gst_buffer_list_unref (list);
 }
 
+#if 0
 static GstBuffer *
 buffer_from_string (const gchar * str)
 {
@@ -76,92 +77,37 @@ check_buffer (GstBuffer * buf, gsize size, const gchar * data)
   fail_unless (memcmp (bdata, data, csize) == 0);
   gst_buffer_unmap (buf, bdata, bsize);
 }
+#endif
 
 GST_START_TEST (test_add_and_iterate)
 {
-  GstBufferListIterator *it;
   GstBuffer *buf1;
   GstBuffer *buf2;
-  GstBuffer *buf3;
-  GstBuffer *buf4;
-  GstBuffer *buf;
 
   /* buffer list is initially empty */
-  fail_unless (gst_buffer_list_n_groups (list) == 0);
-
-  it = gst_buffer_list_iterate (list);
+  fail_unless (gst_buffer_list_len (list) == 0);
 
-  ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, NULL));
-  ASSERT_CRITICAL (gst_buffer_list_iterator_add (NULL, NULL));
+  ASSERT_CRITICAL (gst_buffer_list_insert (list, 0, NULL));
+  ASSERT_CRITICAL (gst_buffer_list_insert (NULL, 0, NULL));
 
-  /* cannot add buffer without adding a group first */
   buf1 = gst_buffer_new ();
-  ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, buf1));
 
   /* add a group of 2 buffers */
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-  gst_buffer_list_iterator_add_group (it);
-  fail_unless (gst_buffer_list_n_groups (list) == 1);
-  ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, NULL));
+  fail_unless (gst_buffer_list_len (list) == 0);
+  ASSERT_CRITICAL (gst_buffer_list_insert (list, -1, NULL));
   ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
-  gst_buffer_list_iterator_add (it, buf1);
+  gst_buffer_list_add (list, buf1);
   ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);     /* list takes ownership */
-  fail_unless (gst_buffer_list_n_groups (list) == 1);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
+  fail_unless (gst_buffer_list_len (list) == 1);
   buf2 = gst_buffer_new ();
-  gst_buffer_list_iterator_add (it, buf2);
+  gst_buffer_list_add (list, buf2);
   ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
-  fail_unless (gst_buffer_list_n_groups (list) == 1);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-
-  /* add another group of 2 buffers */
-  gst_buffer_list_iterator_add_group (it);
-  fail_unless (gst_buffer_list_n_groups (list) == 2);
-  buf3 = gst_buffer_new ();
-  gst_buffer_list_iterator_add (it, buf3);
-  ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
-  fail_unless (gst_buffer_list_n_groups (list) == 2);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-  buf4 = gst_buffer_new ();
-  gst_buffer_list_iterator_add (it, buf4);
-  ASSERT_BUFFER_REFCOUNT (buf4, "buf4", 1);
-  fail_unless (gst_buffer_list_n_groups (list) == 2);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-
-  /* freeing iterator does not affect list */
-  gst_buffer_list_iterator_free (it);
-  fail_unless (gst_buffer_list_n_groups (list) == 2);
-
-  /* create a new iterator */
-  it = gst_buffer_list_iterate (list);
-
-  /* iterate list */
-  fail_unless (gst_buffer_list_iterator_next (it) == NULL);
-  fail_unless (gst_buffer_list_iterator_next_group (it));
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2);
-  buf = gst_buffer_list_iterator_next (it);
-  fail_unless (buf == buf1);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 1);
-  buf = gst_buffer_list_iterator_next (it);
-  fail_unless (buf == buf2);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-  fail_unless (gst_buffer_list_iterator_next (it) == NULL);
-  fail_unless (gst_buffer_list_iterator_next_group (it));
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2);
-  buf = gst_buffer_list_iterator_next (it);
-  fail_unless (buf == buf3);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 1);
-  buf = gst_buffer_list_iterator_next (it);
-  fail_unless (buf == buf4);
-  fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
-  fail_unless (gst_buffer_list_iterator_next (it) == NULL);
-  fail_if (gst_buffer_list_iterator_next_group (it));
-
-  gst_buffer_list_iterator_free (it);
+  fail_unless (gst_buffer_list_len (list) == 2);
 }
 
 GST_END_TEST;
 
+#if 0
 GST_START_TEST (test_make_writable)
 {
   GstBufferListIterator *it;
@@ -805,6 +751,7 @@ GST_START_TEST (test_list)
 }
 
 GST_END_TEST;
+#endif
 
 static Suite *
 gst_buffer_list_suite (void)
@@ -815,6 +762,7 @@ gst_buffer_list_suite (void)
   suite_add_tcase (s, tc_chain);
   tcase_add_checked_fixture (tc_chain, setup, cleanup);
   tcase_add_test (tc_chain, test_add_and_iterate);
+#if 0
   tcase_add_test (tc_chain, test_make_writable);
   tcase_add_test (tc_chain, test_copy);
   tcase_add_test (tc_chain, test_steal);
@@ -823,6 +771,7 @@ gst_buffer_list_suite (void)
   tcase_add_test (tc_chain, test_merge);
   tcase_add_test (tc_chain, test_foreach);
   tcase_add_test (tc_chain, test_list);
+#endif
 
   return s;
 }
index b3242db..7acfbf1 100644 (file)
@@ -436,8 +436,8 @@ GST_START_TEST (test_push_buffer_list_compat)
   GstPadLinkReturn plr;
   GstCaps *caps;
   GstBufferList *list;
-  GstBufferListIterator *it;
   GstBuffer *buffer;
+  guint len;
 
   /* setup */
   sink = gst_pad_new ("sink", GST_PAD_SINK);
@@ -464,15 +464,11 @@ GST_START_TEST (test_push_buffer_list_compat)
 
   /* test */
   /* adding to a buffer list will drop the ref to the buffer */
-  it = gst_buffer_list_iterate (list);
-  gst_buffer_list_iterator_add_group (it);
-  gst_buffer_list_iterator_add (it, buffer_from_string ("List"));
-  gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
-  gst_buffer_list_iterator_add_group (it);
-  gst_buffer_list_iterator_add (it, buffer_from_string ("Another"));
-  gst_buffer_list_iterator_add (it, buffer_from_string ("List"));
-  gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
-  gst_buffer_list_iterator_free (it);
+  len = gst_buffer_list_len (list);
+
+  gst_buffer_list_add (list, buffer_from_string ("ListGroup"));
+  gst_buffer_list_add (list, buffer_from_string ("AnotherListGroup"));
+
   fail_unless (gst_pad_push_list (src, list) == GST_FLOW_OK);
   fail_unless_equals_int (g_list_length (buffers), 2);
   buffer = GST_BUFFER (buffers->data);
index d07443d..95e9f23 100644 (file)
@@ -104,22 +104,11 @@ EXPORTS
        gst_buffer_join
        gst_buffer_list_foreach
        gst_buffer_list_get
-       gst_buffer_list_item_get_type
-       gst_buffer_list_iterate
-       gst_buffer_list_iterator_add
-       gst_buffer_list_iterator_add_group
-       gst_buffer_list_iterator_add_list
-       gst_buffer_list_iterator_do
-       gst_buffer_list_iterator_free
-       gst_buffer_list_iterator_merge_group
-       gst_buffer_list_iterator_n_buffers
-       gst_buffer_list_iterator_next
-       gst_buffer_list_iterator_next_group
-       gst_buffer_list_iterator_remove
-       gst_buffer_list_iterator_steal
-       gst_buffer_list_iterator_take
-       gst_buffer_list_n_groups
+       gst_buffer_list_insert
+       gst_buffer_list_len
        gst_buffer_list_new
+       gst_buffer_list_remove
+       gst_buffer_list_sized_new
        gst_buffer_map
        gst_buffer_merge
        gst_buffer_n_memory